Sunteți pe pagina 1din 24

ETSID

GRADO EN INGENIERA MECNICA

T7-Funciones

Objetivos

Conocer las caractersticas y ventajas de la


programacin modular
Conocer el significado de funcin y la sintaxis para
definir funciones en C
Entender el flujo de datos y de control que se
produce cuando se invoca una funcin

Introduccin

Funcin: secuencia de instrucciones agrupadas bajo un


mismo nombre que realizan una tarea determinada.
Ventajas:
La funcin se ejecutar tantas veces como se la llame
mediante su nombre.
Facilita la reutilizacin de cdigo, aumentando la
productividad del programador.
Descomposicin de un problema en subproblemas ms
sencillos.
El uso de funciones mejora la estructura del programa:
programa ms legible e inteligible.

Estructura de una funcin

La estructura de una funcin en C se divide en


dos partes:
Cabecera de la funcin
Cuerpo de la funcin
En la cabecera de una funcin se define:
El nombre de la funcin
Los parmetros que necesita
El tipo de dato que devuelve

Cabecera de una funcin

La cabecera de una funcin tiene el siguiente formato:

tipo_retorno nombre_funcion(tipo1 argumento1,


tipo2 argumento2, , tipoN argumentoN);

Ejemplo: la funcin pow calcula la potencia de dos


nmeros (hay que incluir la librera math.h)

double pow(double x, double y);


Devuelve un
nmero real: x^y

Necesita dos parmetros: dos nmeros reales x e y.

Cabecera de una funcin

Y si una funcin no necesita ningn parmetro?

En ese caso no se pone nada entre los parntesis, pero sigue


siendo necesario usar los parntesis para distinguir
sintcticamente las funciones de las variables.
Ejemplo:

int rand(); // Devuelve un nmero generado aleatoriamente

Y si una funcin no devuelve nada?

En ese caso se utiliza el tipo de datos void


Ejemplo:

void sleep(int duration);

// Pausa el programa durante el


// tiempo indicado (en ms.)

Cuerpo de una funcin

El cuerpo de una funcin es un conjunto de


instrucciones, encerrado entre llaves, que se ejecutan
cuando se llama a la funcin:
cabecera

tipo_retorno nombre_funcion(lista_argumentos)
{
instruccion1;

instruccionN;
}

cuerpo

Devolucin de resultados

Una funcin puede devolver un valor como


resultado
El valor devuelto ser del tipo indicado en la cabecera
de la funcin
Si el tipo es void, la funcin no devolver nada

La instruccin para devolver el valor de retorno es:


return valor;

Ejemplo

Funcin que devuelve el mximo de dos nmeros reales:


La funcin
devuelve un
nmero real

Nombre de
la funcin

La funcin necesita dos parmetros


(dos nmeros reales). El nombre de
que le demos a los parmetros no
es importante, pero s su tipo

float maximo(float a, float b)


{
if (a > b) return a;
else return b;
}

Llamada a funciones

En la llamada a una funcin hay que dar un valor a cada uno


de sus parmetros

El valor asignado a cada parmetro debe ser del tipo


especificado en la cabecera de la funcin

Si la funcin devuelve un valor, dicho valor puede usarse en


cualquier expresin como una constante del tipo
correspondiente
main() {
float x = 10.5, m;
m = maximo(x, 5.2);
printf(%f, m);
}

A la funcin maximo le pasamos


dos nmeros reales y nos devuelve
el mximo de ambos nmeros
(que guardamos en la variable m)

Llamada a funciones

Ejemplo: calcula el nmero de combinaciones de n


valores tomados de k en k

int factorial(int x) {
int res=1, n;
for (n=x; n>1; n--)
res = res * n;
return res;
}

main() {
int n, k, nf, kf, nkf;
printf(Escribe n y k:);
scanf(%d%d, &n, &k);
nf = factorial(n);
kf = factorial(k);
nkf = factorial(n - k);
printf(Resultado: %d,
nf / (nkf * kf));
}

Llamada a funciones

Ejercicio: disea una funcin que, dado el radio de


