Anda di halaman 1dari 30

Algoritmos e Estruturas de Dados I

01/2013

Passagem de Parmetros
e
Estruturas

Pedro O.S. Vaz de Melo


A passagem de parmetros

Toda funo define um processamento a ser realizado.

Este processamento depende dos valores dos parmetros


da funo.

Assim, para usar uma funo, um programa precisa


fornecer a ela os parmetros adequados. Exemplo:

Para calcular o seno de 30, escrevemos: sin(pi/6);

Para calcular o valor absoluto de a-b, escrevemos: abs(a-b);

Para calcular o mdc de 12 e 8, escrevemos: mdc(12,8);

2
A passagem de parmetros

O mecanismo de informar os valores a serem processados


pela funo chama-se passagem de parmetros.

A Linguagem C define duas categorias de passagem de


parmetros: passagem por valor e passagem por
endereo (ou passagem por referncia).

Normalmente, a passagem de parmetros a uma funo


por valor.

Mas, como os parmetros de uma funo so variveis


locais, alguns aspectos devem ser observados.

3
Passagem por valor

Considere o exemplo abaixo:

O que este programa ir exibir? Valores recebidos ... 1, 2 e 3


Valores alterados ... 2, 3 e 4
Valores finais ......... 1, 2 e 3
4
Passagem por valor

Observe que os valores das variveis a, b e c no foram


modificados na funo alterar. Por qu?

O tipo de passagem de parmetros utilizado por valor.


Ou seja, so feitas apenas cpias dos valores das
variveis a, b, e c nas variveis x, y e z.

Escopo: funo main Escopo: funo alterar

x++ 2 Apenas os
a 1 x 1 contedos
de x, y e z
b 2 y 2 y++ 3 so alterados.

c 3 z 3 z++ 4
5
Passagem por referncia

Mas, e se quisermos que a funo modifique os valores


das variveis a, b e c passadas a ela como parmetros?

Neste caso, em vez de passar para a funo os valores


destas variveis, preciso passar os seus endereos.
Como assim?

Considere, por exemplo, que as variveis a, b e c


correspondem, respectivamente, aos endereos
(hexadecimais) F000, F010 e F020.

6
Passagem por referncia

Ou seja:
Endereo Contedo Varivel

F000 1 a

F010 2 b

F020 3 c

Sabemos, portanto, que:


&a = F000 (endereo de a);
&b = F010 (endereo de b);
&c = F020 (endereo de c);
a = 1, b = 2, c = 3 (valores das variveis).

7
Passagem por referncia

Considere uma varivel declarada como:

int *x;

x um ponteiro para int, ou seja, x uma varivel que


armazena o endereo de uma varivel do tipo int.

Considere agora que:

Neste caso, x armazena o valor F000.


x = &a;

Define-se *x, como sendo o valor contido na posio de


memria apontada por x. Ou seja, *x vale 1.
8
Passagem por referncia

Considere agora o exemplo anterior reescrito como:

O que este programa ir exibir?


Valores recebidos ... 1, 2 e 3
Valores alterados ... 2, 3 e 4
Valores finais ......... 2, 3 e 4
9
Passagem por referncia

Observe agora que os valores das variveis a, b e c foram


modificados na funo alterar. Por qu?

O tipo de passagem de parmetros utilizado por


referncia. Ou seja, so passados os endereos das
variveis a, b, e c para os ponteiros x, y e z.

Escopo: funo main Escopo: funo alterar

a 1 F000 x F000 *x++ a++ 2


Altera os
contedos
b 2 F010 y F010 *y++ b++ 3 de a, b e c!

c 3 F020 z F020 *z++ c++ 4


10
Passagem por referncia
Ateno!
Considere que o endereo de x FFF1.
int x = 1;
int *a;
a = &x;

Neste caso, teremos:

a = FFF1 (endereo de x)
*a = 1 (pois *a = x = 1)
Logo:
&(*a) = &x = FFF1 = a
Portanto:
&(*a) a
11
Problema 1

Implementar uma calculadora para fazer operaes sobre


fraes (ex: 1/3, 5/13 etc). A calculadora deve ser capaz
de realizar as seguintes operaes:


somar

dividir

subtrair

multiplicar

simplificar

12
Anlise do programa

13
Anlise do programa

confuso e com muitos parmetros!

14
Anlise do programa

Define um novo tipo de


dados. O tipo frac!

O novo tipo pode ser


usado nos parmetros
das funes

15
Definio de novos tipos de dados

Se cada frao compreende dois inteiros, como possvel


fazer uma funo para somar duas fraes passando
apenas dois parmetros?

Isto possvel porque a linguagem C permite a definio


de novos tipos de dados com base nos tipos primitivos:
char, int, float e double.

Estes novos tipos de dados, formados a partir dos tipos


primitivos so chamados de tipos estruturados.

16
Definio de novos tipos de dados

Uma varivel de um determinado tipo estruturado definido


pelo usurio comumente chamada de uma estrutura.

Uma estrutura agrupa vrias variveis de diversos tipos


em uma s varivel.

Para criar uma estrutura usa-se o comando struct:

struct nome_da_estrutura
{
tipo_1 variavel_1; As variveis que compem
a estrutura so chamadas
... de campos da estrutura.
tipo_n variavel_n;
};
17
Definio de novos tipos de dados

Exemplos:

struct ponto struct cilindro


