You are on page 1of 27

Captulo 4

Funciones

Qu son?Para qu sirven?
Son un grupo de sentencias bajo el mismo nombre que reali an una tarea espec!ica" Sirven para !acilitar la resoluci#n de problemas mediante la aplicaci#n del paradigma Dividir y Conquistar.

1i!erencia entre +l Programa % las Funciones


$as !unciones % los programas se parecen muc&o' pero di!ieren(

) $os programas son usados por un usuario e*terno" ) $as !unciones son utili adas por un programador" ) +l usuario del programa ,-ola .undo/ no conoce que es la !unci#n print!" ) +l programador que usa print! no siempre conocer0 e*plcitamente como sta &ace para mostrar in!ormaci#n en pantalla" ) +l programador que escribi# print! conoce e*actamente su !uncionamiento interno"

Conceptos 20sicos
Funci#n

) 3rupo de sentencias bajo el mismo nombre que reali an una tarea espec!ica"
$lamada a una !unci#n

) +jecuta el grupo de sentencias de una !unci#n"


4etorno

) 5na ve ,llamada/ la !unci#n' esta &ace su trabajo' % regresa al mismo punto donde !ue llamada"

Funciones
6amos a conocer tres cosas mu% importantes sobre las !unciones(
) C#mo se declaran? ) C#mo se implementan?' % ) C#mo se usan?

1eclaraci#n de Funciones
1e !orma similar a las variables' las !unciones deben ser declaradas( $a !orma de declarar una !unci#n es siguiendo la !orma prede!inida(
tipo1ato4etorno nombreFuncion7lista par0metros89

Por ejemplo(
int potencia7int base' int e*ponente89 !loat !aren&eit:Celsius7double celsius89

;mplementaci#n de Funciones
int potencia7int base' int e*ponente8 < sentencias9 =

$a primera lnea se escribe igual que en la declaraci#n' pero sin el punto % coma"

!loat !aren&eit:Celsius7double celsius8 < +ntre llaves se escriben sentencias9 las sentencias que = ejecutan lo que debe
reali ar la !unci#n

C#mo 4etornar?
Si la !unci#n debe generar un valor' lo retornar0 usando la sentencia return dentro del cuerpo de la !unci#n" $a !orma de usarla es( return (variable o expresin que se debe retornar); +sto especi!ica que la !unci#n debe terminar' retornando el valor calculado" -a% !unciones que no retornan datos' en este caso' se puede usar return' pero sin mencionar una e*presi#n" return;

5so de Funciones
Como las !unciones siempre retornan un valor' el uso de una !unci#n consiste en utili ar el valor de retorno" Se lo puede &acer de dos !ormas(
) Almacenar el valor de retorno en una variable que deber0 ser del mismo tipo de dato que el tipo de dato de retorno de la !unci#n" ) Utilizar el valor de retorno en una expresin.

5so de Funciones 7continuaci#n8


+jemplo(
void main7 8 < int *9 >" * ? potencia7a'b89 > = void main7 8 < >" print!7,@d/' potencia7a'b889 > = void main7 8 < !loat c9 >" c ? !aren&eit:Celsius7!89 > = void main7 8 < >" print!7,@!/' !aren&eit:Celsius7!889 > =

:plicaci#n( Auegos de : ar
3eneraci#n de BCmeros :leatorios

3eneraci#n de BCmeros :leatorios


Funci#n rand
) Cargar <stdlib.h> ) 4eturnar nCmeros ,aleatorios, entre 0 % RAND_MAX 7por lo menos 327678
i = rand();

) BCmeros Pseudoaleatorios
Secuencia preDestablecida de nCmeros aleatorios $a misma secuencia para cada llamada a la !unci#n

Para obtener un nCmero aleatorio entre E % n(


1 ( rand() ! n );

" rand() ! n returna un nCmero entre 0 % n # 1 :gregando 1 genera nCmeros aleatorios entre 1 % n

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

3eneraci#n de BCmeros :leatorios


Funci#n srand $ <stdlib.h> ) Foma un entero % salta a esa posici#n de su secuencia aleatoria"
srand( time(NULL) ); %%&AR'AR <ti().h> " ti()( N*++ )
) 4eturna el tiempo en el cual el programa !ue compilado en segundos"

