of 29 /29
AULA 4 ESTRUTURA DE DADOS I Aula 4 Funções, Ponteiros e Recursividade Cachoeiro de Itapemirim - ES Ensino Universitário Funções, Ponteiros e Recursividade Miter Mayer O Ferreira [email protected]

Estrutura de Dados - Aula 4 - Funcoes Ponteiros e Recursividade

  • Author
    mitmaya

  • View
    10

  • Download
    3

Embed Size (px)

DESCRIPTION

Estrutura de Dados Aula 4 - Funções e Recursividade

Text of Estrutura de Dados - Aula 4 - Funcoes Ponteiros e Recursividade

  • AULA 4

    ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Funes, Ponteiros e

    Recursividade

    Miter Mayer O Ferreira [email protected]

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Funes dividem grandes tarefas de computao em

    tarefas menores;

    Evitam a repetio de cdigo;

    Programas bem estruturados devem ser pensados em

    termos de funes;

    Os exemplos anteriores utilizam as funes da biblioteca

    padro para realizar entrada e sada. Ex: printf e scanf

    (biblioteca

    Definio de funes

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Para definir uma funo usamos a sintaxe:

    tipo_retornado nome_da_funo (lista de parmetros...)

    {

    corpo da funo

    }

    Definio de funes

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Fatorial v1 a funo fat(int n)

    faz a impresso do valor.

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Observe que o prottipo da funo declarado antes da

    funo ser chamada;

    O prottipo de uma funo consiste na repetio da linha

    de sua definio:

    void fat (int n); /* obs: existe ; no prottipo */

    O prottipo da funo necessrio para que o compilador verifique os tipos dos parmetros na chamada da funo.

    Definio de funes

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Fatorial v2 Agora a funo

    main(), faz a impresso do

    valor retornado por fat(int n).

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Funes so independentes entre si; Escopo de Variveis locais: definidas dentro do

    corpo de um a funo no existem fora da funo;

    Quando uma funo executada, as variveis locais so criadas, e, quando a execuo da funo termina, estas variveis deixam de existir.

    Pilha de execuo

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Funes so independentes entre si; Escopo de Variveis locais: definidas dentro do

    corpo de um a funo no existem fora da funo;

    Quando uma funo executada, as variveis locais so criadas, e, quando a execuo da funo termina, estas variveis deixam de existir.

    Pilha de execuo

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Fatorial v3 Observe que o

    valor n na funo main(), no

    alterado em fat(), mesmo

    sendo nomes iguais para

    variveis.

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    O modelo de pilha funciona da seguinte maneira: variveis local de uma funo so colocada na pilha de execuo. Quando uma uma funo chamada, os parmetros so copiados para a pilha e so tratados como se fossem variveis locais dessa nova funo. Quando ela termina, sua pilha liberada.

    Por isso no acessamos variveis locais, fora de seu escopo.

    Pilha de execuo

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Pilha de execuo

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Pilha de execuo

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Permitir o armazenamento e a manipulao de valores de endereos de memria;

    Para cada tipo existente, h um tipo ponteiro que pode armazenar endereos de memria onde existem valores do tipo correspondente armazenados.

    Ex: int a; reserva-se um espao na memria de 4 bytes para armazenar a variavl a.

    Ponteiros

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Ponteiros armazenam endereos de memria onde variveis esto armazenadas;

    Para declarar usamos a mesma palavra do tipo com os nomes das variveis precedidas pelo caractere *;

    EX: int *p; A varivel p agora, armazena o endereo de memria de p, e no o valor de p;

    Ex: float *m;

    Ex: char *s;

    Ponteiros

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Operadores unrios utilizados:

    & (endereo de) - aplicado a variveis, resulta no endereo da posio da memria reservada para a varivel;

    * (contedo de) - aplicado a variveis do tipo ponteiro, acessa o contedo do endereo de memria armazenado pela varivel ponteiro.

    Ponteiros

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Ponteiros

    As variveis, a e p,

    armazenam valores

    "lixo", pois no foram

    inicializadas.

    A varivel a recebe,

    indiretamente, o valor 6.

    a equivalente a *p,

    pois p armazena o

    endereo de a.

    Dizemos que p aponta

    para a, da o nome

    ponteiro.

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Ponteiros

    Um ponteiro aponta

    para uma

    determinada

    varivel.

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    int main ( void )

    {

    int a;

    int *p;

    p = &a;

    *p = 2;

    printf(" %d ", a);

    return;

    }

    O valor 2 impresso.

    int main ( void )

    {

    int a, b, *p;

    a = 2;

    *p = 3;

    b = a + (*p);

    printf(" %d ", b);

    return 0;

    }

    Erro, p ainda no foi inicializada.

    Ponteiros

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Passando ponteiros para funes /* 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;

    }

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Ponteiros /* 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 endereos das variveis */

    printf("%d %d \n", a, b);

    return 0;

    }

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Recursividade

    Funes podem ser chamadas recursivamente, isto

    , uma funo pode chamar novamente a prpria

    funo;

    Recurso direta a funo A chama a prpria

    funo A;

    Recurso indireta a funo A chama uma funo

    B que, por sua vez, chama A.

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Recursividade

    Diversas implementaes ficam muito mais fceis

    usando recursividade, por outro lado, implementaes

    no recursivas tendem a ser mais eficientes;

    A cada chamada de uma funo, recursiva ou no,

    parmetros e variveis locais so colocados na pilha de

    execuo, assim cria-se um ambiente local para cada

    chamada a funo;

    As variveis locais de chamadas recursivas so

    independentes entre si, como se fossem funes

    diferentes.

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Recursividade

    Implementaes recursivas devem ser pensadas

    considerando-se a definio recursiva do problema que

    desejamos resolver.

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Variveis estticas dentro de funes**

    So armazenadas numa rea de memria esttica que

    existe enquanto o programa est sendo executado;

    Continuam existindo mesmo antes ou depois de a

    funo ser executada;

    S so visveis dentro dessa funo;

    Usadas quando se necessita recuperar o valor de uma

    varivel atribuda na ltima vez que a funo foi

    executada;

    So inicializadas automaticamente com zero, quando

    no declaradas explicitamente.

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Variveis estticas dentro de funes**

    void imprime ( float a )

    {

    static int n = 1;

    printf(" %f ", a);

    if ((n % 5) == 0) printf(" \n ");

    n++;

    }

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Pr-processador e macros**

    Um cdigo antes de ser compilado, passa por um pr-

    processador que reconhece determinadas diretivas e

    altera o mesmo para ento compilar;

    Ex: #include - a diretiva substituda pelo

    contedo do arquivo cabealho;

    #define PI 3.14159

    float area (float r)

    {

    float a = PI * r * r;

    return a;

    }

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Pr-processador e macros**

    #define MAX(a,b) ((a) > (b) ? (a) : (b))

    assim, se aps esta definio existir uma linha de cdigo

    com o trecho:

    v = 4.5;

    c = MAX ( v, 3.0 );

    o compilador ver:

    v = 4.5;

    c = ((v) > (4.5) ? (v) : (4.5));

  • ESTRUTURA DE DADOS I

    Aula 4 Funes, Ponteiros e Recursividade

    Cachoeiro de Itapemirim - ES

    Ensino Universitrio

    Pr-processador e macros**

    #include

    #define DIF(a,b) a - b

    int main (void)

    {

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

    return 0;

    }

    o resultado impresso 17 e no 8;

    Fazendo a substituio da macro) est escrito:

    printf(" %d ", 4 * 5 - 3);