{ {
float coord_x; float altura;
float coord_y; struct circulo base;
}; };

struct circulo
{ A declarao de variveis de um
float raio; tipo estruturado (estruturas) feita
struct ponto centro; da mesma forma que para um tipo
}; simples.
18
Definio de novos tipos de dados

Para se acessar os campos de uma estrutura, basta


separar o nome da varivel pelo smbolo ponto ( . ).

Para os exemplos anteriores:

struct ponto struct cilindro


{ {
float coord_x; float altura;
float coord_y; struct circulo base;
}; };

struct circulo struct cilindro d;


{ d.altura = 3.0;
float raio; d.base.raio = 5.5;
struct ponto centro; d.base.centro.coord_x = 1.2;
}; d.base.centro.coord_y = 3.8;
19
O comando typedef

O Comando typedef permite ao programador definir um


novo nome para um determinado tipo.

Sua forma geral :

typedef nome_antigo nome_novo;

Exemplo:
Dando o nome inteiro para o tipo int:

typedef int inteiro;

inteiro num;

20
O comando typedef

O comando typedef tambm pode ser utilizado para dar
nome a tipos complexos como estruturas.


Exemplos:

typedef struct tipo_endereco typedef struct frac


{ {
char rua[50]; int num;
int numero; int den;
char bairro[20]; } frac;
char cidade[30];
char sigla_estado[3];
long int CEP;
} TEndereco;
Exemplo do programa p22.c

21
O comando typedef
Observao:
Utilizando-se o comando struct juntamente com o
comando typedef, pode-se dispensar o uso da palavra
struct na declarao da varivel.

Exemplos: typedef struct circulo


{
float raio;
typedef struct ponto ponto centro;
{ } circulo;
float x;
float y;
} ponto; typedef struct cilindro
{
float altura;
circulo base;
} cilindro;
22
Estruturas como parmetros de funes

Funciona como qualquer outro tipo de varivel


typedef struct ponto
{
float x;
float y;
} ponto;

float distancia_pontos(ponto p1, ponto p2) {


float parte1 = pow(p1.x - p2.x,2);
float parte2 = pow(p1.y - p2.y,2);
return sqrt(parte1 + parte2);
}

void main() {
ponto u, v;
scanf("%f %f %f %f", &u.x, &u.y, &v.x, &v.y);
printf("\n %f", distancia_pontos(u,v));
}
23
Estruturas como parmetros de funes

E como fao para passar estruturas por referncia?

void le_coordenada(ponto *p1) {


float x, y;
printf("Digite a coordenada x e y\n");
scanf("%f %f", &x, &y);
p1->x = x;
p1->y = y;
}

void main() {
ponto u, v;
le_coordenada(&u);
le_coordenada(&v);
printf("\n %f", distancia_pontos(u,v));
getch();
}
24
Estruturas como parmetros de funes
void main() {
ponto u, v;
le_coordenada(&u);
le_coordenada(&v);
printf("\n %f", distancia_pontos(u,v));
getch();
}

endereo varivel contedo


F000 u|x
F010 u|y
F020 v|x
F030 v|y
F040
F050
F060
F070
25
Estruturas como parmetros de funes
void le_coordenada(ponto *p1) {
float x, y;
printf("Digite a coordenada x e y\n");
scanf("%f %f", &x, &y);
p1->x = x;
p1->y = y;
}

endereo varivel contedo


F000 u|x
F010 u|y
F020 v|x le_coordenada(&u);
F030 v|y
F040 p1 F000
F050 x 1.5
F060 y 2.0
F070
26
Estruturas como parmetros de funes
void le_coordenada(ponto *p1) {
float x, y;
printf("Digite a coordenada x e y\n");
scanf("%f %f", &x, &y);
p1->x = x;
p1->y = y;
}

endereo varivel contedo


F000 u|x
F010 u|y
F020 v|x le_coordenada(&u);
F030 v|y Similar a vetores, &u
F040 p1 F000 d o endereo inicial
que a estrutura est
F050 x 1.5 armazenada
F060 y 2.0
F070
27
Estruturas como parmetros de funes
void le_coordenada(ponto *p1) {
float x, y;
printf("Digite a coordenada x e y\n");
scanf("%f %f", &x, &y);
p1->x = x;
p1->y = y;
}

endereo varivel contedo


F000 u|x 1.5
F010 u|y 2.0
F020 v|x le_coordenada(&u);
F030 v|y
F040 p1 F000
F050 x 1.5
F060 y 2.0
F070
28
Estruturas como parmetros de funes
void le_coordenada(ponto *p1) {
float x, y;
printf("Digite a coordenada x e y\n");
scanf("%f %f", &x, &y);
p1->x = x;
p1->y = y;
}

endereo varivel contedo


F000 u|x 1.5
le_coordenada(&v);
F010 u|y 2.0
F020 v|x 30.0
F030 v|y 25.5
F040 p1 F020
F050 x 30.0
F060 y 25.5
F070
29
Estruturas como parmetros de funes
void main() {
ponto u, v;
le_coordenada(&u);
le_coordenada(&v);
printf("\n %f", distancia_pontos(u,v));
getch();
}

endereo varivel contedo


F000 u|x 1.5
F010 u|y 2.0
F020 v|x 30.0
F030 v|y 25.5
F040
F050
F060
F070
30

Anda mungkin juga menyukai