- Construa um programa que leia um arquivo texto, cujo nome é passado como parâmetro de entrada, e carregue um vetor de registros de no máximo 100 registros com o seguinte formato:
- Matrícula: um número inteiro;
- Nome: uma string com no máximo 50 caracteres
- Sexo: somente o código de referência (F - Feminino ou M - Masculino)
- CPF: um número inteiro (deverá ser usado um inteiro longo - long int);
- Curso: uma string com no máximo 30 caracteres
- Telefone: uma string com no máximo 20 caracteres
OBS: Caso o arquivo não exista, deve-se continuar o programa com o vetor vazio.
Após a leitura, o programa deverá apresentar um menu com as seguintes opções: inclusão, consulta, exclusão e fim do programa. De acordo com a opção escolhida pelo usuário (opções inválidas devem ser tratadas), deve-se realizar os seguintes procedimentos:
a) Inclusão:
- Solicitar ao usuário uma nova matrícula.
- Verificar se a matrícula digitada já existe. Se existir, emitir uma mensagem explicativa e voltar ao passo anterior. Caso contrário, permitir o cadastro do novo aluno.
- Verificar se o usuário deseja cadastrar um novo registro. Se afirmativo, repetir os passos anteriores. Caso contrário, encerrar o módulo e retornar ao menu.
b) Consulta:
- Solicitar ao usuário a matrícula desejada.
- Verificar se a matrícula digitada já existe. Se existir, mostrar todos os dados do aluno (o sexo deve ser apresentado por extenso). Caso contrário, emitir uma mensagem explicativa de registro inexistente.
- Verificar se o usuário deseja realizar uma nova consulta. Se afirmativo, repetir os passos anteriores. Caso contrário, encerrar o módulo e retornar ao menu.
c) Exclusão:
- Solicitar ao usuário a matrícula desejada.
- Verificar se a matrícula digitada já existe. Se não existir, emitir uma mensagem explicativa de registro inexistente. Caso contrário, mostrar todos os dados do aluno (o sexo deve ser apresentado por extenso) e solicitar a confirmação da exclusão. Se confirmada, remover o registro. Se não, ir para o próximo passo.
- Verificar se o usuário deseja remover outro registro. Se sim, repetir os passos anteriores. Caso contrário, encerrar o módulo e retornar ao menu.
OBS: Remover um registro consiste em deslocar para esquerda todos registros subseqüentes e decrementar a quantidade de registros.
d) Fim do Programa:
- Ordenar o vetor de registros em ordem crescente (utilizar o método quicksort).
- Gravar o vetor ordenado no arquivo passado como parâmetro de entrada do programa. Se ele já existir, deve ser substituído. Senão, deve ser criado.
- Encerra-se o programa
Após a leitura, o programa deverá apresentar um menu com as seguintes opções: inclusão, consulta, exclusão e fim do programa. De acordo com a opção escolhida pelo usuário (opções inválidas devem ser tratadas), deve-se realizar os seguintes procedimentos:
a) Inclusão:
b) Consulta:
c) Exclusão:
d) Fim do Programa:
Passo 1
O enunciado pede um programa em C para gerenciar até 100 alunos, lendo e escrevendo num arquivo texto passado por parâmetro, com operações de inclusão, consulta, exclusão e, ao final, ordenação por matrícula (quicksort) e gravação.
Passo 2
Definimos uma struct Aluno com os campos indicados e um vetor global de no máximo 100 elementos, além de variáveis de quantidade atual.
Passo 3
Implementamos a função carregarArquivo(nomeArquivo) que tenta abrir o arquivo; se falhar, deixa o vetor vazio; se der certo, lê linha a linha (formato matricula;nome;sexo;cpf;curso;telefone) usando fgets+sscanf até EOF ou 100 registros.
Passo 4
Implementamos a função salvarArquivo(nomeArquivo) que abre o arquivo para escrita (cria ou substitui), usa quicksort para ordenar o vetor por matrícula e grava cada aluno num mesmo formato de texto.
Passo 5
Escrevemos a função buscarIndice(matricula) que faz busca linear no vetor e retorna o índice ou -1 se não encontrar.
Passo 6
Montamos o loop do menu principal, lendo uma opção do usuário e validando-a. Em caso de opção inválida, repetimos.
Passo 7
Para inclusão repetimos: solicitamos matrícula, conferimos com buscarIndice; se existir, avisamos e pedimos outra; se não existir, lemos os demais campos (nome, sexo, cpf, curso, telefone) e adicionamos no vetor incrementando a contagem; depois perguntamos se quer novo cadastro.
Passo 8
Para consulta repetimos: solicitamos matrícula, usamos buscarIndice; se encontrar, exibimos todos os campos (sexo ‘F’->“Feminino” ou ‘M’->“Masculino”); caso contrário, avisamos; depois perguntamos se quer nova consulta.
Passo 9
Para exclusão repetimos: solicitamos matrícula, buscamos; se não achar, avisamos; se achar, exibimos dados e pedimos confirmação (‘S’ ou ‘N’); se confirmar, fazemos um loop de deslocamento à esquerda dos registros subsequentes e decrementamos a contagem; depois perguntamos se quer excluir outro.
Passo 10
Na saída do laço do menu (opção fim) chamamos salvarArquivo e encerramos o programa.
Passo 11
No final, reunimos tudo num só arquivo .c com tratamento básico de erros, funções auxiliares e main que processa argv para obter o nome do arquivo.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ALUNOS 100
typedef struct {
int matricula;
char nome[51];
char sexo; // ‘F’ ou ‘M’
long int cpf;
char curso[31];
char telefone[21];
} Aluno;
int matricula;
char nome[51];
char sexo; // ‘F’ ou ‘M’
long int cpf;
char curso[31];
char telefone[21];
} Aluno;
Aluno alunos[MAX_ALUNOS];
int nAlunos = 0;
int nAlunos = 0;
int buscarIndice(int matricula) {
for (int i = 0; i < nAlunos; i++) {
if (alunos[i].matricula == matricula)
return i;
}
return -1;
}
for (int i = 0; i < nAlunos; i++) {
if (alunos[i].matricula == matricula)
return i;
}
return -1;
}
void carregarArquivo(const char *nomeArquivo) {
FILE *fp = fopen(nomeArquivo, “r”);
if (!fp) {
// arquivo não existe: vetor vazio
nAlunos = 0;
return;
}
char linha[200];
nAlunos = 0;
while (fgets(linha, sizeof(linha), fp) && nAlunos < MAX_ALUNOS) {
Aluno *a = &alunos[nAlunos];
// formato: mat;nome;sexo;cpf;curso;telefone\n
if (sscanf(linha, “%d;%50[;];%c;%ld;%30[;];%20[^”]",
&a->matricula,
a->nome,
&a->sexo,
&a->cpf,
a->curso,
a->telefone) == 6) {
nAlunos++;
}
}
fclose(fp);
}
FILE *fp = fopen(nomeArquivo, “r”);
if (!fp) {
// arquivo não existe: vetor vazio
nAlunos = 0;
return;
}
char linha[200];
nAlunos = 0;
while (fgets(linha, sizeof(linha), fp) && nAlunos < MAX_ALUNOS) {
Aluno *a = &alunos[nAlunos];
// formato: mat;nome;sexo;cpf;curso;telefone\n
if (sscanf(linha, “%d;%50[;];%c;%ld;%30[;];%20[^”]",
&a->matricula,
a->nome,
&a->sexo,
&a->cpf,
a->curso,
a->telefone) == 6) {
nAlunos++;
}
}
fclose(fp);
}
void salvarArquivo(const char *nomeArquivo);
void quicksort(int esq, int dir) {
if (esq < dir) {
int i = esq, j = dir;
int pivo = alunos[(esq + dir) / 2].matricula;
while (i <= j) {
while (alunos[i].matricula < pivo) i++;
while (alunos[j].matricula > pivo) j–;
if (i <= j) {
Aluno tmp = alunos[i];
alunos[i] = alunos[j];
alunos[j] = tmp;
i++; j–;
}
}
if (esq < j) quicksort(esq, j);
if (i < dir) quicksort(i, dir);
}
}
void quicksort(int esq, int dir) {
if (esq < dir) {
int i = esq, j = dir;
int pivo = alunos[(esq + dir) / 2].matricula;
while (i <= j) {
while (alunos[i].matricula < pivo) i++;
while (alunos[j].matricula > pivo) j–;
if (i <= j) {
Aluno tmp = alunos[i];
alunos[i] = alunos[j];
alunos[j] = tmp;
i++; j–;
}
}
if (esq < j) quicksort(esq, j);
if (i < dir) quicksort(i, dir);
}
}
void salvarArquivo(const char *nomeArquivo) {
quicksort(0, nAlunos - 1);
FILE *fp = fopen(nomeArquivo, “w”);
if (!fp) {
printf(“Erro ao abrir arquivo para salvar.\n”);
return;
}
for (int i = 0; i < nAlunos; i++) {
Aluno *a = &alunos[i];
fprintf(fp, “%d;%s;%c;%ld;%s;%s\n”,
a->matricula,
a->nome,
a->sexo,
a->cpf,
a->curso,
a->telefone);
}
fclose(fp);
}
quicksort(0, nAlunos - 1);
FILE *fp = fopen(nomeArquivo, “w”);
if (!fp) {
printf(“Erro ao abrir arquivo para salvar.\n”);
return;
}
for (int i = 0; i < nAlunos; i++) {
Aluno *a = &alunos[i];
fprintf(fp, “%d;%s;%c;%ld;%s;%s\n”,
a->matricula,
a->nome,
a->sexo,
a->cpf,
a->curso,
a->telefone);
}
fclose(fp);
}
void incluir() {
char resp;
do {
int mat;
printf(“Digite a matrícula: “);
scanf(”%d”, &mat);
if (buscarIndice(mat) != -1) {
printf(“Matrícula já existe! Tente outra.\n”);
continue;
}
if (nAlunos >= MAX_ALUNOS) {
printf(“Vetor cheio. Não é possível incluir mais.\n”);
break;
}
Aluno *a = &alunos[nAlunos];
a->matricula = mat;
printf("Nome: ");
getchar(); fgets(a->nome, sizeof(a->nome), stdin);
a->nome[strcspn(a->nome, “\n”)] = ‘\0’;
printf(“Sexo (F/M): “);
scanf(” %c”, &a->sexo);
printf(“CPF: “);
scanf(”%ld”, &a->cpf);
printf("Curso: ");
getchar(); fgets(a->curso, sizeof(a->curso), stdin);
a->curso[strcspn(a->curso, “\n”)] = ‘\0’;
printf("Telefone: ");
fgets(a->telefone, sizeof(a->telefone), stdin);
a->telefone[strcspn(a->telefone, “\n”)] = ‘\0’;
nAlunos++;
printf(“Incluir outro? (S/N): “);
scanf(” %c”, &resp);
} while (resp == ‘S’ || resp == ‘s’);
}
char resp;
do {
int mat;
printf(“Digite a matrícula: “);
scanf(”%d”, &mat);
if (buscarIndice(mat) != -1) {
printf(“Matrícula já existe! Tente outra.\n”);
continue;
}
if (nAlunos >= MAX_ALUNOS) {
printf(“Vetor cheio. Não é possível incluir mais.\n”);
break;
}
Aluno *a = &alunos[nAlunos];
a->matricula = mat;
printf("Nome: ");
getchar(); fgets(a->nome, sizeof(a->nome), stdin);
a->nome[strcspn(a->nome, “\n”)] = ‘\0’;
printf(“Sexo (F/M): “);
scanf(” %c”, &a->sexo);
printf(“CPF: “);
scanf(”%ld”, &a->cpf);
printf("Curso: ");
getchar(); fgets(a->curso, sizeof(a->curso), stdin);
a->curso[strcspn(a->curso, “\n”)] = ‘\0’;
printf("Telefone: ");
fgets(a->telefone, sizeof(a->telefone), stdin);
a->telefone[strcspn(a->telefone, “\n”)] = ‘\0’;
nAlunos++;
printf(“Incluir outro? (S/N): “);
scanf(” %c”, &resp);
} while (resp == ‘S’ || resp == ‘s’);
}
void consultar() {
char resp;
do {
int mat;
printf(“Matrícula para consulta: “);
scanf(”%d”, &mat);
int idx = buscarIndice(mat);
if (idx == -1) {
printf(“Registro não encontrado.\n”);
} else {
Aluno *a = &alunos[idx];
printf(“Matrícula: %d\n”, a->matricula);
printf(“Nome: %s\n”, a->nome);
printf(“Sexo: %s\n”, (a->sexo==‘F’?“Feminino”:“Masculino”));
printf(“CPF: %ld\n”, a->cpf);
printf(“Curso: %s\n”, a->curso);
printf(“Telefone: %s\n”, a->telefone);
}
printf(“Consultar outro? (S/N): “);
scanf(” %c”, &resp);
} while (resp==‘S’ || resp==‘s’);
}
char resp;
do {
int mat;
printf(“Matrícula para consulta: “);
scanf(”%d”, &mat);
int idx = buscarIndice(mat);
if (idx == -1) {
printf(“Registro não encontrado.\n”);
} else {
Aluno *a = &alunos[idx];
printf(“Matrícula: %d\n”, a->matricula);
printf(“Nome: %s\n”, a->nome);
printf(“Sexo: %s\n”, (a->sexo==‘F’?“Feminino”:“Masculino”));
printf(“CPF: %ld\n”, a->cpf);
printf(“Curso: %s\n”, a->curso);
printf(“Telefone: %s\n”, a->telefone);
}
printf(“Consultar outro? (S/N): “);
scanf(” %c”, &resp);
} while (resp==‘S’ || resp==‘s’);
}
void excluir() {
char resp;
do {
int mat;
printf(“Matrícula para exclusão: “);
scanf(”%d”, &mat);
int idx = buscarIndice(mat);
if (idx == -1) {
printf(“Registro não encontrado.\n”);
} else {
Aluno *a = &alunos[idx];
printf(“Confirma exclusão do aluno %s? (S/N): “, a->nome);
scanf(” %c”, &resp);
if (resp==‘S’ || resp==‘s’) {
for (int j = idx; j < nAlunos-1; j++)
alunos[j] = alunos[j+1];
nAlunos–;
printf(“Registro excluído.\n”);
}
}
printf(“Excluir outro? (S/N): “);
scanf(” %c”, &resp);
} while (resp==‘S’ || resp==‘s’);
}
char resp;
do {
int mat;
printf(“Matrícula para exclusão: “);
scanf(”%d”, &mat);
int idx = buscarIndice(mat);
if (idx == -1) {
printf(“Registro não encontrado.\n”);
} else {
Aluno *a = &alunos[idx];
printf(“Confirma exclusão do aluno %s? (S/N): “, a->nome);
scanf(” %c”, &resp);
if (resp==‘S’ || resp==‘s’) {
for (int j = idx; j < nAlunos-1; j++)
alunos[j] = alunos[j+1];
nAlunos–;
printf(“Registro excluído.\n”);
}
}
printf(“Excluir outro? (S/N): “);
scanf(” %c”, &resp);
} while (resp==‘S’ || resp==‘s’);
}
int main(int argc, char *argv[]) {
if (argc != 2) {
printf(“Uso: %s <arquivo>\n”, argv[0]);
return 1;
}
const char *nomeArquivo = argv[1];
carregarArquivo(nomeArquivo);
int opc;
do {
printf("\n— Menu —\n");
printf(“1. Inclusão\n2. Consulta\n3. Exclusão\n4. Fim\n”);
printf(“Opção: “);
scanf(”%d”, &opc);
switch (opc) {
case 1: incluir(); break;
case 2: consultar(); break;
case 3: excluir(); break;
case 4: break;
default: printf(“Opção inválida. Tente novamente.\n”);
}
} while (opc != 4);
salvarArquivo(nomeArquivo);
printf(“Programa encerrado.\n”);
return 0;
}
if (argc != 2) {
printf(“Uso: %s <arquivo>\n”, argv[0]);
return 1;
}
const char *nomeArquivo = argv[1];
carregarArquivo(nomeArquivo);
int opc;
do {
printf("\n— Menu —\n");
printf(“1. Inclusão\n2. Consulta\n3. Exclusão\n4. Fim\n”);
printf(“Opção: “);
scanf(”%d”, &opc);
switch (opc) {
case 1: incluir(); break;
case 2: consultar(); break;
case 3: excluir(); break;
case 4: break;
default: printf(“Opção inválida. Tente novamente.\n”);
}
} while (opc != 4);
salvarArquivo(nomeArquivo);
printf(“Programa encerrado.\n”);
return 0;
}