Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
*
Registros - Structs
*
Definindo uma estrutura
Vamos supor que uma empresa deseja que seja desenvolvido um programa em C que manipule informações sobre seus funcionários, tais como:
Número de matrícula;
Categoria (A, B ou C);
Salário.
Para armazenar essas informações de um funcionário poderíamos criar uma variável para cada informação:
int num_mat;
float salario;
char categoria;
*
Definindo uma estrutura
Entretanto seria interessante se fosse possível agrupar todas as informações que dizem respeito ao funcionário. Isso não é possível usando um vetor, já que as informações que se deseja armazenar são de tipos diferentes. Existe sim uma maneira de agruparmos este conjunto de variáveis de tipos diferentes usando o que chamamos de estrutura (ou registro).
Estruturas de armazenamento Heterogêneas
Podem agrupar variáveis de tipos diferentes
Váriáveis (campos ou membros) com nomes diferentes mas relacionadas e referenciada por um nome comum.
Chamadas de registros ou estruturas.
*
Definindo uma estrutura
Uma estrutura pode ser definida da seguinte maneira:
struct rotulo {
tipo nome;
...
tipo nome;
};
A palavra struct apresenta a definição da estrutura. O rótulo define um nome para a estrutura, e o que é declarado dentro da estrutura são chamados de membros da estrutura.
*
Definindo uma estrutura
A definição de uma estrutura capaz de armazenar as informações de um funcionário ficaria assim:
struct funcionario
{
int num_mat;
float salario;
char categoria;
};
Dessa forma, a estrutura funcionário passa a ser um tipo, e é possível então declarar uma variável deste tipo (struct funcionario) da seguinte maneira:
struct funcionario f1;
*
Acessando membros de uma estrutura
Os membros de uma estrutura podem ser acessados através do operador de acesso "ponto" (.)
f1.num_mat = 10;
f1.salario = 200.50;
f1.categoria = ‘A’;
*
Exemplo
#include <stdio.h>
struct funcionario {
int num_mat;
float salário;
char categoria;
};
main()
{
struct funcionario f1;
printf("Entre com os dados de um funcionário.\n");
printf("Numero de matricula: ");
scanf("%d", &f1.num_mat);
printf("Salario: ");
scanf("%f", &f1.salario);
printf("Categoria: ");
scanf(" %c", &f1.categoria);
printf("Os dados lidos foram:\n");
printf("Numero de matricula: %d", f1.num_mat);
printf("Salario: %f", f1.salario);
printf("Categoria: %c", f1.categoria);
}
*
Exemplo
A variável f1, definida na função principal, é uma variável como qualquer outra. O compilador aloca espaço suficiente para armazenar todos os membros da estrutura.
Note que o acesso ao endereço de um membro da estrutura é feito da mesma forma que aos das variáveis simples: basta escrever &(f1.salario) ou simplesmente &f1.salario.
*
A linguagem C oferece um mecanismo para criarmos apelidos para tipos definidos previamente. Isso é feito pela palavra-chave typedef.
typedef float real;
typedef int inteiro;
typedef struct funcionario Funcionario;
Agora, para criar uma variável do tipo struct funcionario, basta fazer:
Funcionario f2;
Definição de "novos tipos"
*
É possível também já criarmos o apelido no momento da definição da estrutura:
typedef struct funcionario
{
int num_mat;
float salario;
char categoria;
} Funcionario;
É possível ainda criarmos uma estrutura somente com apelido e sem nome:
typedef struct
{
int num_mat;
float salario;
char categoria;
} Funcionario;
Definição de "novos tipos"
*
Podemos ter, como membro de uma estrutura, um vetor:
Exemplo: acrescentar numero de horas extras por dia do mês corrente.
Vetor dentro de registro
Para inserir 10 horas no 5º dia do mês, faríamos:
Funcionario f;
f.horas_extras[4] = 10;
typedef struct funcionario
{
int num_mat;
float salario;
char categoria;
float horas_extras[31];
} Funcionario;
*
typedef struct{
float x;
float y;
} Ponto;
typedef struct {
Ponto p1;
Ponto p2;
} Reta;
...
main ()
{
Reta r;
r.p1.y = 100;
r.p1.x = 100.5;
scanf ("%f %f", &r.p2.x, &r.p2.y);
printf ("P1 = (%f, %f)\n", r.p1.x, r.p1.y);
printf ("P2 = (%f, %f)\n", r.p2.x, r.p2.y);
}
Registro dentro de registro
*
Da mesma forma que podemos declarar variáveis de tipo estruturado, podemos declarar variáveis do tipo ponteiro para estrutura:
Funcionario *pf1;
Para pf1 armazenar o endereço de uma variável de tipo Funcionário, por exemplo, o endereço de f1, teremos:
pf1 = &f1;
Ponteiros para estruturas
*
Podemos acessar os membros de f1 através de pf1.
(*pf1).salario = 2500;
Neste caso, os parênteses são indispensáveis pois o operador "conteúdo" tem precedência sobre o operador "ponto".
A linguagem C oferece um outro operador que permite acessar membros de uma estrutura através de um ponteiro para a estrutura. Este operador é chamado de operador "seta" e é formado por um hífen seguido do sinal de maior (->),sem espaço entre eles. Sendo assim, podemos reescrever a instrução acima da seguinte maneira:
pf1->salario = 2500;
Ponteiros para estruturas
*
Exemplo 2
#include <stdio.h>
typedef struct funcionario
{
int num_mat;
float salario;
char categoria;
} Funcionario;
void LeFuncionario (Funcionario *);
main()
{
Funcionario f;
LeFuncionario(&f);
printf("Os dados lidos foram:\n);
printf("Matricula: %d\n", f.num_mat);
printf("Salario: %.2f\n", f.salario);
printf("Categoria: %c\n", f.categoria);
}
void LeFuncionario (Funcionario *pf)
{
printf("Entre com os dados do funcionário.");
printf("Numero de matricula: ");
scanf("%d", &(*pf).num_mat);
printf("Salario: ");
scanf("%f", &pf->salario);
printf("Categoria: ");
scanf(" %c", &pf->categoria);
}
*
Podemos declarar um vetor para armazenar 50 funcionários da seguinte maneira:
Funcionario cadastro[50];
Em cada posição do vetor armazenaremos um funcionário.
Para acessar os membros de cada posição do vetor faremos:
cadastro[i].num_mat = 100;
cadastro[i].salario = 3500;
cadastro[i].categoria = 'B';
Vetores de estruturas
*
Exemplo
#include <stdio.h>
typedef struct {
int num_mat;
float salario;
char categoria;
} Funcionario;
main()
{
Funcionario cadastro[50];
int i;
for(i = 0; i < 50; i++)
{
printf("Entre com os dados do funcionario %d:\n", i + 1);
printf("Numero de matricula: ");
scanf("%d", &cadastro[i].num_mat);
printf("Salario: ");
scanf("%f", &cadastro[i].salario);
printf("Categoria: ");
scanf(" %c", &cadastro[i].categoria);
}
printf("\nOs dados lidos foram:\n\n");
for(i = 0; i < 50; i++)
{
printf("Funcionario %d:\n", i + 1);
printf("Numero de matricula: %d\n", cadastro[i].num_mat);
printf("Salario: %.2f\n", cadastro[i].salario);
printf("Categoria: %c\n\n", cadastro[i].categoria);
}
}
*
Uma union (união) permite criar variáveis capazes de suportar diferentes tipos de dados, no mesmo espaço de memória em momentos diferentes.
Apenas um dos campos declarados será utilizado por vez. É alocado espaço para o maior dos objetos que a compõem.
Exemplo:
union Valor{
int x;
double y;
char z;
};
...
union Valor val;
significa que val poderá armazenar ou um inteiro, ou um double, ou um char.
Unions
*
Uma enumeração permite criar um conjunto de constantes.
Exemplo:
enum cores{vermelho, verde, azul};
Cada elemento da enumeração tem um inteiro associado. Por padrão o primeiro elemento é 0, o segundo é 1, e assim por diante. No exemplo, vermelho é igual a 0, verde é igual a 1 e azul é igual a 2.
É possível alterar o inteiro associado a cada constante.
Exemplos:
enum meses{JAN = 1, FEV, MAR, ABR, MAI, JUN, JUL, AGO, SET, OUT, NOV, DEZ};
enum cores {branco=10, preto=15, cinza=40, azul=30};
enum
booleano {falso, verdadeiro};
Enumerações
*
Exercícios
Foi feita uma pesquisa em uma cidade. De cada entrevistado foram coletados os seguintes dados: idade, sexo, número de filhos e salário. Escreva um programa que contenha um tipo registro capaz de armazenar os dados de cada entrevistado, leia e armazene os dados de 120 entrevistados em um vetor e escreva uma função para cada um dos itens abaixo:
Calcule e retorne a média salarial dos entrevistados;
Ache e imprima o sexo dos entrevistados com salário mais alto e mais baixo;
Calcule e retorne a quantidade de pessoas com menos de 30 anos, mais de 5 filhos e salário menor que R$ 1.000,00;
Calcule e retorne a porcentagem de pessoas do sexo feminino que possuem filhos que responderam a pesquisa.
*
Exercícios
Um cliente em um banco é representado por:
Número da conta - um número inteiro;
Número da agência - um número inteiro;
Saldo.
Escreva um programa que defina um registro capaz de armazenar um cliente do banco. Seu programa deve ler os dados de 2000 clientes e armazená-los em um vetor, em seguida seu programa deve chamar uma função para calcular a média dos saldos dos clientes, encontrar o número da conta e da agência do cliente com maior saldo e a conta e a agência do cliente com menor saldo. Além disso, deve calcular a porcentagem de clientes com saldo inferior a R$1000,00. Todas as respostas devem ser impressas pela função principal.