Vous êtes sur la page 1sur 12

Programacio n Imperativa:

Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

6. Ana lisis y Diseno Modular


Hasta el momento se han trabajado problemas pequenos que se pueden solucionar
directamente utilizando las instrucciones basicas. Cuando se quiere solucionar un
problema mas grande, es necesario introducir una metodologa o forma de trabajar
que permita manejar esa complejidad de tal manera que sea relativamente facil
obtener la solucio n.
El macro algoritmo, presenta la solucio n del problema total mediante una secuencia
de tareas a desarrollar, pedir notas, calcular la definitiva, calcular el promedio, etc.
Estas tareas pueden considerarse problemas mas pequenos a resolver
(subproblemas). Cada paso del macro algoritmo, es realmente un subproblema a
solucionar, la solucio n se realiza con instrucciones del algoritmo (una operacio n
matematica, leer un dato del teclado o escribir un valor en pantalla).
Cuando el tamano de los problemas crece, el tamano de cada tarea del macro
algoritmo crece, se hace necesario identificar subtareas que permitan realizar la tarea
especificada. Si las subtareas siguen siendo grandes, es necesario volver a identificar
un nuevo conjunto de subtareas que resuelvan las subtareas, este proceso se continua
hasta que cada subtarea se pueda expresar en te rminos de unas pocas instrucciones
basicas. La metodologa, tal como ha sido expresada anteriormente se conoce como
Refinamiento a Pasos y fue expresada en el articulo Program Development by
Stepwise Refinement por Niklaus Wirth.

Ejemplo No 1.
Dadas las coordenadas (en dos dimensiones) de los ve rtices de un triangulo, hallar el
permetro y el area.

Documento de Ana lisis


Problema Bien Definido
Contexto
Geometra Plana
Triangulo = { punto } 3 + permetro + area
Punto = abscisa + ordenada

1 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

Flujo de Datos

ve rtices

triangulo

permetro, area

Si se aplica el refinamiento a pasos es necesario identificar, cuales pasos del macro


algoritmo (tareas) deben ser expresados en te rminos de subtareas. Para este caso en
particular cada pasos puede ser expresado en te rminos de subtareas as:
Obtener los vertices:
Obtener primer vertice
Obtener segundo vertice
Obtener tercer vertice
Calcular el permetro y el area:
Calcular las longitudes de los lados
Calcular el permetro
Calcular el area
Visualizar el permetro y el area:
Visualizar el permetro
Visualizar el area
Si revisamos de nuevo las tareas todava se pueden especificar mas subtareas.

Calcular las longitudes de los lados:


Calcular la longitud del primer lado
Calcular la longitud del segundo lado
Calcular la longitud del tercer lado
En definitiva, se puede descomponer el macro algoritmo en los pasos expresados en
letra negrilla ita lica
2 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

Obtener los vertices:


Obtener primer vertice
Obtener segundo vertice
Obtener tercer vertice
Calcular el permetro y el area:
Calcular las longitudes de los lados
Calcular la longitud del primer lado
Calcular la longitud del segundo lado
Calcular la longitud del tercer lado
Calcular el permetro
Calcular el area
Visualizar el permetro y el area:
Visualizar el permetro
Visualizar el area
Es decir el macro algoritmo puede ser expresado de la siguiente manera:
macro algoritmo triangulo
1. Obtener primer vertice
2. Obtener segundo vertice
3. Obtener tercer vertice
4. Calcular la longitud del primer lado
5. Calcular la longitud del segundo lado
6. Calcular la longitud del tercer lado
7. Calcular el permetro
8. Calcular el area
9. Visualizar el permetro
10.Visualizar el area
End
Sin embargo esta manera de expresar el macro algoritmo es muy detallada,
adicionalmente pierde la estructura del refinamiento a pasos, no es claro cuales
fueron los pasos que se refinaron, de tal manera que imposibilita realizar una
descomposicio n de tareas diferente a la ya presentada.
Una mejor manera de presentar la descomposicio n es la siguiente:
macro algoritmo triangulo
1. Obtener los vertices (obtenerVertices)
2. Calcular el permetro y el area (calculo)
3. Visualizar el permetro y el area (mostrar)
Fin

