CONTENIDO DE LA LECCIÓN 9

Anuncio
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
Descargar