You are on page 1of 48

MIGUEL .

TOLEDO MARTNEZ

CONTENIDO DE LA LECCIN 9
TOMA DE DECISIONES
1. Introduccin 2. Estructuras de control
2.1. El enunciado if (bsico) 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 2
3 4
5

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

45 9 10
11

2.6. Enunciados compuestos utilizados con if/else


2.6.1. Ejemplos 8.11, 8.12

13
13

2.7. 2.8. 2.9. 2.10. 2.11. 2.12. 2.13. 2.14. 2.15. 2.16.

Examen breve 20 Enunciados if anidados Ejemplos 8.13, 8.14 El enunciado if/else de alternativa mltiple
2.10.1. Ejemplos 8.15, 8.16, 8.17

45 14 17 18
19

Declaracin de variables dentro de un enunciado compuesto Problemas potenciales con el enunciado if Examen breve 21 El enunciado switch Formato del enunciado switch La opcin default
2.16.1. Ejemplos 8.18 y 8.19, 8.20, 8.21, 8.22, 8.23

20 21 46 22 23
26 27

2.17. Examen breve 22

46

3. Solucin de problemas en accin: Programas manejadores de mens


3.1. 3.2. 3.3. 3.4. Problema Definicin del problema Planeacin de la solucin Codificacin del programa

32
32 32 32 35

4. Lo que necesita saber 5. Preguntas y problemas


5.1. Preguntas 5.2. Problemas

38 38
39 42

FUNDAMENTOS LECCIN 8

8-1

MIGUEL . TOLEDO MARTNEZ

LECCIN 9
TOMA DE DECISIONES
INTRODUCCIN Conforme los programas se vuelven ms complejos, requerir que los mismos ejecuten un conjunto de enunciados cuando se satisfaga cierta condicin y posiblemente otro conjunto si la condicin es falsa. En otras palabras, desear que sus programas tomen decisiones.
Objetivos de esta leccin: 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 condicin es verdadera y un segundo conjunto de enunciados si la condicin 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 mltiples 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 programacin estructurado. Como lo inferir ms adelante, este tipo de lenguaje facilita la escritura, la verificacin, la lectura, la documentacin y el mantenimiento de los programas. Una razn princ ipal es la caracterstica de modularidad de un lenguaje de programacin estructurada. Por modularidad de programa se entiende que cualquier programa, sin importar qu tan complejo sea, puede dividirse en mdulos de programas independientes ms sencillos. De hecho, cualquier programa complejo puede separarse en mdulos que conforman uno de los tres patrones fundamentales llamados estructuras de control. Una estructura de control es simplemente un patrn para controlar el flujo de un mdulo de programa. Las tres estructuras de control fundamentales de un lenguaje de programacin estructurado son: secuencia, seleccin (decisin) e iteracin. 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 despus de otra, en lnea recta. Esto se llama programacin 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 LECCIN 8

8-2

MIGUEL . TOLEDO MARTNEZ

Las otras dos estructuras de control, seleccin e iteracin, permiten modificar el flujo del programa, dependiendo de una o ms condiciones. La estructura de control seleccin 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 leccin. La estructura de control iteracin es una estructura de control de ciclo. Se implementa en C++ con los enunciados while, do/while y for. Estas operaciones se explicarn en la leccin 9. Ahora, vamos a analizar los enunciados de control de seleccin disponibles en C++.
EL ENUNCIADO if (bsico)

La lgica del enunciado if se ilustra en el diagrama de la figura 8.2.


verdadero (diferente de cero)

if

Expresin de verificacin

enunciados if

falso (cero)

siguiente enunciado

Figura 8.2. Flujo de la operacin if.

Observe que el flujo del programa se modifica, dependiendo del resultado de una expresin de verificacin. La verificacin if puede ser verdadera (diferente de cero) o falsa (cero) Recuerde que, durante una operacin de verificacin, C++ iguala un valor distinto de cero con verdadero y un valor cero con falso. Si la expresin de verificacin es verdadera (diferente de cero), se ejecutan los enunciados if. Sin embargo, si el resultado de la verificacin es falso (cero) se ignoran los enunciados if y el programa contina el flujo. Esto se conoce como una operacin de seleccin 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 operacin if se puede establecer en palabras como: si la verificacin es verdadera, ejecuta los enunciados if. Esto implica que si la verificacin es falsa, los enunciados if no se ejecutan. Antes de ver el formato C++ para el enunciado C++, veamos ms de cerca la expresin de verificacin, la cual tiene carcter condicional. Esto significa que se verifica una o ms condiciones para generar un resultado de verdadero o falso. Por ejemplo, una verificacin comn es if(x == y) Aqu, la condicin simple, x == y, se verifica. Si x es igual a y, el resultado de la verificacin 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 LECCIN 8

8-3

MIGUEL . TOLEDO MARTNEZ

Para verificar condiciones mltiples, deber usar los operadores lgicos 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 verificacin es verdadero, y se ejecutarn 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 (expresin de verificacin) { enunciado 1; enunciado 2; ................... enunciado n; } // Fin de if

// Enunciado compuesto

