clase 1 teórico - Principios de la programación modular
fuente: http://www.etnassoft.com/biblioteca/introduccion-al-desarrollo-de-software/ 2,11 Principios de la programación modular La lectura del código fuente de un programa implica realizar el seguimiento del flujo de ejecución de sus instrucciones (el flujo de control). Evidentemente, una ejecución en el orden secuencial de las instrucciones no precisa de mucha atención. Pero ya se ha visto que los programas contienen también instrucciones condicionales o alternativas e iterativas. Con todo, el seguimiento del flujo de control puede resultar complejo si el código fuente ocupa más de lo que se puede observar (por ejemplo, más de una veintena de líneas). Por ello, resulta conveniente agrupar aquellas partes del código que realizan una función muy concreta en un subprograma identificado de forma individual. Es más, esto resulta incluso provechoso cuando se trata de funciones que se realizan en diversos momentos de la ejecución de un programa. En los apartados siguientes, se verá cómo se distribuye en distintos subprogramas un programa en C. La organización es parecida en otros lenguajes de programación. 2,12 Funciones En C, a las agrupaciones de código en las que se divide un determinado programa se las llama, precisamente, funciones. Más aún, en C, todo el código debe estar distribuido en funciones y, de hecho, el propio programa principal es una función: la función principal (main). Generalmente, una función incluirá en su código, como mucho, la programación de unos pocos esquemas algorítmicos de procesamiento de secuencias de datos y algunas ejecuciones condicionales o alternativas. Es decir, lo necesario para realizar una tarea muy concreta. 2.12.1. Declaración y definición La declaración de cualquier entidad (variable o función) implica la manifestación de su existencia al compilador, mientras que definirla supone describir su contenido. Tal diferenciación ya se ha visto para las variables, pero sólo se ha insinuado para las funciones. La declaración consiste exactamente en lo mismo que para las variables: manifestar su existencia. En este caso, de todas maneras hay que describir los argumentos que toma y el resultado que devuelve para que el compilador pueda generar el código, y poderlas emplear. Declaraciones La declaración de una función consiste en especificar el tipo de dato que devuelve, el nombre de la función, la lista de parámetros que recibe entre paréntesis y un punto y coma que finaliza la declaración: tipo_de_dato nombre_función( lista_de_parámetros ); Hay que tener presente que no se puede hacer referencia a funciones que no estén declaradas previamente. Por este motivo, es necesario incluir los ficheros de cabeceras de las funciones estándar de la biblioteca de C como stdio.h, por ejemplo. En caso de tener funciones que se invoquen mutuamente es necesario declararlas a ambas antes de definirlas. La lista de parámetros es opcional y consiste en una lista de declaraciones de variables que contendrán los datos tomados como argumentos de la función. Cada declaración se separa de la siguiente por medio de una coma. Por ejemplo: float nota_media( float teo, float prb, float pract ); bool aprueba( float nota, float tolerancia ); Si la función no devuelve ningún valor o no necesita ningún argumento, se debe indicar mediante el tipo de datos vacío (void): void avisa( char mensaje[] ); bool si_o_no( void ); int lee_codigo( void ); Definiciones La definición de una función está encabezada siempre por su declaración, que ahora debe incluir forzosamente la lista de parámetros si los tiene. Esta cabecera no debe finalizar con punto y coma, sino que irá seguida del cuerpo de la función, delimitada entre llaves de apertura y cierre: tipo_de_dato nombre_función( lista_de_parámetros ) { /* cuerpo de la función: */ /* 1) declaración de variables locales */ /* 2) instrucciones de la función */ } /* nombre_función */ Llamadas El mecanismo de uso de una función en el código es el mismo que se ha empleado para las funciones de la biblioteca estándar de C: basta con referirse a ellas por su nombre, proporcionarles los argumentos necesarios para que puedan llevar a cabo la tarea que les corresponda y, opcionalmente, emplear el dato devuelto dentro de una expresión, que será, habitualmente, de condición o de asignación. El procedimiento por el cual el flujo de ejecución de instrucciones pasa a la primera instrucción de una función se denomina procedimiento de llamada. Así pues, se hablará de llamadas a funciones cada vez que se indique el uso de una función en un programa. A continuación se presenta la secuencia de un procedimiento de llamada: 1.Preparar el entorno de ejecución de la función; es decir, reservar espacio para el valor de retorno, los parámetros formales (las variables que se identifican con cada uno de los argumentos que tiene), y las variables locales. 2.Realizar el paso de parámetros; es decir, copiar los valores resultantes de evaluar las expresiones en cada uno de los argumentos de la instrucción de llamada a los parámetros formales. 3.Ejecutar el programa correspondiente. 4.Liberar el espacio ocupado por el entorno local y devolver el posible valor de retorno antes de regresar al flujo de ejecución de instrucciones en donde se encontraba la llamada. El último punto se realiza mediante la instrucción de retorno que, claro está, es la última instrucción que se ejecutará en una función: return expresión; Esta instrucción debe aparecer vacía o no aparecer si la función es de tipo void; es decir, si se la ha declarado explícitamente para no devolver ningún dato.
participants (1)
-
Federico Kouyoumdjian