Descarga la aplicación para disfrutar aún más
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
Compartir