Estruturas e definição de novos tipos de dados.
Até agora vimos que podemos declarar variáveis do tipo inteiro (int), real (float ou double) e caracter (char). E depois podemos declarar colecções (arrays) de variáveis de um determinado tipo.
Além dos 4 tipos base, int, float, double e char, podemos definir novos tipos de dados. É precisamente isso que vamos aprender nesta aula.
Suponhamos que queríamos fazer um programa para manipular figuras geométricas no plano. O programa poderia manipular pontos, rectas, triângulos, rectângulos, círculos, etc.
Vamos começar pelo ponto que é a entidade mais simples. Um ponto é definido por 2 coordenadas, x e y. Em C, podemos definir o tipo ponto do seguinte modo:
typedef struct { float x; float y; } ponto;
Esta declaração indica que um ponto tem 2 componentes, x que é um número real, e y que também é um número real. Depois de definido, podemos declarar variáveis do tipo ponto, por exemplo
ponto p
A variável p é uma estrutura. Uma estrutura é uma colecção de uma ou mais variáveis agrupadas num único nome. No exemplo acima, x e y dizem-se membros (ou campos) da estrutura. Um campo de uma estrutura é acedido da seguinte forma:
nome_da_estrutura.nome_do_campo
Podem pensar na variável p como sendo uma caixa que contem 2 caixinhas, uma tem o nome x e a outra tem o nome y.
se depois fizermos:
p.x = 3; p.y = 2;
a caixa correspondente à variável p fica assim
Exemplo: o programa seguinte pede ao utilizador para introduzir 2 pontos e calcula a distância entre eles.
#include <stdio.h> #include <math.h> typedef struct { float x; float y; } ponto; /* calcula a distância entre 2 pontos */ float distancia( ponto a, ponto b ) { float dx, dy; dx = a.x - b.x; dy = a.y - b.y; return sqrt( dx*dx + dy*dy ); } main() { ponto p1, p2; float d; printf("Introduz as coordenadas x e y do ponto p1: "); scanf("%f %f", &p1.x, &p1.y ); printf("Introduz as coordenadas x e y do ponto p2: "); scanf("%f %f", &p2.x, &p2.y ); d = distancia( p1, p2 ); printf("A distância entre os pontos é %f\n", d ); }
Uma vez definido o tipo ponto, pode-se definir outros tipos à custa do tipo ponto. Por exemplo, poderia definir o tipo de dados triângulo e círculo. Um triângulo é definido por 3 pontos. Um círculo é definido pelo centro (um ponto) e o raio (um número real).
typedef struct { float x; float y; } ponto; typedef struct { ponto a; ponto b; ponto c; } triangulo; typedef struct { ponto centro; float raio; } circulo;
e agora podiam fazer coisas deste estilo
circulo c; c.centro.x = 1; c.centro.y = 2; c.raio = 5;
Uma vez definido um tipo de dados podem declarar arrays de coisas desse tipo. O exemplo seguinte declara um array de 20 pontos.
ponto p[20];
Podem definir um tipo de dados chamado data. Uma data tem 3 coisas: dia, mês, ano.
typedef struct { int dia; int mes; int ano; } data;
Um endereço tem a rua, cidade, código postal, e país.
typedef struct { char rua[100]; char cidade[30]; char codigopostal[10]; char pais[20]; } endereco;
Uma pessoa tem um nome, morada, telefone, data de nascimento.
typedef struct { char nome[100]; endereco morada; char telefone[15]; data nascimento; } pessoa;
Agora, podiam declarar um array de 1000 pessoas para guardar e manipular informação sobre os vossos amigos.
pessoa amigo[1000];
O ano em que o amigo 14 nasceu é dado por
amigo[14].nascimento.ano
e a cidade em que o amigo 23 mora é
amigo[23].morada.cidade