Você está na página 1de 6

Notas de Aula - Introduc ao ` a Computac ao

Departamento de Ci encia da Computac a o IME-USP

es - Introduc o Func o a
Ronaldo F. Hashimoto e Carlos H. Morimoto

Objetivo
O objetivo desta aula e introduzir o conceito de func a o e sua utilidade. Ao nal dessa aula voc e dever a saber: Justicar as vantagens do uso de func o es em programas. Identicar em seus programas oportunidades para criac a o e uso de func o es. Denir os par ametros que a func ao precisa receber (par ametros de entrada) e o que a func a o precisa devolver (o tipo do valor devolvido pela func ao).

Exerc cio de Aquecimento


Fac a um programa que leia um real x e um inteiro n > 0 e calcule xn . Uma soluc ao deste exerc cio poderia usar a seguinte estrat egia: Gerar uma seq ue ncia de n n umeros reais x, x, x, . . . , x. Para cada n umero gerado, acumular o produto em uma vari avel pot: pot = pot x Um trecho de programa para esta soluc a o poderia ser:
1 2 3 4 5 6 7 8

f l o a t pot , x ; i n t cont , n ; cont = 0 ; pot = 1 ; while ( cont < n ) { pot = pot x ; cont = cont + 1 ; } / no f i n a l pot cont e m xn /

o Exerc cio de Motivac a


Fac a um programa que leia dois n umeros reais x e y e dois n umeros inteiros a > 0 e b > 0, e calcule o valor da express ao xa + y b + (x y )a+b . Este programa deve calcular a potenciac ao de dois n umeros tr es vezes: uma para xa , outra para y b e outra para a+b (x y ) . Para calcular xa , temos o seguinte trecho de programa:

1 2 3 4 5 6 7 8

f l o a t pot , x ; i n t cont , a ; cont = 0 ; pot = 1 ; while ( cont < a ) { pot = pot x ; cont = cont + 1 ; } / no f i n a l pot contem xa /

Para calcular y b , temos o seguinte trecho de programa:


1 2 3 4 5 6 7 8

f l o a t pot , y ; i n t cont , b ; cont = 0 ; pot = 1 ; while ( cont < b ) { pot = pot y ; cont = cont + 1 ; } / no f i n a l pot cont e m yb /

Para calcular (x y )a+b , temos o seguinte trecho de programa:


1 2 3 4 5 6 7 8

f l o a t pot , x , y ; i n t cont , a , b ; cont = 0 ; pot = 1 ; while ( cont < a+b ) { pot = pot (x-y) ; cont = cont + 1 ; } / no f i n a l pot cont e m (x y )a + b /

Tirando as vari aveis que mudam, isto e, os expoentes (vari aveis a, b e a + b) e as bases (vari aveis x, y e x y ), praticamente temos o mesmo c odigo. Na elaborac a o de programas, e comum necessitarmos escrever v arias vezes uma mesma seq ue ncia de comandos, como no exemplo acima. Assim, seria muito interessante termos uma maneira de escrevermos um c odigo que poderia ser aproveitado, mudando somente os valores (note que est a escrito valores e n ao nomes) das vari aveis que s ao o expoente e a base da potenciac ao. Algo como:
1 2 3 4 5 6 7 8

f l o a t pot , base ; i n t cont , expoente ; cont = 0 ; pot = 1 ; while ( cont < expoente ) { pot = pot base ; cont = cont + 1 ; } / no f i n a l pot cont e m base e l e v a d o a expoente /

Assim, se quisermos calcular xa , devemos fazer algo como expoente a e base x e rodarmos o c odigo acima. Da mesma forma, para calcular y b e (x y )a+b devemos fazer, de alguma forma, expoente b ,
base y e expoente a+b e base (x-y) , respectivamente, e rodar o c odigo acima.

A id eia aqui e ainda escrevermos este c odigo somente uma vez! Para isso, vamos dar um nome para o nosso trecho de c odigo. Que tal potencia? Assim, toda vez que quisermos utilizar o c odigo acima, simplesmente usuar amos seu nome que e potencia . Poder amos fazer: 2

1 2 3 4 5 6 7 8 9 10

potencia ( f l o a t base , i n t expoente ) { f l o a t pot ; i n t cont ; cont = 0 ; pot = 1 ; while ( cont < expoente ) { pot = pot base ; cont = cont + 1 ; } / no f i n a l pot cont e m base e l e v a d o a expoente / }

o. A id O trecho de c odigo acima de nome potencia na verdade e uma func a eia de func ao e fazer um subprograma de nome potencia que seja utilizado, para o exemplo acima, tr es vezes. Note agora que as vari aveis base e expoente est ao declaradas entre par enteses e depois do nome potencia. Por que? A id eia para calcular xa n ao e fazer algo como expoente a e base x ? Ent ao, para calcular xa , a gente poderia colocar o conte udo das vari aveis x e a nas vari aveis base e expoente, respectivamente, usando o comando potencia (x, a) . Observe no diagrama abaixo:

1 2 3 4 5 6 7 8 9 10 11

potencia ( f l o a t base , i n t expoente ) { f l o a t pot ; i n t cont ; cont = 0 ; pot = 1 ; while ( cont < expoente ) { pot = pot base ; cont = cont + 1 ; } / no f i n a l pot cont e m base e l e v a d o a expoente / }

. . .
1 2 3 4 5 6

potencia ( x , a ) ; potencia ( y , b ) ; potencia ( xy , a+b ) ;

O comando potencia (x, a) coloca o conte udo das vari aveis x e a (seus valores) nas vari aveis base e expoente respectivamente, como indicado pelas setas. Depois executa os comandos com os respectivos valores das vari aveis base e expoente atualizados. No nal da execuc ao da func ao potencia, ou seja, depois que sair do lac o, a vari avel pot cont em xa . Da mesma forma, podemos ent ao calcular y b e (x y )a+b usando o comando potencia (y, b) e o comando
potencia (x-y, a+b) , respectivamente. Assim, ao nal de cada execuc a o da func a o potencia, a vari avel pot

cont em y b e (x y )a+b , respectivamente. Agora, voc e deve estar se perguntando o que fazer com cada resultado que est a na vari avel pot? Ali as, como pot pode guardar tr es valores se pot e uma vari avel oat . Na verdade, pot guarda somente um valor real. Toda vez que o c odigo potencia e executado, o valor do u ltimo pot e perdido! 3

Ah! Ent ao, para cada vez que o c odigo de potencia for executado, a gente poderia imprimir o valor nal da vari avel pot. A a gente tem o resultado de cada potenciac ao! Legal, mas, isto n ao resolveria o problema de calcular xa + y b + (x y )a+b . O que ter amos que fazer e guardar o resultado das potenciac o es em outras tr es vari aveis, por exemplo, potx, poty e potxy e no nal imprimir a soma potx + poty + potxy. Para indicar que o resultado de potencia (x, a); ser a colocado na vari avel potx, vamos escrever o uso da aveis poty e potxy. Assim, func ao potencia como potx = potencia (x, a); . Da mesma forma, para as vari ter amos:
1 2 3 4 5 6 7 8

potx = potencia ( x , a ) ; poty = potencia ( y , b ) ; potxy = potencia ( xy , a+b ) ; soma = potx + poty + potxy ; printf ( " Resultado = % f \ n " , soma ) ;

Assim, potx = potencia (x, a); , poty = potencia (y, b); e potxy = potencia (x-y, a+b); indicam que o valor da vari avel pot de cada execuc a o da func a o potencia e colocado nas vari aveis potx, poty e potxy, respectivamente. Depois e s o imprimir a soma das vari aveis potx, poty e potxy. Agora, como fazer com que a func a o potencia coloque corretamente para fora o valor da vari avel pot? N os ao: vamos indicar isso colocando no nal da func ao potencia o comando return pot; . Veja como ca ent
potencia ( f l o a t base , i n t expoente ) { f l o a t pot ; i n t cont ; cont = 0 ; pot = 1 ; while ( cont < expoente ) { pot = pot base ; cont = cont + 1 ; } / no f i n a l pot cont e m base e l e v a d o a expoente / return pot ; }

1 2 3 4 5 6 7 8 9 10 11

Assim, o uso potx = potencia (x, a); faz com que expoente a e base x e executa o c odigo de
potencia; no nal da execuc ao, a vari avel pot cont em o valor de xa ; o comando return pot; coloca o valor

que est a na vari avel pot da func ao potencia em um lugar do computador (CPU) que se chama acumulador. Acumulador?!? O que e anal de contas um acumulador? O acumulador e um lugar do computador capaz de guardar n umeros. Este acumulador funciona como uma vari avel: toda vez que um valor e colocado nele, ou ltimo valor e perdido. Ent ao, como o resultado nal e colocado na vari avel potx? Depois que a func ao encontrou um return, o uxo do programa volta para o comando potx = potencia (x, a); . Neste momento, o resultado da func ao est a no acumulador, pois o c odigo da func ao potencia j a foi executado e conseq uentemente o comando return tamb em j a foi executado (ali as, este eou ltimo comando executado da func ao). A , como temos indicado que a vari avel potx recebe potencia (x, a) no comando potx = potencia (x, a); , ent ao o valor que est a no acumulador e colocado em potx. odigo Da mesma forma, o uso poty = potencia (y, b); faz com que expoente b e base y e executa o c de potencia; no nal da execuc a o, a vari avel pot cont em o valor de y b ; o comando return pot; coloca o valor que est a na vari avel pot da func a o potencia no acumulador. Depois que a func ao encontrou um return, o uxo do programa volta para o comando poty = potencia (y, b); . Neste momento, o resultado da func a o est a no acumulador, pois o c odigo da func a o potencia j a foi executado e conseq uentemente o comando return tamb em j a foi executado (ali as, este eou ltimo comando executado da func ao). A , como temos indicado que a vari avel 4

poty recebe potencia (y, b) no comando poty = potencia (y, b); , ent ao o valor que est a no acumulador e

colocado em poty. Mais uma vez, o uso potxy = potencia (x-y, a+b); faz com que expoente a+b e base x-y e executa o c odigo de potencia; no nal da execuc ao, a vari avel pot cont em o valor de (x y )a+b ; o comando return pot; coloca o valor que est a na vari avel pot da func a o potencia no acumulador. Depois que a func a o encontrou um return, o uxo do programa volta para o comando potxy = potencia (x-y, a+b); . Neste momento, o resultado da func a o est a no acumulador, pois o c odigo da func ao potencia j a foi executado e conseq uentemente o comando return tamb em j a foi executado (ali as, este eou ltimo comando executado da func ao). A , como temos indicado que a vari avel potxy recebe potencia (x-y, a+b) no comando potxy = potencia (x-y, a+b); , ent ao o valor que est a no acumulador e colocado em potxy. Voc e deve estar se perguntando: como coloco tudo isto em um programa em C? Veja o c odigo em C abaixo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

# include < stdio . h>

f l o a t potencia ( f l o a t base , i n t expoente ) { f l o a t pot ; i n t cont ; cont = 0 ; pot = 1 ; while ( cont < expoente ) { pot = pot base ; cont = cont + 1 ; } / no f i n a l pot cont e m base e l e v a d o a expoente / return pot ; } i n t main ( ) { f l o a t x , y , potx , poty , potxy , soma ; int a , b ; printf ( " Entre com dois reais x e y : " ) ; scanf ( " % f % f " , &x , &y ) ; printf ( " Entre com dois inteiros a >0 e b >0: " ) ; scanf ( " % d % d " , &a , &b ) ;

potx = potencia ( x , a ) ;

poty = potencia ( y , b ) ;

potxy = potencia ( xy , a+b ) ; soma = potx + poty + potxy ; printf ( " Resultado = % f \ n " , soma ) ; return 0 ; }

Note que antes do nome da func ao potencia foi colocado um oat . Este oat indica que a func ao vai jogar para 5

fora (devolver) um valor do tipo oat via return. De fato, observe que no comando return pot; , a vari avel pot guarda um valor real. A id eia de func ao no exerc cio anterior e fazer um subprograma de nome potencia que seja utilizado tr es vezes. Este subprograma deve ter entrada e sa da. Por exemplo, para calcular xa , a entrada do subprograma deve ser o real x e o inteiro a e a sa da deve ser o real xa . Em resumo, o uso de func o es facilita a construc a o de programas pois possibilita a reutilizac ao de partes de c odigo.

Exerc cios Recomendados


1. Considerando a func ao fatorial, que par ametros ela deve receber (incluindo os tipos)? E qual o tipo do valor de sa da (real ou inteiro?). 2. Considere uma func a o seno que calcula o valor do seno de um angulo x com precis ao epsilon. Que par ametros ela deve receber (incluindo os tipos)? E qual o tipo do valor de sa da dessa func ao(real ou inteiro?). 3. Escreva um programa que leia dois inteiros m e n, com m n, e calcula
C(m,n) = m! n!(m-n)!

Você também pode gostar