Você está na página 1de 46

Mdulo 5

Estruturas de Dados Compostas


(structures)

PSI 1 ano

Objetivos de aprendizagem do mdulo:


Definio de estrutura de dados composta
Manipulao de estruturas
Acesso aos campos de uma estrutura
Afetao dos campos de uma estrutura
Utilizao de Array de estruturas
Filosofias de gesto de estruturas de dados, de acordo com o modo de insero e remoo
de informao das respetivas estruturas
 Desenho de aplicaes que envolvam estruturas de dados de alguma complexidade
2







Resumo
 As estruturas em C correspondem aos registos na
generalidade das outras linguagens de programao,
permitem colocar, numa nica entidade, elementos de
tipos diferentes (char, int, float, double,).
 Uma estrutura assim um conjunto de uma ou mais
variveis (a que vulgarmente se chama campos ou
membros) agrupadas sobre um nico nome, de forma a
facilitar a sua referncia.
 As estruturas podem conter elementos com quaisquer tipo
de dados vlidos em C (tipos bsicos, vetores, strings,
apontadores, ou mesmo outras estruturas).
3

Linguagem C

struct
Tipos de dados compostos

Revises taxonomia de tipos de dados


Tipos de Dados

void

tipos simples

tipos
alfanumricos

char

int

float

double

tipos compostos

tipos
apontadores

tipos
enumerados

enum

[]

struct

FILE

Um objeto, mltiplas variveis


 Exemplo #1: Vamos supor que pretendamos
representar num programa os principais dados
(registo) que constituem caractersticas fsicas
de uma pessoa (indivduo).

 Uma possvel soluo seria a declarao de


variveis individuais para cada uma das
caratersticas a representar.

int idade;
char sexo;
char nome [60];
float altura, peso;
6

//Uma pessoa representada pelas variveis:

int idade;
char sexo;
char nome [60];
float altura, peso;

//As linhas seguintes leem os dados.

scanf ("%d", &idade);


scanf ("%f", &altura);
scanf ("%f", &peso);
gets (nome);
getchar (sexo);
7

Mltiplos objetos
int idade;
char sexo;
char nome [60];
float altura, peso;

 Agora vamos imaginar que necessitamos de replicar este


cdigo para controlar os dados de mltiplas pessoas.


Normalmente a replicao feita por um


copiar&colar seguido de um ajuste ao texto colado.

Algum problema nesta abordagem?


8

//Uma pessoa representada pelas variveis.

int idade;
char sexo;
char nome [60];
float altura, peso;
int idade2;
char sexo2;
char nome2 [60];
float altura2, peso2;
//As linhas seguintes leem os dados.

scanf ("%d" ,&idade);


scanf ("%f" &altura);
scanf ("%f" ,&peso);
gets (nome);
getchar (sexo);
scanf ("%d" ,&idade2);
scanf ("%f" &altura2);
scanf ("%f" ,&peso2);
gets (nome2);
getchar (sexo2);

Representao dos principais dados que


caracterizam um indivduo

int idade;
char sexo;
char nome [60];
float altura, peso;
 Esta soluo no a mais aconselhada pois nada nos
diz que as variveis esto de algum modo
relacionadas entre si.
 Para resolver o problema de ter uma varivel
constituda por tipos de dados diferentes, utilizam-se
as estruturas (struct).
10

Vamos supor que pretendamos


representar num programa os principais dados (registo)
que constituem a passagem de um veculo por uma
portagem para efeitos estatsticos.
 Exemplo

#2:

11

Motivao
 Necessidade de guardar informao de vrios tipos
de dados numa s entidade (struct).
 Exemplo:
No dia-a-dia das empresas e organizaes h
necessidade de introduzir, alterar, eliminar e consultar
dados em formulrios (p.ex.: segurana social, banca,
finana, bolsa, arquivo de identificao, etc.).

12

Em geral, h trs dados comuns a todos estes sistemas de


organizao de informao:

 nome
 morada
 nmero de identificao fiscal
 Em C (novo tipo de dados: CLIENTE):

struct CLIENTE {
char *nome;
char *morada;
long nif;
};
13

Diagrama de sintaxe

14

Caratersticas gerais dos tipos de dados compostos


 Definio pelo utilizador
 No pertencem ao lxico da linguagem
 Requerem a utilizao dum mecanismo sinttico ou
duma palavra reservada ([ ], struct, FILE, ...)
 Composio
 Tm valores compostos

 Exemplo (clientes dum empresa):

CLIENTE x = {Josefa Boavida, Rua do Vau, n 2, 3500-089 Viseu, 232456719};


