Publicado el 3 de Diciembre del 2019
1.677 visualizaciones desde el 3 de Diciembre del 2019
129,9 KB
15 paginas
Creado hace 10a (28/08/2014)
Introducción a la Programación -
Notas de Clase
Modularidad
4 MODULARIDAD
Un principio ampliamente difundido e importante para resolver problemas es el de “dividir para reinar”, es decir
separar el problema en partes, en problemas más pequeños, para así enfrentarlos y resolverlos en un tamaño más
accesible y fácil de manejar.
Este principio tiene una directa aplicación en la programación de computadoras, para lo cual muchos lenguajes
de programación cuentan con una característica adecuada: la modularidad. Estos lenguajes permiten escribir
programas compuestos de porciones o partes que se conocen como módulos, muchas veces nombrados también
como subprogramas, subrutinas, procedimientos, funciones, entre otros. En todos los casos, los principios generales
y elementales que los gobiernan son los mismos, aún cuando algunos tengan características distintas y mayores o
menores prestaciones: todos permiten separar un programa en partes más pequeñas y reusar esos trozos de programa
o módulos ya escritos para resolver problemas similares.
Un módulo de programa tiene dos partes bien diferenciadas: la definición del módulo y la invocación o llamada
al módulo.
La definición de un módulo es donde se dice qué es lo que el mismo hará, es decir, cuáles serán sus efectos al ser
invocado, es decir cuando se ejecute.
Una invocación o llamada ocurre cuando se usa el módulo. En el punto del programa donde se hace la
invocación al módulo es donde, en tiempo de ejecución del programa, se ejecutarán las acciones comprendidas en la
definición del módulo.
En un programa, por cada módulo, habrá una única definición, ya que bastará con una vez para decirse qué es lo
que el módulo hace. Sin embargo, puede haber más de una invocación al mismo, ya que una solución puede usarse
tantas veces como sea necesario. Por supuesto, podría no usarse nunca, es decir no invocarse nunca, pero entonces,
¿para qué se definió?
4.1 LAS FUNCIONES EN C
En C, los módulos se llaman funciones. Un programa C, típicamente, se crea combinando el uso de funciones
definidas por el usuario, que son funciones escritas por el programador, y funciones predefinidas, que son las que ya
vienen en las bibliotecas del lenguaje C. Si bien, estas últimas, no forman parte estrictamente del lenguaje, siempre
vienen provistas con el compilador, brindando al programador un gran número de funciones, de entrada/salida, para
manejo de strings, de caracteres, para cálculos matemáticos, entre otras. Por ejemplo, las funciones printf y
scanf, que hemos usado en los ejemplos anteriores, son funciones predefinidas de la biblioteca estándar
stdio.h.
Las funciones definidas por el usuario, que son las que trataremos en este capítulo, se definen en el programa una
única vez y se invocan por medio de una llamada a la función tantas veces como sea necesario.
La ejecución de un programa se hace siempre de forma secuencial, comenzando por la función main. Cada vez
que se invoca una función, el flujo de ejecución abandona la función que se está ejecutando en ese momento y salta
a la función invocada. En cuanto la función invocada termina, el flujo de ejecución retoma el punto en que se
produjo la llamada y continúa la ejecución por donde se quedó.
Supongamos, para ejemplificar, que queremos un programa que imprima las primeras 10 potencias de 2 y de 3.
Para ello, definiremos una función entera potencia que devuelva, como resultado, el cálculo de un entero n
elevado a una potencia entera positiva m, e invocaremos la función potencia desde main con los
correspondientes argumentos.
U.N.S.L. Argentina
49
Departamento de Informática
Introducción a la Programación -
Notas de Clase
Modularidad
printf("2 a la %d: %d - 3 a la %d: %d \n", i, potencia(2, i),
i, potencia(3, i));
int i ;
for (i = 0; i <= 10 ; i++)
return 0;
#include <stdio.h>
int potencia(int, int); /* prototipo */
main()
{
}
/* Función que eleva la base n a la potencia m (m >= 0)*/
int potencia(int n, int m)
{
}
p = 1;
for (i = 0; i < m; i++)
return p;
int i, p;
p = p * n;
La función main invoca dos veces a la función potencia en la línea
printf(“%d %d %d \n”, i, potencia(2, i), potencia(3, i));
En cada llamada se pasan dos parámetros actuales o reales (o argumentos) a potencia y esta retorna un valor
entero, el que es impreso en pantalla.
La primera línea de la definición de la función potencia,
int potencia(int n, int m)
declara el tipo y nombre de cada uno de sus parámetros formales así como el tipo del resultado que devuelve la
función.
La función potencia retorna un valor entero (int) a la función invocante (en este caso a main). Esto ocurre
al ejecutarse la sentencia
return p;
la cual retorna el valor de la variable p y restituye el control a la función main.
Sin embargo, no todas las funciones necesitan retornar un valor. En este caso, como veremos en la sección
siguiente, el tipo de retorno de la función debe declararse de tipo void.
Hay dos maneras de restituir el control a la función invocante sin devolver valor alguno. Una forma de hacerlo es
por medio de la sentencia
return;
y la otra es omitiendo la sentencia return, al alcanzarse en la ejecución la llave derecha de terminación del
bloque o cuerpo de la función.
La segunda línea del programa,
U.N.S.L. Argentina
50
Departamento de Informática
Introducción a la Programación -
Notas de Clase
Modularidad
int potencia(int, int); /* prototipo */
corresponde a la declaración del prototipo de la función potencia. En el prototipo de una función se deben
declarar los tipos de los parámetros así como el tipo que retorna la función. Esta declaración indica al compilador el
tipo de dato devuelto por la función, el número de parámetros que espera recibir, el tipo de los parámetros y el orden
en el cual estos se esperan. El prototipo es usado por el compilador para controlar cada una de las invocaciones a la
función. Debe, por supuesto, también coincidir con la definición de la función. Los nombres de los parámetros en el
prototipo no necesitan coincidir, de hecho pueden omitirse, como en el ejemplo.
DEFINICIÓN DE UNA FUNCIÓN EN C
La forma general de la definición de una función es:
tipo-de-retorno identificador(lista-opcional-de-parametros-formales)
{
declaraciones
sentencias
}
donde identificador es el nombre que le damos a la función y que usaremos en la invocación a la misma,
pudiendo ser cualquier identificador válido.
El tipo-de-retorno es el tipo del valor que retorna la función. El tipo void es usado como tipo-de-retorno para
indicar que la función no retorna ningún valor. Si se omite el tipo-de-retorno, se asume que es int (esto ocurre, por
ejemplo, con la función main del programa anterior).
Si se observa, al final de main, hay una sentencia return 0;. Puesto que main es una función que
devuelve un int también puede retornar un valor a quien la invoca que, por tratarse de main, será siempre el
ambiente en donde el programa se ejecuta.
La lista-opcional-de-parametros-formales es una lista separada por comas con los tipos y los nombres de sus
parámetros formales, la cual puede estar vacía, es decir, una función podría no tener parámetros, en cuyo caso esto
se indica colocando la palabra void en lugar de la lista de parámetros.
A continuación, entre llaves, viene el cuerpo de la función o bloque en donde se pondrán las declaraciones y
sentencias necesarias para que la función haga su cometido.
INVOCACIÓN DE UNA FUNCIÓN
La invocación de una función se hace empleando el nombre de la función junto con los parámetros actuales, si
los tuviera. En caso de no tener parámetros, simplemente se colocará el nombre seguido de ().
Una función puede ser invocada en un lugar del programa en donde vaya una expresión del mismo tipo
retornado por la función o, incluso, la función invocante a otra función puede ignorar el valor retornado y hacer la
invocación en un lugar donde va una sentencia. Cuando el tipo de retorno de una función es void, es decir, no
retorna ningún valor, una invocación a ella siempre deberá ocurrir en un lugar donde va una sentencia.
PASAJE DE PARÁMETROS
Los módulos de un programa (o funciones, en C) se comunican entre sí por medio de los datos que son pasados
como parámetros en la invocación y los datos que son devueltos como resultado de las invocaciones.
Un módulo, generalmente, realizará alguna tarea empleando datos que le son provistos. Hay distintas maneras de
U.N.S.L. Argentina
51
Departamento de Informática
Introducción a la Programación -
Notas de Clase
Modularidad
proveerle los datos que el módulo necesita durante su ejecución. Una de las formas más usuales es a través del uso
de parámetros.
Estos parámetros son declarados en la definición del módulo, en donde se dice cuántos y de qué tipo son los
datos que el módulo espera cuando el mismo sea invocado, así como con qué nombres se puede referenciar esos
datos dentro del módulo. Estamos hablando de variables que tomarán un valor cuando el módulo sea invocado.
Estas variables se conocen como parámetros formales.
Al invocarse un módulo, habrá que darle o pasarle los valores reales con los que este trabajará: uno por cada
parámetro declarado en la definición del mismo. Estos valores los tomarán los parámetros formales. En la
invocación del módulo estos valores se conocen como parámetros reales o actuales. Se habla así de pasarle, al
módulo, los parámetros reales, es decir los datos concretos qu
Comentarios de: 4. Modularidad - Introducción a la Programación (0)
No hay comentarios