Logo Studenta

programacion c ejercicios resueltos-70

¡Estudia con miles de materiales!

Vista previa del material en texto

180 | Capítulo 5: Condiciones, expresiones lógicas y estructuras de control de selección
• Datos de entrada no válidos
• Un intento de leer más allá del fi n de un archivo
• Un intento de abrir un archivo no existente para entrada
C++ proporciona una forma de comprobar si un fl ujo se encuentra en el estado de falla. En una 
expresión lógica, sólo se usa el nombre del objeto de fl ujo (por ejemplo, cin) como si fuese una va-
riable booleana:
 if (cin)
 M
 
if ( !inFile )
 M
Cuando usted hace esto, se dice que se está probando el estado del fl ujo. 
El resultado de la prueba es true (lo cual indica que la última 
operación I/O en ese fl ujo tuvo éxito) o false (cuyo signifi cado es 
que falló la última operación I/O).
Conceptualmente, se puede considerar un objeto de fl ujo en 
una expresión lógica como una variable booleana con un valor 
true (el estado de fl ujo es correcto) o false (el estado no es co-
rrecto).
Observe en la segunda sentencia If anterior que se teclearon espacios alrededor de la expresión 
!inFile. Los espacios no son requeridos por C++ sino que están ahí para legibilidad. Sin los espa-
cios, es más difícil ver el signo de admiración:
 if (!inFile)
En una sentencia If, la forma de enunciar la expresión lógica depende de lo que se desee haga la 
cláusula then. La sentencia
 if (inFile)
 M
ejecuta la cláusula then si tiene éxito la última operación I/O en inFile. La sentencia
 if ( !inFile )
 M
ejecuta la cláusula then si inFile está en el estado de falla. (Recuerde que una vez que un fl ujo está 
en el estado de falla, permanece así. Cualquier operación adicional I/O en ese fl ujo es nula.)
A continuación se presenta un ejemplo que muestra cómo comprobar si un archivo de entrada 
se abrió con éxito:
 //******************************************************************
// StreamState program
// This program demonstrates testing the state of a stream
//******************************************************************
#include <iostream>
#include <fstream> // For fi le I/O
 
using namespace std;
 
int main()
Probar el estado de un fl ujo Acto de usar un objeto de 
fl ujo de C++ en una expresión lógica como si fuera una 
variable booleana; el resultado es true si tuvo éxito la 
última operación I/O en ese fl ujo, y false en caso con-
trario.
Dale005.indd 180Dale005.indd 180 4/12/06 19:00:534/12/06 19:00:53
 www.FreeLibros.me
{
 int height;
 int width;
 ifstream inFile;
 inFile.open("measures.dat"); // Attempt to open input fi le
 if ( !inFile ) // Was it opened?
 {
 cout << "Can't open the input fi le."; // No--print message
 return 1; // Terminate program
 }
 inFile >> height >> width;
 cout << "For a height of " << height << endl
 << "and a width of " << width << endl
 << "the area is " << height * width << endl;
 return 0;
}
En este programa se empieza por intentar abrir el archivo de disco measures.dat para ingreso. Se 
comprueba de inmediato si el intento fue exitoso. Si es así, el valor de la expresión !inFile en la 
sentencia If es false y se omite la cláusula then. El programa procede a leer datos del archivo y 
luego ejecuta un cálculo. Concluye al ejecutar la sentencia
 return 0;