3 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos
macro algoritmo
1. Obtener
2. Obtener
3. Obtener
fin

30/08/04
Analisis y Diseno Modular

obtenerVertices
el primer vertice
el segundo vertice
el tercer vertice

macro algoritmo calculo


1. Calcular
las
longitudes
(calcularLados)
2. Calcular el permetro
3. Calcular el area
fin

de

los

lados

macro algoritmo mostrar


1. Visualizar el permetro
2. Visualizar el area
Fin
macro algoritmo calcularLados
1. Calcular la longitud del primer lado
2. Calcular la longitud del segundo lado
3. Calcular la longitud del tercer lado
Fin
Observe que en algunos pasos se coloco entre pare ntesis al final una palabra
(ve rtices, calculo, mostrar etc) la cual indica en nombre del macro algoritmo donde
se refina dicho paso. En el ejemplo anterior se alcanzo a realizar dos refinamientos.
El macro algoritmo principal tiene especificado un flujo de datos, sin embargo es
necesario que los otro macro algoritmos tambie n lo tengan para poder determinar
como se manipulan los datos entre los diferente macro algoritmos, para esto es
necesario ampliar el formalismo de flujo de datos de la siguiente manera:

Datos dados por


el usuario

Datos determinados por el


Programador

Datos Modificados en
Memoria

Datos Necesarios en
Memoria

Datos Visualizados
al Usuario

4 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

Se agregan los datos que estan en memoria del computador, los que son necesario
que ya tengan valor en memoria y aquello cuyo valor se modifica en memoria. De
esta manera los flujos de datos y macro algoritmos se expresan as:
Flujo de Datos

Ve rtices

obtenerVertices

macro algoritmo
1. Obtener
2. Obtener
3. Obtener
Fin

Ve rtices

obtenerVertices
primer vertice
segundo vertice
tercer vertice

Flujo de Datos

Ve rtices

Calculo

macro algoritmo calculo


1. Calcular
las
longitudes
(calcularLados)
2. Calcular el permetro
3. Calcular el area
Fin

Permetro y area

de

los

lados

Flujo de Datos

Permetro, area

Mostrar

Permetro, area

5 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

macro algoritmo mostrar


1. Visualizar el permetro
2. Visualizar el area
Fin
Flujo de Datos

Ve rtices
macro algoritmo
1. Calcular
2. Calcular
3. Calcular
Fin

calcularLados

Lados

calcularLados
la longitud del primer lado
la longitud del segundo lado
la longitud del tercer lado

6.1. Subprogramas
Para escribir las instrucciones correspondientes a los macro algoritmos de la
descomposicio n se hace necesario agregar a los programas un nuevo componente:
los subprogramas.
Existen dos tipos de subprogramas: funciones y procedimientos.
6.1.1. Funcio n:
Una funcio n en el sentido matematico es una relacio n entre dos conjuntos tal que
para todo elemento del conjunto de partida existe una y solo una imagen. En
te rminos de programacio n de computadores, una funcio n es aquel subprograma que
ejecuta un conjunto de instrucciones y que puede calcular y retornar valores a partir
de datos conocidos y enviados por el programa que lo llamo . Generalmente, el
resultado que retorna se asigna a variables, aunque tambie n puede ser utilizado en
una expresio n.
6.1.2. Procedimiento:
Un procedimiento es un subprograma que ejecuta un conjunto de instrucciones para
resolver un subproblema y que puede recibir y/o devolver 0, 1 o mas datos desde y
hacia el programa o subprograma que lo llamo . Tanto la entrada de informacio n al
procedimiento como la devolucio n de resultados desde el procedimiento al programa
que lo llamo se realizan a trave s de los datos enviados y recibidos.

6 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

6.2. Canales de Comunicacion


