lunes, 7 de diciembre de 2020

3.2 ESTRUCTURA CONDICIONAL, ALTERNATIVA O SELECTIVA

Es una de las estructuras que permiten modificar el orden de ejecución de las instrucciones del programa.

Una estructura condicional determina si se ejecutan unas acciones u otras según se cumpla o no una determinada condición.
 
La condición que se comprueba para decidir si unas instrucciones se ejecutan o no debe ser una expresión booleana es decir debe dar como resultado un valor booleano true ó false.

En java la estructura condicional se implementa mediante:
  • Instrucción if.
  • Instrucción switch.
  • Operador condicional ? :
2.1 INSTRUCCION if

La instrucción condicional if puede ser de tres tipos::
  • Condicional simple: if
  • Condicional doble: if ... else ...
  • Condicional múltiple o if anidados: if .. else if ..
Estructura Condicional simple 
Como su nombre indica, es la estructura condicional más sencilla en Java. La usaremos para decidir si una instrucción o bloque de instrucciones se ejecuta o no dependiendo de una condición. Se evalúa la condición y si se cumple se ejecuta. Si no se cumple la condición, se salta dicho grupo de instrucciones.


Sintaxis:

   
instrucción 1;
instrucción 2;
if(condición){    //inicio de la condición
   instrucción 3;
   instrucción 4;
}                 //fin de la condición
instrucción 5;
instrucción 6;


 
 
 
 
 
 
En este caso se ejecutan las instrucciones 1 y 2 y a continuación se evalúa la condición. Si se cumple, se ejecutan las instrucciones 3 y 4 y a continuación la 5 y 6. Si la condición no se cumple, las instrucciones 3 y 4 no se ejecutan, siguiendo la ejecución del programa por las instrucciones 5 y 6.
Ejemplo de programa Java con estructura condicional: Programa que pide que se introduzca una nota por teclado y muestra dos mensajes si la nota es mayor o igual a 5.
/*
 * Programa que pide una nota por teclado y muestra dos mensajes si la nota es                                    
 * mayor o igual que 5
 */
import java.util.*;
public class CondicionalSimple1 {
    public static void main( String[] args ){
        Scanner sc = new Scanner( System.in );
        System.out.print("Nota: ");
        int nota = sc.nextInt();
        if (nota >= 5){//----------------------inicio de la condición                                             
            System.out.println("Enhorabuena!!");
            System.out.println("Has aprobado");
        }//-------------------------------------fin de la condición
        System.out.println("Hasta Pronto!");
    }
}
En este ejemplo si se introduce un número >= 5 el programa mostrará:
Enhorabuena!!     
Has aprobado
Hasta Pronto! 
Si introducimos un valor < 5 el programa mostrará:
Hasta Pronto! 
Si un bloque de instrucciones contiene una sola instrucción no es necesario escribir las llaves { } aunque para evitar confusiones se recomienda escribir las llaves siempre.
Supongamos que en el ejemplo anterior la instrucción if la escribimos así:
        if (nota >= 5){//----------------------inicio de la condición
            System.out.println("Enhorabuena!!");
        }//-------------------------------------fin de la condición
Como el bloque de instrucciones dentro del if ahora solo contiene una instrucción, las llaves se pueden omitir. En ese caso el programa quedaría así:
/*
 * Programa que pide una nota por teclado y muestra un mensaje si la nota es                                      
 * mayor o igual que 5
 */
import java.util.*;
public class CondicionalSimple1 {
    public static void main( String[] args ){                                                                     
        Scanner sc = new Scanner( System.in );
        System.out.print("Nota: ");
        int nota = sc.nextInt();
        if (nota >= 5)
            System.out.println("Enhorabuena!!");                                                                  
        System.out.println("Hasta Pronto!");
    }
}
Ahora si se introduce un número >= 5 el programa mostrará:
Enhorabuena!!
Hasta Pronto!
Si introducimos un valor < 5 mostrará:
Hasta Pronto!
No escribir las llaves en estos casos puede conducir a un código confuso de entender por lo que es siempre recomendable escribir las llaves incluso en los casos en los que no sea necesario.
Ten en cuenta que el código no es obligatorio escribirlo con ese formato en el que las instrucciones están tabuladas. Aunque no es un buen estilo de programación, se podría hacer escrito así:
if (nota >= 5)                                                                            
System.out.println("Enhorabuena!!");                                                                              
System.out.println("Hasta Pronto!");                                                                              
Escribiéndolo así puede llevar a confusion al no estar claro a simple vista donde comienza el bloque if y donde acaba. Por eso es recomendable escribir las llaves siempre.
 
