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;
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; }
struct horasEminutos { int horas; int minutos; };
É 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;
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