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.
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>
#include <stdlib.h>
#include <string.h>
#define MAX_ALUNOS 70
#define MAX_NOTAS 5
#define MAX_NOME 50
#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 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;
}
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;
}