CLIENTE y = {Rui Silva, Rua da Pescada, n 5, 1100-115 Lisboa, 213445232};

 No tm ordem
15

Caratersticas especficas de uma struct


 Contiguidade
 Ocupa uma zona contgua de memria
 No so homogeneamente tipadas
 As componentes podem ter tipos diferentes de dados
 Exemplo (clientes):

CLIENTE x = {Josefa B., Rua do Vau, n 2, 3500-089 Viseu, 232456719};


CLIENTE w;

 Acesso por identificador

 Cada componente tem um identificador


 Exemplo (inteiros):

Acesso para escrita

w.nome = Josefa B.;


w.telefone = x.telefone;

Acesso para leitura


16

Definio de struct
 uma coleo ou conjunto de elementos (ou variveis)
numa zona contgua de memria.
 Ao contrrio dos vetores (arrays), os elementos no so
necessariamente do mesmo tipo.
 Ao contrrio dos arrays, os elementos no so indexados.
 Os elementos so variveis usuais identificadas por nome.
 Os elementos so tambm designados por campos,
membros ou componentes.

17

Declarao de struct
 A declarao de estruturas realizada atravs da seguinte
sintaxe:

struct nome_da_estrutura {
tipo elemento1, elemento2;
. . .
tipo elementon;
};
A declarao de uma estrutura corresponde unicamente
definio de um novo tipo (i.e., da sua estrutura) e no
declarao de variveis do tipo estrutura.
Nota: o nome_da_estrutura pode ser opcional.

18

Exemplo: Podemos, por exemplo, definir uma estrutura capaz


de suportar datas:

struct Datas
{
int Dia, Ano;
char Mes[12];
};
A definio da estrutura Datas (struct Datas) indica
unicamente que, a partir deste momento, o compilador passa
a conhecer um outro tipo, chamado struct Datas que
composto por dois inteiros e um vetor com 12 carateres.
Neste exemplo, Datas no uma varivel, mas antes o nome
pelo qual conhecida esta nova definio de tipo de dados.
19

Declarao de variveis do tipo struct


 Para declarar uma varivel do tipo struct Data, atrs
apresentada, basta indicar o tipo (struct Data) seguido do
nome das variveis.

struct Data d, datas[100], *ptr_data;


Neste exemplo:
d uma varivel do tipo struct Data.
datas um vetor de 100 elementos, sendo cada um
deles uma estrutura do tipo struct Data.
prt_data um apontador para o tipo struct Data.
20

 A declarao de variveis do tipo estrutura pode tambm


ser realizadas quando se faz a definio da prpria
estrutura atravs da sintaxe:
struct nome_da estrutura
{
tipo
campo1, campo2;
. . .
tipo
campo;
} v1, v2, . . . , vn;

Exemplo:

struct Data {
int Dia, Ano;
char Mes[12];
} d, datas[100], *ptr_data;
21

Problema: Definir uma nova estrutura capaz de suportar a


definio de um individuo (idade, sexo, estado civil, nome e
salrio). Declarar na definio as variveis Lucas e Teresa
desse mesmo tipo:
struct Pessoa
{
int idade;
char sexo, estado_civil;
char Nome[60];
float salario;
} Lucas, Teresa;


struct Pessoa pode ser visto como a forma de um bolo.

 Lucas e Teresa so dois bolos feitos nesta forma tendo por


isso um formato igual, embora o seu contedo, isto , os
valores dos membros, possam ser diferentes.
22

Declarao de variveis
Definio de tipo de dados
+
declarao de varivel (ou
variveis) em instrues
diferentes

Definio de tipo de dados


+
declarao de varivel (ou
variveis) na mesma instruo

23

Declarao de tipos com typedef


Definio de tipo de dados
(typedef)
+
declarao de varivel (ou
variveis) em instrues diferentes

Definio de tipo de dados sem


nome
+
declarao de varivel (ou
variveis) na mesma instruo

24

Declarao com inicializao


 Exemplo
CLIENTE x = {Josefa B., Rua do Vau, n 2, 3500-089 Viseu, 232456719};

inicializao
semelhante
aos arrays

25

Inicializaes de variveis
 A inicializao de uma struct feita da mesma forma que
a dos vetores (arrays).
 Exemplo (declarao dum cliente c/ inicializao):
CLIENTE x = {Josefa Boavida, Rua do Vau, n 2, 3500-089 Viseu, 232456719};

Uma estrutura pode ser inicializada quando declarada


