PROGRAMACIÓN 10. Recuerde que estos son apuntes muy simplificados que deberá completar con la bibliografía recomendada Prof. Dolores Cuiñas H. APUNTES Nº 8 SUBPROGRAMAS. Un gran problema puede resolverse descomponiéndolo en subproblemas, (problemas más pequeños o módulos), los cuales a su vez pueden sucesivamente seguir fragmentándose en problemas más pequeños, hasta que estos sean solucionados. Este método se denomina diseño descendente, dado que se comienza en la parte superior con un problema general y se van diseñando soluciones específicas para cada uno de los subproblemas (módulos) en los que ha sido dividido ese problema principal. M O D U L A C I O N problema principal Subproblema 1 Subproblema 3 Subproblema 2 En el caso que nos compete, los problemas que enfrentamos son aquellos que podemos resolver aplicando la lógica de la programación estructurada y que, haciendo uso de la programación modular, podremos descomponer el programa principal en módulos que realizan tareas específicas, denominados subprogramas. De esta manera, normalmente un proyecto de programación se compone, generalmente, de un programa principal (también llamado conductor del programa) y un conjunto de subprogramas (módulos), con las llamadas a los mismos dentro del programa principal o desde otro subprograma. P R O G R A M A C I O N Programa Principal M O D U L A R Subprograma 1 Subprograma 2 entradas proceso subproceso 1 Subprograma 3 salidas subproceso 2 Los subprogramas se clasifican en procedimientos y funciones, los cuales se definen como unidades de programas diseñados para ejecutar una tarea específica. PROCEDIMIENTO: es un subprograma (grupo de sentencias) que realiza una tarea particular. Al igual que cualquier programa, un procedimiento consta de tres partes: Una cabecera, una lista de parámetros formales (opcional), una sección de declaraciones de constantes, variables u otros procedimientos y la sección ejecutable o cuerpo del procedimiento. El cuerpo del procedimiento está constituido por una serie de sentencias, a las cuales se le asigna un nombre mediante un identificador en la cabecera de éste, constituyendo así el nombre del procedimiento. La tarea asignada al procedimiento, es decir, esta serie de sentencias, se ejecuta siempre que el Turbo Pascal encuentre el nombre del procedimiento como parte de una instrucción del cuerpo del programa principal o del cuerpo de otro subprograma, a lo cual se denomina llamada o invocación al subprograma. De este modo se establece entre el programa principal y el subprograma procedimiento una interacción mediante la cual el subprograma procedimiento recibe 0 o más valores (a través de parámetros) del programa que llama y devuelve 0 o más valores (a través de parámetros) a dicho programa. Esta interacción también puede realizarse entre dos subprogramas. Denominaremos parámetro a una variable cuyo valor debe ser o bien proporcionada por el programa principal al procedimiento (parámetro de entrada) o ser devuelto desde el procedimiento al programa principal (parámetros de salida). En otras palabras parámetros de entrada son aquellos cuyos valores deben ser proporcionados por el programa principal y parámetro de salida son aquellos cuyos valores se calculan en el procedimiento y se devuelven al programa principal para su proceso posterior. Ahora bien, tanto en el subprograma procedimiento como en el programa principal debe hacerse referencia a la lista de parámetros que van a ser intercambiados. Cuando la lista de parámetros es referenciada en el programa principal se le denomina lista de parámetros actuales, porque son los valores reales que en el momento de ejecución del programa (momento actual) van a tomar los parámetros. Mientras que cuando la lista de parámetros es referenciada en el subprograma procedimiento se le denomina lista de parámetros formales o ficticios, porque básicamente constituyen sólo el formato (forma) de los valores que van a ser intercambiados. Esquemáticamente la interacción entre el programa principal y el subprograma procedimiento tiene la siguiente forma: cabecera programa principal PROCEDURE nombreprocedimiento (parámetros formales) cuerpo del subprograma 0 o más valores nombreprocedimiento (parámetros actuales) cuerpo programa principal llamada al procedimiento El subprograma procedimiento debe ser declarado (PROCEDURE) antes de que pueda ser referenciado en el cuerpo de un programa principal y es llamado desde éste u otro procedimiento directamente por su nombre. En Turbo Pascal tiene la forma siguiente: PROGRAM identificador; USES CONST cabecera del programa principal TYPE VAR PROCEDURE nombreproc (lista de parámetros formales); declaraciones locales opcional BEGIN cuerpo del procedimiento declaración del subprograma procedimiento END; BEGIN opcional nombreproc (lista de parámetros actuales); cuerpo del programa principal llamada al procedimiento END. Donde: PROCEDURE es la palabra reservada que se utiliza para declarar el procedimiento nombreproc es un identificador válido, que representa el nombre del procedimiento (lista de parámetros formales) puede tener la forma siguiente: lista1:tipo1;lista2:tipo2;... donde lista1 tiene la forma siguiente: PF1, PF2, ... PFN:tipo1 lista2 tiene la forma siguiente: VAR PF3,PF4,...PFN:tipo2 siendo PF1, PF2, PF3, PF4... parámetros formales (identificadores válidos) que van a contener los valores de los parámetros actuales cuando se llama al procedimiento. tipo1 y tipo2: son los tipos de datos (valores) que van a contener los parámetros de la lista1 y lista2, respectivamente. Los parámetros formales sirven para pasar información al procedimiento y/o devolver información del procedimiento a la unidad de programa que le llama. Los parámetros formales pueden ser de dos tipos, parámetros valor o parámetros variable. A los PF1, PF2 (ilustrados como lista1) se les denomina parámetros valor porque éstos son unidireccionales. Es decir, se usan para proporcionar información a un procedimiento, pero no pueden devolver valores. Si la palabra VAR no aparece delante del parámetro formal en un procedimiento, el Pacal supone que el parámetro formal es un parámetro valor. Los parámetros valor también se denominan parámetros de entrada, dado que son parámetros formales que suministran valores para ser usados por un procedimiento. A los PF3, PF4 (ilustrados como lista2) se les denomina parámetros variable, cuando en la declaración del procedimiento están precedidos con la palabra VAR; se usan tanto para recibir como para transmitir valores entre el subprograma procedimiento y el programa principal. A los parámetros variable también se le denomina parámetros de salida dado que son parámetros formales que sirven de salida o de entrada/salida de resultados. Aunque ya se mencionó, insistimos en lo siguiente: para hacer una llamada al subprograma procedimiento, es decir para iniciar su ejecución, basta con utilizar, dentro del programa principal u otro procedimiento, el nombre del procedimiento acompañado o no de la lista de parámetros actuales. Después que se ha terminado su ejecución, se ejecuta la sentencia que sigue a la llamada al procedimiento, tal como se ilustra con la flecha punteada en el esquema anterior. En Turbo Pascal la llamada a un procedimiento adquiere la forma descrita a continuación: nombreproc (lista de parámetros actuales) inicia la ejecución del procedimiento nombreproc (lista de parámetros actuales) tiene la forma siguiente: (PA1, PA2, PA3,....) siendo PA1, PA2, PA3... parámetros actuales (identificadores válidos) que tienen los valores que se pasan al procedimiento nombreproc. NOTAS: • El valor de los parámetros actuales no se conoce cuando se declara el procedimiento, pero cuando se ejecuta la sentencia de llamada al procedimiento es preciso que tengan valores asignados o previamente leídos, de los contrario dará error. • Los parámetros actuales en la llamada al procedimiento deben coincidir en número, orden y tipo con los parámetros formales o ficticios de la declaración del procedimiento. • Las variables que son usadas en un programa con subprogramas procedimientos pueden ser de dos tipos: locales y globales. Las variables locales son las que se declaran en el subprograma y sólo están disponibles durante el funcionamiento del mismo. Las variables globales son las que se declaran en el programa principal y pueden ser usadas tanto en el programa principal como en todos los subprogramas. Ver ejemplos en clase FUNCION: es un subprograma que devuelve un único resultado al programa principal o subprograma que le llamó. A este tipo de funciones se les denomina funciones definidas por el usuario. En Turbo Pascal tiene un formato similar al de un procedimiento: PROGRAM identificador; USES CONST TYPE VAR FUNCTION nombrefun (lista de parámetros formales): tipo; declaraciones locales BEGIN cuerpo de la función nombrefun := valor de la función o resultado END; BEGIN nombrefun (lista de parámetros actuales); declaración del subprograma función sentencia de asignación mediante la que se devuelve el resultado al programa que llamó a la función cuerpo del programa principal llamada a la función END. Donde: FUNCTION es la palabra reservada que se utiliza para declarar la función nombrefun es un identificador válido que representa el nombre de la función tipo es el tipo del dato del resultado que devuelve la función, o sea tipo del valor devuelto (tipo de nombrefun). (lista de parámetros formales) tiene la siguiente forma: PF1,PF2,...: tipo-p tipo-p es el tipo de los parámetros Igual que en los procedimientos NOTA: en las funciones no existen parámetros variable (VAR) dado que el resultado de la evaluación del subprograma function se devuelve o está contenido en su nombre (nombrefun) NOTAS GENERALES: • Los arreglos se pueden usar como parámetros en funciones y procedimientos, pero el valor de una función no puede ser arreglo (ARRAY). • Es mejor pasar el arreglo completo que como elementos individuales, aunque de ambas maneras puede ser realizado. • Los arreglos como parámetros pueden ser valor o variable: cuando se usan como variable el procedimiento trabaja directamente con el arreglo actual (real). Cuando se usan como parámetro valor el procedimiento trabaja con una copia local y cualquier cambio que se haga en el arreglo local no se refleja en el arreglo real. Ver ejemplos en clase COMPARACIÓN ENTRE FUNCIONES Y PROCEDIMIENTOS FUNCTION Debe usarse cuando tenemos un resultado único y cero o más parámetros de entrada. Devuelve sólo un valor. Una función se referencia usando su nombre en una expresión dentro del programa principal. Al nombre de la función se le asigna el valor del resultado del proceso efectuado en la Function. El tipo del resultado en la función debe estar indicado en la cabecera (declaración del function) y puede ser cualquier tipo de dato (integer, real, boolean, char, enumerado, subrango o puntero) PROCEDURE Debe usarse cuando no hay resultado o hay varios resultados. Devuelve 0,1, varios valores. Un procedimientos se referencia por una llamada o invocación al mismo dentro del programa principal. Al nombre del procedimiento no se le puede asignar un valor El tipo del resultado o resultados en el procedimiento debe(n) ser declaro(s) dentro de la lista de parámetros formales y dentro de la sección de declaraciones del programa principal. Los conceptos anteriores son tomados básicamente de: Programación en Turbo/ Borland. Pascal 7. Luis Joyanes Aguilar Programación con Lenguaje Turbo Pascal. F.J. Sanchis Llorca.-