Estructura Condicional Doble

Mediante esta estructura de control el flujo de ejecución del programa puede seguir dos caminos distintos dependiendo del valor de una condición.

Se evalúa la condición y si se cumple se ejecuta una determinada instrucción o grupo de instrucciones. Si no se cumple se ejecuta otra instrucción o grupo de instrucciones.
 

 
Sintaxis en Java:

         


En este caso se ejecutan las instrucciones 1 y 2 y a continuación se evalúa la condición. Si se cumple, se ejecutan las instrucciones 3 y 4. Si la condición no se cumple se ejecutan las instrucciones 5 y 6. En ambos casos el programa continuará su ejecución por las instrucciones 7 y 8.

Ejemplo: Programa que lee una nota por teclado y muestra un mensaje indicando si se ha aprobado o no. Si la nota es >= 5 mostrará los mensajes:
Enhorabuena!!     
Has aprobado
Si la nota es < 5 mostrará el mensaje: 
Lo siento, has suspendido   
/*
 * Programa que pide una nota por teclado y muestra si se ha aprobado o no
 */
import java.util.*;
public class EjemploIfElse {
    public static void main( String[] args ){                                                                     
        Scanner sc = new Scanner( System.in );
        System.out.print("Nota: ");
        int nota = sc.nextInt();
        if (nota >= 5){ 
            System.out.println("Enhorabuena!!");
            System.out.println("Has aprobado");
        } else {
            System.out.println("Lo siento, has suspendido");                                                      
        }
        System.out.println("Hasta Pronto!");
    }
}
Ejemplo: programa que lee un número entero por teclado y muestra un mensaje indicando si el número es par o impar.

/*
 * Programa que pide un número por teclado y muestra si es par o impar                                            
 */
import java.util.*;
public class EjemploIfElse2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num;
        System.out.print("Introduzca un número entero: ");                                                        
        num = sc.nextInt();
        if (num % 2 == 0) {
            System.out.println("PAR");
        } else {
            System.out.println("IMPAR");
        }
    }
}

Ejemplos de ejecución:

Ejemplo 1
Introduzca un número entero: 3     
IMPAR 
Ejemplo 2 
Introduzca un número entero: 214     
PAR
Estructura Condicional Múltiple: if anidados 

La estructura condicional múltiple se obtiene encadenando sentencias if ... else.

Mediante esta estructura podemos construir estructuras de selección más complejas.

Un ejemplo de if múltiple expresado en diagrama de flujo puede ser este:




Sintaxis en Java:
Cada else se corresponde con el if más próximo que no haya sido emparejado.
Una vez que se ejecuta un bloque de instrucciones, la ejecución continúa en la siguiente instrucción que aparezca después de estructura condicional múltiple.

Ejemplo de programa Java que contiene una estructura condicional múltiple: Programa que lee una hora (número entero) y muestra un mensaje según la hora introducida corresponda a la mañana, la tarde o la noche.
//Programa que muestra un saludo distinto según la hora introducida
import java.util.*;
public class EjemploIfAnidados {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int hora;
        System.out.print("Introduzca una hora (>= 0 y <= 23): ");                                                 
        hora = sc.nextInt();
        if (hora >= 0 && hora < 12) {
            System.out.println("Buenos días");
        } else if (hora >= 12 && hora < 21) {
            System.out.println("Buenas tardes");
        } else if (hora >= 21 && hora < 24) {
            System.out.println("Buenas noches");
        } else {
            System.out.println("Hora no válida");
        }
        System.out.println("Hasta pronto!!!");                                                                    
    }
}
Cuatro ejemplos de ejecución del programa:
Introduzca una hora (>= 0 y <= 23): 6   
Buenos días
Hasta pronto!!!
Introduzca una hora (>= 0 y <= 23): 21  
Buenas noches
Hasta pronto!!!
Introduzca una hora (>= 0 y <= 23): 25
Hora no válida
Hasta pronto!!!
Introduzca una hora (>= 0 y <= 23): 13
Buenas tardes
Hasta pronto!!!
En estos ejemplos podemos comprobar que una vez que se ejecuta una de las instrucciones dentro del bloque de if anidados, la ejecución del programa continúa en la siguiente instrucción a continuación del bloque de if anidados, en este caso la ejecución sigue por la instrucción
System.out.println("Hasta pronto!!!");
Ejemplo de programa Java que contiene una estructura condicional múltiple:

