Você está na página 1de 6

Programao I (C) Universidade Metodista de Angola

Prof. Gilberto Cunha

Funes Definidas Pelo Programador So blocos de cdigo que executam uma tarefa especfica e podem ser nomeados e chamados dentro de um programa. Importncia: - Quando um determinado trecho de cdigo executado repetidamente em determinadas linhas do programa, pode-se criar uma funo evitando que esse trecho de cdigo seja escrito vrias vezes. Em substituio coloca-se a chamada funo.

Sintaxe de Definio: tipoDeRetornado nomeDafuno (tipo1 identificador1, ..., tipoN identificadorN ){ declarao variveis locais comandos; return valorDeRetorno; } Nota: - O nome de uma funo segue o estabelecido pelas regras e convenes de identificadores. - Se o tipo de retorno no for definido, o compilador assume o tipo int como valor de retorno da funo. - Uma funo pode ser chamada a partir de outras funes. - Uma funo pode chamar ela mesma (recursividade). - Uma funo deve realizar uma nica tarefa bem definida. - Quando se faz a chamada de uma funo, o nmero, o tipo e a sequncia dos argumentos devem coincidir com os parmetros presentes no cabealho da funo. Ex1: int funcao (char ch, char str[60], int x, int y, float n); // lista de parmetros int funcao (char ch, char str[ ], int x, int y, float n); ... funcao (@, Paulo, 2, 4, 12.6); // lista de argumentos funcao (ch, str, x, y, n); // com valores nas variveis Ex2: void mostra (int mat[LIN][COL]); ... int matriz[LIN][COL]={1,2,3,4,5,6}; mostra(matriz); Ex3: char* upcase(char palavra[46]){ // para retornar uma string char* resultado;
Pgina 1 de 6

Programao I (C) Universidade Metodista de Angola

Prof. Gilberto Cunha

... return resultado; } - Uma funo retorna apenas um nico valor e esse valor pode ser armazenado numa varivel ou utilizado como argumento numa outra funo. Ex: n = soma (2,4); printf(Soma = %d,soma(2,4));

- Se uma funo no retorna qualquer valor (similar a procedimento), o tipo de retorno deve ser definido como void. Ex: void imprime ( ){ ou void imprime (void){ ... ... } return ; } ... imprime ( ); // chamada da funo Exemplo34: Faa um programa que implemente uma funo soma, para somar dois nmeros inteiros. //FuncaoSoma1.c #include <stdio.h> #include <conio.h> int soma(int x, int y); int main(){ int x, y; printf("Digite os valores: "); scanf("%d %d",&x,&y); printf("SOMA = %d",soma(x,y)); getch(); return 0; } int soma(int x, int y){ int s; s = x + y; return s; } Exemplo35: //FuncaoSoma2.c #include <stdio.h> #include <conio.h> // inclui a biblioteca pr-definida da linguagem
Pgina 2 de 6

Programao I (C) Universidade Metodista de Angola

Prof. Gilberto Cunha

#include "funcoes.h" // inclui a biblioteca criada pelo programador int main(){ int x, y, res; printf("Digite os valores: "); scanf("%d %d",&x,&y); res = soma(x,y); printf("SOMA = %d",res); getch(); return 0; }

// funcoes.h int soma(int a, int b){ int s; s = a + b; return s; } Exemplo36: // Funcao.c #include <stdio.h> #include <conio.h> char* teste(char frase[46]); int main(){ char frase[46]= "olaaaaaaa"; printf("%s",teste(frase)); getch(); return 0; } char* teste(char frase[46]){ char *resultado; resultado = frase ; return resultado; } Recursividade: a capacidade que uma linguagem tem de permitir que uma funo possa chamar a ela mesma. A recursividade pode ser directa ou indirecta. Recursividade Directa: Quando uma funo chama ela mesma dentro do seu corpo. Recursividade Indirecta: Quando uma funo f chama uma outra funo g que, por sua vez volta a chamar a funo f.
Pgina 3 de 6

Programao I (C) Universidade Metodista de Angola

Prof. Gilberto Cunha

