Programação Imperativa

Aula 17

Sumário

Estruturas e definição de novos tipos de dados.


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 );  
    }

Mais exemplos de estruturas: pontos, triângulos e círculos

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];

Mais exemplos de estruturas: datas, endereços e pessoas.

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