Curso de C
Estruturas e Uniões


Você está em: MarMSX >> Cursos >> C   Estruturas - Struct

  No capítulo anterior de listas e matrizes, vimos que éramos obrigado a criá-las com o mesmo tipo de dados (int, float, char, etc). Se desejássemos guardar o nome (string), a idade (int) e a nota (double) de uma turma de alunos em uma lista, isso não seria possível.
  Para resolver esta questão, vamos criar uma estrutura de dados contendo diversos tipos primitivos dentro dela, ou seja, uma espécie de "variável composta".
  Na linguagem C, o STRUCT é o responsável pela criação de variáveis compostas (o type do Pascal que define registros).

  Sintaxe:
struct <nome_do_modelo_de_variavel_composta>
{
  conjunto_de_variaveis_primitivas;
};
  Variáveis primitivas do C: int, float, char, double, etc.

  O exemplo de variável composta para o problema da turma de alunos pode ser resolvido assim:
struct modelo_aluno
{
  char nome[20];
  int idade;
  double nota;
};
  A declaração do "struct" não cria variáveis na memória. Na realidade, ela cria um novo tipo de variável. Para utilizá-lo, é necessário criar uma variável nova, do tipo "modelo_aluno".
struct modelo_aluno aluno;
  Agora sim. A variável aluno foi criada e possui as características do "modelo_aluno".

  O acesso ao interior da estrutura "modelo_aluno" é feito através do nome da variável da estrutura, precedido de um ponto. Por exemplo, para acessar a idade da variável aluno, faz-se:
aluno.idade = 10;

  Outro exemplo:
struct modelo_ficha
{
  char nome[40];
  int dia, mes, ano;
  char endereco[100];
};

  As variáveis também podem ser declaradas após o struct, separadas por vírgulas:
struct modelo_ficha
{
  char nome[40];
  int dia, mes, ano;
  char endereco[100];
} ficha1, ficha2;

  O programa a seguir exemplifica o uso de uma struct.
#include <stdio.h>
#include <string.h>

struct modelo_ficha
{
  char nome[40];
  int dia, mes, ano;
  char endereco[100];
};

struct modelo_ficha ficha;

void main(void)
{
  strcpy(ficha.nome,"Guga");
  ficha.dia = 10;
  ficha.mes =  9;
  ficha.ano = 1976;
  strcpy(ficha.endereco,"Floripa");
}

  O programa acima permite o uso de apenas uma ficha. Se desejarmos mais, devemos criar um vetor do tipo "modelo_ficha".
#include <stdio.h>
#include <string.h>

struct modelo_ficha
{
  char nome[40];
  int dia,mes,ano;
  char endereco[100];
} ficha[20];

void main(void)
{
  char *palavra;
  int i;
  for (i=0; i<20; i++)
  {
    printf("\nNome: ");
    scanf("%s",palavra);
    strcpy(ficha[i].nome,palavra);
    printf("Dia: ");
    scanf("%d",&ficha[i].dia);
    printf("Mes: ");
    scanf("%d",&ficha[i].mes);
    printf("Ano: ");
    scanf("%d",&ficha[i].ano);
    printf("Endereco: ");
    scanf("%s",palavra);
    strcpy(ficha[i].endereco,palavra);
  }
}


  Uniões - Union

  Uma união é uma estrutura de dado que pode ser utilizada de várias maneiras. Assim como a estrutura, ela pode declarar variáveis de diferentes tipos, mas somente pode se comportar como um tipo de cada vez. Isso porque essas variáveis compartilham a mesma localização de memória, mas difere no modo que interpreta o dado contido ali.

  Sintaxe:
union nome
{
  tipo_de_dado_1 var1;
  tipo_de_dado_2 var2;
  ...
  tipo_de_dado_n varn;
};

  Exemplo:
#include <stdio.h>

union teste
{
  int i;
  double d;
  char c;
} t;

main()
{
  t.i = 4;
  printf("Valor: %d\n", t.i);

  t.d = 5.3;
  printf("Valor: %f\n", t.d);

  t.c = 'a';
  printf("Valor: %c\n", t.c);
}
  Saída:
  Valor: 4
  Valor: 5.300000
  Valor: a

  Também é possível:
  t.i = 65;
  printf("Valor: %d\n", t.i);
  printf("Valor: %c\n", t.c);
  Saída:
  Valor: 65
  Valor: A



  Typedef e Enum

  O typedef serve para associar novos tipos de dados com os dados existentes. Exemplo:
#include <stdio.h>

typedef int inteiro;
typedef char* string;

main()
{
  string nome = "Tricky";
  inteiro idade = 32;

  printf("%s tem %d anos.\n", nome, idade);
}
  Saída:
  Tricky tem 32 anos.

  O enum permite criar uma lista com nomes, como por exemplo os meses do ano, para que possam ser referenciados pelo próprio nome em vez da posição em um vetor.
  Cada nome é associado a um índice, começando por 0 (é possível alterar esse valor), e esse valor é retornado quando referência-se o nome.
  Veja o exemplo a seguir.
#include <stdio.h>

enum meses { Janeiro=1, Fevereiro, Marco, Abril, Maio, Junho, Julho,
             Agosto, Setembro, Outubro, Novembro, Dezembro };

main()
{
  printf("Número do mês de dezembro: %d\n", Dezembro);

  int i;
  for (i=Janeiro; i<Dezembro; i++)
    printf("Falta(m) %d mes(es) para o fim do ano.\n", Dezembro - i);
}
  Saída:
  Número do mês de dezembro: 12
  Falta(m) 11 mes(es) para o fim do ano.
  Falta(m) 10 mes(es) para o fim do ano.
  Falta(m) 9 mes(es) para o fim do ano.
  Falta(m) 8 mes(es) para o fim do ano.
  Falta(m) 7 mes(es) para o fim do ano.
  Falta(m) 6 mes(es) para o fim do ano.
  Falta(m) 5 mes(es) para o fim do ano.
  Falta(m) 4 mes(es) para o fim do ano.
  Falta(m) 3 mes(es) para o fim do ano.
  Falta(m) 2 mes(es) para o fim do ano.
  Falta(m) 1 mes(es) para o fim do ano.

  Uma utilidade do enum é facilitar a legibilidade de um código, quando for utilizado como argumento para funções. Veja os exemplos a seguir.
set_color_type(0);	// Que sistema de cor corresponde ao valor 0?
set color_type(rgb);	// Mais fácil de entender



  Referências:

  [1]- Turbo C++ Completo e Total, Chris H.P e William H.M. Editora Makron Books, 1991.


<< Anterior Linguagem C Próxima >>