apresentaÇÃo: david anderson cardoso dantas curso de c - 2010 aula 04: funções maceió, maio de...

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

Upload: internet

Post on 18-Apr-2015

106 views

Category:

Documents


1 download

TRANSCRIPT

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

APRESENTAÇÃO:DAVID ANDERSON CARDOSO DANTAS

CURSO DE C - 2010

AULA 04: Funções

Maceió, Maio de 2010.

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

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

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

1. DEFINIÇÃO DE FUNÇÕES

3

GRANDES TAREFAS

TAREFASMENORES

DIVIDIR

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

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.

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

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.

TUDO EM C É FEITO ATRAVÉS DE FUNÇÕES!

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

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

end

MatlabC/C++

6

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

1. DEFINIÇÃO DE FUNÇÕES

/* programa que lê um numero e imprime seu fatorial */

#include <stdio.h>

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”).

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

2. PILHA DE EXECUÇÃO

8

/* programa que le um numero e imprime seu fatorial*/

#include <stdio.h>

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.

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

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 Locais Pilha de Execução

inicializaçãochamada 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

Por isso não é possível acessar as variáveis locais de fora da função em que elas foram definidas.

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

2. PILHA DE EXECUÇÃO

10

Análise Passo a Passo da Evolução do Programa

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

11PRAIA DO FRANCÊS

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

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;

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

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;

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

3.1. PASSANDO PONTEIROS PARA FUNÇÕES

14

/* funcao troca (versao ERRADA) */

#include <stdio.h>

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 <stdio.h>

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;}

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

15

3.1. PASSANDO PONTEIROS PARA FUNÇÕES

Análise Passo a Passo da Evolução do Programa

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

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;

elsereturn 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.

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

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.

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

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

# include

# define

# include <arquivo>

# include “arquivo”

#define PI 3.14159

float area (float r){

float a = PI * r * r;return a;}

#include <stdio.h>#include “arquivo.h”

int main ( void ){

……

return 0;}

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

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));

Estas definições com parâmetros recebem o nome de macros.

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

6. PRÉ-PROCESSADOR E MACROS

20

#include <stdio.h>

#define DIF(a,b) a – b

int main (void){

printf(" %d ", 4 * DIF(5,3));return 0;}

#include <stdio.h>

#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 ", 3 + 4 * 2);printf(" %d ", 4 * 5 - 3);

#define PROD(a,b) ((a) * (b))#define DIF(a,b) (a – b)

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

CURSO DE C - 2010

FIM DA AULA 04: Funções

APRESENTAÇÃO:DAVID ANDERSON CARDOSO DANTAS

Maceió, Maio de 2010.