INF-Tema5 ProgramaciónModular
INF-Tema5 ProgramaciónModular
Programación Modular
Informática
Contenidos
1. Introducción.
2. Concepto de función.
3. Definición de funciones.
4. Invocación de funciones.
5. Comunicación entre funciones.
6. Declaración de funciones por adelantado.
2
1. Introducción
Programación modular: Consiste en estructurar un programa en
diferentes funciones o módulos. ¿Cuántas se
han
>> ¿Cuántas funciones se han usado hasta ahora cuando hemos desarrollado
y cuantas se
programado? han utilizado?
3
1. Introducción
Ventajas de la programación modular
• Disminuir la complejidad del problema.
• Funciones validadas no interfieren con otras en desarrollo.
• Los bloques se pueden agrupar en módulos relacionados entre sí (alta
cohesión) y que no dependan de otros módulos (bajo acoplamiento).
• Se incrementa el nivel de abstracción. Modelo de caja negra. Interfaz.
• El código es fácil de localizar.
• Obliga a la normalización y estructuración del código.
• Se acelera el proceso de compilación.
• Se incrementa la productividad del programador.
• Reutilización de variables y código fuente.
4
2. Concepto de función
• Una función es un módulo que recibe (o no) una serie de datos
(parámetros), ejecuta un conjunto de instrucciones (utilizando los
datos que recibe), y devuelve (o no) un resultado.
• Cuatro tipos de funciones según la entrada / salida:
Resultado
5
2. Concepto de función
• Declaración : define el nombre, la interfaz, el conjunto de
instrucciones que realizan la operación para la que ha sido definido y
el resultado.
¿Qué hace la función?
Ejecuta la función
6
3. Definición de funciones
Para definir una función hay que responder a cuatro preguntas:
}
2. ¿Qué devuelve como resultado? Si no devuelve nada es void, en caso
contrario el tipo de datos que devuelva
tipo nombre( )
{
}
7
3. Definición de funciones
3. ¿Qué necesita para resolver su cometido? Parámetros que recibe. Es posible que
no necesite ningún parámetro.
tipo nombre(parámetros)
{
}
4. ¿Cómo resuelve su cometido? Algoritmo expresado en instrucciones
tipo nombre(parámetros)
{
instrucción 1;
instrucción 2;
...
return ...; /* puede ser opcional */
}
8
3. Definición de funciones
En
resumen:
9
3. Definición de funciones
Ejemplo: Escribe una función que reciba dos valores reales y muestre por
pantalla el menor de dichos valores:
Tipo de retorno (ninguno) Nombre de la función Parámetros (dos); separados por comas
10
3. Definición de funciones
Ejemplo: Escribe una función que muestre por pantalla los múltiplos
positivos de 17 menores que 100:
Tipo de retorno (ninguno) Nombre de la función Parámetros (ninguno)
12
Ejercicio
>> Desarrolla una función que reciba un valor entero positivo y
muestre por pantalla los divisores positivos de dicho valor.
Por ejemplo, si la función recibe un valor de 15 mostraría por
pantalla: 1, 3, 5, 15.
void divisores(int num)
{
int i; que un número A es divisor de un número B si el resto de
Nota: recordar
for
B / A es (i=1;
0; ¿qué i<=num;
operador i++) calcular el resto de una división
permite
entera en C? if (num%i == 0)
printf("%d ", i);
}
13
3. Definición de funciones
Ejemplo: escribe una función que reciba tres valores reales y retorne el
valor intermedio de dichos valores:
float intermedio(float a, float b, float c)
{
if ( (a<=b && b<=c) || (c<=b && b<=a) )
return b;
else if ( (a<=c && c<=b) || (b<=c && c<=a) )
return c;
return a;
}
14
3. Definición de funciones
Ejemplo: desarrollar dos funciones:
• suma. Recibirá dos valores enteros y mostrará por pantalla su suma.
• suma2. Recibirá dos valores enteros y devolverá su suma.
void suma (int a, int b) int suma2 (int a, int b)
{ {
printf("%d\n", a+b); return (a+b);
} }
15
3. Definición de funciones
Declaración de variables
Todas las variables que se usen deben declararse, exceptuando los
parámetros (que ya están declarados en la cabecera).
a = suma2(x,y);
return 0;
}
17
4. Invocación de funciones
Llamada o Invocación: Instrucción que pone una función en
ejecución.
Ejemplo:
multiplos17();
suma(a,b);
resultado = suma2(a,b);
18
4. Invocación de funciones
#include <stdio.h>
void multiplos(int num)
{ Declaración de
int i; funciones:
for (i=num; i<100; i=i+num)
printf("%d\n", i); antes de su uso.
}
int main(){
multiplos(19); Llamada
return 0;
}
19
4. Invocación de funciones
Ejemplo; ¿cuál es la salida del siguiente programa?
void funcion2(){ int main()
printf("F2\n");
Main 1
{
} F1 1
void funcion1(){ printf("Main1\n");
printf("F1 1\n"); F2
funcion1(); void funcion1()
funcion2(); F1 2
printf("F1 2\n"); printf("Main2\n"); {
} return 0; printf("F1 1\n"); Main 2
int main(){
} funcion2(); void funcion2()
printf("Main 1\n");
funcion1(); printf("F1 2\n"); {
printf("Main 2\n");
} printf("F2\n");
return 0;
} }
20
4. Invocación de funciones
>> ¿Qué mostrará este código en pantalla?
void f2()
{ a: 7
int a=99;
printf("a: %d\n", a); a: 3
} a: 99
void f1() a: 99
{
int a = 3; a: 2
printf("a: %d\n", a);
for (a=0;a<2;a++) a: 7
f2();
printf("a: %d\n", a);
}
int main()
{
int a = 7;
printf("a: %d\n", a);
f1();
printf("a: %d\n", a);
return 0;
21
}
5. Comunicación entre funciones
Forma en la que se comunican las funciones con main o con cualquier otra función
que las llame:
• Parámetros o argumentos.
• Valor de retorno.
Llamada:
valor = nombre_función (lista_parámetros)
Declaración:
tipo_retorno nombre_función (lista_parámetros)
{
declaración_variables
Instrucciones
}
22
5. Comunicación entre funciones
Parámetros
Función Valor de retorno
23
5. Comunicación entre funciones
Dato de salida:
Datos de entrada:
función main
main función
Parámetros
Función Valor de retorno
Tipos:
• Parámetros formales: declaración de la función.
tipo_retorno nombre_función (parámetros_formales)
{ ...}
25
5. Comunicación entre funciones
• Los parámetros formales se sustituyen por los actuales:
28
5. Comunicación entre funciones
void cuadrado (char x, int n){
int i, j;
for (i=0; i<n; i++)
{ Dibuja una fila de n caracteres
for (j=0; j<n; j++)
printf("%c", x); ****
printf("\n"); Dibuja n filas de caracteres
x caracter
}
****
}
**** n num
int main(){
****
char caracter; ****
int num;
printf("Dame un carácter y el tamaño: ");
scanf("%c%d", &caracter, &num);
cuadrado (caracter, num);
return 0;
}
29
5. Comunicación entre funciones
Los parámetros de la llamada pueden ser: constantes,
variables, expresiones o el resultado de la llamada a una
función.
a b
Llamada suma ( 2*5-1, num); 9 valor de num
30
5. Comunicación entre funciones
Los parámetros de la llamada y de la cabecera deben coincidir
en número y tipo, sino puede dar un error.
Error
(se interpretará
como 2)
31
5. Comunicación entre funciones
• Cada función tiene sus propias variables, por lo que
los nombres de variables pueden repetirse en varias
funciones.
• Los parámetros de la llamada pueden tener un
nombre igual o diferente a los parámetros de la
declaración.
32
5. Comunicación entre funciones
void resto (int a, int b) void resto (int a, int b)
Dos {
int res;
{
int res;
alternativas res = a % b; res = a % b;
printf("Resto: %d\n", res); printf("Resto: %d\n", res);
válidas: } }
void division (int a, int b) void division (int n1, int n2)
{ {
int res; int res;
res = a / b; res = n1 / n2;
printf("División: %d\n", res); printf("División: %d\n", res);
} }
int main () int main ()
{ {
int a, b; int a, b;
printf("Dame dos valores: "); printf("Dame dos valores: ");
scanf("%d%d", &a, &b); scanf("%d%d", &a, &b);
resto(a, b); resto(a, b);
division(a, b); division(a, b);
return 0; return 0;
} }
33
Ejercicio
>> Desarrolla una función que reciba tres valores enteros y muestre en
pantalla el máximo de los tres.
La función desarrollada permitirá el correcto funcionamiento de este
programa principal:
/*
void Aquí iría la n1,
MuestraMaximo(int función */ n3) int main()
int n2, int
{ {
int main()
if (n1>=n2 && n1>=n3) int a=3, b=9, c=4;
{ printf("%d", n1); MuestraMaximo(a, b, c);
else if (n2>=n3) return 0;
int a=3, n2);
printf("%d", b=9, c=4; }
else MuestraMaximo(a, b, c);
printf("%d", n3);
} return 0;
}
34
5. Comunicación entre funciones
Valor de retorno
Una función puede o no retornar un valor, al finalizar su ejecución:
Si no retorna ningún valor: tipo de retorno void.
Si retorna un único valor: definir el tipo de retorno (int, float, char,...) igual
al del valor a devolver.
Ejemplos:
int suma (int a, int b) { ... }
void multiplos17() { ... }
char dime_letra (int valor_ascii) { ... }
35
5. Comunicación entre funciones
• Para retornar un valor, dentro de la función, se utiliza la instrucción return:
return [expresión];
• Retorna un valor y devuelve el control de la ejecución a la función invocadora.
• El tipo de dato de la expresión debe ser el mismo que el definido en la cabecera de la
función como valor de retorno.
• Si la función no retorna ningún valor (es void) no es necesario que aparezca la sentencia,
aunque puede aparecer para indicar que queremos que la función termine: return;
• Si no se indica el tipo de retorno, se asume por defecto int.
• Una función puede contener varias sentencias return, aunque solo puede ejecutarse una
de ellas.
• Si la función no es void, todos sus posibles caminos deben llevar a un return adecuado.
36
5. Comunicación entre funciones
Ejemplos
37
5. Comunicación entre funciones
¿Qué puede Una constante: Una expresión: Una función:
int f1 () int f3 () int f6 ()
retornar { { {
return 3; return 4+6/5; return f1();
una función? } } }
int f4 ()
{
Una variable: int a=6, b=2;
return a%b;
int f2 () }
{
int a=6; int f5 ()
return a; {
} int a=6, b=2;
return (a%b);
}
38
5. Comunicación entre funciones
Ejemplo: int suma (int a, int b)
{
return a+b;
} b n2
a n1
int main()
{
int n1, n2, resultado;
printf("Dame los valores a sumar: ");
scanf("%d%d", &n1, &n2);
resultado = suma (n1, n2); resultado a+b
printf("%d+%d=%d\n", n1, n2, resultado);
return 0;
}
39
5. Comunicación entre funciones
int suma (int a, int b)
{
int c; return, además de retornar un valor, termina la ejecución
return c; de la función.
¿Cuál es la salida de este programa?
c = a+b; El resultado será indeterminado.
}
int main()
{
int n1, n2, resultado;
printf("Dame los valores a sumar: ");
scanf("%d%d", &n1, &n2);
resultado = suma (n1, n2);
printf("%d+%d=%d\n", n1, n2, resultado);
return 0;
}
40
5. Comunicación entre funciones
¿Puede aparecer más de un return en una función?
int mayor_de_edad (int edad)
{
if (edad>=18) Puede aparecer más de un
return 1; return. Sólo se ejecuta uno.
else return termina la función y
return 0; retorna el valor.
}
41
5. Comunicación entre funciones
• El resultado de la llamada a la función puede:
• Asignarse a una variable:
i = suma (3, 5);
• Utilizarse en una expresión como un operando más:
j = i + suma (3, 5) * 2;
• Utilizarse como parámetro en una función:
i = suma( suma (2, 3), suma (5, 7));
• Mostrarse directamente con un printf:
printf("%d", suma(3, 5));
• No se puede:
• Asignarle un valor
suma (3, 5) = 66; Error
42
Ejercicio
>> Desarrolla:
a) Una función que dado un valor entero retorne TRUE si es
primo y FALSE en caso contrario. El valor lo recibe como
parámetro.
Debes definir estas dos constantes (a 1 y 0)
43
Ejercicio
Posible solución:
#include <stdio.h>
#define TRUE 1
#define FALSE 0
44
Ejercicio
b) Un programa que solicite por teclado un intervalo de
enteros [a..b] (asegurarse que el intervalo es correcto) y
muestre los valores primos que aparecen en ese intervalo.
Usar en el mismo la función anterior.
45
Ejercicio
Posible solución:
#include <stdio.h> int main(){
int a, b, i;
#define TRUE 1
#define FALSE 0 do {
printf("Introduce los límites: ");
scanf("%d%d",&a,&b);
int es_primo (int n)
} while (a>b);
{
int i; for (i=a; i<=b; i++)
if (n<=1) return FALSE; /*1 no primo*/ if (es_primo(i) == TRUE)
else{ printf("El %d es primo.\n",i);
for (i=2; i<n; i++)
if (n%i==0) return FALSE; return 0;
return TRUE; }
}
}
46
5. Comunicación entre funciones
• Los parámetros permiten el intercambio de información entre
funciones.
• Tipos de parámetros según para lo que valen:
• Parámetros por valor: los parámetros son de entrada. La
función los utiliza pero no los modifica. Visto
anteriormente.
• Parámetros por referencia: los parámetros pueden ser de
salida. La función los modifica.
47
5. Comunicación entre funciones
Parámetros por valor
• Se transfieren los valores de los parámetros.
• La función crea copias de los valores recibidos y trabaja con ellas.
• El valor de las variables en la función invocadora no se modifica
cuando termina la ejecución de la función invocada.
void f (int b)
{...}
7 7
... a b
f(a);
48
5. Comunicación entre funciones
Parámetros por valor
• Ventaja: se pueden pasar como parámetros constantes y
expresiones.
intercambia(3*4, n);
49
5. Comunicación entre funciones
Ejemplo
Se necesita un programa que dadas dos variables enteras,
intercambie su contenido.
Para ello se pide desarrollar una función que intercambie el
contenido de las variables.
Antes 5 10
x y
Después 10 5
x y 50
5. Comunicación entre funciones 1A71
1A72 10 y
void intercambia(int u, int v)
Veamos una posible solución
{ 1A73
int temp; 5
1A74 10 v
temp = u;
u = v; 1A75 10
5 u
v = temp; 5
1A76 ? temp
}
1A77
int main()
1A78 5 x
{
int x=5, y=10; 1A79
printf("Antes: x=%d y=%d\n",x,y);
intercambia(x, y); Salida por pantalla:
printf("Después x=%d y=%d\n", x,y);
return 0; Antes x=5 y=10
} Después x=5 y=10
53
5. Comunicación entre funciones
void intercambia(int *u, int *v) 2. En la cabecera
{
Volviendo al ejemplo anterior
1A73
int temp;
temp = *u; 1A74 1A72 v
*u = *v; 1A75 1A78 u
*v = temp;
} 1A76 5
? temp
1A77
int main()
1A78 10
5 x
{
int x=5, y=10; 1A79
60
5. Comunicación entre funciones
Vectores como parámetros
• Si un parámetro es un vector, en la cabecera de la función no hace falta
especificar el tamaño del vector:
int MaxVector(int v[])
• La llamada a la función es simplemente pasando el nombre del vector:
#define TAM 100
int main()
{ Sólo el nombre
int Edades[TAM]; del vector, sin []
//...instrucciones...
printf("Max:%d", MaxVector(Edades));
//...instrucciones...
}
61
5. Comunicación entre funciones
Vectores como parámetros. Los vectores, al ser direcciones de memoria,
siempre se pasan por referencia, es decir, si se modifican sus elementos
en la función, dicho cambio se mantiene al volver al sitio donde se llamó.
#include <stdio.h>
#define RANGO 100 También valdría:
void leer_vector(int v[]) { int *v
int i; int v[RANGO]
for (i=0;i<RANGO;i++){
printf("Elemento %d:", i);
scanf("%d", &v[i]);
}
}
int main() {
int vector[RANGO];
leer_vector(vector);
...
} 62
Ejercicio
>> Desarrolla una función ecualizacionMedia que reciba un
vector de números reales y el tamaño de dicho vector.
La función debe calcular en primer lugar la media del vector, y a
continuación debe modificar los elementos del vector de la
siguiente manera: debe poner un 1 en todos los valores
superiores a la media, y un 0 en el resto de valores.
63
int main()
Ejercicio {
int i;
float datos[N] = {8.00, 2.82, 6.06, 2.12,
Posible solución 4.71, 0.41, 3.76, 2.29, 7.88, 5.35};
67
Ejercicio
float potencia(float base, int exp) Posible solución
{
int negativo=0, i;
float total; int main()
{
if (exp==0) printf("%.2f ^ %d = %.2f\n", 2.0, 10, potencia(2.0,10));
return 1; printf("%.2f ^ %d = %.2f\n", 1.5, 2, potencia(1.5, 2));
printf("%.2f ^ %d = %.2f\n", -3.0, 3, potencia(-3.0, 3));
if (exp<0){ printf("%.2f ^ %d = %.2f\n", 4.0, -2, potencia(4.0, -2));
negativo=1; printf("%.2f ^ %d = %.2f\n", 0.0, 0, potencia(0.0, 0));
exp*=-1;
} return 0;
}
total = 1;
for (i=0; i<exp; i++) 2.00 ^ 10 = 1024.00
total*=base;
1.50 ^ 2 = 2.25
if (negativo==1)
-3.00 ^ 3 = -27.00
return (1/total); 4.00 ^ -2 = 0.06
0.00 ^ 0 = 1.00
return total;
68
}
Ejercicio
>> La media aritmética de un conjunto de datos es la suma de
todos los datos dividida entre el número total de datos.
El rango de un conjunto de datos se calcula restando el dato
menor al dato mayor.
Desarrolla una función MediaYRango que reciba un vector de
números reales y el tamaño de dicho vector.
La función debe calcular y devolver –mediante parámetros por
referencia- la media aritmética y el rango de los valores del vector.
69
Ejercicio
Posible solución
#define N 10
void MediaYRango(float v[], int tam, float *media, float *rango)
{ int main()
int i; {
float total=0, min, max; int i;
min=v[0]; float datos[N] = {8.00, 2.82, 6.06, 2.12, 4.71, 0.41,
max=v[0]; 3.76, 2.29, 7.88, 5.35};
for (i=0; i<tam; i++){ float m, r;
total+=v[i]; MediaYRango(datos, N, &m, &r);
if (v[i]>max)
max=v[i]; /* vamos a mostrar el vector */
else if (v[i]<min) printf("Elementos del vector:\n");
min=v[i]; for (i=0; i<N; i++)
} printf("[%d]: %.2f - ", i, datos[i]);