Skip to content

Latest commit

 

History

History
169 lines (151 loc) · 7.18 KB

18.md

File metadata and controls

169 lines (151 loc) · 7.18 KB

Exercícios de registros

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;
}

Exercícios

  1. Complemente o programa acima, implementando a função faltante, que imprime o gaúcho mais velho.
  2. 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.
  3. 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?
  4. 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?
  5. 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).
  6. 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)?
  7. 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.