SOP-struct

De MediaWiki do Campus São José
Revisão de 13h07min de 18 de junho de 2010 por Msobral (discussão | contribs)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Introdução

Ao se modelarem os dados a serem processados em um programa, toma-se como ponto de partida a identificação de seus tipos. O tipo de um dado determina como ele é representado computacionalmente, e que operações podem ser feitas sobre ele. Por exemplo, imagine que um programa precise ler o nome e a idade de uma pessoa. O nome é uma sequência de caracteres, podendo então ser representado com um tipo string, e a idade pode ser representada com um tipo inteiro:

int main() {
  char nome[64]; // nome deve usar no máximo 63 caracteres
  int idade;

  printf("Digite o nome: ");
  scanf("%63s", nome);
  printf("Digite a idade: ");
  scanf("%d", &idade);

  printf("Nome: %s\nIdade: %d\n", nome, idade);
}

Assim, para cada dado a ser usado ou processado, identifica-se seu tipo de acordo com os tipos de dados disponíveis na linguagem C (ver na Wikipedia outro texto mais detalhado).

Os tipos de dados nativos da linguagem C (e das linguagens de programação em geral) são muito elementares. Os dados de problemas reais costumam ser mais complexos, pois precisam ser descritos por mais de um valor. Voltando ao exemplo do programa que precisa trabalhar com os dados de uma pessoa, imagine que agora, além do nome e idade, são necessários também o CPF e o sexo. Imagine que, após a leituras desses dados do teclado, eles devam ser guardados em um cadastro. Esse programa poderia ser parecido com o seguinte:

int grava_no_cadastro(char * nome, int idade, char * cpf, char sexo) {
   // algoritmo para gravar no cadastro, que pode estar em um arquivo
   // ou banco de dados.
}

int main() {
  char nome[64]; // nome deve usar no máximo 63 caracteres
  int idade;
  char cpf[13];
  char sexo;

  printf("Digite o nome: ");
  scanf("%63s", nome);
  printf("Digite a idade: ");
  scanf("%d", &idade);
  printf("Digite o CPF: ");
  scanf("%12s", cpf);
  printf("Digite o sexo (M = masculino/F = feminino): ");
  scanf(" %c", &sexo);
  
  grava_no_cadastro(nome, idade, cpf, sexo);
}

Nesse exemplo, no fundo a unidade de informação sendo processada é uma "pessoa", descrita pelos atributos nome, idade, cpf e sexo. Como a linguagem não possui um tipo de dados para essa finalidade, são necessárias quatro variáveis diferentes para guardar esses atributos. No entanto, se fosse possível criar um novo tipo de dados capaz de descrever exatamente uma pessoa dessa forma, a escrita do programa ficaria facilitada.

Estruturas de dados na linguagem C

A linguagem C oferece a possibilidade de criarem-se novos tipos de dados. Esses novos tipos funcionam como uma composição de outros tipos, como se fossem encapsulados os valores que correspondem aos atributos dos dado a ser representado em um programa. No exemplo da "pessoa", um novo tipo de dados poderia ser:

// O nome do novo tipo de dados é "struct Pessoa"
struct Pessoa {
  char nome[64];
  int idade;
  char cpf[13];
  char sexo;
};

Veja que esse novo tipo de dados, chamado struct Pessoa, possui quatro atributos: nome, cpf, idade e sexo. Cada atributo funciona como uma variável, porém encapsulada dentro do novo tipo de dados.

Para usar o novo tipo de dados devem-se declarar variáveis:

// O nome do novo tipo de dados é "struct Pessoa"
struct Pessoa {
  char nome[64];
  int idade;
  char cpf[13];
  char sexo;
};

int main() {
  struct Pessoa umaPessoa;

  printf("Digite o nome: ");
  scanf("%63s", umaPessoa.nome);
  printf("Digite a idade: ");
  scanf("%d", &umaPessoa.idade);
  printf("Digite o CPF: ");
  scanf("%12s", umaPessoa.cpf);
  printf("Digite o sexo (M = masculino/F = feminino): ");
  scanf(" %c", &umaPessoa.sexo);

  printf("Nome: %s\n", umaPessoa.nome);
  printf("CPF: %s\n", umaPessoa.cpf);
  printf("Idade: %d\n", umaPessoa.idade);
  printf("Sexo: %c\n", umaPessoa.sexo);
}

Os atributos da variável umaPessoa, que é do tipo de dados struct Pessoa, devem ser acessados com a notação nome_da_variável.nome_do_atributo:

  umaPessoa.nome