Você está na página 1de 8

Funo es

At ento, tivemos oportunidade de trabalhar com vrias funes predefinidas, isto , funes que j esto prontas para serem usadas. Apesar de termos vrias funes disponveis para utilizao, muitas vezes nos perguntamos: por que no implementaram esta ou outra funo? A resposta simples: todas as linguagens de programao permitem que voc crie suas prprias funes.

1. Conceito
Funo um trecho de um algoritmo independente com um objetivo especfico, simplificando o entendimento do algoritmo e proporcionando ao mesmo menores chances de erro e de complexidade. Funes so estruturas que permitem ao usurio separar seus programas em blocos. Se no as tivssemos, os programas teriam que ser curtos e de pequena complexidade. Para fazermos programas grandes e complexos temos de constru-los bloco a bloco.

2. Vantagens
Algoritmos so desenvolvidos por pessoas, verificados por outras pessoas e processados por uma mquina. As funes, atravs da passagem de parmetro e atravs do seu nome, permitem que sejam retornados valores rotina chamadora (geralmente o algoritmo principal) e dessa forma esses valores podero ser impressos ou atribudos a uma varivel ou podem servir em operaes aritmticas, entre outras. Os principais objetivos de uma funo so: Dividir e estruturar um algoritmo em partes logicamente coerentes; Facilidade em testar os trechos separado; O programador pode criar sua prpria biblioteca de funes, tornando sua

programao mais eficiente, uma vez que poder fazer uso de funes por ele escritas em vrios outros algoritmos com a vantagem de j terem sido testadas. Maior legibilidade de um algoritmo; Evitar que uma certa sequncia de comandos necessria em vrios locais de

um algoritmo tenha de ser escrita repetidamente nestes locais, diminuindo assim tambm o cdigo fonte. Tudo isso justifica o uso de funes em nossos algoritmos, que no futuro se tornaro cdigos em uma determinada linguagem.

3. Chamadas de Funo
Quando uma funo chamada, o fluxo de controle desviado para a funo, no momento em que ela ativada no algoritmo principal. Ao terminar a execuo dos comandos da funo, o fluxo de controle retorna ao comando seguinte aquele onde ela foi ativada.
#include <stdio.h> int quadrado(int num) { return num * num; } int main() { int valor; valor = quadrado(2); printf(Valor: %d, valor); return 0; }

O que acontece neste cdigo o seguinte:


int main() { int valor; valor = quadrado(2); printf(Valor: valor); return 0; %d, int quadrado(int num) { return num * num; }

4. Declarao de Funes
Uma funo, para que possa ser utilizada em um algoritmo, deve ser definida com suas particularidades, da mesma forma como j aprendemos a definir variveis. Uma funo sempre possui um nome, tipo de retorno e zero ou mais parmetros.
tipo_de_retorno nome_funo (parmetros);

O tipo_de_retorno o tipo de varivel que a funo vai retornar. A declarao de parmetros uma lista com a seguinte forma geral:
tipo nome1, tipo nome2, ... , tipo nomeN

Repare que o tipo deve ser especificado para cada uma das N variveis de entrada. na declarao de parmetros que informamos ao compilador quais sero as entradas da funo (assim como informamos a sada no tipo-de-retorno). O corpo da funo a sua alma. nele que as entradas so processadas, sadas so geradas ou outras coisas so feitas.

Exemplos: Funo sem retorno e sem parmetros:


void mostra_hora();

Funo sem retorno e com parmetros:


void mostra_hora(char formato[]);

Funo com retorno e sem parmetros:


char *obtem_hora();

5. Retornando Dados
Digamos que uma funo est sendo executada. Quando se chega a uma declarao return a funo encerrada imediatamente e, se o valor de retorno informado, a funo retorna este valor. importante lembrar que o valor de retorno fornecido tem que ser compatvel com o tipo de retorno declarado para a funo. Uma funo pode ter mais de uma declarao return. Isto se torna claro quando pensamos que a funo terminada quando o programa chega primeira declarao return. Abaixo esto dois exemplos de uso do return:
#include <stdio.h> int quadrado (int a) { return a * a; } int main () { int num; printf("Entre com um numero: "); scanf("%d",&num); num=quadrado(num); printf("O seu quadrado vale: %d\n",num); return 0; }

#include <stdio.h> int EhPar (int a) { if (a%2) { return 0; } else { /* Verifica se a e divisivel por dois */ /* Retorna 0 se nao for divisivel */

return 1; /* Retorna 1 se for divisivel */ } } int main () { int num; printf ("Entre com numero: "); scanf ("%d",&num); if (EhPar(num)) { printf ("O numero e par.\n"); } else { printf ("O numero e impar.\n"); } return 0; }

importante notar que, como as funes retornam valores, podemos aproveit-los para fazer atribuies, ou mesmo para que estes valores participem de expresses. Fato importante: se uma funo retorna um valor, voc no precisa aproveitar este valor. Se voc no fizer nada com o valor de retorno de uma funo ele ser descartado. Por exemplo, a funo printf() retorna um inteiro que ns nunca usamos para nada. Ele descartado. Exerccio: Escreva a funo 'EhDivisivel(int a, int b)' (tome como base EhPar(int a)). A funo dever retornar 1 se o resto da diviso de a por b for zero. Caso contrrio, a funo dever retornar zero.

6. Passagem de Parmetros
Como as funes tem um proposito definido, na maioria das vezes necessrio que sejam repassadas informaes do programa para que as funes realizem o seu processamento. Este envio de informaes chamado de Passagem de Parmetros. Exemplos: Chamando a funo que calcula a raiz quadrada de um nmero:
Valor = raiz_quadrada(49);

