Capítulo 5. Estructura de control alternativa. 1. Introducción. 2. Estructura alternativa simple. 3. Estructura alternativa doble. 4. Estructura alternativa múltiple. 5. Anidamiento de alternativas. 1 1. Introducción. Además de la estructura secuencial, vista en el tema anterior, en la programación estructurada puede emplearse la estructura de control alternativa. Con la estructura alternativa se puede hacer que unas determinadas sentencias de un programa se ejecuten sólo cuando se cumpla una determinada condición. Ya sabemos que una condición es una expresión booleana, es decir que puede tomar solamente valor verdadero o falso. También se ha mencionado que en C cualquier expresión puede ser una condición, ya que si la expresión vale 0 es tomada como falsa, y si no vale cero es verdadera. Veamos los tres tipos de estructuras alternativas. 2. Estructura alternativa simple. En pseudocódigo, esta estructura se escribe de la forma: ... si (condición) Sentencia1 Sentencia2 ... finsi ... La condición será una expresión booleana, es decir con valor verdadero o falso. Si la condición es verdadera, se ejecutan las sentencias colocadas entre si y finsi. Si la condición es falsa, esas sentencias no se ejecutan. La ejecución del programa continuará, en cualquier caso, con las sentencias que haya debajo del finsi. En C, la sintaxis de esta estructura es: ... if (condición) { Sentencia1; Sentencia2; ... } //equivale al finsi del pseudocódigo. Ej. scanf(“%d”, &nota); fflush(stdin); if (nota >= 5) { printf(“Aprobado”); } 2 No debe olvidarse que una condición puede ser compuesta, utilizando los operadores lógicos && (AND) y || (OR), enlazando en una misma condición dos o más expresiones relacionales. Ej. scanf(“%d”, &nota); fflush(stdin); if (nota >= 5 && nota <= 10) { printf(“Aprobado”); } 2. Estructura alternativa doble. En pseudocódigo, esta estructura se escribe de la forma: ... si (condición) Sentencia1 Sentencia2 ... sino Sentencia3 Sentencia4 ... finsi ... Si la condición es verdadera, se ejecutan las sentencias colocadas entre si y sino. Si la condición es falsa, se ejecutan las sentencias colocadas entre sino y finsi. La ejecución del programa continuará, en cualquier caso, con las sentencias que haya debajo del finsi. En C, la sintaxis de esta estructura es: ... if (condición) { Sentencia1; Sentencia2; ... } else { Sentencia3; Sentencia4; ... } Ej. scanf(“%d”, &numero); fflush(stdin); if (numero % 2 == 0) { 3 printf(“El número %d es par.”, numero); } else { printf(“El número %d es impar.”, numero); } Como se ha comentado en el tema anterior, en C existe el operador ?, cuya función es asignar a una variable una expresión u otra dependiendo de si una condición es verdadera o falsa. Ej. scanf(“%d”, &nota); fflush(stdin); pasa_curso = (nota >= 5) ? ‘S’: ‘N’; Que equivale a: if (nota >= 5) { pasa_curso = ‘S’; } else { pasa_curso = ‘N’; } 2. Estructura alternativa múltiple. En pseudocódigo, esta estructura se escribe de la forma: ... opción (expresión) caso (valor1) Sentencia1 Sentencia2 ... caso (valor2) Sentencia3 Sentencia4 ... ... caso (valorN) SentenciaN1 SentenciaN2 ... otrocaso SentenciaO1 SentenciaO2 ... finopción 4 ... En esta alternativa, se calcula el valor de la expresión, y se ejecutarán las sentencias dentro del caso cuyo valor coincida con el de la expresión. Sólo vale para el caso de igualdad entre expresión y valor. Si ningún valor coincide con el resultado de la expresión, se ejecutan las sentencias de otrocaso. De cualquier manera, la ejecución del programa continúa por las sentencias que estén debajo de finopción. En C, la sintaxis de esta estructura es: ... switch (expresión) { case constante-1: Sentencia1; Sentencia2; ... break; case constante-2: Sentencia3; Sentencia4; ... break; ... case constante-N: SentenciaN1; SentenciaN2; ... break; default: //Este caso, default, es opcional. SentenciaD1; SentenciaD2; ... } ... Al final de cada case debe ponerse la sentencia break, aunque no es obligatoria. Si no se pone, se seguirá comprobando si la expresión coincide con algún otro case debajo del que se esté ejecutando. La sentencia break hace que se salga de la estructura completa, continuando la ejecución del programa debajo de la llave cerrada }. Las constantes pueden ser enteras o de caracteres, pero no reales ni cadenas. La sentencia default es opcional. Cuando la expresión no ha coincidido con ninguna constante, se ejecutarán las sentencias de default, si es que existe. Ej. opcion = getche(); switch (opcion) 5 { case ‘A’: printf(“Altas”); hacer_altas(); break; case ‘B’: printf(“Bajas”); hacer_bajas(); break; case ‘C’: printf(“Consultas”); hacer_consultas(); break; case ‘S’: printf(“Salir”); break; default: printf(“Opción errónea.”); } También se pueden usar los case de la siguiente manera: scanf(“%d”, &nota); fflush(stdin); switch (nota) { case 1: case 2: printf(“Muy deficiente”); break; case 3: case 4: printf(“Insuficiente”); break; case 5: printf(“Suficiente”); break; case 6: printf(“Bien”); break; case 7: case 8: printf(“Notable”); break; case 9: case 10: printf(“Sobresaliente”); break; default: printf(“Nota incorrecta”); } En ese ejemplo, sólo funciona para notas enteras, no reales. 6 Con estructuras alternativas dobles anidadas puede implementarse la estructura alternativa múltiple. Así podrá usarse no sólo para la igualdad entre expresión y constante, sino para cualquier condición. Además también podrá implementarse para valores reales y cadenas. Ej. scanf(“%f”, &nota); fflush(stdin); if (nota >= 0 && nota < 5) { printf(“Suspenso”); } else { if (nota >= 5 && nota < 6) { printf(“Suficiente”); } else { if (nota >= 6 && nota < 7) { printf(“Bien”); } else { if (nota >= 7 && nota < 9) { printf(“Notable”); } else { if (nota >= 9 && nota <= 10) { printf(“Sobresaliente”); } else { printf(“Nota incorrecta”); } } } } } 5. Anidamiento de alternativas. La estructura alternativa es una sentencia más, aunque ocupe más de una línea de programa. En todos los puntos previos etiquetados con sentencia puede colocarse una sentencia alternativa, con lo que puede quedar una alternativa dentro de otra, lo que se llama anidamiento, como se ha hecho en el último ejemplo. 7 El anidamiento puede darse repetidamente, profundizando más de dos niveles. Para no cometer errores sintácticos al anidar estructuras, es importante cerrar la estructura interior antes de continuar con la estructura exterior. Por ejemplo: if (...) { Sentencia1; Sentencia2; ... } else { Sentencia3; Sentencia4; ... } En ese ejemplo genérico, cualquiera de las sentencias podría ser otra alternativa, simple, doble o múltiple. Si Sentencia1 fuera una alternativa doble, se escribiría: if (...) { // Desde aquí if (...) { Sentencia10; Sentencia11; ...; } else { Sentencia12; Sentencia13; ...; } // Hasta aquí ocupaba la Sentencia1. Sentencia2; ... } else { Sentencia3; Sentencia4; ... } 8 EJERCICIOS - CAPITULO 5: Realizar los siguientes algoritmos en pseudocódigo y en C. 1. Teclear dos nombres y visualizarlos de mayor a menor. 2. Teclear 4 números enteros y visualizar si son pares o impares en columnas. 3. Teclear 3 nombres y sus 3 edades y visualizarlos del mayor al menor en columnas, es decir un nombre y su edad en cada fila. 4. Teclear un año (4 dígitos) y visualizar si es bisiesto, es decir: divisible por 4 y no por 100; o si lo es por 4 y 100, que también lo sea por 400. 5. Teclear 5 números reales y visualizar cuántos son positivos, negativos y ceros. Visualizar también la media de los positivos y de los negativos. 6. Teclear nota y visualizar a qué corresponde: “Muy Deficiente”, “Insuficiente”, “Suficiente”, “Bien”, “Notable”, “Sobresaliente” y “Nota Incorrecta”. 7. Diseñar un menú con las 5 opciones: 1.-(A)ltas, 2.-(B)ajas, 3.(M)odificaciones, 4.-(C)onsultas, 5.-(S)alir. Visualizar la palabra correspondiente a la opción que teclee el usuario. Una opción se podrá elegir con el número (de 1 a 5) o con su letra inicial (‘A’, ‘B’, ‘M’, ‘C’ o ‘S’). 9