7. - Estruturas

7.1. Introdução

Para resolver o problema de ter uma variável constituída por tipos de dados diferentes, utilizam-se as estruturas que são explicadas em seguida.

7.2. Definição

Uma estrutura é um tipo de dado composto que consiste em uma ou mais variáveis agrupadas sob um nome. As variáveis na estrutura podem ter tipos diferentes, mas normalmente existe uma relação entre eles que faz com que seja conveniente tratá-los conjuntamente como um objecto no programa. Em Pascal a noção análoga é um tipo de dado, definido pelo utilizador,chamado record. Os componentes individuais de uma estrutura são chamados membros. Uma declaração de estrutura tem a forma:

struct nome_estrutura
{

> Declarações_dos_membros

};

Isto tem o efeito de definição de um novo tipo de dado. Aqui nome_estrutura é um nome arbitrário e struct nome_estrutura pode ser pensado como o nome de um novo tipo de dado. As Declarações_dos_membros são como quaisquer outras declarações, excepto que não definem variáveis mas nomes de componentes de uma instância da estrutura nome_estrutura.

Alguns exemplos:

struct num_complexo
{

> double real;
> double imaginário;

};

struct data
{

> int ano;
> char mes[10];
> int dia;

};

struct venda
{

> char comprador[SIZE];
> double quantidade;
> struct data quando;

};

Neste último caso existe uma estrutura encaixada noutra. Estas declarações não definiram quaisquer variáveis, elas meramente definiram novos tipos de dados e portanto, não lhes foi reservado espaço de memória. Qualquer definição de variáveis do tipo destas anteriores utiliza as mesmas regras que para qualquer outro tipo de dado. Como exemplo:

struct data d; /* d é uma variável do tipo struct
data */
struct venda a[20] /* a é um array de 20 estruturas*/
struct num_complexo x,y,z;

nestes casos são definidas variáveis e consequentemente é-lhes reservado espaço em memória.

Os membros das estruturas são acedidos da seguinte forma:

variável_estrutura.membro;

Exemplos :

struct data d;
d.ano=1993
strcpy(d.mes,Fevereiro);
d.dia=4;

struct venda s;
s.quantidade=24
s.quando.ano=1994

Repare-se que o membro da estrutura imbricada foi acedido da mesma forma.Outros exemplos são:

struct complexo x,y
x.real+=y.real;
x.imaginário+=y.imaginário;

As variáveis do tipo estrutura podem ser inicializadas na altura da sua definição, colocando-se a lista de inicializações a seguir à definição. Por exemplo,

struct complexo z={1,-1};

7.3 Operações com Estruturas

As operações fundamentais que podem ser aplicadas às estruturas são:

- Tomar o endereço de uma estrutura com o operador &
- Aceder aos membros da estrutura com o operador.
- Atribuição de variáveis de estrutura, por exemplo,

> struct data d1,d2;
> d1=d2;

- Passar uma estrutura para uma função, por exemplo,

> struct data d;
> imprime_data(d);

- Retorno de uma estrutura por uma função, por exemplo,

> struct data d,aniversario();
> d = aniversario(Portugal);
> em que aniversario é uma função que retorna uma estrutura struct data.

Exemplo : A função soma_complexo, adiciona dois números complexos e retorna o resultado.

struct complexo soma_complexos(struct complexo n1, struct complexo n2)
{

> struct complexo soma;
> soma.real=n1.real+n2.real;
> soma.imaginario=n1.imaginario+n2.imaginario;
> return soma;

}

Apesar de não existir qualquer conflito entre membros e variáveis com o mesmo nome, é necessário ter o maior cuidado com esta prática, de forma a que não prejudique a clareza dos programas.

7.4 Vectores de Estruturas

As estruturas, como qualquer outro tipo de dado podem ser agrupadas em vectores.

Exemplo 1 : Neste exemplo é criado um novo tipo de dado struct data e definida uma variável feriado do tipo array de 5 estruturas struct data.

struct data {int dia, char mes[10], int ano};
struct data feriado[5] = {{1,Janeiro,1993},
{10,Junho,1993},
{25,Dezembro,1993}};

Para simplificar as declarações muito extensas, é conveniente atribuir nomes aos tipos de estruturas. Por exemplo:

typedef struct data {int dia,char mes[10], int ano} DATA;

agora DATA representa o tipo de dado struct data, passando a poder ser usado em lugar deste.

7.5 Unions

Uma union (união) permite criar variáveis capazes de suportar diferentes tipos de dados, no mesmo espaço de memória em momentos diferentes. A declaração de uma union é similar à declaração de uma estrutura. A diferença é que com uma struct é alocado de uma vez espaço suficiente para todos os objectos, enquanto que com uma union só é alocado espaço para o maior dos objectos que a compõem, A declaração,

union Valor{

> int ivalor;
> double dvalor;
> char cvalor;

}val;

significa que val poderá armazenar ou um inteiro, ou um double, ou um char.

O programador é responsável pelo conhecimento de qual dos tipos foi armazenado mais recentemente na variável val. A sintaxe para aceder ao conteúdos de uma variável union é exactamente a mesma que para as estruturas. Seguidamente é mostrado o extracto de um programa em que é utilizada a union acima descrita.

/* Definição de constantes */
#define INT 0
#define DOUBLE 1
#define CHAR 2

int tipo;
...
switch (tipo)
{

> case INT:

> > printf (%d,val.ivalor);
> > break;

> case DOUBLE:

> > printf (%lf,val.dvalor);
> > break;

> case CHAR:

> > printf (%c,val.cvalor);
> > break;

}

O programa imprime um inteiro, um double ou um caracter dependendo do valor de tipo.

Back | Up | Forward

To front page | Pages by Nuno Nunes. |