Regras: 1. O primeiro comando de uma funo recursiva deve ser sempre a implementao do critrio de paragem, ou seja, estabelecer-se a condio ou condies que faz com que a funo deixe de chamar-se a ela mesma. 2. Fazer-se a chamada recursiva da funo, sempre relativa a um subconjunto. Nota: Com a recursividade temos a vantagem de escrever um cdigo mais curto, mas em desvantagem perde-se na performance.

Exemplo37: Funo para calcular o factorial de um nmero qualquer. // FuncaoFactorial.c #include <stdio.h> #include <conio.h> unsigned long int factorial (int num); unsigned long int factorialRecursivo (int num); int main(){ int x; printf("Digite um numero: "); scanf("%d",&x); printf("\n %d! = %lu ",x,factorial(x)); printf("\n %d! = %lu ",x,factorialRecursivo(x)); getch(); return 0; } unsigned long int factorial (int num){ int i; unsigned long int fact= 1; for(i=2; i<=num; i++) fact= fact * i; return fact; } unsigned long int factorialRecursivo (int num){ if(num == 0) return 1; else
Pgina 4 de 6

Programao I (C) Universidade Metodista de Angola

Prof. Gilberto Cunha

return num * factorialRecursivo(num-1); } Funcionamento: - Exemplo: 0! = 1 3! = 3 x 2 x 1 = 6 1. Verifica se o valor passado funo zero, caso seja, a funo retorna 1. 2. Se o valor no for zero, o valor de factorialRecursivo(3) calculado aplicando a frmula: factorialRecursivo(3) = 3 x factorialRecursivo(2) factorialRecursivo(3) fica pendente at o clculo de factorialRecursivo(2) 3. Realiza o clculo: factorialRecursivo(2) = 2 x factorialRecursivo(1) factorialRecursivo(2) fica pendente at o clculo de factorialRecursivo(1) 4. Realiza o clculo: factorialRecursivo(1) = 1 x factorialRecursivo(0) O clculo de factorialRecursivo(0) termina as chamadas recursivas funo e retorna 1. factorialRecursivo(0) = 1 5. Desta forma realiza o clculo de factorialRecursivo(1): factorialRecursivo(1) = 1 x factorialRecursivo(0) = 1 x 1 = 1 6. Realiza o clculo de factorialRecursivo(2): factorialRecursivo(2) = 2 x factorialRecursivo(1) = 2 x 1 = 2 7. Finalmente realiza o clculo de factorialRecursivo(3): factorialRecursivo(3) = 3 x factorialRecursivo(2) = 3 x 2 = 6

Exemplo38: Funo para imprimir n nmeros de forma decrescente. Mtodo Interativo: // FuncaoDecrescente.c void decrescente (int num){ int i; for(i=num; i>=0; i--) printf(" %d ",i); } Mtodo Recursivo: void decrescenteRecursivo (int num){ if(num<0) return; printf(" %d ",num);
Pgina 5 de 6

Programao I (C) Universidade Metodista de Angola

Prof. Gilberto Cunha

decrescenteRecursivo(num-1); } Exemplo39: Funo para imprimir n nmeros de forma crescente. // FuncaoCrescente.c Mtodo Interativo: void crescente(int num){ int i; for(i=0; i<=num; i++) printf(" %d ",i); } Mtodo Recursivo: void crescenteRecursivo(int num){ if(num<0) return; crescenteRecursivo(num-1); printf(" %d ",num); } Obs: A funo crescenteRecursivo s executa o printf depois de ter executado na totalidade a chamada recursiva de crescenteRecursivo(num-1). TRABALHO: - (3 valores) Alterar a tela do jogo da velha.

Vetores e Matrizes Importncia: int num1, num2, num3,...numN; int num[tamanhoN]; Ex: Como armazenar 100 nmeros digitados?! um tipo de varivel composta (agregado homogneo), chamadas tambm de arranjos, array, etc, e que podem ser unidimensional (Vector) ou multidimensional (Matriz). Servem para armazenar um conjunto de valores de um mesmo tipo (inteiro, real, caractere, string), com um identificador em comum e que so acessados atravs de um ndice que indica a posio do valor a ser manipulado dentro do arranjo.

Pgina 6 de 6

Você também pode gostar