O nmero 49 o parmetro passado para a funo que realiza o clculo da raiz quadrada. Passagem de Parmetros por Valor Quando chamamos uma funo passando seus parmetros formais, os valores dos destes so copiados para aqueles declarados na funo. Isto quer dizer que no so alterados os valores que os parmetros tm fora da funo. Este tipo de chamada de funo

denominado chamada por valor. Isto ocorre porque so passados para a funo apenas os valores dos parmetros e no os prprios parmetros. Veja o exemplo abaixo:
#include <stdio.h> float quadrado(float num); void main () { float num, q; printf ("Entre com um numero: "); scanf ("%f",&num); q=quadrado(num); printf ("O numero original e: %f\n",num); printf ("O seu quadrado vale: %f\n",1); } float quadrado(float num) { num = num*num; return num; }

No exemplo acima o parmetro formal num da funo sqr() sofre alteraes dentro da funo, mas a varivel num da funo main() permanece inalterada: uma chamada por valor. Passagem de Parmetros por Referncia Outro tipo de passagem de parmetros ocorre quando alteraes nos parmetros formais alteram os valores dos parmetros que foram passados para a funo. Este tipo de chamada tem o nome de "chamada por referncia". Este nome vem do fato de que, neste tipo de chamada, no se passa para a funo os valores das variveis, mas sim suas referncias (a funo usa as referncias para alterar os valores das variveis fora da funo). Quando queremos alterar as variveis que so passadas para uma funo, ns podemos declarar seus parmetros formais como sendo ponteiros. Os ponteiros so a "referncia" que precisamos para poder alterar a varivel fora da funo. O nico inconveniente que, quando usarmos a funo, teremos de adicionar um & na frente das variveis que estivermos passando para a funo. Veja um exemplo:
#include <stdio.h> void troca (int *a,int *b); void main (void) { int num1,num2; num1=100; num2=200; troca(&num1,&num2); printf ("Eles agora valem %d } %d\n",num1,num2);

void troca(int *a,int *b) { int temp; temp=*a; *a=*b; *b=temp; }

No muito difcil. O que est acontecendo que passamos para a funo Swap o endereo das variveis num1 e num2. Estes endereos so copiados nos ponteiros a e b. Atravs do operador * estamos acessando o contedo apontado pelos ponteiros e modificando-o. Mas, quem este contedo? Nada mais que os valores armazenados em num1 e num2, que, portanto, esto sendo modificados! Exerccio: Escreva uma funo que receba duas variveis inteiras e "zere" o valor das mesmas.

7. Escopo de Variveis
O escopo de uma varivel o alcance que ela tem, de onde pode ser acessada. Este escopo pode ser global ou local. H trs lugares nos quais podemos declarar variveis. O primeiro fora de todas as funes do programa. Estas variveis so chamadas variveis globais e podem ser usadas a partir de qualquer lugar no programa. Pode-se dizer que, como elas esto fora de todas as funes, todas as funes as veem. O segundo lugar no qual se pode declarar variveis no incio de um bloco de cdigo. Estas variveis so chamadas locais e s tm validade dentro do bloco no qual so declaradas, isto , s a funo qual ela pertence sabe da existncia desta varivel, dentro do bloco no qual foram declaradas. O terceiro lugar onde se pode declarar variveis na lista de parmetros de uma funo. Mais uma vez, apesar de estas variveis receberem valores externos, elas so conhecidas apenas pela funo onde so declaradas. Exemplo:
#include <stdio.h> int contador; int func1(int j) { ... } int main() { char condicao; int i;

for (i=0; ...) { float f2; ... func1(i); } ... Return 0; }

/* Bloco do for */

A varivel contador uma varivel global, e acessvel de qualquer parte do programa. As variveis condicao e i, s existem dentro de main(), isto so variveis locais de main. A varivel float f2 um exemplo de uma varivel de bloco, isto , ela somente conhecida dentro do bloco do for, pertencente funo main. A varivel inteira j um exemplo de declarao na lista de parmetros de uma funo (a funo func1). As regras que regem onde uma varivel vlida chamam-se regras de escopo da varivel. H mais dois detalhes que devem ser ressaltados. Duas variveis globais no podem ter o mesmo nome. O mesmo vale para duas variveis locais de uma mesma funo. J duas variveis locais, de funes diferentes, podem ter o mesmo nome sem perigo algum de conflito. Exerccio: Estude o seguinte programa e aponte o valor de cada varivel sempre que solicitado:
#include <stdio.h> int num; int func(int a, int b) { a = (a+b)/2; num -= a; return a; } int main() { int first = 0, sec = 50; num = 10; num += func(first, sec); /* Qual e o valor de num, first e sec */ /* antes e depois da atribuicao? printf("\n\nnum = %d\tfirst = %d\tsec = %d",num, first, sec); } */ /* Qual o valor de a apos a atribuicao? */

Exerccios: 1) Faa uma funo que receba dois nmeros positivos por parmetro e retorne a soma dos N nmeros inteiros existentes entre eles. 2) Faa uma funo que transforme e mostre segundos em horas, minutos e segundos. 3) Faa uma funo que receba um nmero inteiro e verifique se o mesmo um nmero primo, retornando um valor booleano, sendo true em caso afirmativo e false caso contrrio. 4) Escreva uma funo que recebe as 3 notas de um aluno por parmetro e uma letra. Se a letra for A, a funo calcula a mdia aritmtica das notas do aluno, se for P, a sua mdia ponderada (pesos: 5, 3 e 2). A funo deve retornar a mdia obtida. 5) Escreva uma funo que receba como parmetro um texto e retorne o nmero de palavras desse texto. As palavras do texto so separadas por espao em branco, podendo haver um ou mais espaos entre as palavras.

Você também pode gostar