Primero, observe la estructura general de este formato. La palabra if y su expresin de verificacin asociados se escriben en la primera lnea del enunciado; if es una palabra reservada en C++. La expresin de verificacin sigue a la palabra reservada if y debe estar entre parntesis. Despus de la primera lnea estn los enunciados que se ejecutarn si la verificacin es verdadera. Este bloque de enunciados se encierra entre llaves. Una llave izquierda, {, seala 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 lnea separada, directamente debajo de la palabra if o bien sangrado, como es nuestro caso. Adems, siempre deber sangrar todos los enunciados del bloque dos o tres espacios, a partir de la llave izquierda, para que el programa sea ms legible (no es requerimiento de C++) Cuando esta estructura es parte de un programa complejo, no habr dudas que el enunciado pertenece a la operacin if. Cuando su programa usa el enunciado if, en algunas ocasiones desear realizar un enunciado si la condicin es verdadera y en otros casos desear realizar un conjunto de enunciados si la misma es verdadera. Cuando su programa realiza nicamente un enunciado despus 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 condicin 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 continuacin:
if (calificacion >= 90) { cout << Felicidades, obtuviste una A! << endl; cout << Tu calificacin 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 debern estar encerrados entre llaves. Sin embargo, es opcional cuando hay solamente un enunciado sencillo dentro del bloque.
FUNDAMENTOS LECCIN 8

8-4

MIGUEL . TOLEDO MARTNEZ

Por ltimo, observe la sintaxis de puntuacin del enunciado if. Observe que no hay punto y coma despus de la expresin de verificacin en la primera lnea. 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 operacin 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 ejecucin de cada operacin 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; 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 if ((x > y) || (x y < 0)) { ++x; --y; cout << x = << x << endl; cout << y = << y << endl; } // Fin del if 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;

c.

e.

f.

g.

FUNDAMENTOS LECCIN 8

8-5

MIGUEL . TOLEDO MARTNEZ

Solucin:
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 verificacin es sobre el valor de x. Si x es cero, la verificacin es falsa; si x es diferente de cero, la verificacin es verdadera. Debido a que x es un valor diferente de cero, la verificacin 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 ms grande que el valor de y, pero x - y es menor que cero. De esta manera, el resultado de la verificacin 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 verificacin 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 verificacin 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 slo 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 lgica no tiene sentido. Quiere ejecutar uno de los dos enunciados cout, no ambos. Para solucionar este dilema, necesitamos una estructura de control de decisin diferente llamada estructura de control if/else. La estructura de control if/else se explica despus.

Ejemplo 8.2
El siguiente programa: IFSIMPLE.CPP, utiliza el enunciado if para comparar el valor de la variable calificacion con 90. Si la calificacin es mayor o igual a 90, el programa visualiza un mensaje, en caso contrario simplemente termina.

FUNDAMENTOS LECCIN 8

8-6

MIGUEL . TOLEDO MARTNEZ

/* El siguiente programa: IFSIMPLE, utiliza el enunciado if para comparar el valor de la variable calificacion con 90. Si la calificacin es mayor o igual a 90, el programa visualiza un mensaje, en caso contrario simplemente termina. */ #include <iostream.h> void main(void) { int calificacion = 95; if(calificacion >= 90) cout << "Felicidades, obtuviste una A!" << endl; } // Fin de main() // Para cout

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> void main (void) { int edad int altura = 21; = 73; // Para cout

if (edad == 21) cout << "La edad del usuario es de 21 aos" << endl; if (edad != 21) cout << "La edad del usuario no es de 21 aos" << 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 recproco de dicho nmero.

FUNDAMENTOS LECCIN 8

8-7

MIGUEL . TOLEDO MARTNEZ

/* El siguiente programa: IFCIN.CPP, solicita un nmero de punto flotante. En caso de ser distinto de cero, calcula el recproco del mismo. */ #include <iostream.h> void main(void) { double x; cout << "Introduzca un nmero distinto de cero: "; cin >> x; if (x != 0) cout << "El recproco de " << x << " es " << (1 / x) << endl; } // Fin de main() // Para cout y cin

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> void main(void) { int tienePerro int tieneGato = 1; = 0; // Para cout

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 LECCIN 8

8-8

MIGUEL . TOLEDO MARTNEZ

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 condicin de un if. */ #include <iostream.h> void main(void) { int tienePerro int tieneGato = 0; = 1; // Para cout

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> void main(void) { int calificacion = 95; if(calificacion >= 90) { cout << "Felicidades, obtuviste una A!" << endl; cout << "Tu calificacin fu de: " << calificacion << endl; } // Fin de if // Para cout

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 expresin de verificacin es verdadera o falsa. Si el resultado es verdadero, se ejecutarn los enunciado if. Por el contrario, si el resultado de la verificacin es falso, se ejecutarn los enunciados else. En otras palabras, si la expresin de verificacin es verdadera, entonces se ejecutan los enunciados if; de otra manera, se ejecutan los enunciados else. En C++, un
FUNDAMENTOS LECCIN 8

8-9

MIGUEL . TOLEDO MARTNEZ

enunciado equivalente es si la expresin de verificacin evala un valor diferente de cero (verdadero), ejecuta los enunciados if; si no, ejecuta los enunciados else. Podra decir que if/else es un proceso de seleccin de dos caminos, y que if es un proceso de seleccin de un camino.
enunciados if

Verdadero (diferente de cero)

if/else

Expresin de verificacin if

siguiente enunciado

enunciados else falso (cero) Figura 8.3. Flujo de la operacin if/else.

El formato C++ para la operacin if/else es como sigue:


FORMATO DEL ENUNCIADO if/else
if (expresin de verificacin) { 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 opcin else se incluye despus de la opcin if. Si la expresin de verificacin es verdadera, se ejecutan los enunciados if y se ignoran los enunciados else. Sin embargo, si la expresin de verificacin 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 seccin cuando slo se requiera un enunciado. Segundo, observe el esquema de sangra.

FUNDAMENTOS LECCIN 8

8-10

MIGUEL . TOLEDO MARTNEZ

Ejemplo 8.8
Determine cuando se ejecutarn los enunciados if y cundo los enunciados else en cada uno de los siguientes segmentos del programa.
a. if (x < y) suma = x + y; else diferencia = x y; if (x) suma = x + y; else diferencia = x y; if (!x) suma = x + y; else diferencia = x y; if ((x < y) && (2 * x y == 0)) suma = x + y; else diferencia = x y; if ((x < y) || (2 * x y == 0)) suma = x + y; else diferencia = x y; if (x > 2 * y) suma = x + y; producto = x * y; else diferencia = x y;

b.

c.

d.

e.

f.

Solucin:
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. 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 condicin booleana. El enunciado else se ejecuta cuando el valor de x es cero, porque un valor de cero se interpreta como falso. Este segmento usa la lgica 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. 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. 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.

b.

c.

d.

e.

FUNDAMENTOS LECCIN 8

8-11

MIGUEL . TOLEDO MARTNEZ

f.

Este segmento de cdigo no se compilar debido a un else fuera de lugar o pendiente. Los enunciados if debern estar encerrados entre llaves para que se compile el segmento. Cuando los enunciados if estn encerrados entre llaves, se ejecutarn 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 calificacin es mayor o igual a 90. Si la condicin es verdadera, el programa visualiza un mensaje de felicitaciones. Si la condicin es falsa, el programa visualiza un mensaje indicndole al estudiante que estudie duro.
/* El siguiente programa: IFELSE.CPP, utiliza el enunciado if para probar que la calificacin es mayor o igual a 90. Si la condicin es verdadera, el programa visualiza un mensaje de felicitaciones. Si la condicin es falsa, el programa visualiza un mensaje indicndole al estudiante que estudie duro. */ #include <iostream.h> void main(void) { int calificacion = 95; if(calificacion >= 90) cout << "Felicidades, obtuviste una A!" << endl; else cout << "Necesita trabajar ms duro la siguiente ocasin!" << endl; } // Fin de main() // Para cout

Ejemplo 8.10
El siguiente programa: IFDOBLE.CPP, muestra el uso de if /else, para verificar si el carcter 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> void main(void) { char c; cout << "Introduzca una letra: "; cin >> c; // Convierte a mayscula 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 LECCIN 8

// Para cout // Para toupper()

8-12

MIGUEL . TOLEDO MARTNEZ

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> void main(void) { int calificacion = 65; if(calificacion >= 90) { cout << "Felicidades, obtuviste una A!" << endl; cout << "Tu calificacin 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() // Para cout

Ejemplo 8.12
El siguiente programa: LEERCAL.CPP, utiliza el flujo de entrada cin para leer la calificacin digitada por el usuario. Posteriormente el programa compara la calificacin con 90 y despliega el mensaje correspondiente:
/* El siguiente programa: LEERCAL.CPP, utiliza el flujo de entrada cin para leer la calificacin digitada por el usuario. Posteriormente el programa compara la calificacin con 90 y despliega el mensaje correspondiente. */ #include <iostream.h> void main(void) { int calificacion; cout << "Teclee su calificacin y oprima Intro: "; cin >> calificacion; if(calificacion >= 90) { cout << "Felicidades, obtuviste una A!" << endl; cout << "Tu calificacin fu de: " << calificacion << endl; } // Fin de if else { // Para cout y cin

FUNDAMENTOS LECCIN 8

8-13

MIGUEL . TOLEDO MARTNEZ

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 seleccin 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

temp >0

verdadero

falso
Agua temp >= 100

verdadero
Vapor

Figura 8.4. Una operacin 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 operacin de verificacin revisa si la temperatura es mayor que 0 grados. Si el resultado de la verificacin 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 verificacin es verdadero, se hace una segunda verificacin para ver si la temperatura es mayor o igual a 100 grados. Si este resultado de verificacin es verdadero, se obtiene vapor. Sin embargo, si este segundo resultado de verificacin 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 verificacin esta anidada dentro de la primera verificacin. El primer resultado de la verificacin deber ser verdadero antes de que se realice la segunda verificacin. Vamos a desarrollar un programa para implementar la operacin anidada de toma de decisiones mostrada en la figura 8.4. Comencemos con la definicin del problema:
FUNDAMENTOS LECCIN 8

8-14

MIGUEL . TOLEDO MARTNEZ

DEFINICIN DEL PROBLEMA Salida: Entrada: Procesamiento: La palabra AGUA, VAPOR o HIELO. La temperatura en grados Celsius desde el teclado del usuario. Determinar si la temperatura originar agua, vapor o hielo.

PLANEACIN DE LA SOLUCIN
INICIO

Escribir(Mensaje con descripcin 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 cmo la segunda operacin si/si no se anida dentro de la primera operacin si/si no. Si la temperatura no es mayor que 0 grados, la operacin si anidada no se realiza. Sin embargo, si la temperatura es mayor que 0 grados, la operacin si anidada se realiza para ver si la temperatura da como resultado vapor o agua .
CODIFICACIN 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> void main(void) { //Definicin de variable. float temperatura = 0.0; // Valor de temperatura dado por el usuario // Muestra el mensaje de la descripcin 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; // para cin y cout

FUNDAMENTOS LECCIN 8

8-15

MIGUEL . TOLEDO MARTNEZ

// Verificacin 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 cmo el flujo del programa se puede ver por medio del esquema de sangra. Sin embargo, no ver ningn par de llaves encerrando los bloques if o else. Recuerde que no necesita encerrar un bloque de cdigo cuando ste consta slo 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 lgica if/else anidados. Una variante de seudocodificacin es la siguiente:
si temperatura <= 0 Escribir (HIELO). si no si temperatura >= 100 Escribir (VAPOR). si no Escribir (AGUA)

Aqu se ve la operacin ms interna si/si no anidada dentro de la operacin externa si no. Esta lgica tambin realizar la tarea de decisin requerida. Ambos mtodos son correctos y se apegan a un buen estilo de programacin. Nos referiremos a este mtodo como la forma if-else-if-else y al mtodo anterior como la forma if-if-else-else. Es simplemente un asunto de eleccin personal y de cmo ve la lgica del problema. En general, la forma if-else-if-else deber usarse cuando ciertas condiciones diferentes necesitan ser satisfechas antes de que ocurra una accin determinada, y la forma if-if-else-else deber usarse cuando se verifica la misma variable para diferentes valores y se toma una accin diferente para cada valor. Esta ltima es la razn por la cual se seleccion el uso de la forma if-if-else-else. Observe tambin que la sangra es extremadamente importante para determinar la lgica anidada.

FUNDAMENTOS LECCIN 8

8-16

MIGUEL . TOLEDO MARTNEZ

Ejemplo 8.13
Determine cuando Rojo, Blanco y Azul se escribirn 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;

Solucin:
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(ao == 1) cout if(ao == 2) cout if(ao == 3) cout if(ao == 4) cout if(ao > 42) cout << Estudiante de reciente ingreso << endl; << Estudiante de segundo ao << endl; << Estudiante de penltimo ao << endl; << Estudiante de ltimo ao << endl; << Graduado << endl;

Solucin:
a.

Para convertir a la forma if-else-if-else, usamos la lgica que indica que si el ao es mayor que 4, entonces escribiremos Graduado; si no es as, verificamos si el ao es mayor que 3. Si el ao no es mayor que 4 pero es mayor que 3, su valor deber ser 4, as que escribimos
8-17

FUNDAMENTOS LECCIN 8

MIGUEL . TOLEDO MARTNEZ

Estudiante de ltimo ao; de lo contrario, verificamos si el ao es mayor que 2. Si pasa esta verificacin, se sabe que el ao 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 penltimo ao. Continuamos esta lgica para producir Estudiante de segundo ao y Estudiante de reciente ingreso para los valores de los aos de 2 y 1, respectivamente.
b.

Este es el resultado del cdigo:


if(ao > 4) cout << Graduado << endl; else if(ao > 3) cout << Estudiante de ltimo ao << endl; else if(ao > 2) cout << Estudiante de penltimo ao << endl; else if(ao > 1) cout << Estudiante de segundo ao << endl; else Estudiante de reciente ingreso << endl;

c.

Para convertir a la forma if-if-else-else, usamos la lgica que indica: si el ao es mayor que 1, verificamos si el ao es mayor que 2, despus que 3, y luego que 4. Si pasa todas estas verific aciones, sabemos que escribiremos Graduado. Sin embargo, si el ao no fue mayor que 1 en la primera verificacin, sabemos que escribiremos Estudiante de reciente ingreso, que forma la parte else de la primera verificacin if. Despus, si el ao es mayor que 1, pero falla la segunda verificacin if(>2), sabemos que escribiremos Estudiante de segundo ao, que forma la parte else de la segunda verificacin if. Esta lgica contina para producir Estudiante de penltimo ao, y Estudiante de ltimo ao para los valores de ao de 3 y 4 respectivamente. Este es el resultado del cdigo:
if(ao > 1) if(ao > 2) if(ao > 3) if(ao > 4) cout << Graduado << endl; else cout << Estudiante de ltimo ao << endl; else cout << Estudiante de penltimo ao << endl; else cout << Estudiante de segundo ao << endl; else cout << Estudiante de reciente ingreso << endl;

EL ENUNCIADO if-else DE ALTERNATIVA MLTIPLE

C++ le permite anidar enunciados if-else para crear una forma de alternativa mltiple, que le proporciona gran poder y flexibilidad a sus aplicaciones. La sintaxis general para el enunciado if-else de alternativa mltiple es:
if (condicion1) enunciado 1; | {<secuencia 1 de enunciados>} else if (condicion 2) enunciado 2; | {<secuencia 2 de enunciados>}
FUNDAMENTOS LECCIN 8

8-18

MIGUEL . TOLEDO MARTNEZ

.......................................................................................... 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 mltiple realiza una serie de pruebas en cascada hasta que suceda algo de lo siguiente:
Alguna de las condiciones de la clusula if o de la clusula else if es cierta. En este caso se ejecutan los enunciados que les acompaan. Ninguna de las condiciones probadas es cierta. El programa ejecuta los enunciados de la clusula else atrapa todo (s es que hay una clusula 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> void main(void) { int calificacion; cout << "Digite su calificacin y oprima Intro: "; cin >> calificacion; //Para cout

FUNDAMENTOS LECCIN 8

8-19

MIGUEL . TOLEDO MARTNEZ

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 mltiples.
/* El siguiente programa: IFMUL.CPP, muestra el enunciado if de alternativa mltiple */ #include <iostream.h> void main(void) { char c; cout << "Introduzca un caracter: "; cin >> c; if (c >= 'A' && c <= 'Z') cout << "Introdujo una letra en mayscula" << endl; else if (c >= 'a' && c <= 'z') cout << "Introdujo una letra en minscula" << endl; else if (c >= '0' && c <= '9') cout << "Introdujo un digito" << endl; else cout << "Introdujo un carcter no alfanumrico" << endl; } //Fin de main() // Para cout y cin

DECLARACIN DE VARIABLES DENTRO DE UN ENUNCIADO COMPUESTO

Conforme sus programas se hacen ms complejos, en ciertas ocasiones dentro de un enunciado compuesto se requieren ciertas variables (que se utilizarn exclusivamente dentro del enunciado compuesto) para poder realizar un proceso (por ejemplo, un contador) Normalmente estas variables se definen al principio del programa, inmediatamente despus de main() Si las variables son utilizadas exclusivamente dentro del enunciado compuesto, puede declarar las variables al principio del enunciado, como se muestra a continuacin:
if(condicin) { int contador; float total; // Otros enunciados }
FUNDAMENTOS LECCIN 8

8-20

MIGUEL . TOLEDO MARTNEZ

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 comprensin de cmo y cuando las variables son utilizadas. Se llama alcance de una variable, a la localizacin dentro de su programa en la cual su variable es reconocida. Como regla, debe tratar de reducir el conocimiento de una variable a la regin 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 utilizarn 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 nmero mgico; else cout << El nmero se encuentra fuera de rango;

En este fragmento de cdigo, cuando la variable i es un nmero positivo diferente de cero, el cdigo despliega el mensaje: El nmero 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 nmero mgico; else cout << El nmero 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 nmero mgico; } else cout << El nmero se encuentra fuera de rango;

Siempre recuerde encerrar sus enunciados if/else entre llaves, { }, cuando tenga ms de un enunciado que ejecutar. Si las llaves se omiten, slo se ejecutar el primer enunciado. Esto puede causar un error lgico que es muy difcil 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 LECCIN 8

8-21

MIGUEL . TOLEDO MARTNEZ

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 verificacin 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 lgico 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 nmero anterior lo represente como 0.649999. Como consecuencia la condicin anterior jams 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 continuacin:
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 categora de seleccin le permite al programa seleccionar una de m uchas opciones o casos (cases) La operacin del enunciado switch se muestra en la figura 8.5 mediante un diagrama. La seleccin de un caso en particular se controla mediante un proceso de comparacin. Primero se evala una expresin a la que llamaremos selector para producir un valor. Despus, 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 comparacin, el programa simplemente contina con el siguiente enunciado que sigue al enunciado switch.

FUNDAMENTOS LECCIN 8

8-22

MIGUEL . TOLEDO MARTNEZ

switch

selector == caso 1

enunciados caso 1 verdadero

break

falso

selector == caso 2 verdadero falso

enunciados caso 2

break

selector == caso n verdadero

enunciados caso n

break

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 mltiple. Este enunciado le permite examinar los diversos valores de una expresin compatible con enteros y seleccionar el curso de accin adecuado. La sintaxis general para el enunciado switch es:

FUNDAMENTOS LECCIN 8

8-23

MIGUEL . TOLEDO MARTNEZ

switch (expresin) { case constante1_1: [case constante1_2: ...] <uno o ms enunciados>; break; case constante2_1: [case constante2_2: ...] <uno o ms enunciados>; break; ............................................................................... case constanteN_1: [case constanteN_2: ...] <uno o ms enunciados>; break; default: <uno o ms enunciados>; break; }

El formato requiere que la expresin siga a la palabra reservada switch. La expresin deber estar contenida entre parntesis y deber ser una clase de datos enteros. Bsicamente significa que la expresin (si es una variable) deber definirse como un entero o un objeto carcter. La definicin de la variable como cadena de caracteres o punto flotante provocar un error de compilacin. 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 propsitos de comparacin. 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 despus de que ocurra una correspondencia case, hasta que se encuentre un break. En ocasiones esto es deseable, especialmente cua ndo mltiples valores case se encuentran como vlidos de una determinada serie de enunciados case. Suponga que la variable selectora es la calificacin que obtuvo en su ltimo cuestionario. Suponiendo que la va riable letraCalif se defina como una variable de clase carcter, 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 LECCIN 8

8-24

MIGUEL . TOLEDO MARTNEZ

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 cdigo 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 cdigo 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 tambin se ejecutaron. Seguramente puede ver la conveniencia de utilizar break en esta aplicacin. 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 LECCIN 8

8-25

MIGUEL . TOLEDO MARTNEZ

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 mltiples 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. Ningn 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 despus 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 despus de la llave de cierre switch.
LA OPCIN default

Lo ltimo que necesitamos explicar es el uso de la opcin default dentro de un enunciado switch. La opcin default se emplea generalmente al final de un enunciado switch. La opcin default permite ejecutar series de enunciados si no existe correspondencia dentro de switch. Esto proporciona una caracterstica de proteccin importante dentro de su programa. Por ejemplo, suponga que pide al usuario que escriba una letra de calificacin para usarse en el enunciado switch. Pero, qu pasa si el usuario oprime una tecla equivocada y escribe un carcter que no es un valor case vlido. Bien, puede usar la opcin default como proteccin contra entradas no vlidas, como sta:
switch(letraCalif) { case a: case A: cout << Excelente << endl; break; case b: case B: cout << Muy bueno << endl; break;

FUNDAMENTOS LECCIN 8

8-26

MIGUEL . TOLEDO MARTNEZ

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 carcter diferente de los listados en case. Por ejemplo, si el usuario escribe el carcter x para letraCalif, el enunciado switch anterior deber producir una salida de:
x no corresponde a ninguna ENTRADA

Encontrar que la opcin default en el enunciado switch es extremadamente til cuando muestra mens 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 opcin default.
if(Ao == 1 ) cout if(Ao == 2 ) cout if(Ao == 3 ) cout if(Ao == 4 ) cout else cout << Estudiante de reciente ingreso << endl; << Estudiante de segundo ao << endl; << Estudiante de penltimo ao << endl; << Estudiante de ltimo ao << endl; << Graduado << endl;

Solucin:
Lo que necesita hacer para convertir una serie de enunciado if en un enunciado sencillo switch es usar la variable de verificacin del if como la variable selectora y los valores de verificacin del if como casos dentro del switch. Aqu esta el cdigo:
switch(ao) { case 1: cout << Estudiante de reciente ingreso << endl;
FUNDAMENTOS LECCIN 8

8-27

MIGUEL . TOLEDO MARTNEZ

break; case 2: cout << Estudiante de segundo ao << endl; break; case 3: cout << Estudiante de penltimo ao << endl; break; case 4: cout << Estudiante de ltimo ao << endl; break; default: cout << Graduado << endl;

Observe como la opcin 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 verificacin if se convierte en default en el enunciado switch.

Veamos ms 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 continuacin 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 funcin o una expresin. El enunciado switch no trabaja con tipos de datos de punto flotante. El valor despus 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 tpicamente con un break. Esto causa que la ejecucin contine en el primer enunciado que se encuentra despus de switch. Si no incluye break, la ejecucin continuar con el siguiente enunciado case. Algunas veces esto es conveniente, pero la mayora de las ocasiones desear usar break. En forma alterna, podra 8-28

FUNDAMENTOS LECCIN 8

MIGUEL . TOLEDO MARTNEZ

usar un enunciado return en lugar de un break. Esto causar que la funcin actual termine y si la funcin actual es main(), entonces el programa terminar. La clusula default es una clusula atrapa todo, pero no necesaria si usted quiere revisar solamente un conjunto de circunstancias especficas. El conjunto de enunciados en cada etiqueta case o etiquetas case agrupadas no requiere encerrarse entre llaves.

Ejemplo 8.20
Una posible solucin 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> void main(void) { char c; cout << "Introduzca un carcter: "; cin >> c; switch (c) { case 'A': case 'B': case 'C': case 'D': // otras etiquetas case cout << "Introdujo una letra mayscula" << endl; break; case 'a': case 'b': case 'c': case 'd': // otras etiquetas case cout << "Introdujo una letra minscula" << endl; break; case '0': case '1': case '2': case '3': // otras etiquetas case cout << "Introduje un dgito" << endl; break; default: cout << "Introdujo un carcter no alfanumrico" << endl; break; } //Fin de switch } //Fin de main() // Para cout y cin

FUNDAMENTOS LECCIN 8

8-29

MIGUEL . TOLEDO MARTNEZ

Ejemplo 8.21
El siguiente programa: VOCALES.CPP, cuenta el nmero de vocales que existe en el alfabeto espaol.
/* El siguiente programa: VOCALES.CPP, ilustra el uso del enunciado switch para contar el nmero de vocales que hay en el alfabero. */ #include <iostream.h> 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 nmero de vocales es de " << contadorVocales; } // Fin de main() // Para cout

Ejemplo 8.22
El siguiente programa: CONSVOCS.CPP, cuenta el nmero de vocales y consonantes que existen en el alfabeto espaol. El for se ensear en la siguiente leccin.
/* El siguiente programa: CONSVOCS.CPP, ilustra el uso de la opcin default de enunciado swith para contar el nmero de consonantes que existen en el alfabeto. */ #include <iostream.h> void main(void) { char letra; int contadorVocales = 0; int contadorConsonantes = 0; for (letra = 'A'; letra <= 'Z'; letra++) switch (letra) // Para cout

FUNDAMENTOS LECCIN 8

8-30

MIGUEL . TOLEDO MARTNEZ

{ case 'A': case 'E': case 'I': case 'O': case 'U': contadorVocales++; break; default: contadorConsonantes++; }; // Fin de switch cout << "El nmero de vocales es " << contadorVocales << endl; cout << "El nmero 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 ccin.
/* El siguiente programa: SWTMENU.CPP, utiliza switch para mostrar un men principal. */ #include <iostream.h> #include <conio.h> #include <ctype.h> #include <stdlib.h> 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 eleccin: "; // Para cout y cin // Para toupper()

cin >> letra; letra = toupper(letra); switch (letra) { case 'A': system("DIR"); break; case 'B': system("CHKDSK "); break;

FUNDAMENTOS LECCIN 8

8-31

MIGUEL . TOLEDO MARTNEZ

case 'C': system("DATE"); break; }; // Fin de switch } while (letra != 'S'); } //Fin de main()

EXAMEN BREVE 22 SOLUCIN DE PROBLEMAS EN ACCIN: Programas manejadores de mens


PROBLEMA El enunciado switch suele utilizarse para crear programas con manejo de mens. Un men es aquel que le pide seleccionar diferentes opciones durante la ejecucin del programa. Por ejemplo, suponga que debe escribir un programa que maneje mens 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. DEFINICIN DEL PROBLEMA
Salida: Un men que pida al usuario seleccionar una opcin de clculo de voltaje, corriente o resistencia. Se necesita un mensaje para entradas no vlidas. Un valor de voltaje, corriente o resistencia, dependiendo de la opcin del programa que el usuario seleccione. 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. Calcula la opcin seleccionada. Caso V: Voltaje = Corriente x Resistencia. Caso C: Corriente = Voltaje / Resistencia. Caso R: Resistencia = Voltaje / Corriente. Caso S: termina el programa.

Entrada:

Procesamiento:

PLANEACIN DE LA SOLUCIN Con el uso del diseo de programacin estructurada, dividiremos el problema en subproblemas individuales para solucionar el problema general. Hay dos tareas importantes que surgen directamente a partir de la definicin del problema:
Mostrar el men y leer la opcin del usuario. Realizar los clculos seleccionados y mostrar los resultados.

Primero, el programa deber mostrar un men de selecciones al usuario. El usuario escribir su eleccin desde el men y dependiendo de su opcin, se har uno de los tres clculos para
FUNDAMENTOS LECCIN 8

8-32

MIGUEL . TOLEDO MARTNEZ

determinar la cantidad solicitada. El diagrama de estructura en la figura 8.6 muestra el diseo descendente.
menu() Llama a muestraMenu() Llama a leyDeOhm()

opcin opcin

muestraMenu() Muestra el men y obtiene la opcin del usuario

leyDeOhm() Realiza el clculo seleccionado y muestra los resultados

V
calculaVoltaje() si opcin V: calcula y muestra el voltaje.

C
calculaCorriente() si opcin C: calcula y muestra la corriente

R
calculaResistencia() si opcin 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 solucin del problema. En el primer nivel menu(), llama a una funcin para mostrar el men y obtener la opcin del usuario. La funcin muestraMenu() realiza esta tarea y devuelve la opcin del men a menu() como se indica en el diagrama. La funcin menu() enviar la opcin a la funcin llamada leyDeOhm(), que llamar a una de tres funciones, dependiendo de la opcin, para realizar los clculos requeridos. Esta es la primera vez que vemos el paso de datos entre funciones. Este concepto es central para el diseo de la programacin estructurada. En el diagrama de estructura ver que el usuario elige la opcion y se devuelve desde la funcin muestraMenu() a la funcin principal menu(). Despus, cuando menu() llama a la funcin leyDeOhm(), opcion se pasa de menu() a leyDeOhm(). La funcin leyDeOhm() usar entonces la opcion para determinar qu funcin de clculo llamar. El algoritmo inicial nos indica que la funcin menu() se usa para llamar a las funciones muestraMenu() y leyDeOhm(), como se muestra a continuacin:
ALGORITMO INICIAL

menu() INICIO Llamar a la funcin muestraMenu() Llamar a la funcin leyDeOhm() FIN.

El primer nivel de refinamiento muestra el contenido de las funciones muestraMenu() y leyDeOhm (), como sigue:

FUNDAMENTOS LECCIN 8

8-33

MIGUEL . TOLEDO MARTNEZ

PRIMER NIVEL DE REFINAMIENTO

muestraMenu() Inicio Muestra el men del programa que pide al usuario seleccionar la opcin de voltaje (V), corriente (C), resistencia (R) o salir (S) Leer(opcion) Fin. leyDeOhm() Inicio Segn sea opcion hacer V: Llama a la funcin calculaVoltaje() no: Escribir(E C: Llama a la funcin calculaCorriente() R: Llama a la funcin calculaResistencia() S: Termina el programa. Si entrada no vlida, seleccionar nuevamente). Fin.

Observe que la funcin muestraMenu() simplemente muestra el men y obtiene la opcin del usuario. La funcin leyDeOhm () llama a la funcin de clculo necesaria dependiendo de la opcin del usuario. Adems, la funcin leyDeOhm() termina el programa si el usuario selecciona terminar (S) y escribe un mensaje de entrada no vlido si la opcin del usuario no es ninguna de las opciones indicadas. Ahora, necesitamos un segundo nivel de refinamiento para mostrar el contenido de las funciones de clculo:
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 vlida, 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 vlida, ejecutar el programa nuevamente) Si no Inicio Calcular corriente = voltaje / resistencia. Escribir(corriente) Fin. Fin.
FUNDAMENTOS LECCIN 8

8-34

MIGUEL . TOLEDO MARTNEZ

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 vlida, ejecutar el programa nuevamente) Sino Inicio Calcular resistencia = voltaje / corriente. Escribir(resistencia) Fin. Fin.

Cada funcin de clculo obtiene los datos necesarios para los clculos respectivos de la ley de Ohm. La funcin hace los clculos y muestra el resultado. Observando ms de cerca estos algoritmos, encontrar algunas caractersticas de proteccin. Los enunciados si/si no dentro de cada funcin protegen contra entradas de datos no vlidos. Un valor de resistencia negativa no es vlido porque no hay tal cosa. Adems, 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 clculo de la ley de Ohm. CODIFICACIN DEL PROGRAMA

Codificaremos la solucin usando una implementacin lineal.


/* El siguiente programa: MENU.CPP, muestra el concepto de mens. Salida: Un men del programa le pide al usuario seleccionar una opcin para calcular el Voltaje, Corriente o Resistencia. Se debe enviar un mensaje en el caso de hacer una seleccin invlida. Mostrar un valor del Voltaje, Corriente o resistencia dependiendo de la opcin que el usuario seleccione. 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.

Entrada:

Procesamiento: Clculo de la opcin seleccionada Caso V: Voltaje = Corriente x Resistencia. Caso C: Corriente = Voltaje / Resistencia. Caso R: Resistencia = Voltaje / Corriente. Caso S: Termina el programa. */

FUNDAMENTOS LECCIN 8

8-35

MIGUEL . TOLEDO MARTNEZ

#include <iostream.h> void main(void) { //Definicin de variables. char opcion = 'S'; float voltaje = 0.0; float corriente = 0.0; float resistencia = 0.0;

// Para cin y cout.

// Entrada del usuario desde el men. // Voltaje en voltios. // Corriente en miliamperes. // Resistencia en KiloOhms.

// Muestra el mensaje de la descripcin del programa. cout << "Este programa calcular el voltaje de cd, la corriente, o\n" "la resistencia proporcionando los otros dos valores." << endl << endl; // Funcin 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 opcin: "; cin >> opcion; // Establecer la precisin de la salida. cout.setf(ios::fixed); cout.precision(2); // Funcin leyDeOhm() switch(opcion) { case 'v': // Funcin 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 vlida. 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': // Funcin 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 vlida. Por favor" " ejecute el programa de nuevo." << endl;

FUNDAMENTOS LECCIN 8

8-36

MIGUEL . TOLEDO MARTNEZ

else { corriente = voltaje / resistencia; cout << "\n\nEl valor de la corriente es " << corriente << " miliamperes." << endl; } // Fin del else break; case 'r': // Funcin 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 vlida. 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 vlida. default: cout << "\n\nEsta es una entrada no vlida. Por favor" " ejecute el programa de nuevo." << endl; } // Fin del switch } // Fin de main()

FUNDAMENTOS LECCIN 8

8-37

MIGUEL . TOLEDO MARTNEZ

LO QUE NECESITA SABER Antes de que contine con la siguiente leccin, asegrese de haber comprendido los siguientes conceptos:
q En esta leccin aprendi acerca de la estructura seleccin, la toma de decisiones, entre las cuales estn los enunciados if, if/else y switch. Cada una de estas operaciones modifica el flujo del programa, dependiendo del resultado de una expresin de verificacin o una condicin. q El enunciado if permite que los programas tomen decisiones cuando se cumplen ciertas condiciones. El formato de la instruccin if simple es: if(condicion) Enunciados; q Si la condicin es verdadera, se ejecuta la instruccin del cuerpo de if. Si no se cumple, es decir, la condicin es falsa, se salta la instruccin 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 observacin de verdadero o falso. q El enunciado if de C++ le permite a su programa probar una condicin y ejecutar uno o ms enunciados si la condicin 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 expresin de verificacin es verdadera (diferente de cero) Si la verificacin resultante es falsa (cero), el programa contina con la instruccin siguiente al if. q El enunciado if puede ser de una sola lnea o un enunciado compuesto por una serie de enunciados de una sola lnea. 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 ms enunciados que se ejecutarn cuando la prueba de una condicin if es falsa. q El enunciado if/else consiste en dos clusulas separadas: una clusula if y una clusula else. Si la expresin de verificacin asociada es verdadera (diferente de cero) se ejecuta la clusula if; de otra manera, se ejecuta la clusula else cuando el resultado de la verificacin es falso (cero) De esta manera podra decirse que if/else es una operacin de seleccin de dos caminos. q Se pueden utilizar enunciados compuestos dentro de las clusulas if o else; en tal caso deben de encerrarse dentro de llaves. Se pueden utilizar opciones de seleccin 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 lgicos AND (&&) y OR (||) le permiten a sus programas probar ms de una condicin. q El operador lgico NOT (!) le permite a sus programas probar por condiciones que no sean verdaderas. q Utilice sangras en sus enunciados para hacer ms legible sus programas. q El enunciado switch lleva a cabo la seleccin 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 contina con el siguiente enunciado al switch. q C++ proporciona una opcin default con el enunciado switch. Cuando use la opcin default, los enunciados default se ejecutan si no hay una correspondencia. Sin embargo, si ocurre una correspondencia, se ejecutarn los enunciados case correspondientes y se omitirn los enunciados default. q Recuerde, siempre deber encerrar el cuerpo del enunciado switch entre llaves.

FUNDAMENTOS LECCIN 8

8-38

MIGUEL . TOLEDO MARTNEZ

PREGUNTAS Y PROBLEMAS
PREGUNTAS
1. Cundo se escribir x como resultado del siguiente enunciado if? if((x <= 0) && (x % 5)) cout << x << endl; Convierta el enunciado sencillo if de la pregunta 1 en dos enunciados if anidados. 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 codificacin? Si los hay, dnde estn? Suponiendo que se corrige cualquier error de sintaxis, cundo se decrementar y? Suponiendo que se corrige cualquier error de sintaxis, cundo se incrementar x?

2. 3.

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 codificacin? Si los hay, dnde estn? Suponiendo que se corrige cualquier error de sintaxis, cundo se decrementar y? Suponiendo que se corrige cualquier error de sintaxis, cundo se incrementar x?

5. 6.

Verdadero o falso: Siempre deber encerrar entre llaves el cuerpo del enunciado switch. Qu if hace que else se convierta en el siguiente cdigo de un segmento de programa? if (x > 0) if(y > 0) --y; else ++x; Verdadero o falso: Cuando usa un enunciado switch en C++, una condicin de no-correspondencia da como resultado un error. Considere el siguiente segmento de cdigo: if (x >= 0) if(x <= 10) { y = x * x; if(x <= 5)

7. 8.

FUNDAMENTOS LECCIN 8

8-39

MIGUEL . TOLEDO MARTNEZ

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? 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 cdigo para cada uno de los siguientes valores de potencia? a. b. c. d. e. potencia = 0; potencia = 1; potencia = 2; potencia = 3; potencia = 4;

9.

10. Considere los siguientes enunciados switch anidados: switch(x) { case 2: case 4: case 6: switch(y)
FUNDAMENTOS LECCIN 8

8-40

MIGUEL . TOLEDO MARTNEZ

{ 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 cdigo para cada uno de los siguientes valores de x y y? a. b. x = 4; y = -2; x = 3; y = 6; x = 1; y = -4; x = 7; y = -2; x = 2; y = 5;

c.

d.

e.

11. Escriba una sola instruccin 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 despus 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 nmero no es igual a 7. Imprima en una lnea el mensaje Este es un programa en C++.

FUNDAMENTOS LECCIN 8

8-41

MIGUEL . TOLEDO MARTNEZ

f. g. h.

Imprima en dos lneas 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 lnea 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 informacin en la pantalla se llama ____________. c. Una instruccin C++ que toma decisiones es ________________. d. Las instrucciones ______________ son las que normalmente realizan los clculos. 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 nmero mayor seguido por las palabras es mayor. Si los nmeros son iguales, que imprima el mensaje Estos nmeros son iguales; 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 dilogo de la pantalla debe aparecer como sigue: Teclee tres nmeros 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. Escriba un programa que acepte como entrada el radio de un crculo e imprima su dimetr o, circunferencia y rea. Emplee el valor constante 3.14159 para . Efecte los clculos en instrucciones de salida. Escriba un programa que lea cinco enteros y determine cul es el ms pequeo y cul el ms grande imprimindolos en pantalla. Escriba un programa que lea un entero y determine si es par o non imprimiendo el resultado (Sugerencia: utilice el operador de mdulo. Un nmero par es un mltiplo de dos. Cualquier mltiplo 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 mltiplo del segundo, y que imprima el resultado (Sugerencia: utilice el operador de mdulo) Escriba un programa que acepte como entrada un nmero de cinco dgitos, lo separe en sus distintos dgitos y los imprima separndolos cada uno con tres espacios. (Sugerencia: emplee los operadores de divisin y de mdulo) Por ejemplo, si el usuario tecla 42339, el programa deber imprimir: 4 9. 2 3 3 9

3.

7. 8.

Una dimensin de una parte dibujada indica que la longitud de la parte es 3.00 0.25 pulgadas. Quiere decir que la longitud mnima aceptable de la parte es 2.75 pulgadas y la longitud mxima aceptable de la parte es 3.25 pulgadas. Escriba un programa para mostrar ACEPTABLE si la parte est dentro de la o lerancia o t INACEPTABLE si la parte est fuera de la tolerancia. 10. Codifique un programa que calcule las races de una ecuacin cuadrtica.

FUNDAMENTOS LECCIN 8

8-42

MIGUEL . TOLEDO MARTNEZ

11. Escriba un programa que clasifique dos valores enteros en orden numrico, 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. Protjalo para entradas no vlidas. 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 kilmetro es de $0.17. Se sabe adems que si el nmero de das 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 calificacin numrica a una calificacin 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 efectan un descuento a los clientes dependiendo del monto de la compra. El descuento se efecta 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 energa elctrica, en watts, de un circuito de corriente directa se define como el producto del voltaje por la corriente. En smbolos: E=V xC

En donde:
E es la energa en watts, V es el voltaje en voltios, C es la corriente en amperios. Escriba un programa con manejo de mens que le permita a un tcnico encontrar la energa de corriente directa, el voltaje y la corriente, conociendo los otros dos valores. Protjalo contra entradas no vlidas. 17. Estamos en ACME, S. A. DE C. V. Esta vez se necesita un programa que proyecte la utilidad de su departamento de artculos deportivos. Los artculos en el departamento se codifican con 1, 2 o 3, dependiendo de la cantidad de utilidad para el artculo. Un artculo con un cdigo de utilidad 1 produce una utilidad del 10% , un cdigo 2 produce una utilidad del 12% y un cdigo 3 genera una utilidad del 15% . Escriba un programa que proyecte la utilidad del siguiente inventario: Artculo 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 Cdigo de utilidad 1 2 2 1 3 3

El programa deber generar un reporte del artculo, la cantidad, la utilidad esperada en pesos por artculo y la utilidad total esperada para todos los artculos. 18. Adems de obtener un salario regular, Emilio Prez Snchez tambin recibe una comisin por lo que vende en la tienda ACME S,.S. A. DE C. V. Su comisin se basa en las ventas totales en pesos que realiza en una semana de acuerdo con la siguiente tabla:

FUNDAMENTOS LECCIN 8

8-43

MIGUEL . TOLEDO MARTNEZ

Ventas Menos de $250.00 $250.00 - $499.99 $500.00 - $1000.00 Ms de $1000.00

Comisin(%) 0 5 7.5 10

Escriba un programa para ACME S. A. DE C. V. que determine la comisin 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 comisin 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), segn la expresin: x f(x)
2

si(x mod4) si(x mod4) si(x mod4)

x/6 x x
3

= 0 = 1 = 2 = 3

+5

si( xmod4)

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 centgrados. Grados centgrados a grados Fahrenheit. Pulgadas a centmetros. Centmetros a pulgadas. Libras a kilogramos. Kilogramos a libras.

Evite entradas del usuario no vlidas. 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 adems la categora del trabajador de acuerdo a la siguiente tabla. CATEGORA 1 2 3 4 PRECIO POR HORA $30.00 $38.00 $50.00 $70.00

Cada trabajador puede tener como mximo 30 horas extras, si tiene ms slo se les pagarn 30 horas. A los trabajadores con categora mayor a 4 no debemos pagarle horas extras. 23. Escriba un programa tal que dados como datos la matrcula 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 matrcula, carrera y la palabra aceptado. Especificaciones para pertenecer a las facultades: Economa: Computacin: Administracin:
FUNDAMENTOS LECCIN 8

semestre >= 6 y promedio >= 8.8 semestre > 6 y promedio > 8.5 semestre > 5 y promedio > 8.5 8-44

MIGUEL . TOLEDO MARTNEZ

Contabilidad:

semestre > 5 y promedio > 8.5

24. En un hospital se ha hecho un estudio sobre los pacientes registrados durante los ltimos 10 aos, con el objeto de hacer una aproximacin de los costos de internacin por paciente. Se obtuvo un costo promedio diario segn el tipo de enfermedad que aqueja al paciente; adems se pudo determinar que en promedio todos los pacientes con edad e ntre 14 y 22 aos implican un costo adicional del 10% . La siguiente tabla expresa los costos diarios, segn 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 das que estuvo internado.

EXAMEN BREVE 19
1. Verdadero o falso: Una expresin de verificacin que evala cualquier valor diferente de cero se considera verdadera. 2. Verdadero o falso: Cuando una expresin de verificacin en un enunciado if evala cero, los enunciados relacionados if se ignoran. 3. Dnde 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 cules valores de x se ejecutar el enunciado cout en la siguiente codificacin? if (!x)
cout << Hola << endl;

EXAMEN BREVE 20
1. Verdadero o falso: cuando la expresin de verificacin en una operacin if/else se evala a cero, se ejecutan los enunciados else.

2. Por qu el siguiente seudocdigo necesita un enunciado else?


Si dia = Viernes Escribir(Es da de pago. Escribir(No es da de pago)

3. Verdadero o falso: Las llaves se pueden eliminar cuando una seccin de enunciado if o else solamente tienen un enunciado sencillo.
FUNDAMENTOS LECCIN 8

8-45

MIGUEL . TOLEDO MARTNEZ

EXAMEN BREVE 21
1. Explique por qu es importante la sangra cuando las operaciones estn anidadas. 2. Verdadero o falso: Cualquier else dado siempre est relacionado con el if ms cercano. Considere el siguiente seudocdigo 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 lgica if-if-else-else a la lgica if-else-if-else.

EXAMEN BREVE 22
1. La seleccin 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 ningn break en ningn 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 vlidos es el enunciado ___________________________. 5. Una aplicacin comn para el enunciado switch es _________________________.

RESPUESTAS EXAMEN BREVE 19


1. Verdadero: Una expresin de verificacin que evala cualquier valor diferente de cero se considera verdadera. 2. Verdadero: Cuando una expresin de verificacin en un enunciado if evala cero, los enunciados relacionados if se ignoran. 3. En el smbolo de asignacin, la codificacin 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 condici nes es o 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 LECCIN 8

8-46

MIGUEL . TOLEDO MARTNEZ

RESPUESTAS EXAMEN BREVE 20


1. Verdadero: cuando la expresin de verificacin en una operacin if/else se evala a cero, se ejecutan los enunciados else. 2. El siguiente seudocdigo necesita un else porque, sin un else, ambas enunciados, es da de pago y no es da de pago, se escribiran cuando la verificacin if sea verdadera.
Si dia = Viernes Escribir(Es da de pago) Escribir(No es da de pago)

3. Verdadero: se pueden eliminar las llaves cuando una seccin del enunciado if o else solamente tienen un enunciado sencillo.

RESPUESTAS EXAMEN BREVE 21


1. La sangra es importante cuando las operaciones estn anidadas para mejorar la legibilidad del cdigo y para poder echar un vistazo qu enunciados pertenecen a cules enunciados if o else. 2. Verdadero: El else anidado en la parte ms interna siempre va con el if ms cercano. Considere el siguiente seudocdigo 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 seleccin 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 ningn break en ningn case todos stos se ejecutarn 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 LECCIN 8

8-47

MIGUEL . TOLEDO MARTNEZ

4. Un enunciado que se puede insertar al final del enunciado switch para proteger contra ingresos no vlidos es el enunciado default. Una aplicacin comn para el enunciado switch es en los programas que manejan mens.

FUNDAMENTOS LECCIN 8

8-48

You might also like