Con esta sentencia, la función main devuelve el control al sistema operativo de la computadora. 
Recuerde que el valor de función devuelto por main se conoce como el estado de salida. El valor 0 
signifi ca terminación normal del programa. Cualquier otro valor (por lo común 1, 2, 3, …) indica que 
algo estuvo mal.
Repasemos de nuevo el programa, suponiendo que no se pudo abrir el archivo de entrada. Como 
resultado de la función open, el fl ujo inFile se encuentra en el estado de falla. En la sentencia If, el 
valor de la expresión !inFile es true. Así, se ejecuta la cláusula then. El programa imprime un 
mensaje de error para el usuario y luego termina, devolviendo un estado de salida de 1 para informar 
al sistema operativo de una terminación anormal del programa. (La elección del valor 1 para el esta-
do de salida es puramente arbitraria. Los programadores de sistemas en ocasiones usan varios valores 
distintos en un programa a fi n de señalar razones distintas para la terminación de un programa. Pero 
la mayoría de las personas sólo emplean el valor 1.)
Siempre que abra un archivo de datos para ingreso, asegúrese de probar el estado de fl ujo antes 
de proceder. Si lo olvida, y la computadora no puede abrir el archivo, su programa continúa la eje-
cución de un modo discreto e ignora cualquier operación de entrada en el archivo.
Caso práctico de resolución de problemas
Calculadora para el IMC
PROBLEMA Se ha hablado mucho acerca del sobrepeso actual de gran parte de la población estadounidense. 
En casi todas las revistas hay un artículo relacionado con los problemas de salud causados por la obesidad. En 
lugar de examinar una gráfi ca que muestra el peso promedio para una estatura particular, se ha hecho popular 
una medida denominada índice de masa corporal (IMC), que calcula una relación de su peso y estatura para de-
terminar un peso apropiado. La fórmula para valores no métricos es
IMC = peso * 703/estatura2
El IMC se correlaciona con la grasa corporal, que puede ser empleado para determinar si un peso es inapropia-
do para cierta estatura. Aunque el análisis del IMC en los medios es muy reciente, Adolphe Quetelet, un estadístico 
 Caso práctico de resolución de problemas | 181
Dale005.indd 181Dale005.indd 181 4/12/06 19:00:554/12/06 19:00:55
 www.FreeLibros.me
182 | Capítulo 5: Condiciones, expresiones lógicas y estructuras de control de selección
belga del siglo XIX, obtuvo la fórmula. Realice una investigación del “índice de masa corporal” en Internet y encon-
trará más de un millón de sugerencias. En estas referencias, la fórmula es la misma, pero varía la interpretación de 
los resultados, dependiendo de la edad y el sexo. A continuación se muestra la interpretación más común:
IMC Interpretación
< 20 Debajo del peso normal
20-25 Normal
26-30 Sobrepeso
más de 30 Obeso
Escriba un programa que calcule el IMC dados el peso y la estatura, e imprima un mensaje apropiado.
ENTRADA La sentencia del problema dice que la fórmula es para valores no métricos. Esto signifi ca que el peso 
debe estar en libras y la estatura en pulgadas. Así, la entrada deben ser dos valores fl oat: peso y estatura.
SALIDA
Mensajes para ingreso de los valores
Un mensaje basado en el IMC
ANÁLISIS Para calcular el IMC, usted lee el peso y la estatura y los inserta en la fórmula. Si eleva la estatura al 
cuadrado, debe incluir <cmath> para tener acceso a la función pow. Es más efectivo multiplicar la estatura por 
sí misma.
IMC = peso * 703/(estatura * estatura)
Si estuviera realizando el cálculo a mano, tal vez observaría si el peso o la estatura fueron negativos y lo 
cuestionaría. Si la semántica de sus datos indica que los valores deben ser no negativos, entonces su programa 
debe realizar una prueba para asegurarse de que así es. El programa debe probar cada valor y usar una variable 
booleana para presentar un informe de resultados. Aquí está el módulo principal para este algoritmo.
Principal Nivel 0
Obtener los datos
Probar los datos
SI los datos son correctos
Calcular el IMC
Imprimir mensaje que indica el estado
DE OTRO MODO
Imprimir “datos no válidos; el peso y la estatura deben ser positivos”.
¿Cuál de estos pasos requiere expansión? Obtener datos, Probar datos e Imprimir mensaje que indique el estado 
requieren sentencias múltiples para resolver su subproblema particular. Por otro lado, se puede traducir Imprimir 
“Datos no válidos:...” directamente en una sentencia de salida de C++. ¿Qué hay acerca del paso Calcular IMC? Se 
puede escribir como una sola sentencia de C++, pero hay otro nivel de detalle que se debe llenar, la fórmula que 
se empleará. Debido a que la fórmulaestá en un nivel inferior de detalle que el resto del módulo principal, se elige 
expandir Calcular IMC como un módulo de nivel 1.
Dale005.indd 182Dale005.indd 182 4/12/06 19:00:564/12/06 19:00:56
 www.FreeLibros.me

Continuar navegando