usando-se a sintaxe:
struct nome_estrutura var={valor1,valor2,,valorn}
Colocando entre chaves os valores dos membros da
estrutura, pela ordem em que esses foram escritos na sua
definio.
26

Operador de acesso
struct CLIENTE
{
char *nome;
char *morada;
long telefone;
};

Operador . (ponto)
struct CLIENTE x;
x.nome = Joaquim Mira;
x.morada = R. Ag.Cima, 2,2456-001 gueda;
x.telefone = 239675413;
27

Problema: Supor que uma pessoa possui trs caractersticas


(me, pai e co). Declarar (em ingls) uma estrutura que
represente essa definio.
Declarar duas variveis desse tipo (John e Mary).

struct Person
{
char Mother[100], Father[100];
char Dog[30];
} John;
/* John uma varivel do tipo struct Person */

struct Person Mary;

/* Mary tambm */

28

struct Person
{
char Mother[100], Father[100];
char Dog[30];
} John;
struct Person Mary;
Pergunta:
Resposta:

Como se diz em ingls o pai do John ?


Johns Father.

Pergunta:
Resposta:

Como se diz em ingls a me da Mary ?


Marys Mother.

Pergunta:
Resposta:

Como se diz em ingls o co do John ?


Johns Dog.
29

Observao:
 Como se sabe, um dos objetivos das linguagens de
programao assemelharem-se, o mais possvel,
linguagem falada que utilizamos normalmente.
 No entanto no podemos escrever o cdigo exatamente
igual s respostas anteriores, pois o carater aspas simples
utilizado em C para delimitar os carateres.
 A soluo adotada foi a substituio dos s por um ponto
.

Para aceder ao membro mmm de uma estrutura eee


usa-se o operador ponto (.) fazendo eee.mmm
30

Exemplo de cdigo

31

Exemplos de inicializaes de variveis


struct Data {
int dia, ano;
char mes[12];

};

dt_nasc = {23,1980,janeiro};
Ou

Declarao da estrutura

struct Data {
int dia, ano;
char mes[12];

};

Declarao da varivel

struct dt_nasc = {23,1980,janeiro};


32

 Se a varivel a ser inicializada um vetor, a inicializao feita do mesmo


modo.

struct Data {
int dia;
char mes[12];
int ano
};

Declarao da estrutura

Declarao da varivel

struct Data Natal = {25,dez,2012};


struct Data v[] = {{1,jan,1990},{2,fev,1970}};
Ou
struct Data v[2] = {{1,jan,1990},{2,fev,1970}};
33

A definio de uma estrutura pode ser realizada se indicar qual o seu nome.
No entanto, todas as variveis desse tipo tm de ser declaradas no momento
da definio, pois a estrutura deixa de ser identificada fora do local de
definio.
Essas estruturas no podem ser enviadas ou recebidas dentro de funes,
pois no possuem um nome que as identifique na definio dos parmetros
da funo.

34

Uso de estruturas para codificar um problema


Um ponto no espao bidimensional
representado por duas coordenadas (x e y),
mas tratado como um nico objeto (ou tipo).

35

Operador de atribuio
struct CLIENTE
{
char *nome;
char *morada;
long telefone;
};
struct CLIENTE x, y;
// a atribuio pode ser feita membro a membro
x.nome = Joaquim Mira;
x.morada = R. Ag.Cima, 2, 2456-001 gueda;
x.telefone = 239675413;
// mas, ao contrrio dos arrays,
// tambm pode ser feita entre estruturas
y = x;
x = *(&y);
36

Exemplo 1

37

Exemplo 2

38

Exemplo 3

39

Exemplo 4

40

ToDo:
Considera o registo de um produto de uma loja
que contem as seguintes informaes:
descricao, valor
Fazer um programa que, dado o registo de 5
produtos, os exiba na ordem inversa em que
foram digitados.

41

42

Prontos para a ao ?!

43

Hora de resolver
1) Criar uma estrutura aluno que contm:
 nmero
 nome
 ano
 turma
 disciplina
 notas do 1, 2 e 3 perodo
Programa os procedimentos necessrios para
inserir dados, calcular a mdia e exibir toda a
informao da estrutura aluno.
44

Hora de resolver
2) Utilizando uma estrutura, fazer um programa em C
que permita a entrada de nome, endereo e telefone
de 5 pessoas e os imprima em ordem decrescente
de insero.
3) Implementa um programa que define um tipo novo
de dados, para uma estrutura de um animal, que
dever conter os seguintes atributos: raa, cor, peso
e sexo. Solicitar ao utilizador do programa 10
espcies e depois imprimir os mesmos no ecr.
45

46

Você também pode gostar