Para la utilizacio n de los subprogramas mediante funciones o procedimientos se
hace necesario pasarle o enviarle algunos de los datos modelados en el programa o
en el subprograma que lo llama. As mismo, los resultados que se obtuvieron en su
procesamiento deben ser recibidos desde donde fue llamado para continuar con la
ejecucio n. Para lo anterior, en el llamado y en la definicio n de los subprogramas, se
necesitan los canales de comunicacio n, cuya funcio n, es establecer la conexio n entre
el subprograma que hace la llamada y el subprograma invocado.
6.2.1. Tipos de Canales
De acuerdo con el funcionamiento los canales de comunicacio n pueden ser:
6.2.1.1.

De entrada (in)

Si tienen un valor al salir hacia el subprograma y lo conservan al terminar y


regresar al programa o subprograma que lo llamo .
6.2.1.2.

De salida (out)

Si no tienen un valor asignado al salir hacia el subprograma, es decir, que su valor es


desconocido y se obtendra dentro en la ejecucio n del subprograma y por lo tanto,
tendran un valor nuevo al regresar al programa o subprograma que lo llamo .
6.2.1.3.

De entrada/salida (inout)

Si al salir hacia el subprograma tienen un valor asignado y van a ser modificados


durante su ejecucio n. Al regresar al programa o subprograma donde fue llamado
tendran un valor diferente.
6.2.2. Canales de comunicacion en las funciones
Las funciones manejan so lo canales de entrada.
6.2.3. Canales de comunicacion en los procedimientos
Los procedimientos pueden manejar cualquiera de los tres tipos de canales: de
entrada, de salida y de entrada/salida.
Es necesario definir el encabezado de cada uno de los subprogramas
correspondientes a los macro algoritmos El encabezado consiste en indicar el tipo de
subprograma y que canales de comunicacio n va a utilizar. Los tipos de los canales
son los mismos tipos que pueden ser usados en la declaracio n de variables. En cierto
sentido se pueden considerar una clase especial de variables.

7 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

En el ejercicio que se ha resuelto hasta el momento, para poder especificar los


subprogramas de los macro algoritmos obtenerVertice, ca lculo, mostrar y
calcularLado, es necesario tener definido los tipos del modelo de datos.
type
Tpunto = record
|[
x,y: real
]|
Triangulo = record
|[
vertices: array [0..3) of Tpunto
area, permetro: real
]|
Se parte del flujo de datos del macro algoritmo y se determina el numero de salidas
para decidir si se usa un procedimiento o una funcio n. Si se tienen datos de salida de
tipo basico que no son al mismo tiempo datos de entrada, el subprograma se puede
convertir en funcio n o en procedimiento, de lo contrario es un procedimiento. Luego
se determinan los canales de acuerdo a si los datos entran o salen a memoria. NO se
tiene en cuenta los datos que entran o salen al usuario. De acuerdo a lo anterior los
encabezados de los subprogramas para el ejercicio que se esta resolviendo son los
siguientes:
proc obtenerVertices(out vertices: array [0..3) of Tpunto)
(*
OBJ: Obtener del usuario los ve rtices del triangulo
*)
El subprograma calculo puede ser procedimiento o funcio n:
proc calculo(in vertices: array [0..3) of Tpunto,
out permetro, area: real)
(*
OBJ: Calcular el area y el permetro del triangulo representado por ve rtices
*)
funct calculo(in vertices: array [0..3) of Tpunto) ret permetro, area: real
(*
OBJ: Calcular el area y el permetro del triangulo representado por ve rtices
*)

8 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

proc mostrar(in permetro, area: real)


(*
OBJ: Visualizar el permetro y el area del triangulo
*)
El subprograma calculo puede ser procedimiento o funcio n:
proc calcularLados(in vertices: array [0..3) of Tpunto,
out lados: array [0..3) of real)
(*
OBJ: Calcular la longitud de los lados del triangulo representado por ve rtices
*)
Funct calcularLados(in vertices: array [0..3) of Tpunto)
ret lados: array [0..3) of real)
(*
OBJ: Calcular la longitud de los lados del triangulo representado por ve rtices
*)

