Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
186 | Capítulo 5: Condiciones, expresiones lógicas y estructuras de control de selección en lugar de if (dataAreOK) : Para convencerse usted mismo de que estas tres variaciones funcionan, inténtelas a mano con algunos datos de prueba. Si todas estas sentencias hacen lo mismo, ¿cómo elige una para usarla? Si su objetivo es la efi ciencia, la variación fi nal, la condición compuesta en la sentencia If principal, es mejor. Si su intención es tratar de expresar su código lo más claro posible, la forma más larga mostrada en el programa puede ser mejor. Las otras variaciones están en alguna parte intermedia. (Sin embargo, algunas personas encontrarían que la condición compuesta en la sentencia If principal no es sólo la más efi caz, sino la más fácil de entender.) No hay reglas absolutas para seguir aquí, pero la pauta general es esforzarse por lograr claridad, incluso si debe sacrifi car un poco de efi ciencia. Prueba y depuración En el capítulo 1 se analizaron las fases de resolución de problemas y ejecución de la programación en computadora. Probar es parte integral de ambas fases. Aquí se prueban ambas fases del proceso empleado para desarrollar el programa del IMC. La prueba en la fase de resolución del problema se hace después de que se desarrolló la solución, pero antes de ponerla en práctica. En la fase de imple- mentación se prueba después de que el algoritmo se tradujo en un programa, y de nuevo después de que el programa se ha compilado con éxito. La compilación en sí es otra etapa de prueba que se efectúa de manera automática. Prueba en la fase de resolución del problema: repaso del algoritmo Determinar precondiciones y poscondiciones Para probar durante la fase de resolución del proble- ma, se hace un repaso del algoritmo. Para cada módulo de la descomposición funcional, se establece una afi rmación denominada precondición y otra nombrada poscondi- ción. Una precondición es una afi rmación que debe ser verdadera antes de ejecutar un módulo, a fi n de que el módulo se ejecute de manera correc- ta. Una poscondición es una afi rmación que debe ser verdadera después de que se ejecutó el módulo, si ha hecho su trabajo correctamente. Para probar un módulo, se “repasan” los pasos del algoritmo para confi rmar que producen la poscondición requerida, dada la precondición estándar. Nuestro algoritmo tiene cinco módulos: el módulo Principal, Obtener datos, Probar datos, Calcular el IMC e Imprimir un mensaje que indica el estado. En general, no hay precondición para el módulo principal. La poscondición del módulo principal es que produzca los resultados correctos, dada la entrada correcta. De modo más específi co, la poscondición para el módulo principal es: • La computadora ha introducido dos valores reales en weight y height. • Si la entrada no es válida, se imprime un mensaje de error; de lo contrario, el índice de masa corporal ha sido calculado y se imprime un mensaje apropiado con base en el resultado. Debido a que Obtener datos es el módulo principal ejecutado en el algoritmo y a que en él no se supone nada acerca del contenido de las variables que se manejarán, no tiene precondición. Su poscondición es que dataAreOK contiene true si los valores en weight y height son no negativos; de lo contrario, dataAreOK contiene false. La precondición para el módulo Calcular el IMC es que weight y height contienen valores signifi cativos. Su poscondición es que la variable llamada bodyMassIndex contiene la evaluación de la fórmula para el IMC (peso * 703 /(estatura * estatura)). La precondición para el módulo Imprimir mensaje que indica el estado es que bodyMassIndex contiene el resultado de evaluar la fórmula del IMC. Su poscondición es que se han impreso la docu- Precondición Afi rmación que debe ser verdadera antes de ejecutar un módulo. Poscondición Afi rmación que debe ser verdadera des- pués de que se ejecutó un módulo. Dale005.indd 186Dale005.indd 186 4/12/06 19:01:054/12/06 19:01:05 www.FreeLibros.me mentación apropiada y el valor de bodyMassIndex, junto con los mensajes: “Peso debajo del nor- mal: tome una malteada.”, si el valor del IMC es menor que 20; “Normal: tome un vaso de leche.”, si el valor es menor que o igual a 26; “Sobrepeso: tome un vaso de té helado.”, si el valor es menor que o igual a 30, y “ Obeso: consulte a su médico.”, si el valor es mayor que 30. A continuación se resumen las precondiciones y poscondiciones del módulo en forma tabular. En la tabla se usa AND con su signifi cado usual en una afi rmación, la operación lógica AND. Asimismo, una frase como “someVariable está asignada” es una forma abreviada de afi rmar que a someVariable ya se le asignó un valor signifi cativo. Módulo Precondición Poscondición Principal — Dos valores fl oat han sido introducidos AND si la entrada es válida, se calcula la fórmula del IMC y se imprime el valor con un mensaje apropiado; de lo contrario, se ha impreso un mensaje de error. Obtener datos — se han introducido weight y height Probar datos weight y height son valores dataAreOK contiene true si asignados weight y height son no negativos; de otro modo, dataAreOK contiene false. Calcular IMC weight y height son valores bodyMassIndex contiene la evaluación asignados de la fórmula del IMC. Imprimir mensaje bodyMassIndex contiene la El valor de bodyMassIndex ha sido Indicar estado evaluación de la fórmula del IMC impreso, junto con un mensaje que interpreta el valor. Efectuar el repaso del algoritmo Ahora que se han establecido las precondiciones y poscondiciones, se repasa el módulo principal. En este punto, sólo interesan los pasos del módulo principal, así que por el momento se supone que cada módulo de nivel inferior se ejecuta de modo correcto. En cada paso se deben determinar las condiciones actuales. Si el paso es una referencia a otro módulo, se debe comprobar que las condiciones actuales satisfacen la precondición de ese módulo. Se empieza con la primera sentencia del módulo principal. Obtener datos no tiene una precondi- ción, y se supone que Obtener datos satisface su poscondición de que introduce de manera correcta dos valores reales en weight y height. La precondición para el módulo Probar datos es que weight y height son valores asignados. Éste debe ser el caso si la poscondición de Obtener datos es verdadera. De nuevo, debido a que sólo interesa el paso a nivel 0, se supone que Probar datos satisface su poscondición de que dataAreOK contiene true o false, dependiendo de los valores de entrada. A continuación, la sentencia If comprueba si dataAreOK es true. Si es así, el algoritmo ejecuta la cláusula then. Suponiendo que Calcular IMC evalúa de manera correcta la fórmula del IMC y que Imprimir mensaje indicando el estado imprime el resultado y el mensaje apropiado (recuerde: por ahora se está suponiendo que los módulos de nivel inferior son correctos), entonces la cláusula then de la sentencia If es correcta. Si el valor en dataAreOK es false, el algoritmo ejecuta la cláusula else e imprime un mensaje de error. Ahora se ha comprobado que el módulo principal (nivel 0) es correcto, suponiendo que los mó- dulos del nivel 1 son correctos. El siguiente paso es examinar cada módulo en el nivel 1 y contestar esta pregunta: si se supone que los módulos (si existen) del nivel 2 son correctos, ¿este módulo de nivel 1 hace lo que se supone tiene que hacer? Simplemente se repite el proceso de repaso para cada módulo, empezando con su precondición particular. En este ejemplo, no hay módulos de nivel 2, así que deben estar completos los módulos del nivel 1. Obtener datos lee correctamente dos valores —weight y height—, así que satisfacen su poscon- dición. (El siguiente refi namiento es codifi car la instrucción en C++. Si está codifi cada o no de ma- Prueba y depuración | 187 Dale005.indd 187Dale005.indd 187 4/12/06 19:01:074/12/06 19:01:07 www.FreeLibros.me 188 | Capítulo 5: Condiciones, expresiones lógicas y estructurasde control de selección nera correcta, no es asunto de esta fase; se trata con el código cuando se efectúa la prueba en la fase de implementación.) Probar datos comprueba si ambas variables contienen valores no negativos. La condición If usa correctamente operadores OR para combinar las expresiones relacionales de modo que si cualquiera de ellas es true, se ejecuta la cláusula then. Así, se asigna false a dataAreOK si alguno de los números es negativo; de otro modo, se asigna true. Por tanto, el módulo satisface su poscondición. Calcular IMC evalúa la fórmula del IMC: peso * 703 /(estatura * estatura). Por consiguiente, la poscondición requerida es verdadera. ¿Pero qué pasa si el valor de la estatura es 0? Se comprobó que las entradas sean no negativas, pero se olvidó que la estatura se usa como divisor y no puede ser cero. Será necesario arreglar este problema antes de liberar este programa para uso general. Imprimir mensaje que indique el estado produce el valor en bodyMassIndex con documentación apropiada. Luego compara el resultado con los estándares e imprime la interpretación apropiada. Se imprime “Peso debajo del normal: tome una malteada.”, si el valor es menor que 20; “Normal: tome un vaso de leche.”, si el valor es menor o igual a 26; “Sobrepeso: tome un vaso de té helado.”, si el valor es menor que o igual a 30, y “Obeso: consulte a su médico.”, si el valor es mayor que 30. Así, el módulo satisface su poscondición. Una vez completado el repaso del algoritmo, se tiene que corregir cualquier discrepancia y repe- tir el proceso. Cuando se sabe que los módulos hacen lo que se supone tienen que hacer, se empieza a traducir el algoritmo en el lenguaje de programación. Una poscondición estándar para cualquier programa es que el usuario ha sido notifi cado de datos no válidos. Se debe validar todo valor de entrada para el cual aplica cualquier restricción. Una sen- tencia If de validación de datos prueba un valor de entrada y produce un mensaje de error si el valor no es aceptable. (Se validan los datos cuando se prueban valores negativos en el programa del IMC.) El mejor lugar para validar los datos es inmediatamente después de su ingreso. Para satisfacer la poscondición de validación de datos, el algoritmo debe probar también los valores de entrada para asegurar que no son demasiado grandes o demasiado pequeños. Prueba en la fase de implementación Ahora que se ha hablado acerca de la prueba en la fase de resolución de problemas, se dirige la aten- ción a la prueba en la fase de implementación. En esta fase es necesario probar en varios puntos. Repaso del código Después de escribir el código, se debe revisar línea por línea para asegurarse de que el algoritmo se reprodujo fi elmente, un proceso conocido como repaso del código. En una situa- una piedra computarizada ¿inventaste una piedra que maldice? ése es sólo el cursor JUGUetes JUGUetes ¿Qué es esto? A.C. Por Johnny Hart Con la autorización de Johny Hart and Creators Syndicate, Inc. Dale005.indd 188Dale005.indd 188 4/12/06 19:01:094/12/06 19:01:09 www.FreeLibros.me
Compartir