Projeto de Algoritmos

Registros e Structs

Esta página é um pequeno resumo sobre o conceito de registro.  Na linguagem C, registros são conhecidos como structs.

 

Um registro (= record = struct) é uma coleção de várias variáveis, possivelmente de tipos diferentes. O exemplo abaixo declara um registro x com três campos inteiros:

   struct {
      int dia;
      int mes;
      int ano; 
   } x; 

É uma boa idéia dar um nome ao tipo de registro. No nosso exemplo, dma parece um nome apropriado:

   struct dma {
      int dia;
      int mes;
      int ano; 
   }; 
   struct dma x;  /* declara um registro x do tipo dma */

É fácil atribuir valores aos campos de um registro:

   x.dia = 31;
   x.mes = 8;
   x.ano = 1998;

Um exemplo

A função abaixo que recebe a data de início de um evento e a duração do evento em dias. Ela devolve a data de fim do evento.

struct dma converte (struct dma datainicio, int duracao) {
   struct dma datafim;
   . . .
   . . .
   datafim.dia = ...
   datafim.mes = ...
   datafim.ano = ...
   return datafim;
}

O código foi omitido porque é um tanto enfadonho: deve levar em conta a existência de meses com 31 dias, de meses com 30 dias, com 29 dias etc.

Eis como essa função poderia ser usada:

int main (void) {
   struct dma inicio;
   struct dma fim;
   int dura;
   scanf ("%d %d %d", &inicio.dia, &inicio.mes, &inicio.ano);
   scanf ("%d", &dura);
   fim = converte (inicio, dura);
   printf ("%d %d %d\n", fim.dia, fim.mes, fim.ano);
   return EXIT_SUCCESS;
}

Exercícios

  1. Complete o código da função do exemplo acima.

  2. Escreva uma função que receba dois structs do tipo dma, cada um representando uma data válida, e devolva o número de dias que decorreram entre as duas datas.

  3. Escreva uma função que receba um número inteiro que representa um intervalo de tempo medido em minutos e devolva o correspondente número de horas e minutos (por exemplo, converte 131 minutos em 2 horas e 11 minutos). Use uma struct como a seguinte:
    struct horasEminutos {
       int horas;
       int minutos;
    };
    

Structs e ponteiros

É muito comum usar ponteiros que apontam para registros, ou seja, guardam o endereço de um registro. Por exemplo,

   struct dma *p;   /* define ponteiro p para registros dma */
   struct dma  x;
   p = &x;          /* agora p aponta para x */
   (*p).dia = 31;   /* mesmo efeito que x.dia = 31 */
   (*p).mes = 8;   
   (*p).ano = 1998;

[Cuidado! A expressão  *p.dia,  que equivale a  *(p.dia),  tem significado muito diferente de  (*p).dia . Veja tabela de precedência entre operadores em C.]   A expressão  p->dia  é uma abreviatura muito útil para a expressão (*p).dia :

   p->dia = 31;      /* mesmo efeito que (*p).dia = 31 */

Os registros dma podem ser tratados como um novo tipo-de-dados:

   typedef struct dma tipo_data; 
   tipo_data  x;  
   tipo_data *p;
   p = &x;

Exercícios

  1. Defina um registro empregado para guardar os dados (nome, sobrenome, data de nascimento, RG, data de admissão, salário) de um empregado de sua empresa.  Defina um vetor de empregados para armazenar todos os empregados de sua empresa.

  2. Um racional é qualquer número da forma p/q, sendo p inteiro e q inteiro não-nulo.  É conveniente representar um racional por um registro:
    struct racional {
       int p, q;
    };
    

    Vamos convencionar o campo q de todo racional é estritamente positivo e que o máximo divisor comum dos campos p e q é 1.  Escreva

    • uma função reduz que receba inteiros p e q e devolva o racional que representa p/q;
    • uma função neg que receba um racional x e devolva o racional -x;
    • uma função soma que receba racionais x e y e devolva o racional que representa x+y;
    • uma função mult que receba racionais x e y e devolva o racional que representa x*y;
    • uma função div que receba racionais x e y e devolva o racional que representa x/y.

 

 


URL of this site: www.ime.usp.br/~pf/algoritmos/
1998 | Last modified: Sat Nov 26 10:02:54 BRST 2005
Paulo Feofiloff
IME-USP