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.