Programa que pide que se introduzca un valor numérico de tipo double correspondiente a la nota de un alumno en una determinada asignatura y muestra un texto con la calificación equivalente de la siguiente forma:

Si la nota es menor que 5 muestra “Suspenso”

Si la nota es mayor o igual que 5 y menor que 6 muestra “Suficiente”

Si la nota es mayor o igual que 6 y menor que 7 muestra “Bien”

Si la nota es mayor o igual que 7 y menor que 9 muestra “Notable”

Si la nota es mayor o igual que 9 y menor que 10 muestra “Sobresaliente”

Si la nota es igual a 10 muestra “Matrícula de honor”

Si la nota es menor que 0 o mayor que 10 mostrará el mensaje “Nota no válida”

// programa que lee una nota y escribe la calificación correspondiente
import java.util.*;
public class EjemploIfAnidados2 {
    public static void main(String[] args) {                                                                      
        Scanner sc = new Scanner(System.in);
        double nota;
        System.out.println("Introduzca una nota entre 0 y 10: ");
        nota = sc.nextDouble();
        System.out.println("La calificación del alumno es ");
        if (nota < 0 || nota > 10) {
            System.out.println("Nota no válida");
        } else if (nota == 10) {
            System.out.println("Matrícula de Honor");
        } else if (nota >= 9) {
            System.out.println("Sobresaliente");
        } else if (nota >= 7) {
            System.out.println("Notable");                                                                        
        } else if (nota >= 6) {
            System.out.println("Bien");
        } else if (nota >= 5) {
            System.out.println("Suficiente");
        } else {
            System.out.println("Suspenso");
        }
    }
}
Errores comunes que se suelen cometer en las instrucciones if

1. Escribir un punto y coma al final de la condición:

if (nota >= 6);

        System.out.println("Notable");

 

En este caso el mensaje "Notable" saldrá siempre. El if termina en el  ;

2. Escribir elseif en lugar de else if

elseif (nota >= 5)

        System.out.println("Suficiente");

3. Usar = en lugar de   ==   en las comparaciones

if (nota=10)

    System.out.println("Matrícula de Honor");

4. Errores al comparar dos String

No se deben usar los operadores relacionales ==, >, <, <= , etc.

