Вы находитесь на странице: 1из 29

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

AULA 4

Funes, Ponteiros e
Recursividade
Miter Mayer O Ferreira
mitmaya@gmail.com

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Definio de funes

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

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Definio de funes

Para definir uma funo usamos a sintaxe:


tipo_retornado nome_da_funo (lista de parmetros...)
{
corpo da funo
}

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Fatorial v1 a funo fat(int n)


faz a impresso do valor.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Definio de funes

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Fatorial v2 Agora a funo


main(), faz a impresso do
valor retornado por fat(int n).

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Pilha de execuo

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Pilha de execuo

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Fatorial v3 Observe que o


valor n na funo main(), no
alterado em fat(), mesmo
sendo nomes iguais para
variveis.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Pilha de execuo

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Pilha de execuo

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Pilha de execuo

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Ponteiros

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Ponteiros

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;

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Ponteiros

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Ponteiros

Um ponteiro aponta
para uma
determinada
varivel.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

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

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Passando ponteiros para funes


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

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Ponteiros
/* 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 endereos das variveis */
printf("%d %d \n", a, b);
return 0;
}

Ensino Universitrio

Cachoeiro de Itapemirim - ES

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Recursividade
Implementaes recursivas devem ser pensadas
considerando-se a definio recursiva do problema que
desejamos resolver.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

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.

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Variveis estticas dentro de funes**


void imprime ( float a )
{
static int n = 1;
printf(" %f ", a);
if ((n % 5) == 0) printf(" \n ");
n++;
}

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Pr-processador e macros**
Um cdigo antes de ser compilado, passa por um prprocessador que reconhece determinadas diretivas e
altera o mesmo para ento compilar;
Ex: #include <cabealho> - a diretiva substituda pelo
contedo do arquivo cabealho;
#define PI 3.14159
float area (float r)
{
float a = PI * r * r;
return a;
}

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

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

Ensino Universitrio

ESTRUTURA DE DADOS I
Aula 4 Funes, Ponteiros e Recursividade

Cachoeiro de Itapemirim - ES

Pr-processador e macros**
#include <stdio.h>
#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);

Вам также может понравиться