0% encontró este documento útil (0 votos)
41 vistas70 páginas

INF-Tema5 ProgramaciónModular

La salida sería: Main 1 F1 1 F2 F1 2 Main 2

Cargado por

Pau Bernabeu
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
41 vistas70 páginas

INF-Tema5 ProgramaciónModular

La salida sería: Main 1 F1 1 F2 F1 2 Main 2

Cargado por

Pau Bernabeu
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

5.

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?

Función o módulo: Conjunto de instrucciones que realizan una tarea


específica.
Motivación de la programación modular: Si un programa tiene que
realizar la misma tarea varias veces, el módulo correspondiente se
utiliza tantas veces como sea necesario.

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:

Datos Resultado Datos

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?

• Llamada o invocación: nombre de la función invocada y valores que


se transfieren a esa función.

Ejecuta la función

6
3. Definición de funciones
Para definir una función hay que responder a cuatro preguntas:

1. ¿Qué nombre se le pone? Relacionado con lo que hace


nombre( )
{

}
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

Cabecera void mostrar_minimo(float a, float b)


{
if (a<b)
Cuerpo printf("%.2f", a);
else
printf("%.2f", b);
}

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)

17 Cabecera void multiplos17 ()


34 {
int i;
51 for (i=17; i<100; i=i+17)
68 Cuerpo printf("%d\n", i);
}
85

>> ¿Por qué el tipo de retorno es void?


>> ¿Por qué no tiene ningún parámetro?
>> ¿Por qué no hay ningún return en el cuerpo de la función?
11
Ejercicio
>> Modifica la función anterior para que se le pase como
parámetro el número del que se deben mostrar múltiplos
positivos menores que 100 (así no Recuerda la función anterior:
void multiplos17()
serán siempre los múltiplos de 17). {
int i;
void multiplos(int num) for (i=17; i<100; i=i+17)
{ printf("%d\n", i);
}
int i;
for (i=num; i<100; i=i+num)
printf("%d\n", i);
}

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);
} }

Ojo: no confundir el mostrar algo por pantalla con el devolverlo.

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).

void suma (int a, int b)


¿Qué variables se declaran?
{
Sólo c
int c;
c = a+b;
¿Qué variables se usan?
printf("Suma: %d\n", c);
}
16
3. Definición de funciones
Ejemplo:

• Cada función usa sus propias variables. #include <stdio.h>

• Cuando se llama a la función se crean int suma2(int a, int b)


{
las variables de esa función. }
return (a+b);

• Cuando finaliza la función se destruyen int main()


{
las variables. int x=7, y=2, a;

a = suma2(x,y);

printf("Resultado: %d", a);

return 0;
}

17
4. Invocación de funciones
Llamada o Invocación: Instrucción que pone una función en
ejecución.

nombre_función (parámetro_1, parámetro_2, ... parámetro_n);

Llamada sin parámetros: nombre_funció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

Número de parámetros: Número de valores


de retorno:
0
0
1
1
Varios
✓ Considerando sólo parámetros por valor y valor de retorno
(sin considerar parámetros por referencia)

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

Parámetros ✓ Datos de entrada: parámetros por


valor
Datos de entrada ✓ Datos de salida: valor de retorno y/o
y salida: parámetros por referencia
main  función ✓ Datos de entrada y salida:
parámetros por referencia
24
5. Comunicación entre funciones
Los parámetros sirven para comunicar la función con otras funciones
(incluida la función main).

Tipos:
• Parámetros formales: declaración de la función.
tipo_retorno nombre_función (parámetros_formales)
{ ...}

• Parámetros actuales o efectivos: llamada.


nombre_función (parámetros_actuales)

25
5. Comunicación entre funciones
• Los parámetros formales se sustituyen por los actuales:

Cabecera int suma ( int a, int b) Valor en la


función
  a b
Llamada suma ( 2, 3); 2 3

• Si la función tiene parámetros se pone en ejecución la función con


