Download Introducción a Java - fc

Document related concepts
no text concepts found
Transcript
Sentencias de selección
Curso de Programación
OBJETIVOS
•Implementar sentencias de control de selección en un programa usando
sentencias if.
•Implementar controles de selección en un programa usando sentencias
switch.
•Escribir expresiones booleanas usando operadores relaciónales y booleanos.
•Evaluar expresiones booleanas correctamente.
•Anidar una sentencia if dentro de otra sentencia if then o else
correctamente.
•Elegir la sentencia de selección de control adecuada para una determinada
Tarea.
Flujo de control
Las sentencias de los programas se ejecutan en secuencia, lo
que se denomina ejecución secuencial o flujo de control,
secuencial.
Sin embargo, se pueden añadir sentencias de toma de
decisiones a un programa para alterar este flujo de control.
La sentencia que altera el flujo de control se denomina una
sentencia de control.
En este capítulo se describen algunas sentencias de control
importantes denominadas sentencias de selección.
En el siguiente capítulo, describiremos otras sentencias de
control denominadas sentencias de repetición.
La sentencia if
Se usa una sentencia if para especificar qué bloque de código se
ejecuta.
Un bloque el código puede contener cero o más sentencias.
Qué bloque de código se ejecuta depende de resultado de la
evaluación de una condición de prueba, denominada expresión
booleana.
Un sentencia if en un programa que tiene el siguiente formato
general:
if (
<expresion booleana> )
<bloque then>
else
<bloque else>
Operadores relaciónales
<
// menor que
<=
// menor que o igual a
==
// igual a
!=
// distinto de
>
// mayor que
>=
// mayor que o igual a
Ejemplos
3 <= 5
//true
6 != 8
//true
5 == 4
//false
6 + 4 > 7
//true
4/5 + 8 == 8.8 //false
4.0/5 + 8 == 8.8 //true
43%5/3 +12/3/2 < 5
//true
Expresión Booleana
Bloque then
if (puntuacionPrueba < 6.0)
System.out.println(“No ha aprobado“);
else
System.out.println(“Ha aprobado");
Bloque else
Diagrama de flujo
F o false
V o true
puntuacionPrueba < 6.0
Ha aprobado
No ha aprobado
Sentencias compuestas
Sentencias
compuestas
if (puntuacionPrueba < 6.0)
{
System.out.pritnln(“No ha aprobado“);
System.out.pritnln(“Inténtelo otra vez“);
}
else
{
System.out.pritnln(“Ha aprobado“);
System.out.pritnln(“Siga trabajando");
}
Estilo
if (<expresion booleana>) {
}
Estilo 1
else {
}
if (<expresion booleana>)
{
Estilo 2
}
else
{
}
Reglas para escribir los bloques
then y else
1. Las llaves izquierda y derecha son necesarias para rodear
a las sentencias si el bloque then o el bloque else
contienen múltiples sentencias.
2. Las llaves no son necesarias si el bloque then o el bloque
else contienen una única sentencia.
3. No se necesita un punto y coma después de la llave
derecha.
If abreviado
F
V
puntuacionPrueba>=9.5
Ud. Es excelente
if (puntuacionPrueba >= 9.5)
{
System.out.pritnln(“Ud. Es excelente“);
}
Actividad
1. Escribir un programa en Java que lea un número entero
y despliegue en la pantalla el letrero “mayor que cero”
si el número leido es mayor que cero y el letrero “menor
que cero” si es menor que cero.
2. Escriba un programa en Java que lea un número entero y
si es un número para lo divida entre 2, si es múltiplo de
3 lo divida entre 3 y si es múltiplo de 5 lo divida entre
5. Deberá imprimir el número leído y una indicación si
fue dividido y si así fue, el resultado de la división.
Preguntas rápidas
1. Identifique las sentencias if inválidas
a. if(a < b) then
x = y;
else
x= z;
c . if(a < b)
x = y;
else {
x= z;
}
b. if ( a < b )
else x = y;
d. if ( a < b ) {
x = y; } else
x = z;
2. Exprese las siguientes sentencias if-then usando if-then-else.
a.
if ( a < b ) x = y;
b.
if ( a < b ) {}
c.
if ( a < b ) x = y;
if ( a >= b ) x = z;
Expresiones booleanas
Tres operadores booleanos son AND, OR y NOT.
En Java, los símbolos &&, ||, y ! representan los operadores
AND, OR y NOT respectivamente.
Operadores booleanos y su significado.
A
B
A&&B
A||B
!A
F
F
F
F
V
F
V
F
V
V
V
F
F
V
F
V
V
V
V
F
V = verdadero, F = falso
ejemplos
(2 == (5-3)) || !(3 < 2) && (27%4 == 3)
(2 == (2) ) || !( F ) && ( 3 == 3)
V
|| !( F ) &&
V
V
||
V
&&
V
V
||
V
V
4 < 7 && !(6 > 3 || 5 < 9)
V
&& !( V
||
V )
V
&& ! V
V
&& F
F
programa ejemplo
public class TestBool{
static public void main(String [] args){
boolean a,b:
a = (2 == (5-3)) || !(3 < 2) && (27%4 == 3);
b = 4 < 7 && !(6 > 3 || 5 < 9);
System.out.println(""+a);
System.out.println(""+b);
}
}
Salida:
true
false
Error frecuente
Un error muy frecuente cuando se escribe un programa es
mezclar los operadores de asignación y de igualdad.
Frecuentemente cometemos el error de escribir.
if (x = 5) . . .
cuando realmente queríamos decir:
if (x == 5) ...
Preguntas rápidas
Evalúe las siguientes expresiones booleanas. Suponga que x, y y z tienen
valores numéricos.
a. 3 < 5 || 6 == 6
b. 2 < 4 && (false || 5 <= 4 )
c. 6 <= 12 && ! (5 != 5) || 8 > 3
d. 3 < 1 || 5 < 1 && 3 <= 5
2. Identifique errores en las siguientes expresiones y asignaciones booleanas.
a. boolean hecho;
hecho = 6 = 9;
b. 2 < 4 && (3 < 5) + 1 == 3
c. boolean rápido;
rápido = true;
rápido = ( 34 != 20 ) && rápido;
Sentencias if anidadas
Las cláusulas then y else de una sentencia if pueden
contener cualquier sentencia, incluyendo otra sentencia if.
Una sentencia if que contiene otra sentencia if, bien en el
bloque then o bien en el bloque else, se denomina una
sentencia if anidada.
Ejemplo
if (puntuacionPrueba >= 70) {
if (edadEstudiante < 10) {
System.out.println(
"Ha hecho un gran trabajo");
}
else {
//puntuación prueba >= 70
//y edad >= 10
System.out.println("Ha aprobado");
}
}
else { // puntuación prueba < 70
System.out.println("No ha aprobado");
}
Otra versión
if (puntuacionPrueba >= 70 && edadEstudiante < 10) {
System.out.println(
"Ha hecho un gran trabajo");
}
else {
//o bien puntuación prueba < 70 OR
// edad >= 10
if (puntuacionPrueba >= 70){
System.out.println("Ha aprobado");
}
else {
System.out.println("No ha aprobado");
}
}
Contador de números negativos
if (num1 < 0)
if (num2 < 0)
if (num3 < 0)
contadorNegativo
else
contadorNegativo
else
if (num3 < 0)
contadorNegativo
else
contadorNegativo
else
if (num2 < 0)
if (num3 < 0)
contadorNegativo
else
contadorNegativo
else
if (num3 < 0)
contadorNegativo
else
contadorNegativo
= 3; //los tres son negativos
= 2; //num1 y num2 son negativos
= 2; //num1 y num3 son negativos
= 1; //num1 es negativo
=2; // num2 y num3 son negativos
= 1; // num2 es negativo
=1; // num3 es negativo
=0; // no hay números negativos
Otra versión
contadorNegativo = 0;
contadorNegativo=0
if (num1 < 0)
contadorNegativo++;
if (num2 < 0)
contadorNegativo++;
if (num3 < 0)
contadorNegativo++ ;
V
num1<0?
F
contadorNegativo++
V
num2<0?
F
num3<0?
F
contadorNegativo++
V
contadorNegativo++
Escriba en Java las dos versiones. Deberá leer los 3 números y contar los negativos.
Ejemplo de triángulos
Diseñe un programa que lea tres números y determine si
es posible obtener un triángulo con estos números.
Ejemplo:
Si los números son 3, 4 y 5, si es posible obtener un
triángulo.
Si los números son 2,3 y 6, no es posible obtener un
triángulo.
Solución
La condición para que formen un triángulo es que la suma de los dos
menores sea igual o mayor que el mayor.
Por tanto, lo primero es determinar cual es el mayor.
Sean a, b y c los tres números. El siguiente algoritmo en Java
determina cual es el mayor.
if(a>=b && a>=c){
mayor = a;
menor1 = b;
menor2 = c;
}
else
if(b>=a && b>=c){
mayor = b;
menor1 = a;
menor2 = c;
}
else{
mayor = c;
menor1 = a;
menor2 = b;
}
V
F
a>=b&&a>=c?
V
mayor=a
menor1=b
menor2=c
mayor=b
menor1=a
menor2=c
F
b>=a&&b>=c?
mayor=c
menor1=a
menor2=b
Solución
una vez determinados el mayor y los dos menores se
comprueba si forman triángulo.
if(mayor<=menor1+menor2)
System.out.println(“SI forman triángulo”);
else
System.out.println(“NO forman triángulo”);
Programa completo
import javabook.*;
public class TesSiTriangulo{
static public void main(String[] args){
SimpleInput entrada = new SimpleInput();
int a,b,c,mayor,menor1,menor2;
a = entrada.getInteger("teclee un número: ");
b = entrada.getInteger("teclee un número: ");
c = entrada.getInteger("teclee un número: ");
if(a>=b && a>=c){
mayor = a;
menor1 = b;
menor2 = c;
}
else
if(b>=a && b>=c){
mayor = b;
menor1 = a;
menor2 = c;
}
else{
mayor = c;
menor1 = a;
menor2 = b;
}
if(mayor<=menor1+menor2)
System.out.println("SI forman triángulo");
else
System.out.println("NO forman triángulo");
}
}
Actividad
Agregue código al programa anterior para que determine el
tipo de triángulo que forman los tres números; los tipos
pueden ser: rectángulo, equilátero, isóceles, escaleno.
Note que un triángulo puede ser rectángulo e isóseles o
escaleno.
Rectangulo:
si mayor^2 == menor1^2+menor^2
Equilatero:
si mayor == menor1 && mayor == menor2
Cálculo de la nota de un estudiante
Prueba puntuación
Nota
90 < puntuación
A
80 <= puntuación < 90
B
70 <= puntuación < 80
C
60 <= puntuación < 70
D
if (puntuación >= 90)
System.out.println("Su nota es A");
else
if (puntuación >= 80)
System.out.println("Su nota es B");
else
if (puntuación >= 70)
System.out.println("Su nota es C");
else
if (puntuación >= 60)
System.out.println("Su nota es D");
else
System.out.println("Su nota es F");
if (puntuación >= 90)
System.out.println("Su nota
else if (puntuación >= 80)
System.out.println("Su nota
else if (puntuación >= 70)
System.out.println("Su nota
else if (puntuación >= 60)
System.out.println("Su nota
else
System.out.println("Su nota
es A");
es B");
es C");
es D");
es F");
else colgado
if (x < y)
if (x < z)
System.out.println("Hola") ;
else
System.out.println("Adiós") ;
if (x < y)
if (x < z)
System.out.println("Hola") ;
else
System.out.println("Adiós") ;
Solución
if (x < y){
if (x < z)
System.out.println("Hola") ;
}
else
System.out.println("Adiós") ;
Preguntas rápidas
1.
Rescriba las siguientes sentencias de if anidados sin usar ningún
anidamiento:
a. if ( a < c )
c. if ( a < b )
if ( b < c )
if ( a >= b )
x = y;
x = z;
else
else
x = z;
x = y;
else
else
x = z;
x = z;
Preguntas rápidas
2. Dé formato a las siguientes sentencias if usando
sangrado.
a. if(a<b)if(c>d)x = y; else x = z;
b. if(a<b){if(c > d)x = y;}else x = z;
c. if(a<b)x = y;if(a<c)x-z;else if(c<d)
z = y;
Sentencia switch
La sentencia switch permite elegir entre varias alternativas.
Sintaxis
switch (<expresión>){
case <constante>:[case <constante>:]<sentencias>;break;
...
[default:<sentencias>;break;]
}
caso a
Acción del
caso a
break;
caso b
Acción del
caso b
break;
caso z
Acción del
caso z
break;
Acción por
omisión
Ejemplo
El siguiente fragmento de código imprime un letrero si un número
es primo y mayor que cero y menor que 10, otro letrero si es no
primo y mayor 1ue cero y menor que 10 y otro letrero si es menor
que 1 o mayor que 10.
switch (num){
case 1:case 2:case 3:case 5:case 7:
System.out.println(“primo, >0 y <10”);break;
case 4:case 6:case 8:case 9:
System.out.println(“No primo, >0 y <10”);break;
default:mensaje.show(“<1 o >10”);
}
Ejemplo: días de la semana
Escriba una sentencia switch que para desplegar un mensaje
con el día de la semana dada una variable dia con valores de 0
a 6.
switch (dia){
case 0:System.out.println(“Domingo”); break;
case 1:System.out.println(“Lunes”); break;
case 2:System.out.println(“Martes”);break;
case 3:System.out.println(“Miércoles”); break;
case 4:System.out.println(“Jueves”); break;
case 5:System.out.println(“Viernes”); break;
case 6:System.out.println(“Sabado”); break;
default:System.out.println(“día incorrecto”);
}
Ejemplo: día hábil
2. Escriba un a sentencia switch para desplegar el letrero “día
habil” si una variable diaSemana vale de 1 a 5, desplegar
“sabado” si vale 6 y “domingo” si vale 0.
switch (dia){
case 0:System.out.println(“Domingo”); break;
case 1:case 2:case 3:case 4:case 5:
System.out.println(“día hábil”); break;
case 6:System.out.println(“Sabado”); break;
default:System.out.println(“día incorrecto”);
}
Ejemplo: pago horas extra
Escriba un sentencia switch para calcular el pago de horas extra a un trabajador.
Si las horas son entre semana se le pagará el doble por hora extra, si es el sábado el triple y si
es domingo el cuádruple.
Suponga las variables horas, para las horas, dia para el día de la semana, pagoPorHora
para el pago por hora normal y pagoTotal para el pago total.
switch (dia){
case 0:pagoTotal = 4*pagoPorHora*horas; break;
case 1:case 2:case 3:case 4:case 5:
pagoTotal = 2*pagoPorHora*horas; break;
case 6:pagoTotal = 3*pagoPorHora*horas;
}
if(dia == 0)
pagoTotal = 4*pagoPorHora*horas;
if(dia == 1 || dia == 2 || dia==3 || dia == 4 || dia == 5)
pagoTotal = 2*pagoPorHora*horas;
if(dia == 6)
pagoTotal = 3*pagoPorHora*horas;
V.2 Sentencia “Switch”
Veamos un ejemplo usando la sentencia “switch” y el complemento de “break” o su falta del
mismo: Import javabook.*;
La ejecución
Su ejecución
tomando
será:
la serie de valores:
public class ejemswicth {
1,2,3,4,5,6,7,8,9 será
public static void main(String args[ ]){
Sí
t=2
resulta
SíSí
t=0
resulta
Sí
t=5resulta
t=1
resulta
Sí
t=3
Sí
t=7,
8ó ó6 9resulta
resulta
int t;
Ahora
SimpleInput teclado=new SimpleInput();
es
►►Ahora
►►
►►hagan
►►Ahora
►►el
t=teclado.getInteger(“Escriba un número “);
►►.
el
es
switch (t){
momento
para .......
momento
para
que
todos
los hombres
el
case 1: System.out.println("Ahora "); break;
momento para .......
case 2: System.out.println(" es ");
El
caso
de t=4 es idéntico a t=0
case 3: System.out.println("el");
el momento para que todos los
System.out.println(" momento para que todos los hombres\n");break;
hombres
case 5:
case 6: System.out.println("hagan ");break;
case 7:
hagan
case 8:
hagan
case 9: System.out.print(".");
.
} // switch
.
} // main
} // class
.
V.2 Sentencia “Switch”
Usando la sentencia
“switch” podemos reescribir
el programa de conversión
octal, binario y hexadecimal
como:
import javabook.*;
public class converter {
public static void main(String args[]) {
SimpleInput disp=new SimpleInput();
int opcion, valor; String res;
System.out.println(" CONVERTIDOR DE ENTERO A: ");
System.out.println(" -------------------------");
System.out.println(" 1) DECIMAL A HEXADECIMAL ");
System.out.println(" 2) DECIMAL A OCTAL
");
System.out.println(" 3) DECIMAL A BINARIO ");
System.out.println(" ------------------------ ");
opcion=disp.getInteger("Escriba su opción: ");
valor=disp.getInteger("Dé el valor a convertir: ");
switch (opcion) {
case 1: res=Integer.toHexString(valor);
System.out.println("Número "+valor+" a Hexadecimal "+res); break;
case 2: res=Integer.toOctalString(valor);
System.out.println("Número "+valor+" a Octal "+res); break;
case 3: res=Integer.toBinaryString(valor);
System.out.println("Número "+valor+" a Binario "+res); break;
} // switch
} // main
} //classs
Actividad
Se requiere calcular el valor de los primeros
polinomios de Legendre, los cuales se definen como:
cinco
P0  x   1
P1  x   x
P2  x  
3 2 1
x 
2
2
5
3
P3  x   x 3  x
2
2
35 4 15 2 3
P4  x  
x  x 
8
4
8
Escriba un programa en Java que lea el valor de x y un valor
n de 0 a 4 y evalúe el polinomio de Legendre adecuado.
Escriba una sentencia switch para este programa, si el valor
de n está fuera de rango, envíe el mensaje adecuado.