Faça um programa que recebe como entrada o nome de um arquivo de entrada e o nome de um arquivo de saída. O arquivo de entrada contém o nome de um aluno ocupando 40 caracteres e três inteiros que indicam suas notas. O programa deverá ler o arquivo de entrada e gerar um arquivo de saída onde aparece o nome do aluno e as suas notas em ordem crescente.
Passo 1
O programa recebe dois parâmetros: o nome do arquivo de entrada e o nome do arquivo de saída. No arquivo de entrada há o nome do aluno ocupando exatamente 40 caracteres (incluindo espaços) e depois três inteiros que são as notas. Vamos usar conceitos de abertura de arquivo, leitura de string, leitura de inteiros e um algoritmo simples de ordenação.
Passo 2
Abrir o arquivo de entrada em modo leitura (“r”). Verificar se a abertura foi bem-sucedida.
Ler os 40 caracteres do nome do aluno. Em C podemos usar fgets(buffer, 41, fp) ou fread para garantir os 40 caracteres, depois remover o ‘\n’ se houver.
Ler as três notas com fscanf(fp, “%d %d %d”, &n1, &n2, &n3).
Ler os 40 caracteres do nome do aluno. Em C podemos usar fgets(buffer, 41, fp) ou fread para garantir os 40 caracteres, depois remover o ‘\n’ se houver.
Ler as três notas com fscanf(fp, “%d %d %d”, &n1, &n2, &n3).
Passo 3
Colocar as três notas em um vetor de tamanho 3 e aplicar um método de ordenação simples (por exemplo, bubble sort) para colocar em ordem crescente.
Passo 4
Abrir o arquivo de saída em modo escrita (“w”). Verificar se a abertura foi bem-sucedida.
Escrever no arquivo de saída o nome do aluno e, em seguida, as três notas já ordenadas, separadas por espaço ou cada uma em uma linha, conforme requisito.
Fechar ambos os arquivos e terminar o programa.
Escrever no arquivo de saída o nome do aluno e, em seguida, as três notas já ordenadas, separadas por espaço ou cada uma em uma linha, conforme requisito.
Fechar ambos os arquivos e terminar o programa.
Resposta
#include <stdio.h>
#include <string.h>
#include <string.h>
int main(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, “Uso: %s <arquivo_entrada> <arquivo_saida>\n”, argv[0]);
return 1;
}
if (argc != 3) {
fprintf(stderr, “Uso: %s <arquivo_entrada> <arquivo_saida>\n”, argv[0]);
return 1;
}
FILE *fin = fopen(argv[1], "r");
if (!fin) {
perror("Erro ao abrir arquivo de entrada");
return 1;
}
char nome[41];
int notas[3];
// Lê os 40 caracteres do nome (mais o terminador) e garante a string correta
if (fgets(nome, sizeof(nome), fin) == NULL) {
fprintf(stderr, "Erro ao ler o nome\n");
fclose(fin);
return 1;
}
// Remove possível '\n' no final
nome[strcspn(nome, "\n")] = '\0';
// Lê as três notas
if (fscanf(fin, "%d %d %d", ¬as[0], ¬as[1], ¬as[2]) != 3) {
fprintf(stderr, "Erro ao ler as notas\n");
fclose(fin);
return 1;
}
fclose(fin);
// Ordenação simples (bubble sort)
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2 - i; j++) {
if (notas[j] > notas[j+1]) {
int tmp = notas[j];
notas[j] = notas[j+1];
notas[j+1] = tmp;
}
}
}
FILE *fout = fopen(argv[2], "w");
if (!fout) {
perror("Erro ao abrir arquivo de saída");
return 1;
}
// Escreve nome e notas ordenadas
fprintf(fout, "%s\n", nome);
fprintf(fout, "%d %d %d\n", notas[0], notas[1], notas[2]);
fclose(fout);
return 0;
}