A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C - 2010 AULA 04: Funções Maceió, Maio de 2010.

Apresentações semelhantes


Apresentação em tema: "APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C - 2010 AULA 04: Funções Maceió, Maio de 2010."— Transcrição da apresentação:

1 APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C AULA 04: Funções Maceió, Maio de 2010.

2 SUMÁRIO Definição de Funções Pilha de Execução Ponteiro de Variáveis Passando Ponteiros para Funções Recursividade Variáveis Estáticas dentro de Funções Pré-processador e Macros 2

3 1. DEFINIÇÃO DE FUNÇÕES 3 GRANDES TAREFAS TAREFAS MENORES

4 1. DEFINIÇÃO DE FUNÇÕES A criação de funções: 4 Evita a repetição de código Esconde detalhes de implementação do corpo principal do programa Procedimento repetido deve ser transformado numa função que será chamada várias vezes. Característica de programas bem estruturados pensado em termos de funções.

5 1. DEFINIÇÃO DE FUNÇÕES A criação de funções: 5 Evita a repetição de código Esconde detalhes de implementação do corpo principal do programa Procedimento repetido deve ser transformado numa função que será chamada várias vezes. Característica de programas bem estruturados pensado em termos de funções.

6 1. DEFINIÇÃO DE FUNÇÕES Forma Geral para Definir uma Função tipo_retornado nome_da_função ( lista de parâmetros... ) { corpo da função } /* Função para retorna o valor do fatorial */ int fatorial ( int n ) { int i; int f = 1; for (i = 1; i <= n; i++) { f *= i; //f = f*i } return f; } /* Função para imprimir o valor do fatorial */ function [f] = fatorial ( n ) f = 1; for i = 1:1:n f = f*i; end Matlab C/C++ 6

7 1. DEFINIÇÃO DE FUNÇÕES /* programa que lê um numero e imprime seu fatorial */ #include void fat (int n); /* Função principal */ int main ( void ) { int n; scanf("%d", &n); fat(n); return 0; } /* Função para imprimir o valor do fatorial */ void fat ( int n ) { int i; int f = 1; for (i = 1; i <= n; i++) f *= i; printf("Fatorial = %d\n", f); } 7 Exemplo 1 Duas funções: - main (principal) - fat Parâmetros são listados, com seus respectivos tipos, entre os parênteses. Quando não há parâmetros usa-se a palavra void. Uma função pode ter um valor de retorno associado. C exige que se coloque o protótipo da função antes de ser chamada. Inclusão do arquivo stdio.h (printf e scanf).

8 2. PILHA DE EXECUÇÃO 8 /* programa que le um numero e imprime seu fatorial*/ #include int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("Fatorial de %d = %d \n", n, r); return 0; } int fat (int n) { int f = 1.0; while (n != 0) { f *= n; n--; } return f; } No final da função fat, o parâmetro n tem valor igual a zero. No entanto, a saída do programa será: Fatorial de 5 = 120 Passagem por Valor Cada parâmetro funciona como variável local inicializada com o valor passado na chamada. Na chamada da função, o valor passado é atribuído ao parâmetro da função chamada. Assim, a variável n (parâmetro da função fat) é local e NÃO representa a variável n da função main.

9 2. PILHA DE EXECUÇÃO Por que isso acontece? 9 A EXECUÇÃO DO PROGRAMA FUNCIONA COMO MODELO DE PILHAMODELO DE PILHA a b c Variáveis LocaisPilha de Execução inicialização chamada da função Pilha de Execução durante a chamada da função saída da função Pilha de Execução na saída da função

10 2. PILHA DE EXECUÇÃO 10 Análise Passo a Passo da Evolução do Programa

11 11

12 3. PONTEIRO DE VARIÁVEIS Da mesma forma que declaramos variáveis para armazenar valores, podemos declarar variáveis (ponteiro) que, em vez de servirem para armazenar valores, servem para armazenar endereços de memória onde há variáveis armazenadas. 12 /* Variável inteiro */ int a; /* Variável Ponteiro p/ inteiro */ int *p; /* a recebe o valor 5 */ a = 5; /* p recebe o endereço de a (diz-se p aponta para a) */ p = &a; /*conteúdo de p recebe o valor 6 */ *p = 6;

13 3. PONTEIRO DE VARIÁVEIS 13 /* Função que imprime o valor 2 */ int main ( void ) { int a; int *p; p = &a; *p = 2; printf(" %d ", a); return 0; } Exemplo 2 /* Função que imprime o valor b */ int main ( void ) { int a, b, *p; a = 2; *p = 3; b = a + (*p); printf(" %d ", b); return 0; } De maneira análoga, é possível declarar ponteiros de outros tipos: /* Variável Ponteiro p/ float */ float *m; /* Variável Ponteiro p/ char */ char *s;

14 3.1. PASSANDO PONTEIROS PARA FUNÇÕES 14 /* funcao troca (versao ERRADA) */ #include void troca (int x, int y ) { int temp; temp = x; x = y; y = temp; } int main ( void ) { int a = 5, b = 7; troca(a, b); printf("%d %d \n", a, b); return 0; } /* funcao troca (versao CORRETA) */ #include void troca (int *px, int *py ) { int temp; temp = *px; *px = *py; *py = temp; } int main ( void ) { int a = 5, b = 7; troca(&a, &b); /* passamos os endereços das variáveis */ printf("%d %d \n", a, b); return 0; }

15 PASSANDO PONTEIROS PARA FUNÇÕES Análise Passo a Passo da Evolução do Programa

16 4. RECURSIVIDADE As funções podem ser chamadas recursivamente, isto é, dentro do corpo de uma função podemos chamar novamente a própria função. 16 /* Função recursiva para calculo do fatorial */ int fat (int n) { if (n==0) return 1; else return n*fat(n-1); } Diversas implementações ficam muito mais fáceis usando recursividade. Por outro lado, implementações não recursivas tendem a ser mais eficientes. Para cada chamada de uma função, recursiva ou não, os parâmetros e as variáveis locais são empilhados na pilha de execução. Assim, mesmo quando uma função é chamada recursivamente, cria-se um ambiente local para cada chamada.

17 5. VARIÁVEIS ESTÁTICAS DENTRO DE FUNÇÕES Ao contrário das variáveis locais, que existem apenas enquanto a função à qual elas pertencem estiver sendo executada, as estáticas, assim como as globais, continuam existindo mesmo antes ou depois de a função ser executada. 17 void imprime ( float a ) { static int n = 1; printf(" %f ", a); if ((n % 5) == 0) printf(" \n "); n++; } No entanto, uma variável estática declarada dentro de uma função só é visível dentro dessa função. Uma utilização importante de variáveis estáticas dentro de funções é quando se necessita recuperar o valor de uma variável atribuída na última vez que a função foi executada.

18 6. PRÉ-PROCESSADOR E MACROS Um código C, antes de ser compilado, passa por um pré-processador. O pré-processador de C reconhece determinadas diretivas e altera o código para, então, enviá-lo ao compilador. 18 #define PI float area (float r) { float a = PI * r * r; return a; } #include #include arquivo.h int main ( void ) { … return 0; }

19 6. PRÉ-PROCESSADOR E MACROS C permite ainda a utilização da diretiva de definição com parâmetros. É válido escrever, por exemplo: 19 #define MAX(a,b) ((a) > (b) ? (a) : (b)) assim, se após esta definição existir uma linha de código com o trecho: v = 4.5; c = MAX ( v, 3.0 ); o compilador verá: v = 4.5; c = ((v) > (4.5) ? (v) : (4.5));

20 6. PRÉ-PROCESSADOR E MACROS 20 #include #define DIF(a,b) a – b int main (void) { printf(" %d ", 4 * DIF(5,3)); return 0; } #include #define PROD(a,b) (a * b) int main (void) { printf(" %d ", PROD(3+4, 2)); return 0; } Definição das macros Logo, o correto seria: printf(" %d ", * 2);printf(" %d ", 4 * 5 - 3); #define PROD(a,b) ((a) * (b))#define DIF(a,b) (a – b)

21 CURSO DE C FIM DA AULA 04: Funções APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS Maceió, Maio de 2010.


Carregar ppt "APRESENTAÇÃO: DAVID ANDERSON CARDOSO DANTAS CURSO DE C - 2010 AULA 04: Funções Maceió, Maio de 2010."

Apresentações semelhantes


Anúncios Google