$ibrera .:F $a librera mat&"& permite al programador e!ectuar c0lculos matem0ticos comunes a travs de !unciones"
Numero ceil(x) floor(x) fa s(x) fmod(x#y) sqrt(x) po)(x#y) log(x) log10(x) exp(x) sin(x) cos(x) tan(x) Descripcion
redondea x al entero mas pequeo no menor que x redondea x al entero mas grande no mayor que x !alor a soluto de x residuo de x$y como numero de punto flotante rai( cuadrada de x x ele!ado a la potencia y logaritmo natural de x( ase e) logaritmo de x( ase 10) funcion exponencial seno trigonometrico de x(en radianes) coseno trigonometrico de x(en radianes) tangente trigonometrico de x(en radianes)

Ejemplo ceil(9.2) es 10.0 ceil(-9.8) es 9.0 floor(9.2) es 9.0 floor(-9.8) es 10.0 fa s(-9.") es 9." fmod(1%.&"'# 2.%%%) es 1.992 sqrt(9.0) es %.0 po)(2#') es 128 log10(x) log(2.'18282) es 1 exp(0.1) es 2.'1828 sin(0.0) es 0.0 cos(0.0) es 1 tan(0.0) es 0

Funciones Predicado
$as !unciones que retornan valores l#gicos se conocen como funciones predicado. $lamar a una !unci#n de predicado es equivalente a &acer una pregunta donde la respuesta puede ser 6erdadera 7F45+8 o Falsa 7F:$S+8"

$a 6erdad detr0s de las Funciones


-a% una ma%or complejidad de la mostrada' en el uso de !unciones" Fomemos como ejemplo el siguiente programa(
*include +stdio.,Si vemos el programa principal % la !unci#n como un todo' puede resultar un tanto con!uso( Hay dos variables con nombre i +n el programa se usa la variable i como el nCmero al que se le calcula el !actorial" n la funcin la variable a la que se le calcula el factorial se llama n $$.eclaraci/n de funciones int 0actorial(int n)1 !oid main() 2 int i; for (i 3 01 i + 101 i 44) printf(56d7n8# 0actorial(i))1 9 int 0actorial (int n) 2 int fact# i1 fact 3 11 for(i 3 11 i +3n1 i44) fact 3 fact : i1 return (fact)1 9

Si vemos s#lo el programa principal' tiene sentido' pues se imprime el !actorial de todos los nCmeros &asta el EG

Si vemos s#lo la !unci#n' tiene sentido' pues se encarga de calcular el !actorial de la variable n

Paso de :rgumentos a Funciones


;n el programa principal# se calcula el factorial de i. ;n la funci/n se calcula el factorial de n Cmo es que hay diferentes identificadores para el mismo valor? <a respuesta esta muy relacionada con el concepto de argumento=
- ;n el programa principal# i representa el argumento en!iado a la funci/n 0actorial. - ;n la funci/n 0actorial# alguna !aria le de e reci ir el en!iado# para representar dic,o !alor. ;sta !aria le puede tener cualquier nom re# en este caso se le dio el nom re n. - >na !aria le definida en la ca ecera de una funci/n# que sir!e
*include +stdio.,*include +simpio.,$$.eclaraci/n de funciones int 0actorial (int n)1 !oid main() 2 int i1 for (i 3 01 i + 101 i 44) printf(56d7n8# 0actorial(i))1 9 int 0actorial (int n) 2 int fact# i1 fact 3 11 for(i 3 11 i +3n1 i44) fact 3 fact : i1 return (fact)1 9

Pasos para llamar a una Funci#n


Se evalCan las e*presiones enviadas como argumentos" +l valor de cada argumento es copiado en orden en cada par0metro correspondiente de la !unci#n llamada" Se ejecutan una a una las sentencias del cuerpo de la !unci#n &asta que aparece la sentencia return" Se evalCa la e*presi#n de la sentencia return" +l programa que llam# a la !unci#n continCa' reempla ando en el lugar de la llamada' el valor retornado
*include +stdio.,int 0actorial(int n)1 !oid main() 2 int i1 for (i 3 01 i + 101 i 44) 2 printf(56d7n8# actorial!i")1 9 9

1 2 &

int 0actorial(int n) 2 int fact# i1 fact 3 11 for(i 3 11 i +3n1 i44) 2 fact 3 fact : i1 9 return (fact)1 9

0actorial(1) 0actorial(0) 0actorial(2) 0actorial(% )

n 0 1 2 % expr exp r 1 2 &

6ariables $ocales
+n la !unci#n Factorial se usa una variable i' % en el programa principal se usa otra variable i' pero no parece que se usaran para lo mismo' son di!erentes?" 1e &ec&o' si son di!erentes" ) Cada !unci#n puede usar sus propias variables' % estas s#lo ser0n v0lidas dentro de la !unci#n' se conocen como variables locales"
main i
$a variable i es local a la !uncion main

fact

?l llamar a la funci/n 0actorial# se crean % !aria les locales a 0actorial# pueden tener cualquier nom re# en locales 0actorial <as este!aria caso= les n# fact e i. del main aun existen# pero# no se pueden !er mientras 0actorial este acti!a. i @uando todo 0actorial termina# 1 retorna el !alor# y las !aria les locales al main permanecen iguales como antes de la llamada.

.0s sobre >


5n tipo especial de !unciones( Procedimientos

Procedimientos
+*isten !unciones que no retornan ningCn valor' como print!(

print! 7,-ola .undoHn/89


$as !unciones que no retornan nada' % que se llaman Cnicamente para que ejecuten su c#digo' se les llama procedimientos" .uc&os lenguajes de programaci#n separan totalmente el concepto de !unciones' con el de procedimientos' pero C las trata de igual !orma" 5n procedimiento en C' es una !unci#n sin valor de retorno"

void menu 7void89


$os procedimientos pueden recibir tantos argumentos necesite"

;mplementaci#n de Procedimientos
!oid mostrarAenu (!oid) 2 printf printf printf printf printf 9 (51. (52. (5%. (5E. (5". Ba la de Cumar7n8)1 Ba la de Destar7n8)1 Ba la de Aultiplicar7n8)1 Ba la de .i!idir7n8)1 Calir7n8)1

Paso de Par0metros
:&ora que conocemos de !unciones' % sabemos crearlas' podemos crear una !unci#n que reciba dos valores % los retorne' intercambiados" Podramos decir que el prototipo sera( !oid main()

void intercambiar7int a' int b89


?l retornar la funci/n no efectuarFa el cam io# como lo deseamos. Decordemos que# al pasar parGmetros# se efectHa una copia de los !alores. ;ste tipo de paso de parGmetros se conoce como #$%& DE #$'$(E)'&% #&' *$+&'.

2 int x# y1 printf(5Ingrese x=8)1 scanf(56d8#Jx)1 printf(5Ingrese y=8)1 scanf(56d8#Jy)1 printf(5x 3 6d# y3 6d8# x# y)1 intercam iar(x#y)1 printf(5x 3 6d# y3 6d8# x# y)1

main x

E a % E

Intercam iar tmp

E %

9 !oid intercam iar(int a# int ) 2 int tmp1 tmp 3 a1 a3 1 3 tmp1 9

Paso de Par0metros por 4e!erencia


Para este tipo de problemas' en los cuales necesitamos modi!icar directamente los datos que se reciben como par0metros' se usa la llamada de par0metros !"# # $ # %C&' 1e esta !orma' el prototipo seria(

void intercambiar(int (a) int (b);


?l retornar la funci/n si ,a rG efectuado el cam io so re las !aria les que se pasaron por referencia.

!oid main() 2

int x# y1 printf(5Ingrese x=8)1

scan!7,@d/'I*89
printf(5Ingrese y=8)1 scanf(56d8#Jy)1 printf(5x 3 6d# y3 6d8# x# y)1 intercam iar(Jx#Jy)1 printf(5x 3 6d# y3 6d8# x# y)1 9 !oid intercam iar(int :a# int : ) 2 int tmp1 tmp 3 :a1 :a 3 : 1 : 3 tmp1 9

main x

% E
a

E % % E % E

Intercam iar tmp

4e!inamiento
Cuando un problema es mu% grande' se busca separarlo' para resolver todo por partes" +sto es ventajoso( ) $as partes m0s pequeJas son mas !0ciles de entender ) Si algo !alla' el error es mas !0cil de encontrar" :l escribir un programa' usualmente se piensa en el programa principal 7main8'% se piensa en las tareas m0s importantes" Se piensa en dividir el programa en componentes individuales' los cuales pueden ser a su ve ' divididos en pie as m0s pequeJas" +sto se conoce como dise*o top+do,n) o refinamiento paso a paso.

5n Problema m0s 3rande


Se requiere escribir un programa que muestre el .ar Instrucciones calendario completo de un aJo dado' que no puede ser Imprimir Aes menor a EKGG"

Ingreso y Kalidacion de ?o .ar el respecti!o marqen para el primer dia del mes

Aostrar Lom re del Aes .eterminar que dia de la semana fue el primer dia del mes

@alendario .ar Instrucciones Imprimir @alendario Imprimir @alendario de c$ Aes


Imprimir el Aargen para el primer dia del mes

Medir ?o

Imprimir Lom re del Aes

.eterminar cuantos dFas trae el mes

.eterminar el dia de la semana donde cayo el primer dia

Imprimir el resto de dFas

.ependiendo del mes y de si es isiesto# elegir total de dFas

@alcular el dia de la semana del primer dia del ao# contando el total de dFas desde 1900 ,asta el ao actual# considerando los aos isiestos

@alcular el dia de la semana del primer dia del mes# sumGndole al primer dia del ao# el total de dFas ,asta el mes actual# considerando el total de dFas de cada mes