los valores indicados.
• Si la función no tiene parámetros sólo se pondrá en ejecución la
función. 26
5. Comunicación entre funciones
Ejemplo: int suma (int a, int b)
{
¿Qué muestra este return a+b;
programa por }
pantalla?
int main()
{
Resultado: 7 int n1=2, n2=5;
printf("Resultado:%d\n", suma(n1,n2));
Resultado: 9 printf("Resultado:%d\n", suma(4,5));
printf("Resultado:%d\n", suma(n1,5+n2));
Resultado: 12 printf("Resultado:%d\n", suma(suma(n1,n2),10));
return 0;
Resultado: 17
}
27
5. Comunicación entre funciones
Ejemplo: programa que muestre un cuadrado formado por un carácter
determinado.
El programa principal debe leer el carácter y el lado del cuadrado
(tamaño), y llamar a una función que dibujará el cuadrado.
Si el usuario elige el asterisco (‘*’) como carácter y tamaño 4, el
resultado será:
* * * *
* * * *
* * * *
* * * *

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.

Cabecera int suma ( int a, int b) Valor en la 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.

Cabecera void imprimir ( int a, float b, char c)


  
Llamada imprimir ( 2*5-1, 3.14, 2.45);

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

int sumai(int a, int b) float sumaf(float a, float b)


{ {
int c; float c;
c = a+b; return a+b; c = a+b; return a+b;
return c; return c;
} }

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.
}

No tiene sentido poner más de un return consecutivo:


return 1;
return 0; >> ¿Por qué?

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

int es_primo (int n)


{
int i;
if (n<=1) return FALSE; /*1 no primo*/
else{
for (i=2; i<n; i++)
if (n%i==0) return FALSE;
return TRUE;
}
}

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);

• Inconveniente: los cambios realizados dentro de la función en


cuanto al valor de los parámetros se pierden.

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

Luego no es válida la solución 51


5. Comunicación entre funciones
Parámetros por referencia
• Se pasan las direcciones donde se encuentran situadas las
variables.
• Los parámetros actuales son punteros a las variables.
• No permite que los parámetros de la llamada sean constantes,
expresiones o funciones.
void f (int *b)
{...}
7 b
... a
f(&a);
52
5. Comunicación entre funciones
Parámetros por referencia. Pasos a seguir:
1. En la llamada a la función, las variables que se pasan por
referencia se preceden de & (dirección).
2. En la cabecera las variables que se pasan por referencia
se preceden de * (punteros).
3. Cada vez que esas variables se usen dentro del cuerpo
de la función se preceden de * (contenido).

53
5. Comunicación entre funciones
void intercambia(int *u, int *v) 2. En la cabecera
{
Volviendo al ejemplo anterior

las variables por


int temp; referencia se
temp = *u; preceden de *
*u = *v;
*v = temp; 3. Dentro de la función las
} variables por referencia se
preceden de *
int main()
{ 1. En la llamada
int x=5, y=10; las variables por
printf("Antes x=%d y=%d\n", x, y); referencia se
intercambia(&x, &y); preceden de &
(dirección)
printf("Después x=%d y=%d\n",x, y);
return 0;
} 54
5. Comunicación entre funciones 1A71
void intercambia(int *u, int *v) 1A72 10
5 y
{
Veamos esta otra solución

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

printf("Antes: x=%d y=%d\n",x,y); Salida por pantalla:


intercambia(&x, &y);
printf("Después x=%d y=%d\n", x,y); Antes x=5 y=10
Después x=10 y=5
return 0;
}
Luego es válida la solución 55
5. Comunicación entre funciones
Ejemplo: Desarrollar código que solicite dos números y los sume. La
función principal debe:
• Leer los valores a sumar.
• Llamar a una función suma que sume los valores.
• Mostrar el resultado.
Hacer dos versiones distintas del código:
• Versión 1. A la función suma se le pasan como parámetros los
dos valores a sumar y retorna el valor sumado.
• Versión 2. A la función suma se le pasan tres parámetros: los
dos valores a sumar y el resultado.
56
5. Comunicación entre funciones
int suma(int a, int b)
{
return a+b; Los parámetros no se modifican
} 
int main() Pase de parámetros por valor
{
int v1, v2, v3;
printf("Valores a sumar: ");
scanf("%d%d",&v1,&v2);
v3 = suma(v1, v2);
printf("Resultado: %d\n",v3); Versión 1
return 0;
}
57
5. Comunicación entre funciones
void suma(int a, int b, int *c)
{
*c = a+b; El tercer parámetro se modifica para
} contener el resultado de la suma

