Sesión Prevista para el 5 Diciembre 2008

 

1.6 Programación modular

 

1.6.1 Actividad guiada: diseño modular, uso de las estructuras CASE y REPEAT-UNTIL para la gestión de menús de usuario.

Definición del problema

Escribir un programa en PASCAL que convierta temperaturas introducidas por teclado a otra escala dependiendo de la opción escogida por el usuario. Para ello el programa mostrará en pantalla el siguiente menú:

Menu de opciones para convertir temperaturas:
1.- Convertir Centígrados a Farenheit
2.- Convertir Centígrados a Kelvin
3.- Convertir Farenheit a Kelvin
4.- Terminar

Introducir una opción (1-4):_

El programa esperará hasta que el usuario haya introducido una opción (entre las posibilidades: 1,2,3,4). Una vez introducida la opción, el programa pedirá que se introduzca una temperatura por teclado y mostrará en pantalla la temperatura convertida a la escala final, dependiendo de la opción escogida(teniendo en cuenta que x ºC son (9/5*x + 32) ºF y (x-273) ºK). Una vez mostrada la temperatura final, el programa mostrará el mensaje Pulsar ENTER para continuar y consecuentemente esperará hasta pulsar la tecla ENTER. Una vez pulsada esta tecla, mostrará de nuevo el menú y continuará indefinidamente hasta pulsar la opción "4". Si el usuario introdujera una opción distinta a 1,2,3 y 4, el programa mostrará en pantalla el mensaje Opción incorrecta. Pulsa ENTER para continuar y esperará hasta pulsar la tecla ENTER para, a continuación, volver a mostrar el menú.

Cómo solucionar el problema

Para resolver este problema utilizaremos técnicas de programación modular, aplicando la metodología Divide y vencerás, es decir, en un primer análisis del problema identificaremos subproblemas más pequeños, los resolveremos de forma independiente y finalmente los orquestaremos para producir la solución al problema global. Pasos a seguir para construir la solución a este problema:

1.6.1.1 Diseño modular: identificar subproblemas y asociar un módulo con cada uno.
Dentro del problema general de convertir temperaturas a distintas escalas, identificamos cuatro subproblemas: cómo mostrar información al usuario (MostrarMenú), cómo convertir de Celsius a Farenheit, de Celsius a Kelvin y de Farenheit a Kelvin. En principio no nos preocupa el flujo de control que habrá entre estos módulos, una vez que hallamos resuelto cada uno de los subproblemas por separado nos enfrentaremos con el problema de "cómo engancharlos" dentro de una estructura de control.

 

1.6.1.2 Elaborar un subalgoritmo para cada uno de los subproblemas.
Subalgoritmo MostrarMenu Subalgoritmo CelsiusAFarenheit

Entradas: no tiene
Salidas: (por pantalla)
Objetivo:mostrar en pantalla información al usuario
Usa otros subalgoritmos: no
Pasos:

Entradas: (por teclado) g_celsius, número real
Salidas: (por pantalla) muestra el valor en ºF de g_celsius
Objetivo:mostrar en pantalla el valor en ºF de la temperatura en ºC leida por teclado y almacenada en g_celsius. Después hacer que el programa espere hasta pulsar ENTER.
Usa otros subalgoritmos: la función C_a_F(x:real):real que calcula el valor en ºF de la temperatura x (en ºC) (esta es una función que tendremos que definir también en el programa y que ya hemos hecho en otros ejercicios).
Pasos:
  1. Escribir(en pantalla) "Menu de opciones para convertir temperaturas:"
  2. Escribir(en pantalla) "1.- Convertir Centígrados a Farenheit"
  3. Escribir(en pantalla) " 2.- Convertir Centígrados a Kelvin"
  4. Escribir(en pantalla) " 3.- Convertir Farenheit a Kelvin"
  5. Escribir(en pantalla) " 4.- Terminar"
  1. Leer(de teclado) g_celsius
  2. Escribir(en pantalla) g_celsius, "ºC son ", C_a_F(g_celsius), "ºF"
  3. Esperar hasta pulsar ENTER
