Buscar

Aula 12 - Registros

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.

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando