Sunteți pe pagina 1din 27

Captulo 4

Funciones
Qu son?Para qu sirven?
Son un grupo de sentencias bajo el
mismo nombre que realizan una tarea
especfica.
Sirven para facilitar la resolucin de
problemas mediante la aplicacin del
paradigma Dividir y Conquistar.
Diferencia entre
El Programa y las Funciones
Las funciones y los programas se parecen mucho, pero difieren:
Los programas son usados por un usuario externo.
Las funciones son utilizadas por un programador.
El usuario del programa Hola Mundo no conoce que
es la funcin printf.
El programador que usa printf no siempre conocer
explcitamente como sta hace para mostrar
informacin en pantalla.
El programador que escribi printf conoce
exactamente su funcionamiento interno.
Conceptos Bsicos
Funcin
Grupo de sentencias bajo el mismo nombre
que realizan una tarea especfica.
Llamada a una funcin
Ejecuta el grupo de sentencias de una
funcin.
Retorno
Una vez llamada la funcin, esta hace su
trabajo, y regresa al mismo punto donde fue
llamada.
Funciones
Vamos a conocer tres cosas muy
importantes sobre las funciones:
Cmo se declaran?
Cmo se implementan?, y
Cmo se usan?
Declaracin de Funciones
De forma similar a las variables, las
funciones deben ser declaradas:
La forma de declarar una funcin es
siguiendo la forma predefinida:
tipoDatoRetorno nombreFuncion(lista parmetros);

Por ejemplo:
int potencia(int base, int exponente);
float farenheitACelsius(double celsius);
Implementacin de Funciones
int potencia(int base, int exponente)
{
sentencias; La primera lnea se escribe
igual que en la declaracin,
} pero sin el punto y coma.

float farenheitACelsius(double celsius)


{
Entre llaves se escriben
sentencias; las sentencias que
} ejecutan lo que debe
realizar la funcin
Cmo Retornar?
Si la funcin debe generar un valor, lo retornar usando
la sentencia return dentro del cuerpo de la funcin.
La forma de usarla es:
return (variable o expresin que se debe retornar);
Esto especifica que la funcin debe terminar, retornando
el valor calculado.
Hay funciones que no retornan datos, en este caso, se
puede usar return, pero sin mencionar una expresin.
return;
Uso de Funciones
Como las funciones siempre retornan un
valor, el uso de una funcin consiste en
utilizar el valor de retorno.
Se lo puede hacer de dos formas:
Almacenar el valor de retorno en una
variable que deber ser del mismo tipo de
dato que el tipo de dato de retorno de la
funcin.
Utilizar el valor de retorno en una
expresin.
Uso de Funciones (continuacin)
Ejemplo:
void main( ) void main( )
{ {
int x; float c;
. .
x = potencia(a,b); c = farenheitACelsius(f);

} }

void main( ) void main( )


{ {
. .
printf(%d, potencia(a,b)); printf(%f, farenheitACelsius(f));

} }
Aplicacin: Juegos de Azar

Generacin de Nmeros
Aleatorios
Generacin de Nmeros Aleatorios
Funcin rand
Cargar <stdlib.h>
Returnar nmeros aleatorios entre 0 y RAND_MAX (por
lo menos 32767)
i = rand();
Nmeros Pseudoaleatorios
Secuencia pre-establecida de nmeros aleatorios
La misma secuencia para cada llamada a la funcin
Para obtener un nmero aleatorio entre 1 y n:
1 + ( rand() % n );
rand() % n returna un nmero entre 0 y n - 1
Agregando 1 genera nmeros aleatorios entre 1 y n

1 + ( rand() % 6); //Nmero entre 1 y 6


