Tema Programación por refinamientos sucesivos. Subprogramas



Descargar 234,29 Kb.
Página1/3
Fecha de conversión08.03.2017
Tamaño234,29 Kb.
  1   2   3

Programación I

Tema 2. Programación por refinamientos sucesivos. Subprogramas.

Estrategia de resolución 46

Paso abstracto 48



2.2. Especificación de subprogramas 51

Interfaz de un subprograma 53

Especificación: convenio 55

Tipos de subprogramas: Procedimientos y Funciones 56



2.3. Uso de subprogramas 62

La llamada al subprograma se considera como la instrucción n+1 del programa de la izda. 64

Modo de paso de valores 65

2.4. Diseño de subprogramas 69

Gestión de parámetros 74

Parámetros formales y parámetros reales 81

2.5. Ejemplo paso a paso de diseño por refinamientos. 84

Recopilación de ejemplos vistos en el Tema 2. 94

Ejercicios 95


subprogramas en Ada (Apuntes Lenguaje ADA)

2.1. Diseño de programas y datos. Refinamientos sucesivos



El diseño descendente (top-down) o refinamientos sucesivos constituye:


• Una estrategia de construcción de algoritmos

• Documentación del programa (de utilidad

para su comprensión)

Estrategia de resolución





Sigue la técnica de "divide y vencerás"
• El problema se divide en subproblemas

• Cada subproblema se resuelve individualmente

• Cada subproblema se divide en otros subproblemas

• Se sigue de esta manera hasta que los subproblemas sean sencillos de resolver

La solución se organiza jerárquicamente:



Paso abstracto



En el ejemplo de la máquina expendedora, cada subproblema generado se ha escrito en forma de "paso abstracto" (lectura inicial de datos, tratar petición producto, calcular cambios ...)

Incluir un conjunto de instrucciones bajo un mismo epígrafe es tan sólo una necesidad organizativa.


Lo que hace un paso abstracto debe ser fácil de entender y de recordar.

¿Qué detalles interesa concretar antes?

¿Qué otros es preferible incluir dentro de un paso abstracto?
Son preguntas difíciles de responder. La experiencia nos va mostrando cuándo es más conveniente una cosa o la otra.

Subprograma


  • Alguno de los pasos abstractos que surgen en el diseño descendente (top-down) pueden constituir pequeños (o no tan pequeños) programas.




  • Los lenguajes de programación incorporan la noción de subprograma como un fragmento de código con entidad propia que puede ser utilizado desde otros programas (sin necesidad de escribirlo de nuevo en cada programa que lo use).




  • Un subprograma puede ser invocado (utilizado) desde cualquier programa que lo necesite.




  • Un subprograma se distingue de los demás mediante un identificador (en caso de sobrecarga de identificadores intervienen otros aspectos).




Uso de subprogramas: ventajas

• Se evita duplicar grupos de instrucciones innecesariamente (ej. obtener cambios)


• El programa es más pequeño
• El programa es más fácil de entender (abstracción procedural)
• Los subprogramas hechos se pueden usar para escribir otros programas en el futuro

2.2. Especificación de subprogramas



subprograma substring_hasta (st ent string, car ent caracter, num sal numero, st_sal sal string)

pre: el carácter car debe aparecer en el string st

pos: num indica la posición de la 1ª ocurrencia del carácter car en el string st. st_sal es parte del string de entrada st, desde la primera posición hasta la primera ocurrencia del carácter car, inclusive.
La especificación de un subprograma se compone de:
• La interfaz/cabecera del subprograma

• La precondición

• La poscondición
En la precondición hay que indicar las restricciones necesarias de los datos de entrada, para que el programa funcione correctamente. En muchas ocasiones la propia cabecera indica todo lo que hace falta decir sobre los valores de entrada.

En la poscondición hay que indicar cuáles son las propiedades que cumplen los datos de salida o los resultados, con respecto a los datos de entrada.


Interfaz de un subprograma

Los valores que se pasan entre programa y subprograma quedan definidos en lo que se llama cabecera o interfaz del subprograma.


La cabecera del subprograma restringe el modo de utilización del subprograma.

En la cabecera del subprograma se establece:

• Identificador/Nombre del subprograma

• Cuántos valores debe pasar el programa al subprograma (datos) ent

• Cuántos valores debe devolver el subprograma al programa (resultados) sal

• De qué tipo es cada valor de los anteriores


Identificadores de subprogramas

Para que el programa que invoca a subprogramas sea fácil de entender, conviene que los nombres de los subprogramas nos den la pista para comprender qué hacen.


