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).

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.

Resposta

#include <stdio.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;
}
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", &notas[0], &notas[1], &notas[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;
}

Exercícios relacionados