Generacin de Nmeros Aleatorios
Funcin srand
<stdlib.h>
Toma un entero y salta a esa posicin de su
secuencia aleatoria.
srand( time(NULL) ); //CARGAR <time.h>
time( NULL )
Returna el tiempo en el cual el programa fue compilado
en segundos.
Librera MATH
La librera math.h permite al programador efectuar
clculos matemticos comunes a travs de funciones.
Numero Descripcion Ejemplo
ceil(x) redondea x al entero mas pequeo no menor ceil(9.2) es 10.0
que x ceil(-9.8) es 9.0
floor(x) redondea x al entero mas grande no mayor que floor(9.2) es 9.0
x floor(-9.8) es 10.0
fabs(x) valor absoluto de x fabs(-9.5) es 9.5
fmod(x,y) residuo de x/y como numero de punto flotante fmod(13.657, 2.333) es
1.992
sqrt(x) raiz cuadrada de x sqrt(9.0) es 3.0
pow(x,y) x elevado a la potencia y pow(2,7) es 128
log(x) logaritmo natural de x(base e) log10(x)
log10(x) logaritmo de x(base 10) log(2.718282) es 1
exp(x) funcion exponencial exp(0.1) es 2.71828
sin(x) seno trigonometrico de x(en radianes) sin(0.0) es 0.0
cos(x) coseno trigonometrico de x(en radianes) cos(0.0) es 1
tan(x) tangente trigonometrico de x(en radianes) tan(0.0) es 0
Funciones Predicado
Las funciones que retornan valores
lgicos se conocen como funciones
predicado.
Llamar a una funcin de predicado es
equivalente a hacer una pregunta donde
la respuesta puede ser Verdadera (TRUE)
o Falsa (FALSE).
La Verdad detrs de las Funciones
Hay una mayor complejidad de la mostrada, en el uso de
funciones. Tomemos como ejemplo el siguiente programa:

#include <stdio.h>

Si vemos el //Declaracin de funciones


programa principal int Factorial(int n);
y la funcin como
un todo, puede void main()
resultar un tanto { Si vemos slo el programa
confuso: int i; principal, tiene sentido, pues
Hay dos for (i = 0; i < 10; i ++) se imprime el factorial de
variables con printf(%d\n, Factorial(i)); todos los nmeros hasta el 10
nombre i }
En el programa se
usa la variable i
como el nmero al int Factorial (int n)
que se le calcula el { Si vemos slo la
factorial. int fact, i; funcin, tiene sentido,
En la funcin la fact = 1; pues se encarga de
variable a la que for(i = 1; i <=n; i++) calcular el factorial de
se le calcula el fact = fact * i; la variable n
factorial se llama n return (fact);
}
Paso de Argumentos a
Funciones
En el programa principal, se calcula #include <stdio.h>
el factorial de i. #include <simpio.h>

En la funcin se calcula el factorial //Declaracin de funciones


int Factorial (int n);
de n
void main()
Cmo es que hay diferentes {
int i;
identificadores para el mismo for (i = 0; i < 10; i ++)
printf(%d\n, Factorial(i));
valor? }
La respuesta esta muy relacionada int Factorial (int n)
con el concepto de argumento: {
int fact, i;
- En el programa principal, i fact = 1;
for(i = 1; i <=n; i++)
representa el argumento enviado a fact = fact * i;
la funcin Factorial. return (fact);
}
- En la funcin Factorial, alguna
variable debe recibir el enviado,
para representar dicho valor. Esta
variable puede tener cualquier
nombre, en este caso se le dio el
nombre n.
- Una variable definida en la
cabecera de una funcin, que sirve
Pasos para llamar a una Funcin
#include <stdio.h>
Se evalan las expresiones int Factorial(int n);
enviadas como argumentos. void main()
1
2
6
El valor de cada argumento es {
int i;
copiado en orden en cada for (i = 0; i < 10; i ++)
{
parmetro correspondiente de }
printf(%d\n, Factorial(i));

la funcin llamada. }

Se ejecutan una a una las


sentencias del cuerpo de la
funcin hasta que aparece la Factorial(1)
Factorial(0)
Factorial(2)
Factorial(3
n
sentencia return. )
Se evala la expresin de la int Factorial(int n)
{ 0
1
2
3
sentencia return. int fact, i;
fact = 1;
El programa que llam a la for(i = 1; i <=n; i++)
{
expr
exp
funcin contina, fact = fact * i; r
reemplazando en el lugar de la }
return (fact); 1
llamada, el valor retornado }
2
6
Variables Locales
En la funcin Factorial se usa una variable i, y en el
programa principal se usa otra variable i, pero no parece
que se usaran para lo mismo, son diferentes?.
De hecho, si son diferentes.
Cada funcin puede usar sus propias variables, y
estas slo sern vlidas dentro de la funcin, se
conocen como variables locales.
La variable i es Al llamar a la funcin Factorial, se
main local a la funcion crean 3 variables locales a Factorial,
main pueden tener cualquier nombre, en
i Factorial Las
estevariables locales
caso: n, fact e i. del main aun
0 n
existen, pero, no se pueden ver
fact i mientras Factorial este activa.
Cuando todo Factorial termina,
0 1 1 retorna el valor, y las variables
locales al main permanecen iguales
como antes de la llamada.
Ms sobre