int main()
{ Pase de parámetros por referencia
int v1, v2, v3;
printf("Valores a sumar: ");
scanf("%d%d",&v1,&v2);
suma(v1, v2, &v3);
printf("Resultado: %d\n",v3); Versión 2
return 0;
}
58
Ejercicio
>> Desarrolla una función que reciba tres valores enteros y devuelva
el máximo y el mínimo de dichos valores.
La función desarrollada permitirá el correcto funcionamiento de este
programa principal:
/* Aquí iría la función */
int main()
{
int a=3, b=9, c=4, min, max;
CalculaMaxMin(a, b, c, &max, &min);
printf("Max:%d, Min:%d", max, min);
return 0;
}
59
Ejercicio
Posible solución
void CalculaMaxMin(int n1, int n2, int n3, int *mx, int *mn)
{
if (n1>=n2 && n1>=n3){
*mx=n1;
if (n2<=n3) *mn=n2;
else *mn=n3;
}
else if (n2>=n3){
*mx=n2;
if (n1<=n3) *mn=n1;
int main()
else *mn=n3;
{
}
int a=1, b=9, c=41, min, max;
else
CalculaMaxMin(a, b, c, &max, &min);
{
printf("Max:%d, Min:%d", max, min);
*mx=n3;
return 0;
if (n2<=n1) *mn=n2;
}
else *mn=n1;
}
}

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};

#define N 10 /* vamos a mostrar el vector antes de


la ecualización */
void ecualizacionMedia(float v[], int tam) for (i=0; i<N; i++)
{ printf("[%d]: %.2f -- ", i, datos[i]);
int i;
float total=0, media; Media: ecualizacionMedia(datos, N);
4.34
for (i=0; i<tam; i++) printf("\n");
total+=v[i]; /* vamos a mostrar como queda el vector
tras la ecualización */
media = total/tam; for (i=0; i<N; i++)
printf("[%d]: %.2f -- ", i, datos[i]);
for (i=0; i<tam; i++)
if (v[i]>media) return 0;
v[i]=1; }
else
[0]: 8.00 - [1]: 2.82 - [2]: 6.06 - [3]: 2.12 - [4]: 4.71 - [5]: 0.41 - [6]: 3.76 - [7]: 2.29 - [8]: 7.88 - [9]: 5.35 -
v[i]=0;
[0]: 1.00 - [1]: 0.00 - [2]: 1.00 - [3]: 0.00 - [4]: 1.00 - [5]: 0.00 - [6]: 0.00 - [7]: 0.00 - [8]: 1.00 - [9]: 1.00 -
}
64
6. Declaración de funciones por adelantado
Las funciones deben declararse antes de utilizarse.
Ejemplo:
void f1()
{
} f2 llama a f1
f1 se declara antes que f2
void f2()
{
f1();
}
65
6. Declaración de funciones por adelantado
void f2(); f1 llama a f2
void f1()
f2 llama a f1
{
... ¿Quién se declara antes?
f2(); Solución: se utiliza el prototipo de la función
} (cabecera seguida por ‘;’)
void f2()
{ Ejemplo:
... int ejemplo (int i, float f);  Prototipo
f1();
int ejemplo (int i, float f)  Declaración
}
{ ... } 66
Ejercicio
>> Desarrolla una función similar a pow: a esta función se le
pasan como parámetro dos números (a y b) y retorna ab .
Considerar para la solución que a será un valor float, y b un valor
int.
Llama a la función potencia.
Escribir también una función main donde se utilice la función
pow desarrollada anteriormente para calcular y mostrar 210.

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]);

printf("\nMedia: %.2f\n", m);


*media = total/tam; printf("Rango: %.2f\n", r);
*rango = max-min;
} return 0;
Elementos del vector: }
[0]: 8.00 - [1]: 2.82 - [2]: 6.06 - [3]: 2.12 - [4]: 4.71 - [5]: 0.41 - [6]: 3.76 - [7]: 2.29 - [8]: 7.88 - [9]: 5.35 -
Media: 4.34 70
Rango: 7.59

También podría gustarte