Faça um programa que leia o arquivo texto cadastro.txt, gravado no exercício anterior, e grave os registros em um vetor. Este programa deverá permitir inúmeras pesquisas ao vetor através do CPF, finalizando quando o usuário digitar um CPF negativo.
7) Elabore um programa que leia dois arquivos texto (cod.txt e nome.txt) contendo, respectivamente, os códigos de matrícula e os nomes dos alunos de Processamento de Dados; e gere um vetor com os dados dos alunos. Ao final, o vetor deve ser ordenado:
a) pela matrícula (utilizar o método bubble sort), e gravado no arquivo binário cod.bin; e
b) pelo nome (utilizar o método insertion sort), e gravado no arquivo binário nome.bin.

Passo 1

Não é possível implementar o primeiro programa (pesquisa por CPF) porque não foi fornecido o formato exato dos registros no arquivo cadastro.txt, logo não há como saber quais campos e em que ordem lê-los.

Passo 2

Para o segundo exercício, vamos criar um tipo estruturado para armazenar matrícula e nome do aluno e seguir estes passos para ler, ordenar e gravar os dados:
Definir o struct Aluno com um inteiro código e uma string nome.

Passo 3

Abrir cod.txt só para contar quantos códigos existem (número de linhas) e alocar dinamicamente um vetor de Aluno com esse tamanho.
Reabrir cod.txt e abrir nome.txt simultaneamente. Fazer um loop de 0 até n–1 para ler cada código com fscanf em v[i].codigo e cada nome com fgets em v[i].nome, removendo o ‘\n’.

Passo 4

Aplicar Bubble Sort no vetor para ordenar por v[i].codigo em ordem crescente: trocar structs inteiros sempre que o código estiver fora de ordem.

Passo 5

Abrir (ou recriar) cod.bin em modo binário de escrita e gravar o vetor todo usando fwrite.

Passo 6

Aplicar Insertion Sort no mesmo vetor, agora trocando com base em strcmp(v[j].nome, chave.nome) para ordenar alfabeticamente por nome.

Passo 7

Abrir (ou recriar) nome.bin em modo binário de escrita e gravar o vetor todo usando fwrite.

Passo 8

Liberar a memória alocada e fechar todos os arquivos.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int codigo;
char nome[100];
} Aluno;
int main(void) {
FILE *fcod, *fnome, *fbout;
int n = 0, capacity;
Aluno *v;
int tempCode;
// Contar quantos registros existem em cod.txt
fcod = fopen("cod.txt", "r");
if (!fcod) {
    perror("Erro ao abrir cod.txt");
    return EXIT_FAILURE;
}
while (fscanf(fcod, "%d", &tempCode) == 1) {
    n++;
}
fclose(fcod);

capacity = n;
v = malloc(capacity * sizeof(Aluno));
if (!v) {
    perror("Falha na alocação");
    return EXIT_FAILURE;
}

// Ler códigos e nomes
fcod = fopen("cod.txt", "r");
fnome = fopen("nome.txt", "r");
if (!fcod || !fnome) {
    perror("Erro ao abrir arquivos de entrada");
    free(v);
    return EXIT_FAILURE;
}
for (int i = 0; i < n; i++) {
    fscanf(fcod, "%d", &v[i].codigo);
    // ler nome inteiro da linha
    fgets(v[i].nome, sizeof(v[i].nome), fnome);
    // remover o '\n' final, se presente
    size_t len = strlen(v[i].nome);
    if (len > 0 && v[i].nome[len-1] == '\n')
        v[i].nome[len-1] = '\0';
}
fclose(fcod);
fclose(fnome);

// Ordenação por matrícula (Bubble Sort)
for (int i = 0; i < n - 1; i++) {
    for (int j = 0; j < n - 1 - i; j++) {
        if (v[j].codigo > v[j+1].codigo) {
            Aluno tmp = v[j];
            v[j] = v[j+1];
            v[j+1] = tmp;
        }
    }
}

// Gravar em cod.bin
fbout = fopen("cod.bin", "wb");
if (!fbout) {
    perror("Erro ao criar cod.bin");
    free(v);
    return EXIT_FAILURE;
}
fwrite(v, sizeof(Aluno), n, fbout);
fclose(fbout);

// Ordenação por nome (Insertion Sort)
for (int i = 1; i < n; i++) {
    Aluno chave = v[i];
    int j = i - 1;
    while (j >= 0 && strcmp(v[j].nome, chave.nome) > 0) {
        v[j+1] = v[j];
        j--;
    }
    v[j+1] = chave;
}

// Gravar em nome.bin
fbout = fopen("nome.bin", "wb");
if (!fbout) {
    perror("Erro ao criar nome.bin");
    free(v);
    return EXIT_FAILURE;
}
fwrite(v, sizeof(Aluno), n, fbout);
fclose(fbout);

free(v);
return EXIT_SUCCESS;
}

Exercícios relacionados