Universidade Federal do Espírito Santo Programação II Funções Professora: Norminda Luiza Funções O programa abaixo utiliza três funções: A função main( ), a função produto( ) e a função printf( ) que já está definida na biblioteca padrão de entrada e saída. #include <stdio.h> float produto(float fator1, float fator2){ return (fator1*fator2); } main ( ){ float saida; float coeficiente = 14.2; saida = produto(coeficiente, 67.23); printf ("Produto = %f\n", saida); } “warning” (cuidado) Funções Uma função é um bloco de código que funciona como uma unidade autônoma para cumprir uma tarefa particular no código do programa. Funções são as estruturas que permitem ao programador separar seus programas em blocos. • Podem ser utilizadas diversas vezes no código do programa • Geralmente consistem de chamadas a outras pequenas funções. • São concisas, permitindo que o programa fique mais legível, mais bem estruturado. Modelagem de função : tipo_de_retorno nome_da_função (lista_de_argumentos) { código_da_função } O nome_da_função é qualquer nome que tenha significado. A lista_de_argumentos contém um número finito qualquer de argumentos separados por vírgulas. Cada argumento é dado indicando o tipo do argumento e o nome dele. Tipo de retorno, que é o tipo do valor retornado: void, char, int, long, double. Funções O comando return Para retornar um valor de uma função utiliza-se o comando return. Sintaxe: return valor_de_retorno; ou simplesmente, return; • O valor de retorno fornecido tem que ser, pelo menos, compatível com o tipo de retorno declarado para a função. • Uma função pode ter mais de uma declaração return, mas a função é terminada quando o programa chega à primeira declaração return. Exemplo: Faça um programa que leia um número inteiro e verifique se é par ou ímpar (para isso, use uma função). Funções #include <stdio.h> int EPar (int a) { if (a%2) // Verifica se a e divisivel por dois return 0; else return 1; } main ( ){ int num; printf ("Entre com numero: "); scanf ("%d",&num); if (EPar(num)) printf ("\n\nO numero e par.\n"); else printf ("\n\nO numero e impar.\n"); system("pause"); } int num; if (num!=0) .... if (num==0) .... equivale a int num; if (num) .... if (!num) .... Funções Protótipos de funções Protótipos são apenas declarações de funções. Sintaxe: tipo_de_retorno nome_da_função (declaração_de_argumentos); • Muitas vezes o programa está espalhado por vários arquivos. Ou seja, são usadas funções em um arquivo que serão compiladas em outro arquivo. #include <stdio.h> int EPar (int a); // protótipo da função main ( ){ int num; printf ("Entre com numero: "); scanf ("%d",&num); if (EPar(num)) printf ("\n\nO numero e par.\n"); else printf ("\n\nO numero e impar.\n"); system("pause"); } int EPar (int a) { if (a%2) // Verifica se a e divisivel por dois return 0; else return 1; } Funções Tipo Void Void quer dizer vazio. O tipo void permite fazer funções que não retornam nada e funções que não têm parâmetros! O protótipo de uma função que não retorna nada será: void nome_da_função (declaração_de_parâmetros); Neste caso, não existe valor de retorno na declaração return, portanto ele não é necessário na função. Para funções que não têm parâmetros: tipo_de_retorno nome_da_função (void); Se a função não tem parâmetros e não retornam nada: void nome_da_função (void); Funções #include <stdio.h> void Mensagem (void); main (){ Mensagem(); printf ("\tDiga de novo:\n"); Mensagem(); } void Mensagem (void) { printf ("Ola! Eu estou vivo.\n"); } O compilador acha que a função main() deve retornar um inteiro quando nada é especificado. Isto pode ser interessante quando se precisa que o sistema operacional receba um valor de retorno da função main( ). Convenção: se o programa retornar zero, significa que ele terminou normalmente, e, se o programa retornar um valor diferente de zero, significa que o programa teve um término anormal. Funções Funções em arquivo cabeçalho. Não possuem os códigos completos das funções. Eles só contêm protótipos de funções, o que é suficiente. O compilador lê estes protótipos e gera o código correto. O corpo das funções cujos protótipos estão no arquivo-cabeçalho, no caso das funções do próprio C, já estão compiladas e normalmente são incluídas no programa no instante da "linkagem". Linkagem: é o instante em que todas as referências a funções cujos códigos não estão nos atuais arquivos fontes são resolvidas, buscando este código nos arquivos de bibliotecas. É possível criar e incluir arquivos cabeçalho definidos pelo usuário. Funções Parâmetros Formais Quando uma função utiliza argumentos, então ela deve declarar as variáveis que aceitaram os valores dos argumentos, sendo essas variáveis os parâmetros formais. #include <stdio.h> int elevado(int base, int expoente) int elevado(); main(){ int b,e; printf("Digite a base e expoente x,y : "); scanf("%d,%d",&b,&e); printf("valor=%d\n",elevado(b,e)); system("pause"); return 0; } int elevado(base,expoente) int base,expoente; { int i; if (expoente<0) return; i=1; for (;expoente;expoente--){ i=base*i; } return i; } Funções 1. Chamada por Valor O valor de um argumento é copiado para o parâmetro formal da função, portanto as alterações no processamento não alteram as variáveis. Todos os exemplos vistos até agora. 2. Chamada por Referência Permite a alteração do valor de uma variável. Para isso é necessário a passagem do endereço do argumento para a função. Ex: void troca(); main() { int x=10,y=20; troca(&x,&y); printf("x=%d y=%d\n",x,y); } void troca(a,b) int *a,*b; { int temp; temp=*a; *a=*b; *b=temp; } Funções Classe de Variáveis Uma função pode chamar outras funções, mas o código que compreende o corpo de uma função (bloco entre {}) está escondido do resto do programa, ele não pode afetar nem ser afetado por outras partes do programa, a não ser que o código use variáveis globais. Como já vimos anteriormente, existem três classes básicas de variáveis: locais, estáticas e globais. 1. Variáveis locais As variáveis que são declaradas dentro de uma função são chamadas de locais. Na realidade toda variável declarada entre um bloco { } podem ser referenciadas apenas dentro deste bloco. Elas existem apenas durante a execução do bloco de código no qual estão declaradas. Todos os exemplos usados até aqui. 2. Variáveis Globais São conhecidas por todo programa e podem ser usadas em qualquer parte do código. Permanecem com seu valor durante toda execução do programa. Deve ser declarada fora de qualquer função e até mesmo antes da declaração da função main. Fica numa região fixa da memória própria para esse fim. Funções #include <stdio.h> Exemplo de variáveis globais e locais void func1(),func2(); int cont; main() { cont=100; func1(); } void func1(){ int temp; temp=cont; func2(); printf("cont é = %d",cont); } void func2(){ int cont; for(cont=1;cont<10;cont++) printf("."); } 3. Variáveis Estáticas Funcionam de forma parecida com as variáveis globais, conservando o valor durante a execução de diferentes funções do programa. No entanto só são reconhecidas na função onde estão declaradas.