MIGUEL Á. TOLEDO MARTÍNEZ CONTENIDO DE LA LECCIÓN 9 TOMA DE DECISIONES 1. Introducción 2. Estructuras de control 2.1. El enunciado if (básico) 2.2. Formato del enunciado if 2.2.1.Ejemplos 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7 2.3. Examen breve 19 2.4. El enunciado if/else 2.5. Formato del enunciado if/else 2.5.1. Ejemplos 8.8, 8.9, 8.10 2.6. Enunciados compuestos utilizados con if/else 2.7. 2.8. 2.9. 2.10. 2.11. 2.12. 2.13. 2.14. 2.15. 2.16. 3 4 5 45 9 10 11 13 2.6.1. Ejemplos 8.11, 8.12 13 Examen breve 20 Enunciados if anidados Ejemplos 8.13, 8.14 El enunciado if/else de alternativa múltiple 45 14 17 18 2.10.1. Ejemplos 8.15, 8.16, 8.17 19 Declaración de variables dentro de un enunciado compuesto Problemas potenciales con el enunciado if Examen breve 21 El enunciado switch Formato del enunciado switch La opción default 20 21 46 22 23 2.16.1. Ejemplos 8.18 y 8.19, 8.20, 8.21, 8.22, 8.23 2.17. Examen breve 22 3. Solución de problemas en acción: Programas manejadores de menús 3.1. 3.2. 3.3. 3.4. 2 2 Problema Definición del problema Planeación de la solución Codificación del programa 4. Lo que necesita saber 5. Preguntas y problemas 5.1. Preguntas 5.2. Problemas FUNDAMENTOS – LECCIÓN 8 26 27 46 32 32 32 32 35 38 38 39 42 8-1 MIGUEL Á. TOLEDO MARTÍNEZ LECCIÓN 9 TOMA DE DECISIONES INTRODUCCIÓN Conforme los programas se vuelven más complejos, requerirá que los mismos ejecuten un conjunto de enunciados cuando se satisfaga cierta condición y posiblemente otro conjunto si la condición es falsa. En otras palabras, deseará que sus programas tomen decisiones. Objetivos de esta lección: • • • • • • • Comparar valores para determinar si son iguales o bien uno es mayor o menor que el otro. Utilizar el enunciado if para tomar decisiones dentro de su programa. Utilizar enunciados simples y compuestos. Utilizar el enunciado if-else para ejecutar un conjunto de enunciados cuando la condición es verdadera y un segundo conjunto de enunciados si la condición es falsa. Combinar varios enunciados if-else para permitirle a su programa que pruebe varias alternativas. Utilizar los operadores AND y OR para verificar condiciones múltiples Utilizar el enunciado switch. Se dice que los programas que toman decisiones ejecutan procesos condicionados. ESTRUCTURAS DE CONTROL Desde el principio se estableció que C++ es un lenguaje de programación estructurado. Como lo inferirá más adelante, este tipo de lenguaje facilita la escritura, la verificación, la lectura, la documentación y el mantenimiento de los programas. Una razón princ ipal es la característica de modularidad de un lenguaje de programación estructurada. Por modularidad de programa se entiende que cualquier programa, sin importar qué tan complejo sea, puede dividirse en módulos de programas independientes más sencillos. De hecho, cualquier programa complejo puede separarse en módulos que conforman uno de los tres patrones fundamentales llamados estructuras de control. Una estructura de control es simplemente un patrón para controlar el flujo de un módulo de programa. Las tres estructuras de control fundamentales de un lenguaje de programación estructurado son: secuencia, selección (decisión) e iteración. En la figura 8.1 se muestra la primera. Como puede observar, no hay nada especial en ella porque los enunciados del programa se ejecutan en forma de secuencia, una después de otra, en línea recta. Esto se llama programación lineal y es lo que hemos hecho hasta este momento. enunciado 1 enunciado 2 enunciado n Figura 8.1. La estructura de control secuencial es una serie de enunciados secuenciales paso a paso. FUNDAMENTOS – LECCIÓN 8 8-2 MIGUEL Á. TOLEDO MARTÍNEZ Las otras dos estructuras de control, selección e iteración, permiten modificar el flujo del programa, dependiendo de una o más condiciones. La estructura de control selección se destina a la toma de decisiones. Se implementa en C++ con los enunciados if, if/else y switch. Estos son los temas de esta lección. La estructura de control iteración es una estructura de control de ciclo. Se implementa en C++ con los enunciados while, do/while y for. Estas operaciones se explicarán en la lección 9. Ahora, vamos a analizar los enunciados de control de selección disponibles en C++. EL ENUNCIADO if (básico) La lógica del enunciado if se ilustra en el diagrama de la figura 8.2. if verdadero (diferente de cero) Expresión de verificación enunciados if falso (cero) siguiente enunciado Figura 8.2. Flujo de la operación if. Observe que el flujo del programa se modifica, dependiendo del resultado de una expresión de verificación. La verificación if puede ser verdadera (diferente de cero) o falsa (cero) Recuerde que, durante una operación de verificación, C++ iguala un valor distinto de cero con verdadero y un valor cero con falso. Si la expresión de verificación es verdadera (diferente de cero), se ejecutan los enunciados if. Sin embargo, si el resultado de la verificación es falso (cero) se ignoran los enunciados if y el programa continúa el flujo. Esto se conoce como una operación de selección o toma de decisiones, porque el programa selecciona o decide entre una o dos posibles alternativas, dependiendo del resultado de las condiciones que se verifican. En resumen, la operación if se puede establecer en palabras como: si la verificación es verdadera, ejecuta los enunciados if. Esto implica que si la verificación es falsa, los enunciados if no se ejecutan. Antes de ver el formato C++ para el enunciado C++, veamos más de cerca la expresión de verificación, la cual tiene carácter condicional. Esto significa que se verifica una o más condiciones para generar un resultado de verdadero o falso. Por ejemplo, una verificación común es if(x == y) Aquí, la condición simple, x == y, se verifica. Si x es igual a y, el resultado de la verificación es verdadero, por lo tanto se ejecutan los enunciados if. Si x no es igual a y, los enunciados if se ignoran y se ejecuta el siguiente enunciado de la secuencia. FUNDAMENTOS – LECCIÓN 8 8-3 MIGUEL Á. TOLEDO MARTÍNEZ Para verificar condiciones múltiples, deberá usar los operadores lógicos booleanos de OR y AND. Por ejemplo, if((x != y) && (a < b)) verifica dos condiciones. Si x no es igual a y y si a es menor que b, el resultado de la verificación es verdadero, y se ejecutarán los enunciados if. Por otro lado, si x es igual a y o si a es mayor o igual a b, entonces se ignoran los enunciados if. El formato C++ para el enunciado if es el siguiente: FORMATO DEL ENUNCIADO if if (expresión de verificación) { enunciado 1; enunciado 2; ................... enunciado n; } // Fin de if // Enunciado compuesto Primero, observe la estructura general de este formato. La palabra if y su expresión de verificación asociados se escriben en la primera línea del enunciado; if es una palabra reservada en C++. La expresión de verificación sigue a la palabra reservada if y debe estar entre paréntesis. Después de la primera línea están los enunciados que se ejecutarán si la verificación es verdadera. Este bloque de enunciados se encierra entre llaves. Una llave izquierda, {, señala el inicio del bloque del enunciado, y una llave derecha, }, denota el final del bloque. Observe que la llave de inicio se coloca en una línea separada, directamente debajo de la palabra if o bien sangrado, como es nuestro caso. Además, siempre deberá sangrar todos los enunciados del bloque dos o tres espacios, a partir de la llave izquierda, para que el programa sea más legible (no es requerimiento de C++) Cuando esta estructura es parte de un programa complejo, no habrá dudas que el enunciado pertenece a la operación if. Cuando su programa usa el enunciado if, en algunas ocasiones deseará realizar un enunciado si la condición es verdadera y en otros casos deseará realizar un conjunto de enunciados si la misma es verdadera. Cuando su programa realiza únicamente un enunciado después del if, el enunciado se llama enunciado simple. Ejemplo: if (calificacion >= 90) cout << “¡Felicidades, obtuviste una A!” << endl; Cuando su programa requiere ejecutar varias instrucciones cuando una condición es verdadera, el conjunto de enunciados deben de agruparse entre llaves. Los enunciados que aparecen dentro de las llaves conforman un enunciado compuesto, como se muestra a continuación: if (calificacion >= 90) { cout << “¡Felicidades, obtuviste una A!” << endl; cout << “Tu calificación fue de: ” << calificacion << endl; } Cuando un enunciado compue sto se encuentra dentro de un programa C++, todo el grupo de enunciados se trata como un enunciado sencillo. Los enunciados compuestos siempre deberán estar encerrados entre llaves. Sin embargo, es opcional cuando hay solamente un enunciado sencillo dentro del bloque. FUNDAMENTOS – LECCIÓN 8 8-4 MIGUEL Á. TOLEDO MARTÍNEZ Por último, observe la sintaxis de puntuación del enunciado if. Observe que no hay punto y coma después de la expresión de verificación en la primera línea. Sin embargo, cada enunciado dentro del bloque de enunciados se termina con dicho signo. Probablemente sea una buena idea ver en este momento algunos ejemplos para captar el sentido de la operación if. Ejemplo 8.1 Determine la salida para cada uno de los siguientes segmentos de programa. Suponga que x y y tienen las siguientes asignaciones antes de la ejecución de cada operación if. x = 2; y = 3; a. if (x < y) { cout << “x = ” << x << endl; cout << “y = ” << y << endl; } // Fin del if b. if (x) cout << “El valor de x es diferente de cero. ” << endl; c. if (x < y) { temp = y; y = x; x = temp; cout << “x = ” << x << endl; cout << “y = ” << y << endl; } // Fin del if d. if ((x < y) && (y != 10)) { suma = x + y; cout << “x = ” << x << endl; cout << “y = ” << y << endl; cout << “Suma = ” << suma << endl; } // Fin del if e. if ((x > y) || (x – y < 0)) { ++x; --y; cout << “x = ” << x << endl; cout << “y = ” << y << endl; } // Fin del if f. g. if (( x > y) || (x * y < 0)) { ++x; --y; } // Fin del if cout << “x = ” << x << endl; cout << “y = ” << y << endl; if ((x % y) == 10) cout << “x es divisible entre y.” << endl; cout << “x no es divisible entre y.” << endl; FUNDAMENTOS – LECCIÓN 8 8-5 MIGUEL Á. TOLEDO MARTÍNEZ Solución: a. El valor de x es menor que el valor de y. De esta manera, la salida es: x =2 y=3 b. Aquí, la verificación es sobre el valor de x. Si x es cero, la verificación es falsa; si x es diferente de cero, la verificación es verdadera. Debido a que x es un valor diferente de cero, la verificación es verdadera y el enunciado cout se ejecuta, produciendo la siguiente salida: El valor de x es diferente de cero. c. El valor de x es menor que y, así el enunciado compuesto se ejecuta y la salida es: x =3 y=2 d. El valor de x es menor que y y el valor de y no es igual a 10. Como resultado, los dos valores se adicionan y la salida es: x =2 y=3 suma = 5 e. Aquí, el valor de x no es más grande que el valor de y, pero x - y es menor que cero. De esta manera, el resultado de la verificación es verdadero, por lo tanto se ejecuta el enunciado compuesto, lo que da como resultado una salida de: x =3 y=2 Observe que el enunciado compuesto incrementa x y decrementa y. f. Esta vez la verificación es falsa. Así, el enunciado compuesto se ignora. En consecuencia, los valores de x y y permanecen sin cambio y la salida es: x =2 y=3 g. Este es un truco. Aquí, la verificación es falsa, el residuo es 2 que no es igual a 10. Entonces, ¿qué pasa? No hay llaves que enmarquen el bloque, así que el compilador tomara sólo el primer enunciado cout para hacer el if. Como resultado, el primer enunciado cout se ignora, y el segundo se ejecuta para producir una salida de: x no es divisible entre y. Pero esta aparente lógica no tiene sentido. Quiere ejecutar uno de los dos enunciados cout, no ambos. Para solucionar este dilema, necesitamos una estructura de control de decisión diferente llamada estructura de control if/else. La estructura de control if/else se explica después. Ejemplo 8.2 El siguiente programa: IFSIMPLE.CPP, utiliza el enunciado if para comparar el valor de la variable calificacion con 90. Si la calificación es mayor o igual a 90, el programa visualiza un mensaje, en caso contrario simplemente termina. FUNDAMENTOS – LECCIÓN 8 8-6 MIGUEL Á. TOLEDO MARTÍNEZ /* El siguiente programa: IFSIMPLE, utiliza el enunciado if para comparar el valor de la variable calificacion con 90. Si la calificación es mayor o igual a 90, el programa visualiza un mensaje, en caso contrario simplemente termina. */ #include <iostream.h> // Para cout void main(void) { int calificacion = 95; if(calificacion >= 90) cout << "¡Felicidades, obtuviste una A!" << endl; } // Fin de main() Ejemplo 8.3 El siguiente programa: IGUALDIS.CPP, utiliza el enunciado if para utilizar la prueba de igualdad (==) y diferente a (!=) /* El siguiente programa: IGUALDIS.CPP, ilustra la prueba de igualdad (==) y diferente a (!=), utilizando if. */ #include <iostream.h> // Para cout void main (void) { int edad int altura = 21; = 73; if (edad == 21) cout << "La edad del usuario es de 21 años" << endl; if (edad != 21) cout << "La edad del usuario no es de 21 años" << endl; if (altura == 73) cout << "La altura del usuario es de 73 pulgadas" << endl; if (altura != 73) cout << "La altura del usuario no es de 73 pulgadas" << endl; } // Fin de main() Ejemplo 8.4 El siguiente programa: IFCIN.CPP, solicita un valor de punto flotante y en caso de ser distinto de cero, muestra el recíproco de dicho número. FUNDAMENTOS – LECCIÓN 8 8-7 MIGUEL Á. TOLEDO MARTÍNEZ /* El siguiente programa: IFCIN.CPP, solicita un número de punto flotante. En caso de ser distinto de cero, calcula el recíproco del mismo. */ #include <iostream.h> // Para cout y cin void main(void) { double x; cout << "Introduzca un número distinto de cero: "; cin >> x; if (x != 0) cout << "El recíproco de " << x << " es " << (1 / x) << endl; } // Fin de main() Ejemplo 8.5 El siguiente programa: PERGATO.CPP, utiliza la variable tienePerro y tieneGato, dentro de un enunciado if para determinar el tipo de mensaje que se enviará por pantalla. /* El siguiente programa: PERGATO.CPP, utiliza las variables tienePerro y tieneGato, dentro de un enunciado if para determinar el tipo de animal que tiene el usuario. */ #include <iostream.h> // Para cout void main(void) { int tienePerro int tieneGato = 1; = 0; if(tienePerro) cout << "Los perros son maravillosos" << endl; if(tieneGato) cout << "Los gatos son maravillosos" << endl; if((tienePerro) && (tieneGato)) cout << "Los perros y los gatos son maravillosos" << endl; if((tieneGato) || (tienePerro)) cout << "Las mascotas son maravillosas" << endl; } //Fin de main() FUNDAMENTOS – LECCIÓN 8 8-8 MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo 8.6 El siguiente programa: USONOT.CPP, ilustra el uso del operador NOT dentro de un if. /* El siguiente programa: USONOT.CPP, ilustra el uso del operador NOT como parte de una condición de un if. */ #include <iostream.h> // Para cout void main(void) { int tienePerro int tieneGato = 0; = 1; if(!tienePerro) cout << "Debe comprar un perro" << endl; if (!tieneGato) cout << "Debe comprar un gato" << endl; } // Fin de main() Ejemplo 8.7 El siguiente programa: COMPUESTO.CPP, muestra el uso de los enunciados compuestos dentro de un if: /* El siguiente programa: COMPUESTO.CPP, utiliza un if con dos enunciados. */ #include <iostream.h> // Para cout void main(void) { int calificacion = 95; if(calificacion >= 90) { cout << "¡Felicidades, obtuviste una A!" << endl; cout << "Tu calificación fué de: " << calificacion << endl; } // Fin de if EXAMEN BREVE 19 EL ENUNCIADO if/else Las operaciones del enunc iado if/else se muestran por medio del diagrama de la figura 8.3. Observe que hay dos series de enunciados que se pueden ejecutar, dependiendo de si la expresión de verificación es verdadera o falsa. Si el resultado es verdadero, se ejecutarán los enunciado if. Por el contrario, si el resultado de la verificación es falso, se ejecutarán los enunciados else. En otras palabras, si la expresión de verificación es verdadera, entonces se ejecutan los enunciados if; de otra manera, se ejecutan los enunciados else. En C++, un FUNDAMENTOS – LECCIÓN 8 8-9 MIGUEL Á. TOLEDO MARTÍNEZ enunciado equivalente es si la expresión de verificación evalúa un valor diferente de cero (verdadero), ejecuta los enunciados if; si no, ejecuta los enunciados else. Podría decir que if/else es un proceso de selección de dos caminos, y que if es un proceso de selección de un camino. enunciados if Verdadero (diferente de cero) if/else Expresión de verificación if siguiente enunciado enunciados else falso (cero) Figura 8.3. Flujo de la operación if/else. El formato C++ para la operación if/else es como sigue: FORMATO DEL ENUNCIADO if/else if (expresión de verificación) { enunciado 1; enunciado 2; ................... enunciado n; } // Final del if else { enunciado 1; enunciado 2; ................... enunciado n; } // Final del else // Enunciado compuesto // Enunciado compuesto Como puede observar, la opción else se incluye después de la opción if. Si la expresión de verificación es verdadera, se ejecutan los enunciados if y se ignoran los enunciados else. Sin embargo, si la expresión de verificación es falsa, se ignoran los enunciados if y se ejecutan los enunciados else. Unas palabras sobre la sintaxis, primero, observe que ambos: los enunciados if y los enunciados else se encierran entre llaves. Sin embargo, es posible eliminar las llaves en cualquier sección cuando sólo se requiera un enunciado. Segundo, observe el esquema de sangría. FUNDAMENTOS – LECCIÓN 8 8-10 MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo 8.8 Determine cuando se ejecutarán los enunciados if y cuándo los enunciados else en cada uno de los siguientes segmentos del programa. a. if (x < y) suma = x + y; else diferencia = x – y; b. if (x) suma = x + y; else diferencia = x – y; c. if (!x) suma = x + y; else diferencia = x – y; d. if ((x < y) && (2 * x – y == 0)) suma = x + y; else diferencia = x – y; e. if ((x < y) || (2 * x – y == 0)) suma = x + y; else diferencia = x – y; f. if (x > 2 * y) suma = x + y; producto = x * y; else diferencia = x – y; Solución: a. El enunciado if se ejecuta cuando x es menor que y y el enunciado else se ejecuta cuando x es mayor o igual a y. Recuerde, lo opuesto de, menor que, es mayor que o igual a. b. El enunciado if se ejecuta cuando x es diferente de cero, porque un valor diferente de cero en C++ se interpreta como verdadero cuando se verifica en una condición booleana. El enunciado else se ejecuta cuando el valor de x es cero, porque un valor de cero se interpreta como falso. c. Este segmento usa la lógica opuesta del segmento en la parte b, debido al operador !(NOT). Como resultado, el enunciado if se ejecuta cuando x es cero o falso, y el enunciado else se ejecuta cuando x es diferente de cero o verdadero. d. Este segmento emplea el operador booleano AND (&&) Aquí, el enunciado if se ejecuta cuando el valor de x es menor que el valor de y y el valor de 2x – y es igual a cero. El enunciado else se ejecuta cuando el valor de x es mayor que o igual al valor de y o el valor de 2x – y no es igual a cero. e. Este segmento emplea el operador booleano OR (||). Aquí el enunciado if se ejecuta cuando el valor de x es menor que el valor de y o el valor de 2x – y es igual a cero. El enunciado else se ejecuta cuando el valor de x es mayor o igual al valor de y y el valor de 2x – y no es igual a cero. FUNDAMENTOS – LECCIÓN 8 8-11 MIGUEL Á. TOLEDO MARTÍNEZ f. Este segmento de código no se compilará debido a un else fuera de lugar o pendiente. Los enunciados if deberán estar encerrados entre llaves para que se compile el segmento. Cuando los enunciados if están encerrados entre llaves, se ejecutarán siempre que el valor de x sea mayor que el valor 2y. El enunciado else se ejecutará cuando el valor de x sea menor o igual al valor de 2y. Ejemplo 8.9 El siguiente programa: IFELSE.CPP, utiliza el enunciado if para probar que la calificación es mayor o igual a 90. Si la condición es verdadera, el programa visualiza un mensaje de felicitaciones. Si la condición es falsa, el programa visualiza un mensaje indicándole al estudiante que estudie duro. /* El siguiente programa: IFELSE.CPP, utiliza el enunciado if para probar que la calificación es mayor o igual a 90. Si la condición es verdadera, el programa visualiza un mensaje de felicitaciones. Si la condición es falsa, el programa visualiza un mensaje indicándole al estudiante que estudie duro. */ #include <iostream.h> // Para cout void main(void) { int calificacion = 95; if(calificacion >= 90) cout << "¡Felicidades, obtuviste una A!" << endl; else cout << "¡Necesita trabajar más duro la siguiente ocasión!" << endl; } // Fin de main() Ejemplo 8.10 El siguiente programa: IFDOBLE.CPP, muestra el uso de if /else, para verificar si el carácter que introdujo el usuario es o no una letra. /* El siguiente programa: IFDOBLE.CPP, ilustra el uso del enunciado if de doble alternativa */ #include <iostream.h> #include <ctype.h> // Para cout // Para toupper() void main(void) { char c; cout << "Introduzca una letra: "; cin >> c; // Convierte a mayúscula c = toupper(c); if (c >= 'A' && c <= 'Z') cout << "Introdujo una letra" << endl; else cout << "Lo que introdujo no es una letra" << endl; } // Fin de main() FUNDAMENTOS – LECCIÓN 8 8-12 MIGUEL Á. TOLEDO MARTÍNEZ ENUNCIADOS COMPUESTOS UTILIZADOS CON if/else Ejemplo 8.11 El siguiente programa: IFCMP.CPP, utiliza un enunciado compuesto tanto para if como para else. /* El siguiente programa: IFCMP.CPP, utiliza un enunciado compuesto tanto para if como para else. */ #include <iostream.h> // Para cout void main(void) { int calificacion = 65; if(calificacion >= 90) { cout << "¡Felicidades, obtuviste una A!" << endl; cout << "Tu calificación fué de: " << calificacion << endl; } //Fin de if else { cout << "¡Tiene que trabajar duro!" << endl; cout << "Perdiste: " << (100 - calificacion) << " puntos " << endl; } //Fin de else } //Fin de main() Ejemplo 8.12 El siguiente programa: LEERCAL.CPP, utiliza el flujo de entrada cin para leer la calificación digitada por el usuario. Posteriormente el programa compara la calificación con 90 y despliega el mensaje correspondiente: /* El siguiente programa: LEERCAL.CPP, utiliza el flujo de entrada cin para leer la calificación digitada por el usuario. Posteriormente el programa compara la calificación con 90 y despliega el mensaje correspondiente. */ #include <iostream.h> // Para cout y cin void main(void) { int calificacion; cout << "Teclee su calificación y oprima Intro: "; cin >> calificacion; if(calificacion >= 90) { cout << "¡Felicidades, obtuviste una A!" << endl; cout << "Tu calificación fué de: " << calificacion << endl; } // Fin de if else { FUNDAMENTOS – LECCIÓN 8 8-13 MIGUEL Á. TOLEDO MARTÍNEZ cout << "¡Tiene que trabajar duro!" << endl; cout << "Perdiste: " << (100 - calificacion) << " puntos " << endl; } //Fin de else } //Fin de main() EXAMEN BREVE 20 ENUNCIADOS if ANIDADOS Hasta este punto, ha visto que las decisiones pueden ser de uno y dos caminos mediante el uso de los enunciados if y if/else, respectivamente. Puede tener opciones de selección adicional usando enunciados if anidados. Un if anidado es simplemente un enunciado if dentro de otro if. Para mostrar esta idea, considere el diagrama en la figura 8.4. Hielo falso verdadero temp >0 falso Agua verdadero temp >= 100 Vapor Figura 8.4. Una operación if anidada. Aquí se verifica una temperatura para ver si está dentro de un rango de 0 a 100 grados Celsius. Si está dentro de este rango obtendrá agua. Sin embargo, si está fuera del rango obtendrá vapor o hielo, dependiendo de sí el rango es superior o inferior, respectivame nte. Vamos a seguir el diagrama. La primera operación de verificación revisa si la temperatura es mayor que 0 grados. Si el resultado de la verificación es falso, la temperatura deberá ser menor o igual a 0 grados, lo que da como resultado hielo. Sin embargo, si el resultado de la verificación es verdadero, se hace una segunda verificación para ver si la temperatura es mayor o igual a 100 grados. Si este resultado de verificación es verdadero, se obtiene vapor. Sin embargo, si este segundo resultado de verificación es falso, se sabe que la temperatura debe estar entre 0 y 100 grados, lo que provoca que el resultado sea agua. Observe como la segunda verificación esta anidada dentro de la primera verificación. El primer resultado de la verificación deberá ser verdadero antes de que se realice la segunda verificación. Vamos a desarrollar un programa para implementar la operación anidada de toma de decisiones mostrada en la figura 8.4. Comencemos con la definición del problema: FUNDAMENTOS – LECCIÓN 8 8-14 MIGUEL Á. TOLEDO MARTÍNEZ DEFINICIÓN DEL PROBLEMA Salida: La palabra “AGUA”, “VAPOR” o “HIELO”. Entrada: La temperatura en grados Celsius desde el teclado del usuario. Procesamiento: Determinar si la temperatura originará agua, vapor o hielo. PLANEACIÓN DE LA SOLUCIÓN INICIO Escribir(“Mensaje con descripción del problema”) Escribir(“Favor de introducir la temperatura en grados Celsius”) Leer(temperatura) si temperatura > 0 si temperatura >= 100 Escribir (“VAPOR”) si no Escribir (“AGUA”) si no Escribir (“HIELO”) FIN. Este algoritmo se construye por medio del diagrama de la figura 8.4. Observe cómo la segunda operación si/si no se anida dentro de la primera operación si/si no. Si la temperatura no es mayor que 0 grados, la operación si anidada no se realiza. Sin embargo, si la temperatura es mayor que 0 grados, la operación si anidada se realiza para ver si la temperatura da como resultado vapor o agua . CODIFICACIÓN DEL PROGRAMA /* El siguiente programa: ANIDADO.CPP, ilustra el uso de los if anidados. Salida: Muestra la palabra "VAPOR", "HIELO" o "AGUA", dependiendo de la temperatura que escriba el usuario. Entrada: Temperatura en Celsius escrita por el usuario. Procesamiento: Verifica el valor de la temperatura contra el rango de 0 a 100 grados Celsius. */ #include <iostream.h> // para cin y cout void main(void) { //Definición de variable. float temperatura = 0.0; // Valor de temperatura dado por el usuario // Muestra el mensaje de la descripción del programa al usuario. cout << "Este programa calculará una temperatura para ver si\n" "produce hielo, agua o vapor." << endl << endl; // Obtiene la temperatura que escribe el usuario. cout << "Escriba una temperatura en grados Celsius: "; cin >> temperatura; FUNDAMENTOS – LECCIÓN 8 8-15 MIGUEL Á. TOLEDO MARTÍNEZ // Verificación de si la temperatura es agua, vapor o hielo. if(temperatura > 0) if(temperatura >= 100) cout << "VAPOR" << endl; else cout << "AGUA" << endl; else cout << "HIELO" << endl; } // Fin de main() Observe cómo el flujo del programa se puede ver por medio del esquema de sangría. Sin embargo, no verá ningún par de llaves encerrando los bloques if o else. Recuerde que no necesita encerrar un bloque de código cuando éste consta sólo de un enunciado sencillo. Pero usted puede creer que el primer bloque if parece tener varios enunciados. Bien, el primer bloque if contiene un enunciado sencillo if/else. Debido a que el compilador identifica esto como un enunciado sencillo, no es necesario encerrarlo en llaves. Por supuesto que si tiene duda, puede encerrar el bloque de la siguiente manera: if(temperatura > 0) { if(temperatura >= 100) cout << "VAPOR" << endl; else cout << "AGUA" << endl; } else cout << "HIELO" << endl; Hay diferentes formas de construir la lógica if/else anidados. Una variante de seudocodificación es la siguiente: si temperatura <= 0 Escribir (“HIELO”). si no si temperatura >= 100 Escribir (“VAPOR”). si no Escribir (“AGUA”) Aquí se ve la operación más interna si/si no anidada dentro de la operación externa si no. Esta lógica también realizará la tarea de decisión requerida. Ambos métodos son correctos y se apegan a un buen estilo de programación. Nos referiremos a este método como la forma if-else-if-else y al método anterior como la forma if-if-else-else. Es simplemente un asunto de elección personal y de cómo ve la lógica del problema. En general, la forma if-else-if-else deberá usarse cuando ciertas condiciones diferentes necesitan ser satisfechas antes de que ocurra una acción determinada, y la forma if-if-else-else deberá usarse cuando se verifica la misma variable para diferentes valores y se toma una acción diferente para cada valor. Esta última es la razón por la cual se seleccionó el uso de la forma if-if-else-else. Observe también que la sangría es extremadamente importante para determinar la lógica anidada. FUNDAMENTOS – LECCIÓN 8 8-16 MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo 8.13 Determine cuando “Rojo”, “Blanco” y “Azul” se escribirán en cada uno de los siguie ntes segmentos del programa. a. if(x < y) if (x == =0) cout << “Rojo” << endl; else cout << “Blanco” << endl; else cout << “Azul” << endl; b. if(x >= y) cout << “Azul” << endl; else if (x == 0) cout << “Rojo” << endl; else cout << “Blanco” << endl; c. if((x < y) && (x == 0)) cout << “Rojo” << endl; if ((x < y) && (x != 0)) cout << “Blanco” << endl; if (x >= y) cout << “Azul” << endl; Solución: Se escribirá Rojo cuando el valor de x sea menor que el valor de y y el valor de x sea cero. Se escribirá Blanco cuando el valor de x sea menor que el valor de y y el valor de x sea diferente de cero. Se escribirá Azul cuando el valor de x sea mayor o igual que el valor de y sin importar si el valor de x es o no cero. Ejemplo 8.14 Convierta la siguiente serie de enunciados if en enunciados if/else anidados usando las formas ifelse-if-else e if-if-else-else. if(año == 1) cout if(año == 2) cout if(año == 3) cout if(año == 4) cout if(año > 42) cout << “Estudiante de reciente ingreso” << endl; << “Estudiante de segundo año” << endl; << “Estudiante de penúltimo año” << endl; << “Estudiante de último año” << endl; << “Graduado” << endl; Solución: a. Para convertir a la forma if-else-if-else, usamos la lógica que indica que si el año es mayor que 4, entonces escribiremos “Graduado”; si no es así, verificamos si el año es mayor que 3. Si el año no es mayor que 4 pero es mayor que 3, su valor deberá ser 4, así que escribimos FUNDAMENTOS – LECCIÓN 8 8-17 MIGUEL Á. TOLEDO MARTÍNEZ “Estudiante de último año”; de lo contrario, verificamos si el año es mayor que 2. Si pasa esta verificación, se sabe que el año no es mayor que 4 ni mayor que 3 pero es mayor que 2, así que el valor deberá ser 3 y escrib imos, “Estudiante de penúltimo año”. Continuamos esta lógica para producir “Estudiante de segundo año” y “Estudiante de reciente ingreso” para los valores de los años de 2 y 1, respectivamente. b. Este es el resultado del código: if(año > 4) cout << “Graduado” << endl; else if(año > 3) cout << “Estudiante de último año” << endl; else if(año > 2) cout << “Estudiante de penúltimo año” << endl; else if(año > 1) cout << “Estudiante de segundo año” << endl; else “Estudiante de reciente ingreso” << endl; c. Para convertir a la forma if-if-else-else, usamos la lógica que indica: si el año es mayor que 1, verificamos si el año es mayor que 2, después que 3, y luego que 4. Si pasa todas estas verific aciones, sabemos que escribiremos “Graduado”. Sin embargo, si el año no fue mayor que 1 en la primera verificación, sabemos que escribiremos “Estudiante de reciente ingreso”, que forma la parte else de la primera verificación if. Después, si el año es mayor que 1, pero falla la segunda verificación if(>2), sabemos que escribiremos “Estudiante de segundo año”, que forma la parte else de la segunda verificación if. Esta lógica continúa para producir “Estudiante de penúltimo año”, y “Estudiante de último año” para los valores de año de 3 y 4 respectivamente. Este es el resultado del código: if(año > 1) if(año > 2) if(año > 3) if(año > 4) cout << “Graduado” << endl; else cout << “Estudiante de último año” << endl; else cout << “Estudiante de penúltimo año” << endl; else cout << “Estudiante de segundo año” << endl; else cout << “Estudiante de reciente ingreso” << endl; EL ENUNCIADO if-else DE ALTERNATIVA MÚLTIPLE C++ le permite anidar enunciados if-else para crear una forma de alternativa múltiple, que le proporciona gran poder y flexibilidad a sus aplicaciones. La sintaxis general para el enunciado if-else de alternativa múltiple es: if (condicion1) enunciado 1; | {<secuencia 1 de enunciados>} else if (condicion 2) enunciado 2; | {<secuencia 2 de enunciados>} FUNDAMENTOS – LECCIÓN 8 8-18 MIGUEL Á. TOLEDO MARTÍNEZ .......................................................................................... else if (condicion n) enunciado n; | {<secuencia n de enunciados>} [else enunciado n+1; | {<secuencia #N+1 de enunciados>}] Ejemplo 8.15 char op; int opOk = 1; double x, y, z; cout << “Introduzca operando1 operador operando2: ”; cin >> x >> op >> y; if (op == ‘+’) z = x + y; else if (op == ‘-’) z = x – y; else if (op == ‘*’) z = x * y; else if (op == ‘/’ && y != 0) z = x / y; else opOk = 0; El enunciado if-else de alternativa múltiple realiza una serie de pruebas en cascada hasta que suceda algo de lo siguiente: • Alguna de las condiciones de la cláusula if o de la cláusula else if es cierta. En este caso se ejecutan los enunciados que les acompañan. • Ninguna de las condiciones probadas es cierta. El programa ejecuta los enunciados de la cláusula else atrapa todo (sí es que hay una cláusula else) Ejemplo 8.16 El siguiente programa: MSTRCAL.CPP, utiliza una serie de enunciados if-else para probar calificaciones mayores o iguales a 90, 80, 70, 60 y menor o igual a 50, enviando los mensajes correspondientes: /* El siguiente programa: MSTRCAL.CPP, utiliza una serie de enunciados if-else para probar calificaciones mayores o iguales a 90, 80, 70, 60 y menor o igual a 50, enviando los mensajes correspondientes. */ #include <iostream.h> //Para cout void main(void) { int calificacion; cout << "Digite su calificación y oprima Intro: "; cin >> calificacion; FUNDAMENTOS – LECCIÓN 8 8-19 MIGUEL Á. TOLEDO MARTÍNEZ if(calificacion >= 90) cout << "¡Obtuviste una A!" << endl; else if(calificacion >= 80) cout << "¡Obtuviste una B!" << endl; else if(calificacion >= 70) cout << "¡Obtuviste una C!" << endl; else if(calificacion >= 60) cout << "¡Obtuviste una D!" << endl; else cout << "¡Saliste reprobado!" << endl; } //Fin de main() Ejemplo 8.17 El siguiente programa: IFMUL.CPP, es otro ejemplo de if con alternativas múltiples. /* El siguiente programa: IFMUL.CPP, muestra el enunciado if de alternativa múltiple */ #include <iostream.h> // Para cout y cin void main(void) { char c; cout << "Introduzca un caracter: "; cin >> c; if (c >= 'A' && c <= 'Z') cout << "Introdujo una letra en mayúscula" << endl; else if (c >= 'a' && c <= 'z') cout << "Introdujo una letra en minúscula" << endl; else if (c >= '0' && c <= '9') cout << "Introdujo un digito" << endl; else cout << "Introdujo un carácter no alfanumérico" << endl; } //Fin de main() DECLARACIÓN DE VARIABLES DENTRO DE UN ENUNCIADO COMPUESTO Conforme sus programas se hacen más complejos, en ciertas ocasiones dentro de un enunciado compuesto se requieren ciertas variables (que se utilizarán exclusivamente dentro del enunciado compuesto) para poder realizar un proceso (por ejemplo, un contador) Normalmente estas variables se definen al principio del programa, inmediatamente después de main() Si las variables son utilizadas exclusivamente dentro del enunciado compuesto, puede declarar las variables al principio del enunciado, como se muestra a continuación: if(condición) { int contador; float total; // Otros enunciados } FUNDAMENTOS – LECCIÓN 8 8-20 MIGUEL Á. TOLEDO MARTÍNEZ En este caso, el enunciado if declara dos variables al principio del enunciado compuesto, puede utilizar estas dos variables, como si fueran definidas al principio del programa. No puede, sin embargo, referirse a estas variables fuera del enunciado compuesto. Una ventaja de declarar variables dentro de un enunciado compuesto es que otro programador que esté leyendo su programa, tendrá una mejor comprensión de cómo y cuando las variables son utilizadas. Se llama alcance de una variable, a la localización dentro de su programa en la cual su variable es reconocida. Como regla, debe tratar de reducir el conocimiento de una variable a la región de su programa que usa dicha variable. Al declarar las variables al principio de un enunciado compuesto, limita el alcance de la variable al enunciado compuesto (principio y fin de las llaves) Nota: Si define variables dentro de un enunciado compuesto que tengan los mismos nombres que variables definidas fuera del enunciado compuesto, el compilador C++ utilizará las variables definidas dentro del enunciado compuesto, cuando se les utilice dentro del mismo, y las variables fuera del enunciado compuesto se utilizarán al salirse del mismo. PROBLEMAS POTENCIALES CON EL ENUNCIADO if Hay un problema potencial con el enunciado if de doble alternativa. Este sucede cuando el enunciado if incluye otro enunciado if de una sola alternativa. Por ejemplo: if (i > 0) if (i == 0) cout << “Adivinó el número mágico”; else cout << “El número se encuentra fuera de rango”; En este fragmento de código, cuando la variable i es un número positivo diferente de cero, el código despliega el mensaje: “El número se encuentra fuera de rango”. El compilador trata estos enunciados como si el fragmento de programa fuera: if (i > 0) if (i == 0) cout << “Adivinó el número mágico”; else cout << “El número se encuentra fuera de rango”; Para corregir este problema, encierre el enunciado if anidado en un bloque de enunciados: if (i > 0) { if (i == 0) cout << “Adivinó el número mágico”; } else cout << “El número se encuentra fuera de rango”; Siempre recuerde encerrar sus enunciados if/else entre llaves, { }, cuando tenga más de un enunciado que ejecutar. Si las llaves se omiten, sólo se ejecutará el primer enunciado. Esto puede causar un error lógico que es muy difícil de localizar. Por ejemplo, considere lo siguiente: if (x < y) --x; cout << “x es menor que y” << endl; else cout << “x es mayor o igual a y” << endl; FUNDAMENTOS – LECCIÓN 8 8-21 MIGUEL Á. TOLEDO MARTÍNEZ Aquí, el compilador ve tres enunciados separados, uno de ellos es ilegal. El primero es el enunciado if que decrementa el valo r de x si la verificación es verdadera. El segundo es un enunciado cout. Aunque éste está sangrado debajo de if, el compilador no lo considera como parte del enunciado if, porque no está encerrado entre llaves. El único enunciado que el compilador reconoce como parte de if es el enunciado –x. Este es un error lógico y el compilador no lo registrará. Por último, else es todo por sí mismo y queda fuera de lugar. Un else siempre debe asociarse con su correspondiente if. Este es un error de sintaxis y el compilador deberá reconocerlo. Otra fuente de error es cuando trabaja con valores en punto flotante dentro de un if, debe tener cuidado cuando verifique este valor. Por ejemplo, el siguiente enunciado prueba una variable de punto flotante llamada tasaImpuesto. if(tasaImpuesto == 0.065) // enunciado Para la computadora es imposible representar todos los valores exactamente, por ejemplo, puede que el número anterior lo represente como 0.649999. Como consecuencia la condición anterior jamás será verdadera. Para prevenir tales errores dentro de su programa, no pruebe para valores exactos, sino para un rango de valores, como se muestra a continuación: if(fabs(tasaImpuesto – 0.065) <= 0.0001) // enunciado En este caso si la diferencia entre el valor de la variable tasaImpuesto y 0.065 es menor o igual a 0.0001, el programa considera al valor como igual. EXAMEN BREVE 21 EL ENUNCIADO switch Esta última categoría de selección le permite al programa seleccionar una de muchas opciones o casos (cases) La operación del enunciado switch se muestra en la figura 8.5 mediante un diagrama. La selección de un caso en particular se controla mediante un proceso de comparación. Primero se evalúa una expresión a la que llamaremos selector para producir un valor. Después, el valor del selector se compara con una serie de opciones. Si el valor del selector iguala a uno de los valores de las opciones, se ejecuta el enunciado case correspondiente. Si no se satisface ninguna comparación, el programa simplemente continúa con el siguiente enunciado que sigue al enunciado switch. FUNDAMENTOS – LECCIÓN 8 8-22 MIGUEL Á. TOLEDO MARTÍNEZ switch selector == caso 1 enunciados caso 1 break enunciados caso 2 break verdadero falso selector == caso 2 verdadero falso selector == caso n enunciados caso n break verdadero falso enunciados opcionales (default) siguiente enunciado Figura 8.5. Flujo del enunciado switch. Este es el formato C++ para switch. FORMATO DEL ENUNCIADO switch El enunciado switch proporciona una forma especial de toma de decisiones de alternativa múltiple. Este enunciado le permite examinar los diversos valores de una expresión compatible con enteros y seleccionar el curso de acción adecuado. La sintaxis general para el enunciado switch es: FUNDAMENTOS – LECCIÓN 8 8-23 MIGUEL Á. TOLEDO MARTÍNEZ switch (expresión) { case constante1_1:… [case constante1_2: ...] <uno o más enunciados>; break; case constante2_1: [case constante2_2: ...] <uno o más enunciados>; break; ............................................................................... case constanteN_1: [case constanteN_2: ...] <uno o más enunciados>; break; default: <uno o más enunciados>; break; } El formato requiere que la expresión siga a la palabra reservada switch. La expresión deberá estar contenida entre paréntesis y deberá ser una clase de datos enteros. Básicamente significa que la expresión (si es una variable) deberá definirse como un entero o un objeto carácter. La definición de la variable como cadena de caracteres o punto flotante provocará un error de compilación. La sintaxis de switch necesita el uso de llaves para abrir y cerrar el bloque switch de los enunciados case, como se muestra. El bloque switch consta de algunos casos que se identifican usando la palabra reservada case. Deberá suministrarse un valor case de tipo entero con cada case para propósitos de comparación. El enunciado switch compara el valor de la variable con un valor case dado. Si son iguales, se ejecutan los enunciados case correspondientes. Observe que el valor case se separa con dos puntos de los enunciados case. Un bloque de enunciados case determinado puede ser cualquier cantidad de enunciados y no necesita estar encerrado entre llaves. Sin embargo, la palabra reservada break a menudo se inserta como el último enunciado en el bloque de enunciados case dado. Si no se usa break, se ejecutará cualquier case posterior después de que ocurra una correspondencia case, hasta que se encuentre un break. En ocasiones esto es deseable, especialmente cua ndo múltiples valores case se encuentran como válidos de una determinada serie de enunciados case. Suponga que la variable selectora es la calificación que obtuvo en su último cuestionario. Suponiendo que la va riable letraCalif se defina como una variable de clase carácter, un ejemplo en el que se muestra el uso del enunciado switch es el siguiente: switch(letraCalif) { case ‘A’: cout << “Excelente” << endl; break; case ‘B’: cout << “Muy bueno” << endl; break; case ‘C’: cout << “Promedio” << endl; FUNDAMENTOS – LECCIÓN 8 8-24 MIGUEL Á. TOLEDO MARTÍNEZ break; case ‘D’: cout << “Malo” << endl; break; case ‘R’: cout << “Trate de nuevo” << endl; break; } // Fin de switch Aquí, la variable selectora es letraCalif. Los valores case son ‘A’, ‘B’, ‘C’, ‘D’ y ‘R’. El valor de la variable selectora se compara con la lista de valores case. Si se encue ntra una correspondencia, se ejecutan los enunciados case correspondientes. Por ejemplo, si el valor de letraCalif es ‘B’, el código genera una salida. Muy bueno Ahora, suponga que deja afuera la palabra reservada break en cada uno de los casos: switch(letraCalif) { case ‘A’: cout case ‘B’: cout case ‘C’: cout case ‘D: cout case ‘R’: cout } // Fin de switch << “Excelente” << endl; << “Muy bueno” << endl; << “Promedio” << endl; << “Malo” << endl; << “Trate de nuevo” << endl; Esta vez, suponiendo que letraCalif tiene el valor ‘B’, el código genera la siguiente salida: Muy bueno Promedio Malo Trate de nuevo Con base en la salida, se observa que se igualó case ‘B’ y se ejecutaron sus enunciados case. Sin embargo, todos los enunciados case posteriores a case ‘B’ también se ejecutaron. Seguramente puede ver la conveniencia de utilizar break en esta aplicación. ¿Habrá ocasiones en las que quiera eliminar el comando break? ¡Seguro! Considere el siguiente enunciado switch: switch(letraCalif) { case ‘a’: case ‘A’: cout << “Excelente” << endl; break; FUNDAMENTOS – LECCIÓN 8 8-25 MIGUEL Á. TOLEDO MARTÍNEZ case ‘b’: case ‘B’: cout << “Muy bueno” << endl; break; case ‘c’ case ‘C’: cout << “Promedio” << endl; break; case ‘d’: case ‘D’: cout << “Malo” << endl; break; case ‘r’ case ‘R’: cout << “Trate de nuevo” << endl; break; } // Fin de switch En este caso, los múltiples valores case necesitan apuntar hacia el mismo enunciado case. Así que, si letraCalif tiene el valor ‘b’, entonces se hace una correspondencia con case ‘b’. Ningún break es parte de este case, así que se ejecuta el siguiente case de la secuencia, el cual escribirá la palabra Muy Bueno. Debido a que case ‘B’ contiene un break, el enunciado switch se termina después de que se genera la salida. ¿Qué pasa si no hay correspondencia? Como sospechará, todos los cases son ignorados y se ejecuta el siguiente enunciado de la secuencia que aparece después de la llave de cierre switch. LA OPCIÓN default Lo último que necesitamos explicar es el uso de la opción default dentro de un enunciado switch. La opción default se emplea generalmente al final de un enunciado switch. La opción default permite ejecutar series de enunciados si no existe correspondencia dentro de switch. Esto proporciona una característica de protección importante dentro de su programa. Por ejemplo, suponga que pide al usuario que escriba una letra de calificación para usarse en el enunciado switch. Pero, qué pasa si el usuario oprime una tecla equivocada y escribe un carácter que no es un valor case válido. Bien, puede usar la opción default como protección contra entradas no válidas, como ésta: switch(letraCalif) { case ‘a’: case ‘A’: cout << “Excelente” << endl; break; case ‘b’: case ‘B’: cout << “Muy bueno” << endl; break; FUNDAMENTOS – LECCIÓN 8 8-26 MIGUEL Á. TOLEDO MARTÍNEZ case ‘c’ case ‘C’: cout << “Promedio” << endl; break; case ‘d’: case ‘D: cout << “Malo” << endl; break; case ‘r’ case ‘R’: cout << “Trate de nuevo” << endl; break; default: cout << letraCalif << “no corresponde a ninguna ENTRA DA ” << endl; } // Fin de switch Aquí, el enunciado default se ejecuta si letraCalif es cualquier otro carácter diferente de los listados en case. Por ejemplo, si el usuario escribe el carácter x para letraCalif, el enunciado switch anterior deberá producir una salida de: x no corresponde a ninguna ENTRADA Encontrará que la opción default en el enunciado switch es extremadamente útil cuando muestra menús para entradas del usuario. Ejemplo 8.18 Un enunciado switch es simplemente una forma conveniente de codificar una serie de enunciados if. Convierta las siguientes series de enunciados if a un enunciado sencillo switch que emplee la opción default. if(Año == 1 ) cout if(Año == 2 ) cout if(Año == 3 ) cout if(Año == 4 ) cout else cout << “Estudiante de reciente ingreso” << endl; << “Estudiante de segundo año” << endl; << “Estudiante de penúltimo año” << endl; << “Estudiante de último año” << endl; << “Graduado” << endl; Solución: Lo que necesita hacer para convertir una serie de enunciado if en un enunciado sencillo switch es usar la variable de verificación del if como la variable selectora y los valores de verificación del if como casos dentro del switch. Aquí esta el código: switch(año) { case 1: cout << “Estudiante de reciente ingreso” << endl; FUNDAMENTOS – LECCIÓN 8 8-27 MIGUEL Á. TOLEDO MARTÍNEZ break; case 2: cout << “Estudiante de segundo año” << endl; break; case 3: cout << “Estudiante de penúltimo año” << endl; break; case 4: cout << “Estudiante de último año” << endl; break; default: cout << “Graduado” << endl; Observe como la opción default se usa para escribir “Graduado”. Usted sabe que se escribe “Graduado” si no hay correspondencia con los cuatro casos anteriores, ¿correcto? Así, la parte else de la última verificación if se convierte en default en el enunciado switch. Veamos más ejemplos. Ejemplo 8.19 ok = true; switch (op) { case ‘+’: z = x + y; break; case ‘-’: z = x - y; break; case ‘*’: z = x * y; break; case ‘/’: if (y != 0) z = x / y; break; default: ok = false; break; } A continuación se presentan las reglas para el uso del enunciado switch: • • • • El enunciado switch requiere un valor compatible con enteros. Este valor puede ser una constante, una variable, una llamada de función o una expresión. El enunciado switch no trabaja con tipos de datos de punto flotante. El valor después de cada etiqueta case debe ser una constante. C++ no soporta etiquetas case con rangos de valores. En lugar de ello, cada valor debe aparecer en una etiqueta case aparte. El final de un enunciado case está marcado típicamente con un break. Esto causa que la ejecución continúe en el primer enunciado que se encuentra después de switch. Si no incluye break, la ejecución continuará con el siguiente enunciado case. Algunas veces esto es conveniente, pero la mayoría de las ocasiones deseará usar break. En forma alterna, podría FUNDAMENTOS – LECCIÓN 8 8-28 MIGUEL Á. TOLEDO MARTÍNEZ • • usar un enunciado return en lugar de un break. Esto causará que la función actual termine y si la función actual es main(), entonces el programa terminará. La cláusula default es una cláusula atrapa todo, pero no necesaria si usted quiere revisar solamente un conjunto de circunstancias específicas. El conjunto de enunciados en cada etiqueta case o etiquetas case agrupadas no requiere encerrarse entre llaves. Ejemplo 8.20 Una posible solución del programa IFMUL.CPP, utilizando switch es el siguiente programa: SWITCH.CPP. /* El siguiente programa: SWITCH.CPP, soluciona al programa IFMUL.CPP utilizando el enunciado switch. */ #include <iostream.h> // Para cout y cin void main(void) { char c; cout << "Introduzca un carácter: "; cin >> c; switch (c) { case 'A': case 'B': case 'C': case 'D': // otras etiquetas case cout << "Introdujo una letra mayúscula" << endl; break; case 'a': case 'b': case 'c': case 'd': // otras etiquetas case cout << "Introdujo una letra minúscula" << endl; break; case '0': case '1': case '2': case '3': // otras etiquetas case cout << "Introduje un dígito" << endl; break; default: cout << "Introdujo un carácter no alfanumérico" << endl; break; } //Fin de switch } //Fin de main() FUNDAMENTOS – LECCIÓN 8 8-29 MIGUEL Á. TOLEDO MARTÍNEZ Ejemplo 8.21 El siguiente programa: VOCALES.CPP, cuenta el número de vocales que existe en el alfabeto español. /* El siguiente programa: VOCALES.CPP, ilustra el uso del enunciado switch para contar el número de vocales que hay en el alfabero. */ #include <iostream.h> // Para cout void main(void) { char letra; int contadorVocales = 0; for (letra = 'A'; letra <= 'Z'; letra++) switch (letra) { case 'A': case 'E': case 'I': case 'O': case 'U': contadorVocales++; }; // Fin de switch cout << "El número de vocales es de " << contadorVocales; } // Fin de main() Ejemplo 8.22 El siguiente programa: CONSVOCS.CPP, cuenta el número de vocales y consonantes que existen en el alfabeto español. El for se enseñará en la siguiente lección. /* El siguiente programa: CONSVOCS.CPP, ilustra el uso de la opción default de enunciado swith para contar el número de consonantes que existen en el alfabeto. */ #include <iostream.h> // Para cout void main(void) { char letra; int contadorVocales = 0; int contadorConsonantes = 0; for (letra = 'A'; letra <= 'Z'; letra++) switch (letra) FUNDAMENTOS – LECCIÓN 8 8-30 MIGUEL Á. TOLEDO MARTÍNEZ { case 'A': case 'E': case 'I': case 'O': case 'U': contadorVocales++; break; default: contadorConsonantes++; }; // Fin de switch cout << "El número de vocales es " << contadorVocales << endl; cout << "El número de consonantes es " << contadorConsonantes << endl; } // Fin de main() Ejemplo 8.23 El siguie nte programa: SWTMENU.CPP, ilustra el uso de un menú para realizar un comando del sistema operativo DOS. El uso de do-while se verá en la siguiente le cción. /* El siguiente programa: SWTMENU.CPP, utiliza switch para mostrar un menú principal. */ #include <iostream.h> #include <conio.h> #include <ctype.h> #include <stdlib.h> // Para cout y cin // Para toupper() void main(void) { char letra; do { cout cout cout cout cout << endl << "[A] comando DOS DIR" << endl; << "[B] comando DOS CHKDSK" << endl; << "[C] comando DOS DATE" << endl; << "[S] Salirse del programa" << endl << endl; << "Digite su elección: "; cin >> letra; letra = toupper(letra); switch (letra) { case 'A': system("DIR"); break; case 'B': system("CHKDSK "); break; FUNDAMENTOS – LECCIÓN 8 8-31 MIGUEL Á. TOLEDO MARTÍNEZ case 'C': system("DATE"); break; }; // Fin de switch } while (letra != 'S'); } //Fin de main() EXAMEN BREVE 22 SOLUCIÓN DE PROBLEMAS EN ACCIÓN: Programas manejadores de menús PROBLEMA El enunciado switch suele utilizarse para crear programas con manejo de menús. Un menú es aquel que le pide seleccionar diferentes opciones durante la ejecución del programa. Por ejemplo, suponga que debe escribir un programa que maneje menús para permitir al usuario calcular el voltaje de corriente, la corriente o la resistencia . Por la ley de Ohm (voltaje = corriente x resistencia), se sabe que cualquiera de éstas se encuentra conociendo el valor de las otras dos. DEFINICIÓN DEL PROBLEMA Salida: Un menú que pida al usuario seleccionar una opción de cálculo de voltaje, corriente o resistencia. Se necesita un mensaje para entradas no válidas. Un valor de voltaje, corriente o resistencia, dependiendo de la opción del programa que el usuario seleccione. Entrada: Una respuesta del usuario al menú (V, C, R o S) Si selecciona V: el usuario escribe los valores para corriente y resistencia. Si selecciona C: el usuario escribe los valores para voltaje y resistencia. Si selecciona R: el usuario escribe los valores para voltaje y corriente. Si selecciona S: el programa termina. Procesamiento: Calcula la opción seleccionada. Caso V: Voltaje = Corriente x Resistencia. Caso C: Corriente = Voltaje / Resistencia. Caso R: Resistencia = Voltaje / Corriente. Caso S: termina el programa. PLANEACIÓN DE LA SOLUCIÓN Con el uso del diseño de programación estructurada, dividiremos el problema en subproblemas individuales para solucionar el problema general. Hay dos tareas importantes que surgen directamente a partir de la definición del problema: • • Mostrar el menú y leer la opción del usuario. Realizar los cálculos seleccionados y mostrar los resultados. Primero, el programa deberá mostrar un menú de selecciones al usuario. El usuario escribirá su elección desde el menú y dependiendo de su opción, se hará uno de los tres cálculos para FUNDAMENTOS – LECCIÓN 8 8-32 MIGUEL Á. TOLEDO MARTÍNEZ determinar la cantidad solicitada. El diagrama de estructura en la figura 8.6 muestra el diseño descendente. menu() Llama a muestraMenu() Llama a leyDeOhm() opción opción muestraMenu() Muestra el menú y obtiene la opción del usuario V leyDeOhm() Realiza el cálculo seleccionado y muestra los resultados C calculaVoltaje() si opción V: calcula y muestra el voltaje. calculaCorriente() si opción C: calcula y muestra la corriente R calculaResistencia() si opción R: calcula y muestra la resistencia Figura 8.6. Diagrama de estructura para el problema de la ley de Ohm. Observe que hay tres niveles en la solución del problema. En el primer nivel menu(), llama a una función para mostrar el menú y obtener la opción del usuario. La función muestraMenu() realiza esta tarea y devuelve la opción del menú a menu() como se indica en el diagrama. La función menu() enviará la opción a la función llamada leyDeOhm(), que llamará a una de tres funciones, dependiendo de la opción, para realizar los cálculos requeridos. Esta es la primera vez que vemos el paso de datos entre funciones. Este concepto es central para el diseño de la programación estructurada. En el diagrama de estructura verá que el usuario elige la opcion y se devuelve desde la función muestraMenu() a la función principal menu(). Después, cuando menu() llama a la función leyDeOhm(), opcion se pasa de menu() a leyDeOhm(). La función leyDeOhm() usará entonces la opcion para determinar qué función de cálculo llamar. El algoritmo inicial nos indica que la función menu() se usa para llamar a las funciones muestraMenu() y leyDeOhm(), como se muestra a continuación: ALGORITMO INICIAL menu() INICIO Llamar a la función muestraMenu() Llamar a la función leyDeOhm() FIN. El primer nivel de refinamiento muestra el contenido de las funciones muestraMenu() y leyDeOhm (), como sigue: FUNDAMENTOS – LECCIÓN 8 8-33 MIGUEL Á. TOLEDO MARTÍNEZ PRIMER NIVEL DE REFINAMIENTO muestraMenu() Inicio Muestra el menú del programa que pide al usuario seleccionar la opción de voltaje (V), corriente (C), resistencia (R) o salir (S) Leer(opcion) Fin. leyDeOhm() Inicio Según sea opcion hacer V: Llama a la función calculaVoltaje() no: Escribir(“E C: Llama a la función calculaCorriente() R: Llama a la función calculaResistencia() S: Termina el programa. Si entrada no válida, seleccionar nuevamente”). Fin. Observe que la función muestraMenu() simplemente muestra el menú y obtiene la opción del usuario. La función leyDeOhm () llama a la función de cálculo necesaria dependiendo de la opción del usuario. Además, la función leyDeOhm() termina el programa si el usuario selecciona terminar (S) y escribe un mensaje de entrada no válido si la opción del usuario no es ninguna de las opciones indicadas. Ahora, necesitamos un segundo nivel de refinamiento para mostrar el contenido de las funciones de cálculo: SEGUNDO NIVEL DE REFINAMIENTO calculaVoltaje() Inicio Escribir(“Favor de introducir un valor para la corriente: ”) Leer(corriente) Escribir (“Favor de introducir un valor para la resistencia: ”) Leer(resistencia) si resistencia < 0 Escribir (“Entrada no válida, ejecutar el programa nuevamente”) Si no Inicio Calcular voltaje = corriente x resistencia. Escribir(voltaje) Fin. Fin. calculaCorriente() Inicio Escribir (“Favor de introducir un valor para el voltaje: ”) Leer(voltaje) Escribir (“Favor de introducir un valor para la resistencia: ”) Leer(resistencia). si resistencia <= 0 Escribir (“Entrada no válida, ejecutar el programa nuevamente”) Si no Inicio Calcular corriente = voltaje / resistencia. Escribir(corriente) Fin. Fin. FUNDAMENTOS – LECCIÓN 8 8-34 MIGUEL Á. TOLEDO MARTÍNEZ calculaResistencia() Inicio Escribir (“Favor de introducir un valor para el voltaje: ”) Leer(voltaje). Escribir (“Favor de introducir un valor para la corriente: ”) Leer(corriente). si corriente = 0 Escribir(“Entrada no válida, ejecutar el programa nuevamente”) Sino Inicio Calcular resistencia = voltaje / corriente. Escribir(resistencia) Fin. Fin. Cada función de cálculo obtiene los datos necesarios para los cálculos respectivos de la ley de Ohm. La función hace los cálculos y muestra el resultado. Observando más de cerca estos algoritmos, encontrará algunas características de protección. Los enunciados si/si no dentro de cada función protegen contra entradas de datos no válidos. Un valor de resistencia negativa no es válido porque no hay tal cosa. Además, no podrá dividir entre 0. Como resultado, las funciones calculaCorriente() y calc ulaResistencia () cada una verifica las entradas cero para los valores que se usan como divisor en cálculo de la ley de Ohm. CODIFICACIÓN DEL PROGRAMA Codificaremos la solución usando una implementación lineal. /* El siguiente programa: MENU.CPP, muestra el concepto de menús. Salida: Un menú del programa le pide al usuario seleccionar una opción para calcular el Voltaje, Corriente o Resistencia. Se debe enviar un mensaje en el caso de hacer una selección inválida. Mostrar un valor del Voltaje, Corriente o resistencia dependiendo de la opción que el usuario seleccione. Entrada: Una respuesta del usuario al menú (V, C, R o S) Si se selecciona V: escribe un valor para la corriente y la resistencia. Si selecciona C: escribe un valor para voltaje y resistencia. Si selecciona R: escribe un valor para voltaje y corriente. Si selecciona S: el programa termina. Procesamiento: Cálculo de la opción seleccionada Caso V: Voltaje = Corriente x Resistencia. Caso C: Corriente = Voltaje / Resistencia. Caso R: Resistencia = Voltaje / Corriente. Caso S: Termina el programa. */ FUNDAMENTOS – LECCIÓN 8 8-35 MIGUEL Á. TOLEDO MARTÍNEZ #include <iostream.h> // Para cin y cout. void main(void) { //Definición de variables. char opcion = 'S'; float voltaje = 0.0; float corriente = 0.0; float resistencia = 0.0; // Entrada del usuario desde el menú. // Voltaje en voltios. // Corriente en miliamperes. // Resistencia en KiloOhms. // Muestra el mensaje de la descripción del programa. cout << "Este programa calculará el voltaje de cd, la corriente, o\n" "la resistencia proporcionando los otros dos valores." << endl << endl; // Función mustraMenu() cout << "\n\n\t\t\tEscriba V para encontrar el voltaje." << endl << endl << "\t\t\tEscriba C para encontrar la corriente." << endl << endl << "\t\t\tEscriba R para encontrar la resistencia." << endl << endl << "\t\t\tEscriba S para salir." << endl << endl << "\t\t\tPor favor escriba su opción: "; cin >> opcion; // Establecer la precisión de la salida. cout.setf(ios::fixed); cout.precision(2); // Función leyDeOhm() switch(opcion) { case 'v': // Función calculaVoltaje() case 'V': cout << "\nEscriba el valor de la corriente en miliamperes\tI = "; cin >> corriente; cout << "\nEscriba el valor de la resistencia en KiloOhms\tR = "; cin >> resistencia; if(resistencia < 0 ) cout << "\n\nEsta es una entrada no válida. Por favor" "ejecute el programa de nuevo." << endl; else { voltaje = corriente * resistencia; cout << "\n\nEl valor del voltaje es " << voltaje << " voltios." << endl; } // Fin del else break; case 'c': // Función calculaCorriente(). case 'C': cout << "\nEscriba el valor del voltaje en volts\tV = "; cin >> voltaje; cout << "\nEscriba el valor de la resistencia en KiloOhms\tR = "; cin >> resistencia; if(resistencia <= 0) cout << "\n\nEsta es una entrada no válida. Por favor" " ejecute el programa de nuevo." << endl; FUNDAMENTOS – LECCIÓN 8 8-36 MIGUEL Á. TOLEDO MARTÍNEZ else { corriente = voltaje / resistencia; cout << "\n\nEl valor de la corriente es " << corriente << " miliamperes." << endl; } // Fin del else break; case 'r': // Función calculaResistencia(). case 'R': cout << "\nEscriba el valor de voltaje en volts\tV = "; cin >> voltaje; cout << "\nEscriba el valor de la corriente en miliamperes\tI = "; cin >> corriente; if(corriente == 0) cout << "\n\nEsta es una entrada no válida. Por favor" " ejecute el programa de nuevo." << endl; else { resistencia = voltaje / corriente; cout << "\n\nEl valor de la resistencia es " << resistencia<< " KiloOhms." << endl; } // Fin del else break; case 's': // Termina el programa case 'S': cout << "Programa terminado" << endl; break; // Muestra el mensaje de entrada no válida. default: cout << "\n\nEsta es una entrada no válida. Por favor" " ejecute el programa de nuevo." << endl; } // Fin del switch } // Fin de main() FUNDAMENTOS – LECCIÓN 8 8-37 MIGUEL Á. TOLEDO MARTÍNEZ LO QUE NECESITA SABER Antes de que continúe con la siguiente lección, asegúrese de haber comprendido los siguientes conceptos: q En esta lección aprendió acerca de la estructura selección, la toma de decisiones, entre las cuales están los enunciados if, if/else y switch. Cada una de estas operaciones modifica el flujo del programa, dependiendo del resultado de una expresión de verificación o una condición. q El enunciado if permite que los programas tomen decisiones cuando se cumplen ciertas condiciones. El formato de la instrucción if simple es: if(condicion) Enunciados; q Si la condición es verdadera, se ejecuta la instrucción del cuerpo de if. Si no se cumple, es decir, la condición es falsa, se salta la instrucción del cuerpo. q Las condiciones de las instrucciones if se forman por lo general mediante operadores de igualdad y operadores relacionales. El resultado de estos operadores siempre es la simple observación de verdadero o falso. q El enunciado if de C++ le permite a su programa probar una condición y ejecutar uno o más enunciados si la condición es verdadera. q C++ representa un valor verdadero utilizando cualquier valor diferente de cero. El valor falso lo representa con un valor 0. q El enunciado if ejecuta su enunciado si su expresión de verificación es verdadera (diferente de cero) Si la verificación resultante es falsa (cero), el programa continúa con la instrucción siguiente al if. q El enunciado if puede ser de una sola línea o un enunciado compuesto por una serie de enunciados de una sola línea. Cuando utilice un enunciado compuesto, deberá encerrar el bloque completo del enunciado dentro de llaves. q El enunciado else de C++ le permite a su programa definir uno o más enunciados que se ejecutarán cuando la prueba de una condición if es falsa. q El enunciado if/else consiste en dos cláusulas separadas: una cláusula if y una cláusula else. Si la expresión de verificación asociada es verdadera (diferente de cero) se ejecuta la cláusula if; de otra manera, se ejecuta la cláusula else cuando el resultado de la verificación es falso (cero) De esta manera podría decirse que if/else es una operación de selección de dos caminos. q Se pueden utilizar enunciados compuestos dentro de las cláusulas if o else; en tal caso deben de encerrarse dentro de llaves. Se pueden utilizar opciones de selección adicional en cuyo caso se dice que se tienen if o if/else anidados. q Si su programa requiere ejecutar mas de un enunciado dentro de un if o else, debe colocar los enunciados dentro de llaves. q Los operadores lógicos AND (&&) y OR (||) le permiten a sus programas probar más de una condición. q El operador lógico NOT (!) le permite a sus programas probar por condiciones que no sean verdaderas. q Utilice sangrías en sus enunciados para hacer más legible sus programas. q El enunciado switch lleva a cabo la selección usando el proceso de correspondencia. Aquí, el valor de una variable selectora de tipo entero se compara con una serie de valores case. Si el valor del selector corresponde a uno de los valores case, el enunciado case correspondiente se ejecutará hasta encontrar un enunciado break o hasta que termine el enunciado switch. q Si no existe ninguna correspondencia, el programa simplemente continúa con el siguiente enunciado al switch. q C++ proporciona una opción default con el enunciado switch. Cuando use la opción default, los enunciados default se ejecutan si no hay una correspondencia. Sin embargo, si ocurre una correspondencia, se ejecutarán los enunciados case correspondientes y se omitirán los enunciados default. q Recuerde, siempre deberá encerrar el cuerpo del enunciado switch entre llaves. FUNDAMENTOS – LECCIÓN 8 8-38 MIGUEL Á. TOLEDO MARTÍNEZ PREGUNTAS Y PROBLEMAS PREGUNTAS 1. ¿Cuándo se escribirá x como resultado del siguiente enunciado if? if((x <= 0) && (x % 5)) cout << x << endl; 2. Convierta el enunciado sencillo if de la pregunta 1 en dos enunciados if anidados. 3. Considere la siguiente salida de un segmento de programa: cout << “Escriba un valor para x ”; cin >> x; cout << “Escriba un valor para y ”; cin >> y; if x > 0 { if y > 0 --y; } // Fin de if x > 0 else ++x; a. b. c. 4. ¿Hay errores de sintaxis en esta codificación? Si los hay, ¿dónde están? Suponiendo que se corrige cualquier error de sintaxis, ¿cuándo se decrementará y? Suponiendo que se corrige cualquier error de sintaxis, ¿cuándo se incrementará x? Considere el siguiente segmento de programa: cout << “Escriba un valor para x ”; cin >> x; cout << “Escriba un valor para y ”; cin >> y; if (x > 0) { if (y > 0) --y; else ++x; } // Fin de x > o a. b. c. ¿Hay errores de sintaxis en esta codificación? Si los hay, ¿dónde están? Suponiendo que se corrige cualquier error de sintaxis, ¿cuándo se decrementará y? Suponiendo que se corrige cualquier error de sintaxis, ¿cuándo se incrementará x? 5. Verdadero o falso: Siempre deberá encerrar entre llaves el cuerpo del enunciado switch. 6. ¿Qué if hace que else se convierta en el siguiente código de un segmento de programa? if (x > 0) if(y > 0) --y; else ++x; 7. Verdadero o falso: Cuando usa un enunciado switch en C++, una condición de no-correspondencia da como resultado un error. 8. Considere el siguiente segmento de código: if (x >= 0) if(x <= 10) { y = x * x; if(x <= 5) FUNDAMENTOS – LECCIÓN 8 8-39 MIGUEL Á. TOLEDO MARTÍNEZ x = sqrt(x); } // Fin de if(x<= 10) else y = 10 * x; else y = x * x * x; cout << “x = ” << x << endl; cout << “y = ” << y << endl; ¿Qué mostrará el programa para cada uno de los siguientes valores iniciales de x? 9. a. x = 0; b. x = 4; c. x = -5; d. x = 10; Considere el siguiente enunciado switch: x = 2; switch(potencia) { case 0: cout << ‘1’ << endl; break; case 1: cout << x << endl; break; case 2: cout << x * x << endl; break; case 3: cout << x * x * x << endl; break; case 4: cout << x * x * x * x << endl; break; default: cout << “No existe correspondencia para esta potencia.” << endl; } // Fin de switch ¿Qué mostrará el código para cada uno de los siguientes valores de potencia? a. b. c. d. e. potencia = 0; potencia = 1; potencia = 2; potencia = 3; potencia = 4; 10. Considere los siguientes enunciados switch anidados: switch(x) { case 2: case 4: case 6: switch(y) FUNDAMENTOS – LECCIÓN 8 8-40 MIGUEL Á. TOLEDO MARTÍNEZ { case 1: case 2: case 3: x = x + y; break; case –1: case –2: case –3: x = x – y; break; } // Fin de switch(y) break; case 1: case 3: case 5: switch(y) { case 2: case 4: case 6: x = x * y; break; case –1: case –4: case –6: x = y * y; break; } // Fin de switch(y) } // Fin de switch(x) cout << “x = ” << x << endl; cout << “y = ” << y << endl; ¿Qué mostrará el código para cada uno de los siguientes valores de x y y? a. x = 4; y = -2; b. x = 3; y = 6; c. x = 1; y = -4; d. x = 7; y = -2; e. x = 2; y = 5; 11. Escriba una sola instrucción C++ que logre lo siguiente: a. b. c. d. e. Declare c, estaEsUnaVariable, q76354 y numero como varibles de la clas int. Solicite al usuario que introduzca un entero. Termine su mensaje de solicitud con dos puntos (:), seguido por un espacio, y deje el cursor después del espacio. Lea un entero que el usuario introduzca desde el teclado y almacene su valor en la varible entera edad. Si la variable numero no es igual a 7, imprima “La variable número no es igual a 7”. Imprima en una línea el mensaje “Este es un programa en C++”. FUNDAMENTOS – LECCIÓN 8 8-41 MIGUEL Á. TOLEDO MARTÍNEZ f. g. h. Imprima en dos líneas el mensaje “Este es un programa en C++”, terminando la primera en la parte que dice programa. Imprima el mensaje “Este es un programa en C++” dejando cada palabra del mensaje en una línea diferente. Imprima el mensaje “Este es un programa en C++” separando las palabras con tabulaciones. 12. Identifique y corrija los errores de las siguientes instrucciones. a. if(c < 7); cout << “c es menor que 7\n”; b. if(c => 7) cout << “c es igual a o mayor que 7\n”; 13. Llene los espacios en blanco de las siguientes oraciones. a. Los ___________ se utilizan para documentar los programas y simplificar su lectura. b. El objeto empleado para imprimir información en la pantalla se llama ____________. c. Una instrucción C++ que toma decisiones es ________________. d. Las instrucciones ______________ son las que normalmente realizan los cálculos. e. El objeto ___________ introduce valores desde el teclado. PROBLEMAS 1. 2. Escriba un programa completo que calcule e imprima el producto de tres enteros. Escriba un programa que le pida al usuario que introduzca dos enteros, que obtenga dichos enteros y que imprima el número mayor seguido por las palabras “es mayor”. Si los números son iguales, que imprima el mensaje “Estos números son iguales”; 3. Escriba un programa que acepte tres enteros del teclado e imprima la suma, el promedio, el producto y el menor y mayor de ellos. El diálogo de la pantalla debe aparecer como sigue: Teclee tres números enteros diferentes: 13 27 14 La suma es 54 El promedio es 18 El producto es 4914 El menor es 13 El mayor es 27 4. 5. 6. 7. 8. Escriba un programa que acepte como entrada el radio de un círculo e imprima su diámetr o, circunferencia y área. Emplee el valor constante 3.14159 para π. Efectúe los cálculos en instrucciones de salida. Escriba un programa que lea cinco enteros y determine cuál es el más pequeño y cuál el más grande imprimiéndolos en pantalla. Escriba un programa que lea un entero y determine si es par o non imprimiendo el resultado (Sugerencia: utilice el operador de módulo. Un número par es un múltiplo de dos. Cualquier múltiplo de dos deja un residuo de cero al dividirse entre 2) Escriba un programa que lea dos enteros y determine si el primero es un múltiplo del segundo, y que imprima el resultado (Sugerencia: utilice el operador de módulo) Escriba un programa que acepte como entrada un número de cinco dígitos, lo separe en sus distintos dígitos y los imprima separándolos cada uno con tres espacios. (Sugerencia: emplee los operadores de división y de módulo) Por ejemplo, si el usuario tecla 42339, el programa deberá imprimir: 4 2 3 3 9 Una dimensión de una parte dibujada indica que la longitud de la parte es 3.00 ± 0.25 pulgadas. Quiere decir que la longitud mínima aceptable de la parte es 2.75 pulgadas y la longitud máxima aceptable de la parte es 3.25 pulgadas. Escriba un programa para mostrar “ACEPTABLE” si la parte está dentro de la ot lerancia o “INACEPTABLE” si la parte está fuera de la tolerancia. 10. Codifique un programa que calcule las raíces de una ecuación cuadrática. 9. FUNDAMENTOS – LECCIÓN 8 8-42 MIGUEL Á. TOLEDO MARTÍNEZ 11. Escriba un programa que clasifique dos valores enteros en orden numérico, sin importar el orden en el cual se ingresan. 12. Escriba un programa que muestre el nombre correspondiente de un mes para una entrada entero entre 1 y 12. Protéjalo para entradas no válidas. 13. Escriba un programa que calcule el precio del boleto de ida y vuelta en ferrocarriles, conociendo la distancia del viaje de ida y el tiempo de estancia. El precio por kilómetro es de $0.17. Se sabe además que si el número de días de estancia es superior a 7 y la distancia total (ida y vuelta) a recorrer es superior a 800 Km. el boleto tiene un descuento del 30% . 14. Emplee enunciados if/else anidados para convertir una calificación numérica a una calificación de letra de acuerdo con la siguiente escala: 90 – 100 A 80 – 89 B 70 – 79 C 60 – 69 D Menos de 60 R 15. En una tienda efectúan un descuento a los clientes dependiendo del monto de la compra. El descuento se efectúa con base al siguiente criterio: compra < $500.00 No hay descuento $500.00 <= compra <= $1,000.00 5% de descuento $1,000.00 < compra <= $7,000.00 11% de descuento $7,000.00 < compra <= $15,000.00 18% de descuento compra > $15,000.00 25% de descuento Escriba un programa tal, que dado el importe de la compra de un cliente, determine lo que el mismo debe de pagar. 16. La energía eléctrica, en watts, de un circuito de corriente directa se define como el producto del voltaje por la corriente. En símbolos: E=V xC En donde: E es la energía en watts, V es el voltaje en voltios, C es la corriente en amperios. Escriba un programa con manejo de menús que le permita a un técnico encontrar la energía de corriente directa, el voltaje y la corriente, conociendo los otros dos valores. Protéjalo contra entradas no válidas. 17. Estamos en ACME, S. A. DE C. V. Esta vez se necesita un programa que proyecte la utilidad de su departamento de artículos deportivos. Los artículos en el departamento se codifican con 1, 2 o 3, dependiendo de la cantidad de utilidad para el artículo. Un artículo con un código de utilidad 1 produce una utilidad del 10% , un código 2 produce una utilidad del 12% y un código 3 genera una utilidad del 15% . Escriba un programa que proyecte la utilidad del siguiente inventario: Artículo Sedal Anzuelos Plomos Redes de pesca Carnadas Anzuelo de cuchara Cantidad 132 carretes 97 paquetes 123 paquetes 12 piezas 256 piezas 49 piezas Precio $3.95 $0.89 $0.49 $8.75 $2.49 $0.29 Código de utilidad 1 2 2 1 3 3 El programa deberá generar un reporte del artículo, la cantidad, la utilidad esperada en pesos por artículo y la utilidad total esperada para todos los artículos. 18. Además de obtener un salario regular, Emilio Pérez Sánchez también recibe una comisión por lo que vende en la tienda ACME S,.S. A. DE C. V. Su comisión se basa en las ventas totales en pesos que realiza en una semana de acuerdo con la siguiente tabla: FUNDAMENTOS – LECCIÓN 8 8-43 MIGUEL Á. TOLEDO MARTÍNEZ Ventas Menos de $250.00 $250.00 - $499.99 $500.00 - $1000.00 Más de $1000.00 Comisión(%) 0 5 7.5 10 Escriba un programa para ACME S. A. DE C. V. que determine la comisión de las ventas de Emilio a partir de una entrada del usuario para las ventas semanales. El programa mostrará el total de las ventas en pesos y la comisión de las ventas correspondientes en pesos. 19. El valor de y se define como sigue: y = x 2 + 2x – 3 y = 5x + 7 y=0 sí sí sí -3 <= x <= 2 2 < x <= 10 x <= -3 ó x > 10 Escriba un programa que encuentre y dando el usuario la entrada para x. 20. Escriba un programa que permita calcular el valor de f(x), según la expresión: x f(x) = 2 si(x mod4) x/6 si(x mod4) x x 3 si(x mod4) +5 si( xmod4) = 0 = 1 = 2 = 3 x es una variable de tipo entero, que expresa el dato que se ingresa. 21. Escriba un programa con manejo de menú que permita al usuario convertir entre las siguientes unidades: 1. 2. 3. 4. 5. 6. Grados Fahrenheit a grados centígrados. Grados centígrados a grados Fahrenheit. Pulgadas a centímetros. Centímetros a pulgadas. Libras a kilogramos. Kilogramos a libras. Evite entradas del usuario no válidas. 22. Escriba un programa que permita calcular lo que hay que pagarle a un trabajador teniendo en cuenta su sueldo y las horas extras trabajadas. Para el pago de horas extras se tiene en cuenta además la categoría del trabajador de acuerdo a la siguiente tabla. CATEGORÍA 1 2 3 4 PRECIO POR HORA $30.00 $38.00 $50.00 $70.00 Cada trabajador puede tener como máximo 30 horas extras, si tiene más sólo se les pagarán 30 horas. A los trabajadores con categoría mayor a 4 no debemos pagarle horas extras. 23. Escriba un programa tal que dados como datos la matrícula de un alumno, la carrera en la que está inscrito, su semestre y su promedio; determine si el mismo es apto para pertenecer a alguna de las facultades que tiene la universidad. Si el alumno es aceptado teniendo en cuenta las especificaciones que se listan abajo, se debe imprimir su matrícula, carrera y la palabra aceptado. Especificaciones para pertenecer a las facultades: Economía: Computación: Administración: FUNDAMENTOS – LECCIÓN 8 semestre >= 6 y promedio >= 8.8 semestre > 6 y promedio > 8.5 semestre > 5 y promedio > 8.5 8-44 MIGUEL Á. TOLEDO MARTÍNEZ Contabilidad: semestre > 5 y promedio > 8.5 24. En un hospital se ha hecho un estudio sobre los pacientes registrados durante los últimos 10 años, con el objeto de hacer una aproximación de los costos de internación por paciente. Se obtuvo un costo promedio diario según el tipo de enfermedad que aqueja al paciente; además se pudo determinar que en promedio todos los pacientes con edad entre 14 y 22 años implican un costo adicional del 10% . La siguiente tabla expresa los costos diarios, según el tipo de enfermedad. TIPO DE ENFERMEDAD 1 2 3 4 COSTO/PACIENTE/DIA 25 16 20 32 Elabore un programa que calcule e imprima el costo total que representa un paciente dados el tipo de enfermedad, la edad y los días que estuvo internado. EXAMEN BREVE 19 1. Verdadero o falso: Una expresión de verificación que evalúa cualquier valor diferente de cero se considera verdadera. 2. Verdadero o falso: Cuando una expresión de verificación en un enunciado if evalúa cero, los enunciados relacionados if se ignoran. 3. ¿Dónde está el error en el siguiente enunciado if? if (x = y) cout << “Hay un problema aquí” << endl; 4. ¿Qué operador booleano deberá emplearse para verificar que dos condiciones son verdaderas ? 5. ¿Qué operador(es) boole ano(s) deberá(n) emplearse para verificar que una de las dos condiciones es falsa? 6. ¿Qué operador booleano deberá emplearse para verificar que una de las dos condiciones es verdadera? 7. ¿Para cuáles valores de x se ejecutará el enunciado cout en la siguiente codificación? if (!x) cout << “Hola” << endl; EXAMEN BREVE 20 1. Verdadero o falso: cuando la expresión de verificación en una operación if/else se evalúa a cero, se ejecutan los enunciados else. 2. ¿Por qué el siguiente seudocódigo necesita un enunciado else? Si dia = Viernes Escribir(“Es día de pago”. Escribir(“No es día de pago”) 3. Verdadero o falso: Las llaves se pueden eliminar cuando una sección de enunciado if o else solamente tienen un enunciado sencillo. FUNDAMENTOS – LECCIÓN 8 8-45 MIGUEL Á. TOLEDO MARTÍNEZ EXAMEN BREVE 21 1. Explique por qué es importante la sangría cuando las operaciones están anidadas. 2. Verdadero o falso: Cualquier else dado siempre está relacionado con el if más cercano. Considere el siguiente seudocódigo para contestar las preguntas 3-6: si valor < 50 si valor > -50 Escribir(“Rojo”) Si no Escribir(“Blanco”) Si no Escribir(“Azul”) 3. 4. 5. 6. ¿Qué rango de valores hará que se escriba “Rojo”? ¿Qué rango de valores hará que se escriba “Blanco”? ¿Qué rango de valores hará que se escriba “Azul”? Convierta la lógica if-if-else-else a la lógica if-else-if-else. EXAMEN BREVE 22 1. La selección de un case en particular en un enunciado switch se controla por medio de un proceso llamado de _________________________________. 2. Suponga que tiene n case en un enunciado switch y no hay ningún break en ningún case. ¿Qué pasará cuando se encuentre correspondencia con el primer case? 3. Verdadero o falso: Nunca habrá ocasiones en las que case no contenga un enunciado break. 4. Un enunciado que se puede insertar al final del enunciado switch para proteger contra ingresos no válidos es el enunciado ___________________________. 5. Una aplicación común para el enunciado switch es _________________________. RESPUESTAS EXAMEN BREVE 19 1. Verdadero: Una expresión de verificación que evalúa cualquier valor diferente de cero se considera verdadera. 2. Verdadero: Cuando una expresión de verificación en un enunciado if evalúa cero, los enunciados relacionados if se ignoran. 3. En el símbolo de asignación, la codificación correcta es la siguiente: if (x == y) cout << “ Hay un problema aquí” << endl; 4. El operador && (AND) debe emplearse para verificar que las dos condiciones son verdaderas 5. Los operadores !&& (NOT AND) deben emplearse para verificar que una de las dos condiciones es falsa. 6. El operador || (OR) debe emplearse para verificar que una de las dos condiciones es verdadera. 7. El enunciado cout se ejecutará cuando x es 0, porque !x = !0 = 1 = verdadero. FUNDAMENTOS – LECCIÓN 8 8-46 MIGUEL Á. TOLEDO MARTÍNEZ RESPUESTAS EXAMEN BREVE 20 1. Verdadero: cuando la expresión de verificación en una operación if/else se evalúa a cero, se ejecutan los enunciados else. 2. El siguiente seudocódigo necesita un else porque, sin un else, ambas enunciados, es día de pago y no es día de pago, se escribirían cuando la verificación if sea verdadera. Si dia = Viernes Escribir(“Es día de pago”) Escribir(“No es día de pago”) 3. Verdadero: se pueden eliminar las llaves cuando una sección del enunciado if o else solamente tienen un enunciado sencillo. RESPUESTAS EXAMEN BREVE 21 1. La sangría es importante cuando las operaciones están anidadas para mejorar la legibilidad del código y para poder echar un vistazo qué enunciados pertenecen a cuáles enunciados if o else. 2. Verdadero: El else anidado en la parte más interna siempre va con el if más cercano. Considere el siguiente seudocódigo para contestar las preguntas 3-6: si valor < 50 si valor > -50 Escribir(“Rojo”) Si no Escribir(“Blanco”) Si no Escribir(“Azul”) 3. “Rojo” se escribirá cuando el valor sea mayor que –50 y menor que 50. “Blanco” se escribirá cuando el valor sea menor o igual a –50. 4. “Azul” se escribirá cuando el valor sea mayor o igual a 50. 5. El if-else-if-else equivalente es: si valor >= 50 Escribir(“Azul”) Si no si valor <= -50 Escribir(“Blanco”) Si no Escribir(“Rojo”) RESPUESTAS EXAMEN BREVE 22 1. La selección de un case en particular en un enunciado switch se controla por medio de un proceso llamado de correspondencia. 2. Suponga que tiene n cases en un enunciado switch y no hay ningún break en ningún case todos éstos se ejecutarán secuencialmente cuando haya una correspondencia en el primer case. 3. Falso: porque habrá ocasiones en que algunos casos subsecuentes necesiten ejecutarse como resultado de una correspondencia . FUNDAMENTOS – LECCIÓN 8 8-47 MIGUEL Á. TOLEDO MARTÍNEZ 4. Un enunciado que se puede insertar al final del enunciado switch para proteger contra ingresos no válidos es el enunciado default. Una aplicación común para el enunciado switch es en los programas que manejan menús. FUNDAMENTOS – LECCIÓN 8 8-48