un crculo, calcule y devuelva el rea de dicho crculo

float area(float radio) {


return 3.141592654 * radio * radio;
}

Llamada a funciones

Ejercicio: disea una funcin que devuelva un


nmero real ledo desde teclado. La funcin debe
comprobar que el nmero introducido sea positivo
float leerRealPositivo() {
float n;
do {
printf(Escribe un nmero real: );
scanf(%f, &n);
if (n < 0)
printf(El nmero ha de ser positivo);
} while (n < 0);
return n;
}

Llamada a funciones

Ejercicio: utilizando las dos funciones anteriores,


escribe un programa que le pida al usuario el radio
de un crculo y muestre su rea por pantalla
int main() {
float radio = leerRealPositivo();
printf(El rea de un crculo de radio %f es %f,
radio, area(radio));
system(pause);
return 0;
}

Ejercicios

Implementa un programa en C que calcule los


divisores de un nmero dado. Para ello, disea una
funcin que comprueba si un nmero es divisible
por otro.
Implementa un programa en C que calcule el
mximo comn divisor de dos nmeros enteros
introducidos por teclado. Para ello, disea una
funcin que devuelva el mximo comn divisor de
dos nmeros enteros.

Algoritmo Euclides (clculo mcd)

Supongamos el siguiente programa


#include <stdio.h>
int mayor(int a, int b){
if (a>b)
return a;

else
return b;
}
main () {
int a,b;
Printf(deme dos numeros enteros:)
scanf(%d%d,&a,&b)
printf(El mayor es: %d,mayor(a,b));
}

Memoria

Supongamos el siguiente programa


#include <stdio.h>

Memoria

int mayor(int a, int b){


if (a>b)
return a;

a
(main)

else
return b;
}

b
(main)

main () {
int a,b;
printf(deme dos numeros enteros:);
scanf(%d%d,&a,&b);
printf(El mayor es: %d,mayor(a,b));
}

Supongamos el siguiente programa


#include <stdio.h>

Memoria

int mayor(int a, int b){


if (a>b)
return a;

a
(main)

else
return b;
}

b
(main)

main () {
int a,b;
printf(deme dos numeros enteros:)
scanf(%d%d,&a,&b)
printf(El mayor es: %d,mayor(a,b));
}

Ejecucin

Supongamos el siguiente programa


#include <stdio.h>

Memoria

int mayor(int a, int b){


if (a>b)
return a;

a
(main)

else
return b;
}

b
(main)

main () {
int a,b;
printf(deme dos numeros enteros:)
scanf(%d%d,&a,&b)
printf(El mayor es: %d,mayor(a,b));
}

Paso de parmetros por valor


#include <stdio.h>

Memoria

a
(mayor)

int mayor(int a, int b){


if (a>b)
return a;

a
(main)

6
6

else
return b;
}

b
(main)

9
9

main () {
int a,b;
printf(deme dos numeros enteros:)
scanf(%d%d,&a,&b)
printf(El mayor es: %d,mayor(a,b));
}

b
(mayor)

Supongamos el siguiente programa


#include <stdio.h>

Memoria

a
(mayor)

int mayor(int a, int b){


if (a>b)
return a;

a
(main)

6
6

else
return b;
}

b
(main)

9
9

main () {
int a,b;
printf(deme dos numeros enteros:)
scanf(%d%d,&a,&b)
printf(El mayor es: %d,mayor(a,b));
}

b
(mayor)

Tipos de paso de parmetros

Paso por valor


En C este es el paso por defecto para los tipos simples.
En la llamada se indica una constante, una variable, una
expresin compleja ...
La funcin trabaja con una copia lo que se haga a estos
parmetros no afecta fuera de la funcin.

Paso por referencia


En C este es el paso que se hace para vectores, cadenas y
matrices (nunca se pasan por valor). Una variable de un tipo
simple se pasar por referencia slo si le ponemos &.
En la llamada siempre se indicar una variable.
La funcin trabaja con esa variable los cambios afectarn
fuera de la funcin (a la variable indicada en la llamada).

S-ar putea să vă placă și