programación modular
La programación modular consiste en la descomposición de un programa en trozos más
pequeños denominados módulos o subprogramas, en el que cada uno de ellos se encargara de
llevar a cabo una tarea concreta y bien definida
Una función es un bloque de código que realiza alguna operación. Una función puede definir
opcionalmente parámetros de entrada que permiten a los llamadores pasar argumentos a la
función. Una función también puede devolver un valor como salida. Las funciones son útiles
para encapsular las operaciones comunes en un solo bloque reutilizable, idealmente con un
nombre que describa claramente lo que hace la función. La siguiente función acepta dos enteros
de un autor de llamada y devuelve su suma; a y b son parámetros de tipo int.
Paso de parámetros por valor
Cuando una función solicita los servicios de otra, debe facilitarla los datos que debe procesar.
Esta información es enviada a la función a través de unos identificadores o expresiones
denominados argumentos o parámetros.
Los argumentos enviados en el momento de ser llamada la función se denominan parámetros
actuales o reales.
Los argumentos recibidos por la función se denominan parámetros formales.
Ejemplo que calcula la media de dos valores
En el primer ejemplo, que calcula una sencilla media de dos valores, supondremos que el
usuario introduce los valores 1 y 2.
Se enfatizan las líneas ya ejecutadas del programa.
Estado tras definición de variables en main()
1. #include <iostream>
2. using namespace std;
3. double calcula_media(double num1, double num2)
4. {
5. double media = (num1 + num2)/2.;
6. return media;
7. }
8. int main()
9. {
10. double numero1, numero2;
11. cout << "Introduzca dos números reales: ";
12. cin >> numero1 >> numero2;
13. double resultado = calcula_media(numero1, numero2);
14. cout << "La media es " << resultado << endl;
15. }
Paso por referencia
Para entender bien el paso por referencia de parámetros a una función, es conveniente, aunque
sea de forma somera, introducir los conceptos de punteros y referencias.
Punteros
Cuando se define una variable, el sistema operativo reserva espacio en memoria capaz de
almacenar el contenido de dicha variable.
double media = 2.;
El formato general para la declaración de una variable puntero es:
tipo_de_variable_apuntada* nombre_del_puntero;
En el siguiente fragmento de código, p_media es un puntero que permitirá almacenar la
dirección de memoria de una variable tipo double.
double media = 2.;
double* p_media;
¡El contenido de p_media es indeterminado!
Dado que un puntero almacena direcciones, el espacio requerido depende del hardware (4 bytes
en un computador de 32 bits y 8 bytes en los de 64 bits).
Para trabajar con punteros se dispone de los operadores de puntero * y &.
Ejemplo
1. #include <iostream>
2. using namespace std;
3. void sumar(int *);
4. int main()
5. {
6. int n = 4;
7. sumar(&n);
8. cout << n << std::endl;
9. system("pause");
10. return 0;
11. }
12. void sumar(int *x)
13. {
14. *x = *x + 1;
15. cout << *x << std::endl;
16. }
Como vemos el parámetro de sumar ahora es un puntero que recibe una dirección de memoria
en este caso le pasamos la dirección de la variable x y dentro de la función con operador de
indirección podemos acceder al contenido de la variable n.
Referencias
Una referencia es por así decirlo un alias o etiqueta de una variable.
Las referencias se deben inicializar al declararse ya que no son en sí una variable sino una
etiqueta de otra y se declaran poniendo el operador & después del tipo de dato.
1. int n = 4;
2. int &ref_n = n;
3. cout << ref_n << endl;
A efectos prácticos n y ref_n se refieren a la misma variable de hecho si con el
operador & obtenemos la dirección de memoria de n y ref_n obtendríamos la misma en ambos
casos. En nuestra memoria ficticia se vería así:
Las referencias son una buena forma de pasar un valor a otra función sin ser por valor, veamos
el ejemplo anterior de paso por punteros, pero está vez usando referencias.
1. #include <iostream>
2. using namespace std;
3. void sumar(int &);
4. int main()
5. {
6. int n = 4;
7. sumar(n);
8. cout << n << endl;
9. system("pause");
10. return 0;
11. }
12. void sumar(int &x)
13. {
14. x = x + 1;
15. cout << x << endl;
16. }