Observe que se agrega como comentario el objetivo del subprograma


Cuando se cuenta con los encabezados de los subprogramas ya es posible escribir el
algoritmo principal. En este es necesario invocar el procedimiento o funcio n
asociado al subprograma, la accio n de darle control al procedimiento o funcio n
tradicionalmente se llama hacer el llamado al procedimiento o funcio n.

9 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

module triangulos
|[
var
Triangulo: Ttriangulo
write(area y Permetro de triangulos);
(* Obtener los vertices *)
pedirVertices(triangulo.vertices);
(* Calcular permetro y area *)
(* Como llamado a procedimiento *)
calculo(triangulo.vertices,
triangulo.permetro,
triangulo.area);
(* Como llamado a funcion *)
Triangulo.permetro, triangulo.area :=
calculo(triangulo.vertices);
(* visualizar permetro y area *)
mostrar(triangulo.permetro, triangulo.area)
]|
Observe que cada paso del macro algoritmo invoca o llama al subprograma
respectivo dando su nombre y colocando entre pare ntesis los argumentos, los datos
en memoria que corresponden con los canales de comunicacio n definidos para cada
subprograma. Por Ej.:
El argumento triangulo.ve
rtices
subprograma pedirVertices

corresponde al canal de entrada ve rtices del

El numero, el orden y el tipo de cada argumento debe corresponder con el numero,


orden y tipo de cada canal de comunicacio n del subprograma. Dado que una funcio n
puede retornar mas de un valor, es necesario extender la instruccio n de asignacio n
para permitir la asignacio n simultanea de mas de un valor a mas de una variable.
triangulo.permetro, triangulo.area := calculo(triangulo.v ertices);

La anterior asignacio n significa: asigne a triangulo.permetro el primer valor de


resultado de la funcio n (permetro) y a triangulo.area, el segundo valor de resultado
de la funcio n(area). La asignacio n simultanea no se restringe a los valores retornados
por una funcio n, se puede utilizar con cualquier numero de variables y cualquier
numero de expresiones.
10 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

Por ejemplo
a,b := 3,5;

Significa: asigne el valor 3 a la variable a y el valor 5 a la variable b. De la misma


manera, la asignacio n

a,b := b,a;

Tiene el significado de intercambiar los valores de las dos variables. Cual seria el
equivalente para lograr este efecto usando asignaciones sencillas y no asignaciones
multiples?
Finalmente solo resta escribir los cuerpos de cada subprograma , las instrucciones
correspondientes al algoritmo de cada subprograma. Como ejemplo se muestra el
subprograma mostrar
proc mostrar(in permetro, area: real)
(*
OBJ: Visualizar el permetro y el area del triangulo
*)
|[
(* Visualizar el permetro *)
write(El permetro es :, permetro)
(* Visualizar el area *)
write(El area es : , area)
]|

Como ejemplo de definicio n de funcio n, suponga que se desea implementar un


subprograma que dados dos numeros enteros me calcule el cociente y el residuo de
la divisio n entera dado el siguiente encabezado:
Funct divisionEntera(in a,b: int) ret cociente,residuo: int
(*
OBJ: Calcula el cociente y el residuo de la division
entera de a entre b
*)
La implementacio n es:

11 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Programacio n Imperativa:
Un enfoque basado en objetos

30/08/04
Analisis y Diseno Modular

funct divisionEntera(in a,b: int) ret cociente,residuo: int


(*
OBJ: Calcula el cociente y el residuo de la division
entera de a entre b
*)
|[
(* Calcular el cociente *)
cociente := a div b;
(* calcular el residuo *)
residuo := a mod b;
(* retornar de la funcion *)
ret cociente, residuo;
]|
Es importante resaltar que la ultima instruccio n del cuerpo de la funcio n debe ser
ret, y que la funcio n solo puede contener una instruccio n ret

12 de 12
Ing. Gerardo Ospina

Ing. Claudia P. Santiago

Vous aimerez peut-être aussi