Foi feito em aula um exercício que consistia em ler um arquivo de cadastro de pessoas, contendo data de nascimento, CPF e nome, como pode ser visto abaixo. O programa desenvolvido durante a aula está abaixo também. Ele inclui algumas funções para imprimir o cadastro, imprimir só os gaúchos, e faltou uma para imprimir o gaúcho mais velho.
7 6 1989 49404323195 Armanda Tigre
17 3 1981 25809516360 Lucas Costela
16 11 1990 07812795772 Alarico Alancastre
18 10 1970 64715329891 Davi Lucas Monteiro
2 1 1982 93017846962 Lucas Gabriel Campos
15 4 1991 88718725252 Isadora da Cunha
28 8 1998 15325243152 Camila Sales
4 1 1961 86827554082 Ana Luiza Ferreira
18 5 1998 20128567481 Vicente Rezende
23 1 1986 29132367821 Gustavo Henrique Martins
10 11 1999 92832783058 Paulo Duarte
15 1 1972 45336124907 Leonardo Fernandes
20 3 1961 10939371499 Alice Pereira
24 6 1974 85442511102 Enzo Viana
13 1 1988 42843887623 Mirella Moraes
17 2 1972 15445718018 Cid Onofre
16 5 1981 11046246135 Clotilde Castellano
11 10 2002 41246357615 Vitor Porto
19 10 2000 73746358183 Lorenzo Oliveira
21 12 1997 20548365830 Vitor Gabriel da Paz
20 8 2003 88049813770 Beatriz Freitas
5 10 1997 86653883388 Daniel Ferreira
22 2 1990 46054711970 Clotilde Castanho
27 3 1986 48361867490 Clara Pinto
4 6 1995 53262911267 Joana da Rosa
9 8 1968 53263426699 Carlos Eduardo Ferreira
9 8 1966 18163554371 Lucas Gabriel Santos
26 10 1970 42175221857 Luigi Nascimento
11 7 1981 12375555155 Renan da Paz
6 9 1963 88981713901 Maria da Mata
4 5 1984 82384913638 Brenda Cardoso
21 1 1989 40185119573 Celestina Manso
18 7 1967 33585363199 Luna Pinto
1 3 2003 48386241900 Pietra Melo
10 4 1968 45686621764 Caroline da Cunha
8 3 1999 86188416841 Maria Sophia Castro
24 5 1989 68191256312 Leandro Rezende
8 1 1996 39794645630 Vinicius Lima
19 7 1998 61795457236 Juan Correia
16 3 2003 27296686162 Lucas Gabriel Moraes
/******************************************************************************
Faça uma função para ler um cadastro de pessoas de um arquivo.
Cada pessoa tem data de nascimento, cpf e nome
Deve ser criado um tipo "pessoa", um registro com esses 3 campos.
Deve ser criado um outro tipo, "data", com dia, mes, ano.
O cadastro deve ser lido para um vetor de "pessoa".
*******************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#define N_PESSOAS 40
typedef struct {
int dia;
int mes;
int ano;
} data;
typedef struct {
data nascimento;
long cpf;
char nome[30];
} pessoa;
void imprime_pessoa(pessoa p)
{
printf("%-30s %02d/%02d/%04d %11ld\n",
p.nome,
p.nascimento.dia,
p.nascimento.mes,
p.nascimento.ano,
p.cpf
);
}
void imprime_cadastro(int n, pessoa cad[n])
{
printf("%-30s Nasc CPF\n", "Nome");
for (int i=0; i<n; i++) {
imprime_pessoa(cad[i]);
}
}
bool gaucho(long cpf)
{
// é gaucho se o antepenultimo digito do cpf for 0
if ((cpf / 100) % 10 == 0) {
return true;
} else {
return false;
}
}
void imprime_gauchos(int n, pessoa cad[n])
{
printf("Gauchos no cadastro\n");
printf("%-30s Nasc CPF\n", "Nome");
for (int i=0; i<n; i++) {
if (gaucho(cad[i].cpf)) {
imprime_pessoa(cad[i]);
}
}
}
int le_cadastro(pessoa cadastros[], char nome[])
{
FILE *arquivo;
int numero_de_cadastros = 0;
arquivo = fopen(nome, "r");
if (arquivo == NULL) {
return 0;
}
for(int i = 0; i < N_PESSOAS; i++)
{
fscanf(arquivo, "%d %d %d %ld ",
&cadastros[i].nascimento.dia,
&cadastros[i].nascimento.mes,
&cadastros[i].nascimento.ano,
&cadastros[i].cpf
);
fgets(cadastros[i].nome, 30, arquivo);
if (feof(arquivo)) {
break;
}
int ult_pos = strlen(cadastros[i].nome)-1;
if (cadastros[i].nome[ult_pos]=='\n'){
cadastros[i].nome[ult_pos]='\0';
}
numero_de_cadastros++;
}
fclose(arquivo);
return numero_de_cadastros;
}
int main()
{
pessoa cad[N_PESSOAS];
int n_pessoas;
n_pessoas = le_cadastro(cad, "cadastro");
//imprime_cadastro(n_pessoas, cad);
imprime_gauchos(n_pessoas, cad);
imprime_gaucho_mais_velho(n_pessoas, cad);
return 0;
}
- Complemente o programa acima, implementando a função faltante, que imprime o gaúcho mais velho.
- A função que imprime uma pessoa recebe como argumento um registro de uma pessoa. Em uma situação semelhante, em que uma função dcomo essa seja usada um grande número de vezes, e com um registro grande, essa solução pode se tornar um gargalo de desempenho. Uma alternativa seria passar para a função um ponteiro para o registro que se quer imprimir, e não o registro inteiro. Altere o programa para que seja feito dessa maneira.
- A função de leitura do cadastro está muito longa, ela poderia ser simplificada com a adição de uma função para ler um registro. Você consegue fazer essa alteração?
- Na implementação acima, o cadastro de pessoas está implementado como um vetor de registros, e deve ser mantido também uma variável avulsa contendo o número de registros nesse vetor. Ficaria mais encapsulado se tivéssemos um tipo "cadastro", que contém todas as informações a respeito do cadastro, isso permitiria também passar menos argumentos para as funções que recebem o cadastro inteiro, que atualmente estão recebendo 2 argumentos (número de elementos e vetor com os elementos), e poderiam receber um só (ponteiro para o registro contendo todo o cadastro). Que tal alterar isso?
- Faça um programa para imprimir os aniversariantes do mês informado pelo usuário (do cadastro acima). O programa deve imprimir o título no início ("Aniversariantes de Julho", por exemplo), e depois uma linha para cada dia, com o dia e o primeiro nome de cada aniversariante daquele dia. Os dias sem aniversariante não devem ser impressos. A impressão deve ser feita em um arquivo em formato markdown do github (ou se preferir, em html).
- No arquivo de cadastro, o nome da pessoa está colocado por último em cada linha. Você consegue identificar um motivo para isso? Seria necessário modificar muita coisa caso se quisesse colocar o nome antes? E se o cadastro tivesse dois nomes (por exemplo, o nome da rua, caso tivesse também o endereço)?
- Faça um função que lê para um vetor de registros as informações de uma turma de alunos, a partir de um arquivo. O arquivo contém informações de cada aluno em uma linha, com o número de matrícula, 5 notas de trabalhos, duas notas de provas e o nome do aluno. O registro de um aluno deve ter todos esses valores e ainda a nota média do aluno e seu estado (se aprovado ou em exame). Faça uma função que calcula a nota média e o estado de cada aluno. A nota média é a média entre a média das notas de trabalhos e as duas notas de provas. Se a nota média for 7 ou mais, o aluno está aprovado, senão está em exame. Faça uma função que imprime a turma toda, outra que imprime os aprovados, outra ainda que imprime os alunos em exame e outra que imprime o melhor (em nota) aluno da turma. Faça um programa que use essas funções para ler o cadastro e depois permite ao usuário escolher uma das listagens.