Subalgoritmo CelsiusAKelvin Subalgoritmo FarenheitAKelvin
Entradas: (por teclado) g_celsius, número real
Salidas: (por pantalla) muestra el valor en ºK de g_celsius
Objetivo:mostrar en pantalla el valor en ºK de la temperatura en ºC leida por teclado y almacenada en g_celsius. Después hacer que el programa espere hasta pulsar ENTER.
Usa otros subalgoritmos: la función C_a_K(x:real):real que calcula el valor en ºK de la temperatura x (en ºC) (esta es una función que tendremos que definir también en el programa, que no hemos hecho pero que es similar a otras hechas en otros ejercicios).
Pasos:
Entradas: (por teclado) g_far, número real
Salidas: (por pantalla) muestra el valor en ºK de g_far
Objetivo:mostrar en pantalla el valor en ºK de la temperatura en ºF leida por teclado y almacenada en g_far. Después hacer que el programa espere hasta pulsar ENTER.
Usa otros subalgoritmos: la función F_a_K(x:real):real que calcula el valor en ºK de la temperatura x (en ºF) (esta es una función que tendremos que definir también en el programa, que no hemos hecho pero que es similar a otras hechas en otros ejercicios).
Pasos:
  1. Leer(de teclado) g_celsius
  2. Escribir(en pantalla) g_celsius, "ºC son ", C_a_K(g_celsius), "ºK"
  3. Esperar hasta pulsar ENTER
  1. Leer(de teclado) g_far
  2. Escribir(en pantalla) g_far, "ºF son ", F_a_K(g_far), "ºK"
  3. Esperar hasta pulsar ENTER

 

1.6.1.3 Componer el algoritmo principal a partir de cada una de sus piezas (subalgoritmos).
Una vez identificados los subproblemas y definido el subalgoritmo para cada uno hay que componer el algoritmo principal a partir de las piezas con que contamos. Para ello tenemos que "esbozar" cuál va a ser la estructura de control (o flujo de control) que seguirá el algoritmo principal. La siguiente figura lo ilustra.

Algoritmo Convertir_Temperaturas
Entrada:(por teclado) opcion, tipo carácter
Salida:(por pantalla) muestra los mensajes de cada subalgoritmo y un mensaje de error si la opción introducida no es la adecuada
Objetivo: convertir una temperatura introducida por teclado a una escala distinta dependiendo de la opción escogida.
Subalgoritmos: Usa los subalgoritmos

MostrarMenu,
CelsiusAFarenheit,
CelsiusAKelvin,
FarenheitAKelvin,

además utiliza las funciones

C_a_F(x:real):real, C_a_K(x:real):real y F_a_K(x:real):real

Pasos:

  1. Repetir
    1. Invocar MostrarMenu
    2. Leer opcion
    3. Casos de opcion
      1. Si opcion='1' Invocar CelsiusAFarenheit
      2. Si opcion ='2' Invocar CelsiusAKelvin
      3. Si opcion ='3' Invocar FarenheitAKelvin
      4. Cualquier otro
        Escribir(en pantalla) "Error. Opción Incorrecta"
        Esperar hasta pulsar ENTER
  2. HASTA opcion=4

 

                                   
1.6.1.4 Escribir (implementar) el programa.
                                   
1.6.1.4.1 Escribir cada subalgortimo como procedimiento o función.

Se muestra a continuación el esquema de definición de procedimientos y funciones del programa principal (que debe ser completado) Nota: Copiar desde la página web y pegar en el entorno FreePascal escogiendo la opción "Paste From Windows"

Program Convertir_Temperaturas;

Uses crt; (*unidad para usar funciones especiales para pantalla y teclado*)

Var opcion:char; (*variable global para almacenar la opcion escogida*)

(*Primero hay que declarar las funciones que usaran los distintos procedures*)

Function C_a_F(x:real):real;(*convierte Celsius a Farenheit*)

Begin
C_a_F:=(9/5)*x + 32;
End;

Function C_a_K(x:real):real;(*convierte Celsius a Kelvin*)

(*completar*)

Function F_a_K(x:real):real;(*convierte Farenheit a Kelvin*)

(*completar*)

Procedure MostrarMenu; (*este procedimiento no tiene parámetros*)

(*completarlo*)

Procedure CelsiusAFarenheit; (*este procedimiento no tiene parámetros*)

(*completarlo*)

Procedure CelsiusAKelvin; (*este procedimiento no tiene parámetros*)

(*completarlo*)

Procedure FarenheitAKelvin; (*este procedimiento no tiene parámetros*)

(*completarlo*)

                                   
1.6.1.4.2 Escribir el programa principal.

El programa principal se muestra a continuación.

BEGIN

REPEAT

clrscr; (*borra la pantalla*)

(* ... completarlo ... *)

UNTIL opcion = '4';

END.