Suponha que exista dois arquivos texto (nome.bin e notas.bin) contendo, respectivamente, o nome e as notas de 0 a 10 (no máximo 5 por aluno) de um grupo de 70 alunos. Em cada arquivo, antes do conteúdo existe um número inteiro seqüencial (de 1 a 70) que corresponde ao código do aluno. Desenvolva um programa que leia estes arquivos e preencha um vetor de registros. Após a leitura, este programa deverá calcular a média do aluno, considerando a quantidade de notas existentes, e apresentá-la juntamente com o conceito “APROVADO” ou “REPROVADO”.
OBS: O aluno é aprovado se sua média for maior ou igual a 6.

Passo 1

A questão pede que a gente leia dois arquivos binários – um com código e nome de cada aluno e outro com código, quantidade de notas e as notas – preencha um vetor de registros, calcule a média de cada aluno e exiba essa média junto com “APROVADO” ou “REPROVADO” (média ≥ 6 → aprovado). Vamos usar C para ilustrar.

Passo 2

Definimos um registro (struct) Aluno com campos: código (int), nome (vetor de char fixo), quantidade de notas (int), vetor de notas (float[5]), média (float) e conceito (char[10]).

Passo 3

Abrimos os dois arquivos com fopen em modo “rb” (leitura binária). Se algum fopen retornar NULL, abortamos com mensagem de erro.

Passo 4

Fazemos um laço de 70 iterações (pois são 70 alunos). A cada iteração:
  • lemos do nome.bin um inteiro (código) e depois um nome de tamanho fixo (por exemplo, 50 chars);
  • lemos do notas.bin um inteiro (deve ser o mesmo código, podemos ignorar conferência ou verificar se bate), em seguida lemos um inteiro n (quantidade de notas de 0 a 5), e então n floats (as notas).

Passo 5

Para cada aluno, somamos as notas lidas e calculamos a média: média = soma / n (assegurando n > 0). Se n for zero, definimos média = 0.

Passo 6

Comparamos a média com 6.0. Se média ≥ 6.0, atribuímos conceito = “APROVADO”, senão “REPROVADO”.

Passo 7

Por fim, percorremos o vetor e imprimimos para cada aluno: código, nome, média (com duas casas decimais) e conceito.

Passo 8

Segue o programa completo em C como resposta final.

Resposta

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ALUNOS 70
#define MAX_NOTAS 5
#define MAX_NOME 50
typedef struct {
int codigo;
char nome[MAX_NOME];
int nNotas;
float notas[MAX_NOTAS];
float media;
char conceito[10];
} Aluno;
int main() {
FILE *fnome = fopen(“nome.bin”, “rb”);
FILE *fnotas = fopen(“notas.bin”, “rb”);
if (!fnome || !fnotas) {
printf(“Erro ao abrir arquivos.\n”);
return 1;
}
Aluno v[MAX_ALUNOS];
int i;
for (i = 0; i < MAX_ALUNOS; i++) {
    int cod1, cod2;
    // lê código e nome
    if (fread(&cod1, sizeof(int), 1, fnome) != 1) break;
    fread(v[i].nome, sizeof(char), MAX_NOME, fnome);
    v[i].codigo = cod1;

    // lê código e notas
    fread(&cod2, sizeof(int), 1, fnotas);
    if (cod2 != cod1) {
        // opcional: verificar consistência
    }
    fread(&v[i].nNotas, sizeof(int), 1, fnotas);
    for (int j = 0; j < v[i].nNotas; j++) {
        fread(&v[i].notas[j], sizeof(float), 1, fnotas);
    }

    // calcula média
    if (v[i].nNotas > 0) {
        float soma = 0.0f;
        for (int j = 0; j < v[i].nNotas; j++) {
            soma += v[i].notas[j];
        }
        v[i].media = soma / v[i].nNotas;
    } else {
        v[i].media = 0.0f;
    }

    // define conceito
    if (v[i].media >= 6.0f)
        strcpy(v[i].conceito, "APROVADO");
    else
        strcpy(v[i].conceito, "REPROVADO");
}

fclose(fnome);
fclose(fnotas);

// exibe resultados
printf("Codigo | Nome                          | Media  | Situacao\n");
printf("----------------------------------------------------------\n");
for (int k = 0; k < i; k++) {
    printf("%6d | %-28s | %6.2f | %s\n",
           v[k].codigo,
           v[k].nome,
           v[k].media,
           v[k].conceito);
}

return 0;
}

Exercícios relacionados