Un tipo especial de funciones:


Procedimientos
Procedimientos
Existen funciones que no retornan ningn valor, como printf:
printf (Hola Mundo\n);
Las funciones que no retornan nada, y que se llaman
nicamente para que ejecuten su cdigo, se les llama
procedimientos.
Muchos lenguajes de programacin separan totalmente el
concepto de funciones, con el de procedimientos, pero C las
trata de igual forma.
Un procedimiento en C, es una funcin sin valor de retorno.
void menu (void);
Los procedimientos pueden recibir tantos argumentos
necesite.
Implementacin de Procedimientos

void mostrarMenu (void)


{
printf (1. Tabla de Sumar\n);
printf (2. Tabla de Restar\n);
printf (3. Tabla de Multiplicar\n);
printf (4. Tabla de Dividir\n);
printf (5. Salir\n);
}
Paso de Parmetros
Ahora que conocemos de funciones, y sabemos crearlas, podemos crear una funcin que reciba dos valores y los
retorne, intercambiados.
Podramos decir que el prototipo sera:
void intercambiar(int a, int b);

void main()
{
int x, y;
Al retornar la funcin no efectuara el printf(Ingrese x:);
scanf(%d,&x);
cambio, como lo deseamos.
printf(Ingrese y:);
Recordemos que, al pasar parmetros, scanf(%d,&y);
se efecta una copia de los valores. printf(x = %d, y= %d, x, y);
Este tipo de paso de parmetros se intercambiar(x,y);
conoce como PASO DE PARAMETROS printf(x = %d, y= %d, x, y);
POR VALOR. }
main void intercambiar(int a, int b)
y {
x Intercambiar int tmp;
3 a4 b tmp
tmp = a;
a = b;
3
4 4
3 3 }
b = tmp;
Paso de Parmetros por Referencia
Para este tipo de problemas, en los cuales necesitamos modificar
directamente los datos que se reciben como parmetros, se usa la
llamada de parmetros POR REFERENCIA
De esta forma, el prototipo seria:
void main()
void intercambiar(int *a, int *b); {
int x, y;
printf(Ingrese x:);
Al retornar la funcin si
scanf(%d,&x);
habr efectuado el cambio
printf(Ingrese y:);
sobre las variables que se scanf(%d,&y);
pasaron por referencia. printf(x = %d, y= %d, x, y);
intercambiar(&x,&y);
main
printf(x = %d, y= %d, x, y);
x y }
void intercambiar(int *a, int *b)
3
4 4
3 Intercambiar {
int tmp;
a b tmp tmp = *a;
*a = *b;
3
4 3
4 3 *b = tmp;
}
Refinamiento
Cuando un problema es muy grande, se busca separarlo,
para resolver todo por partes. Esto es ventajoso:
Las partes ms pequeas son mas fciles de entender
Si algo falla, el error es mas fcil de encontrar.
Al escribir un programa, usualmente se piensa en el
programa principal (main),y se piensa en las tareas ms
importantes.
Se piensa en dividir el programa en componentes
individuales, los cuales pueden ser a su vez, divididos en
piezas ms pequeas.
Esto se conoce como diseo top-down, o refinamiento
paso a paso.
Un Problema ms Grande
Se requiere escribir un programa que
Darmuestre el calendario completo
Instrucciones
de un ao dado, que no puede ser menor a 1900.
Imprimir Mes

Mostrar Nombre
Ingreso y del Mes
Validacion de
Ao Determinar que
dia de la semana
Dar el respectivo fue el primer dia
marqen para el del mes
primer dia del
mes
Calendario

Dar Imprimir
Pedir Ao
Instrucciones Calendario
Imprimir Calendario de c/
Mes

Imprimir el
Imprimir Determinar Determinar el dia Imprimir
Margen para el
Nombre del Mes cuantos das de la semana el resto
primer dia del
trae el mes donde cayo el de das
mes
primer dia

Calcular el dia de la Calcular el dia de la


Dependiendo del semana del primer semana del primer dia
mes y de si es dia del ao, del mes, sumndole al
bisiesto, elegir contando el total de primer dia del ao, el
total de das das desde 1900 total de das hasta el
hasta el ao actual, mes actual,
considerando los considerando el total de
aos bisiestos das de cada mes

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