Faça um programa que leia o arquivo texto agenda.txt, contendo o CPF, nome e telefone de no máximo 1000 pessoas e grave-o em um vetor. Após a leitura, o programa deverá ordenar este vetor através do método select sort e gravá-lo no arquivo texto cadastro.txt.
Passo 1
O enunciado pede um programa que leia até 1000 registros (CPF, nome, telefone) de um arquivo “agenda.txt”, armazene esses registros em um vetor, ordene esse vetor usando Selection Sort e grave o resultado em “cadastro.txt”. O conteúdo envolve manipulação de arquivo, uso de struct/vetor e algoritmo de ordenação Selection Sort.
Passo 2
Definimos uma struct para armazenar cada registro e um vetor de até 1000 elementos. Algo assim em C:
typedef struct {
char cpf[12]; // 11 dígitos + '\0'
char nome[100]; // tamanho máximo do nome
char tel[20]; // tamanho máximo do telefone
} Pessoa;
Pessoa agenda[1000];
int n = 0; // contador de registros lidos
Passo 3
Abrimos o arquivo “agenda.txt” em modo de leitura e fazemos um laço até EOF ou até chegarmos a 1000 registros. Para cada linha, usamos fscanf ou fgets+sscanf para ler CPF, nome e telefone, incrementando
n
. Exemplo:FILE *fin = fopen("agenda.txt", "r");
while (n < 1000 && fscanf(fin, "%11s %99[^
] %19s", agenda[n].cpf, agenda[n].nome, agenda[n].tel) == 3) {
n++;
}
fclose(fin);
Passo 4
Aplicamos Selection Sort sobre o vetor
agenda
, comparando os CPFs como strings. A cada iteração i, encontramos o menor CPF no subvetor i..n-1
, trocamos com a posição i
.for (int i = 0; i < n-1; i++) {
int min_idx = i;
for (int j = i+1; j < n; j++) {
if (strcmp(agenda[j].cpf, agenda[min_idx].cpf) < 0) {
min_idx = j;
}
}
if (min_idx != i) {
Pessoa tmp = agenda[i];
agenda[i] = agenda[min_idx];
agenda[min_idx] = tmp;
}
}
Passo 5
Após a ordenação, abrimos “cadastro.txt” em modo de escrita e gravamos todos os registros ordenados, imprimindo CPF, nome e telefone em cada linha.
FILE *fout = fopen("cadastro.txt", "w");
for (int i = 0; i < n; i++) {
fprintf(fout, "%s %s %s\n", agenda[i].cpf, agenda[i].nome, agenda[i].tel);
}
fclose(fout);
Resposta
#include <stdio.h>
#include <string.h>
#include <string.h>
#define MAXP 1000
typedef struct {
char cpf[12]; // 11 dígitos + ‘\0’
char nome[100]; // nome até 99 chars
char tel[20]; // telefone até 19 chars
} Pessoa;
char cpf[12]; // 11 dígitos + ‘\0’
char nome[100]; // nome até 99 chars
char tel[20]; // telefone até 19 chars
} Pessoa;
int main() {
Pessoa agenda[MAXP];
int n = 0;
FILE *fin = fopen(“agenda.txt”, “r”);
if (!fin) {
perror(“Erro ao abrir agenda.txt”);
return 1;
}
Pessoa agenda[MAXP];
int n = 0;
FILE *fin = fopen(“agenda.txt”, “r”);
if (!fin) {
perror(“Erro ao abrir agenda.txt”);
return 1;
}
// Leitura dos registros
while (n < MAXP && fscanf(fin, "%11s %99[^
] %19s", agenda[n].cpf, agenda[n].nome, agenda[n].tel) == 3) {
n++;
}
fclose(fin);
n++;
}
fclose(fin);
// Selection Sort pelo CPF
for (int i = 0; i < n-1; i++) {
int min_idx = i;
for (int j = i+1; j < n; j++) {
if (strcmp(agenda[j].cpf, agenda[min_idx].cpf) < 0) {
min_idx = j;
}
}
if (min_idx != i) {
Pessoa tmp = agenda[i];
agenda[i] = agenda[min_idx];
agenda[min_idx] = tmp;
}
}
// Gravação dos registros ordenados
FILE *fout = fopen("cadastro.txt", "w");
if (!fout) {
perror("Erro ao criar cadastro.txt");
return 1;
}
for (int i = 0; i < n; i++) {
fprintf(fout, "%s %s %s\n", agenda[i].cpf, agenda[i].nome, agenda[i].tel);
}
fclose(fout);
return 0;
}