t := xj45(x, y) ó total := media(x,y)

leer_actualizar_y_comprobar_si_mayor(Sum, Otro, es_mayor)


leer(Num)

actualizar(Sum, Num)

es_mayor := mayor(Sum, Otro)

También es conveniente que cada subprograma haga una tarea concreta y no un batiburrillo de cuestiones variopintas (entonces nos costará elegir el identificador y entenderlo)

Especificación: convenio

En la especificación diferenciaremos cuatro apartados:


Entrada: datos de entrada del subprograma (parámetros de entrada) y los datos que vayan a ser leídos por el subprograma desde la entrada externa (entrada estándar o ficheros de lectura). Habrá que decir cuántos son y de qué tipo.

Precondición: Las restricciones que han de cumplir los valores de entrada para garantizar un correcto funcionamiento del programa.
Salida: datos de salida del subprograma (parámetros de salida), y los valores que vayan a ser escritos por el subprograma en la salida externa (salida estándar o ficheros de escritura). Habrá que decir cuántos son y de qué tipo.

Poscondición: Las características de los resultados que obtiene el subprograma, con respecto a los datos de entrada.

Tipos de subprogramas: Procedimientos y Funciones


Procedimientos

Subprogramas que pueden recibir datos de entrada, pueden devolver valores de salida y pueden recibir/devolver valores de entrada y salida.
Cabecera de procedimiento: Define la interfaz del procedimiento.

Completa la especificación de estos ejemplos:

procedimiento leer (n sal numero)

procedimiento escribir (n ent numero)

procedimiento max_min (n1 ent numero, n2 ent numero, max sal numero, min sal numero)

Se compone de:

• El identificador de procedimiento.



• La declaración de parámetros formales.

Cada parámetro formal consta de:

• identificador del parámetro. Necesario para distinguir los parámetros del mismo tipo.

modo de paso del valor. Puede ser sólo de entrada (ent), sólo de salida (sal), o de entrada y salida (ent sal).

• tipo del valor.


Cada parámetro formal establece en qué dirección circula el valor entre programa y subprograma y lo restringe a ser de un determinado tipo.

Funciones

Subprogramas a los que se les pasa datos de entrada y devuelven un solo resultado.
Cabecera de función
Define la interfaz de la función

funcion longitud(st ent string) devuelve entero
Se compone de:

• El identificador de la función (longitud)



• La declaración de parámetros formales (st ent string)

• El tipo del valor devuelto por la función (entero)


Siguiendo la idea matemática de función:

  • El tipo de cada parámetro formal es de entrada, por ello no es necesario indicarlo.

  • En ADA, utilizaremos sólo parámetros de entrada en las funciones.

  • Algunos lenguajes de programación admiten definir parámetros formales de función con cualquier modo de paso (entrada, salida, entrada y salida). En tal caso las funciones que se pueden construir se alejan de la idea matemática de función.

Ejemplos de especificación de subprogramas

Esp1. Dados dos números determina cuál es el máximo de ambos.

funcion max (n1 numero, n2 numero) devuelve numero

pre:

pos: devuelve el número máximo entre n1 y n2.
Esp2. Dados dos números determina cuál es el máximo y cuál el mínimo.

procedimiento max_min (n1 ent numero, n2 ent numero, max sal numero, min sal numero)

pre:

pos: max es el número máximo y min el número mínimo entre n1 y n2.
Esp3. Dados dos strings obtenga el string concatenación de ambos.

funcion concatenar (s1 string, s2 string) devuelve string

pre:

pos: devuelve un string que resulta de colocar s2 a continuación de s1.
Esp4. Dados un string y un entero obtenga un string con los caracteres iniciales del dado, hasta el de la posición n-ésima.

procedimiento substring_hasta (s ent string, n ent caracter, sn sal string)



pre:

pos: sn tiene los caracteres de s que están en las posiciones de la 1 a la n.

Subprogramas sin parámetros
Podemos encontrarnos tanto procedimientos como funciones sin parámetros:
Ejemplos de subprogramas sin necesidad de parámetros
Esp5. Especifica un subprograma que escriba un mensaje de bienvenida al programa y el copyrigth.

procedimiento escribir_mensajes

-- salida: escribe los mensajes de bienvenida y copyright


Esp6. Especifica un subprograma que devuelva la nota máxima sobre la que se evalúa a un alumno.

función nota_maxima devuelve numero

-- pos: devuelve la nota máxima que puede asignarse




  1   2   3


La base de datos está protegida por derechos de autor ©absta.info 2016
enviar mensaje

    Página principal