if(cadena1 == cadena2){ //Comparación no válida de 2 String

Comparar dos String en java 

Para comprobar si dos String son iguales se debe usar el método equals:

if (cadena1.equals(cadena2))

Si lo que queremos es comprobar si dos cadenas son iguales sin tener en cuenta mayúscula o minúscula se usa el método equalsIgnoreCase:

if (cadena1.equalsIgnoreCase(cadena2))

Para comparar dos cadenas en el orden alfabético se usa el método compareTo

El método compareTo compara las dos cadenas alfabéticamente y devuelve un valor entero con el resultado de la comparación de la siguiente forma:

  • Devuelve 0 si las dos cadenas son iguales.
  • Devuelve un valor < 0 si la primera cadena es alfabéticamente menor que la segunda.
  • Devuelve un valor > 0 si la primera cadena es alfabéticamente mayor que la segunda.

Ejemplos de uso:

Suponiendo que cadena1 y cadena2 son de tipo String y ambas contienen una cadena de caracteres, podemos compararlas de varias formas según necesitemos:

if(cadena1.compareTo(cadena2) < 0) //si la condición se cumple significa que

                                   //cadena1 es alfabéticamente menor que cadena2

if(cadena1.compareTo(cadena2) > 0) //si la condición se cumple significa que

                                   //cadena1 es alfabéticamente mayor que cadena2

if(cadena1.compareTo(cadena2) == 0)  //si la condición se cumple significa que

                                     //cadena1 es igual que cadena2

if(cadena2.compareTo(cadena1) > 0)  //si la condición se cumple significa que

                                    //cadena2 es alfabéticamente mayor que cadena1

if(cadena2.compareTo(cadena1) < 0)  //si la condición se cumple significa que

                                    //cadena2 es alfabéticamente menor que cadena1

Para comparar Strings en el orden alfabético sin tener en cuenta mayúsculas o minúsculas se usa el método compareToIgnoreCase

if(cadena1.compareToIgnoreCase(cadena2) > 0) 

En este saso, si la condición se cumple significa que cadena 1 es alfabéticamente mayor que cadena2  sin importar que los caracteres en ambas cadenas estén en mayúsculas o en minúsculas.

2.2 INSTRUCCION switch

Esta estructura de control se utiliza para seleccionar una de entre múltiples opciones posibles. Es una alternativa a los if .. else anidados. Si el número de anidamientos if .. else es elevado, la estructura switch produce un código más sencillo de leer y modificar.

El flujo de ejecución del programa lo determina el valor de una variable o expresión.

El tipo de esta variable o expresión puede ser uno de los siguientes:

  • Tipo primitivo: byte, short, char, int.
  • La clase envolvente de los tipos primitivos anteriores: Byte, Short, Character, Integer.
  • Tipo String.
  • Tipos enumerados (enum). 

La instrucción switch no permite que la variable o expresión sea del tipo float o double.

La sintaxis general de una estructura switch es la siguiente:

switch (expresión){

case VALOR1:

           instrucciones1;

           break;

case VALOR2:

           instrucciones2;

           break;

.....

default:

           instrucciones3;

}

Funcionamiento de la instrucción switch:

  • Primero se evalúa la expresión y salta al case cuyo valor coincida con el valor de la expresión.
  • Se ejecutan las instrucciones que contiene el case seleccionado hasta que se encuentra un break o hasta el final del switch. El break produce un salto y la ejecución continúa por la siguiente instrucción a continuación del switch.
  • Si el valor de la expresión no coincide con ningún case se ejecuta el bloque default.

El bloque default es opcional por lo tanto no es obligatorio que exista siempre un bloque default en un switch. El bloque default suele escribirse de forma habitual al final del switch a continuación de todos los case pero no es obligatorio escribirlo al final, puede aparecer en cualquier lugar.

Los valores que aparecen en los case deben ser únicos. No puede haber dos case con el mismo valor.

El valor de un case no puede ser una variable. Debe ser un literal o una constante (variables declaradas como final).

Ejemplo de switch: programa que lee por teclado un número de mes y muestra el nombre de mes correspondiente.
//Programa que pide un número de mes y muestra 
//el nombre de mes correspondiente
import java.util.*;
public class EjemploSwitch {
    public static void main(String[] args) {
        int mes;
        Scanner sc = new Scanner(System.in);
        System.out.print("Introduzca un numero de mes: ");                                                        
        mes = sc.nextInt();
        switch (mes) {  //inicio del switch
                case 1: System.out.println("ENERO");
                        break;
                case 2: System.out.println("FEBRERO");
                        break;
                case 3: System.out.println("MARZO");
                        break;
                case 4: System.out.println("ABRIL");
                        break;
                case 5: System.out.println("MAYO");
                        break;
                case 6: System.out.println("JUNIO");
                        break;
                case 7: System.out.println("JULIO");
                        break;
                case 8: System.out.println("AGOSTO");
                        break;
                case 9: System.out.println("SEPTIEMBRE");
                         break;
                case 10: System.out.println("OCTUBRE");
                         break;
                case 11: System.out.println("NOVIEMBRE");                                                         
                         break;
                case 12: System.out.println("DICIEMBRE");
                         break;
                default : System.out.println("Mes no válido");                        
        }  //fin del switch
    }
}

Ejemplo de switch: programa que lee por teclado un String correspondiente al nombre de un mes y muestra el número de días que tiene.

// Programa que pide un nombre de mes y muestra el número de días correspondiente                                 
import java.util.Scanner;
public class Ejemplo2Switch {
    public static void main(String[] args) {
        String mes;
        Scanner sc = new Scanner(System.in);
        System.out.print("Introduzca un nombre de mes: ");
        mes = sc.nextLine();
        switch (mes.toUpperCase()) {
            case "ENERO":
                System.out.println("31 DÍAS");
                break;
            case "FEBRERO":
                System.out.println("28 ó 29 DÍAS");
                break;
            case "MARZO":
                System.out.println("31 DÍAS");
                break;
            case "ABRIL":
                System.out.println("30 DÍAS");
                break;
            case "MAYO":
                System.out.println("31 DÍAS");                                                                    
                break;
            case "JUNIO":
                System.out.println("30 DÍAS");
                break;
            case "JULIO":
                System.out.println("31 DÍAS");
                break;
            case "AGOSTO":
                System.out.println("31 DÍAS");
                break;
            case "SEPTIEMBRE":
                System.out.println("30 DÍAS");
                break;
            case "OCTUBRE":
                System.out.println("31 DÍAS");
                break;
            case "NOVIEMBRE":
                System.out.println("30 DÍAS");
                break;
            case "DICIEMBRE":
                System.out.println("31 DÍAS");                                                                    
                break;
            default:
                System.out.println("Mes no válido");
        }
    }
}

Un case puede contener además de instrucciones que se ejecuten en secuencia, otras instrucciones como condiciones o bucles o incluso otro switch.

Ejemplo: programa que pide por teclado dos números enteros y un operador +, -, *, / y realiza y muestra el resultado de la operación según el operador introducido. Si se introduce el operador división, se comprueba si el divisor es cero, en ese caso la división no se puede realizar y se muestra un mensaje indicándolo.

//Programa que pide dos números y un operador y muestra el resultado de la operación                              
import java.util.*;
import java.io.*;
public class Ejemplo3Switch {
    public static void main(String[] args) throws IOException{
        int A,B, Resultado = 0 ;
        char operador;
        boolean calculado = true;
        Scanner sc = new Scanner(System.in);
        System.out.print("Introduzca un numero entero:");
        A = sc.nextInt();
        System.out.print("Introduzca otro numero entero:");
        B = sc.nextInt();
        System.out.print("Introduzca un operador (+,-,*,/):");                                                    
        operador = (char)System.in.read();
        switch (operador) {
                case '-' : Resultado = A - B;
                           break;
                case '+' : Resultado = A + B;
                           break;
                case '*' : Resultado = A * B;
                           break;
                case '/' : if(B!=0){
                              Resultado = A / B; 
                           }else{
                              System.out.println("\nNo se puede dividir por cero");                               
                              calculado = false;
                           }
                           break;
                default : System.out.println("\nOperador no valido");
                          calculado = false;               
        }
        if(calculado){
            System.out.println("\nEl resultado es: " + Resultado);                                                
        }
    }
}

Si una misma instrucción o bloque de instrucciones se tienen que ejecutar para distintos valores, en ese caso podemos escribir case multiples. Esto consiste en escribir varias instrucciones case seguidas.

Ejemplo de switch con case multiples: programa que pide introducir por teclado un número entero entre 1 y 7 correspondiente a un día de la semana y muestra un mensaje indicando si ese día hay clase de programación o no.

import java.util.*;
public class Ejemplo4Switch {
    public static void main(String[] args) {                                                                      
        int numeroDia;
        Scanner sc = new Scanner(System.in);
        System.out.print("Introduzca el numero del día de la semana (1 a 7): ");
        numeroDia = sc.nextInt();
        switch (numeroDia){
                case 1:  
                case 3: 
                case 5: System.out.println("Tenemos clase de programación");
                        break;
                case 2:
                case 4: System.out.println("Vaya, que pena");
                        System.out.println("Hoy no tenemos clase de programación");                               
                        break;
                case 6:
                case 7: System.out.println("Estoy deseando que llegue el lunes!!"); 
                        break;
                default : System.out.println("Número de día no válido");                                          
        }
    }
}

En este programa si se introduce por ejemplo un 1 como número de día, la ejecución pasará al case 1 y comienza a ejecutar las instrucciones que encuentre desde ahí hacia abajo hasta encontrar un break.

Es importante entender que una vez que la ejecución del programa entra en uno de los case, el programa sigue ejecutándose desde ese punto hasta que encuentre el primer break (estén dentro del mismo case o no) o hasta que se llegue al final del switch en cuyo caso continuará por la instrucción que se encuentre a continuación del switch.

Ejemplo: programa que pide un valor entero por teclado entre 1 y 6 y realiza una serie de operaciones con él dependiendo de su valor inicial.

import java.util.*;
public class Ejemplo5Switch {
    public static void main(String[] args) {
        int x, y = 10;
        Scanner sc = new Scanner(System.in);
        System.out.print("Introduzca un número >= 1 y <= 6: ");                                                   
        x = sc.nextInt();
        switch (x){
                case 1: x--;
                case 2: x+=5;
                case 3: x = x + y;
                        break;
                case 4:
                case 5: 
                case 6: x++;
                        break;
                default : System.out.println("Número no válido");                                                 
        }
        System.out.println("x = " + x);
    }
}

Si en este programa se introduce un 1 como valor para la x, en el switch se entrará en el case 1 y se ejecutarán todas las instrucciones hacia abajo hasta encontrar un break, es decir, si x es un 1 se ejecutan las instrucciones:

x--;

x+=5;

x = x + y;

Siete ejemplos de ejecución de este programa:

Introduzca un número >= 1 y <= 6: 1  
x = 15
Introduzca un número >= 1 y <= 6: 2  
x = 17
Introduzca un número >= 1 y <= 6: 3  
x = 13
Introduzca un número >= 1 y <= 6: 4  
x = 5
Introduzca un número >= 1 y <= 6: 5  
x = 6
Introduzca un número >= 1 y <= 6: 6  
x = 7
Introduzca un número >= 1 y <= 6: 0  
Número no válido
x = 0

3.3 OPERADOR CONDICIONAL ? :

El operador condicional se puede utilizar en sustitución de la instrucción condicional if-else.

Lo forman los caracteres  ?  y  :

Sintaxis:

expresión1 ? expresión2 : expresión3

Si expresión1 es cierta entonces se evalúa expresión2 y éste será el valor que devuelve el operador. Si expresión1 es falsa, se evalúa expresión3 y éste será el valor que devuelve el operador.

Ejemplo: programa que pide por teclado un número entero y muestra si es positivo o negativo. Consideramos el cero como positivo.

import java.util.Scanner;
public class OperadorCondicional {
    public static void main(String[] args) {                                                                      
        Scanner sc = new Scanner(System.in);
        int num;
        System.out.println("Introduzca numero: ");
        num = sc.nextInt();
        System.out.println(num >= 0 ? "POSITIVO" : "NEGATIVO");                                                   
    }
}

En el ejemplo, la instrucción:

System.out.println(num >= 0 ? "POSITIVO" : "NEGATIVO");  

Es equivalente a escribir esto:

if(num >= 0){
   System.out.println("POSITIVO");          
}else{
   System.out.println("NEGATIVO");
}

Ejemplo: programa que pide por teclado un número entero y muestra si es par o impar.

import java.util.*;
public class Ejemplo1OperadorCondicional2 {                                                                       
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num;       
        System.out.println("Introduzca numero: ");
        num = sc.nextInt();
        System.out.println(num%2 == 0 ? "PAR" : "IMPAR");                                                         
    }
}

En el ejemplo, la instrucción:

System.out.println(num%2 == 0 ? "PAR" : "IMPAR");  

Es equivalente a escribir esto:

if(num%2 == 0){
   System.out.println("PAR");
}else{
   System.out.println("IMPAR");     
}
TAREA 18: LENGUAJE DE PROGRAMACIÓN I (JAVA).
1.- ESCRIBIR EN LA LIBRETA UN RESUMEN DEL TEMA ANTERIOR (MEDIA CUARTILLA).

2.- ESCRIBIR EL EJEMPLO EN LA LIBRETA
.





No hay comentarios.:

Publicar un comentario