Author
mitmaya
View
10
Download
3
Embed Size (px)
DESCRIPTION
Estrutura de Dados Aula 4 - Funções 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);