Crie um programa que receba como entrada o número de alunos de uma disciplina. Aloque dinamicamente em uma estrutura para armazenar as informações a respeito desses alunos: nome do aluno e sua nota final. Use nomes com no máximo 40 caracteres. Em seguida, salve os dados dos alunos em um arquivo binário. Por fim, leia o arquivo e mostre o nome do aluno com a maior nota.
Passo 1
Resumo do problema: a gente precisa criar um programa em C que leia o número de alunos, aloque dinamicamente uma lista de structs contendo nome (até 40 caracteres) e nota final, salve esses dados em um arquivo binário, depois abra esse mesmo arquivo, percorra os registros e exiba o nome do aluno com a maior nota.
Passo 2
Definir a struct e as variáveis: vamos criar uma struct Aluno com campo nome de tamanho 41 (para caber o ‘\0’) e float nota. Também um ponteiro Aluno *vet para armazenar dinamicamente n alunos.
Passo 3
Leitura dos dados e alocação dinâmica: ler n, chamar malloc(n * sizeof *vet) e, em loop de 0 a n-1, usar scanf(" %40[^\n]", vet[i].nome) para ler o nome (trata espaço inicial) e scanf("%f", &vet[i].nota) para ler a nota.
Passo 4
Gravar no arquivo binário: abrir um FILE *fp em modo “wb”, chamar fwrite(vet, sizeof(Aluno), n, fp), fechar o arquivo e liberar a memória com free(vet).
Passo 5
Ler do arquivo binário e encontrar maior nota: reabrir o arquivo em “rb”, ler o primeiro registro em melhor, depois em loop ler cada registro em temp com fread e, se temp.nota > melhor.nota, copiar temp para melhor.
Passo 6
Mostrar resultado e encerrar: exibir melhor.nome no console e sair do programa. Fazer checagens de erro em alocação e abertura de arquivo.
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#define MAX_NAME 40
typedef struct {
char nome[MAX_NAME + 1];
float nota;
} Aluno;
char nome[MAX_NAME + 1];
float nota;
} Aluno;
int main() {
int n;
printf(“Digite o numero de alunos: “);
if (scanf(”%d”, &n) != 1 || n <= 0) {
fprintf(stderr, “Numero de alunos invalido\n”);
return 1;
}
int n;
printf(“Digite o numero de alunos: “);
if (scanf(”%d”, &n) != 1 || n <= 0) {
fprintf(stderr, “Numero de alunos invalido\n”);
return 1;
}
Aluno *vet = malloc(n * sizeof *vet);
if (!vet) {
fprintf(stderr, "Erro de memoria\n");
return 1;
}
for (int i = 0; i < n; i++) {
printf("Nome do aluno %d: ", i + 1);
scanf(" %40[^\n]", vet[i].nome);
printf("Nota do aluno %d: ", i + 1);
scanf("%f", &vet[i].nota);
}
FILE *fp = fopen("alunos.bin", "wb");
if (!fp) {
fprintf(stderr, "Erro ao abrir arquivo para escrita\n");
free(vet);
return 1;
}
fwrite(vet, sizeof(Aluno), n, fp);
fclose(fp);
free(vet);
fp = fopen("alunos.bin", "rb");
if (!fp) {
fprintf(stderr, "Erro ao abrir arquivo para leitura\n");
return 1;
}
Aluno melhor, temp;
if (fread(&melhor, sizeof(Aluno), 1, fp) != 1) {
fprintf(stderr, "Arquivo vazio ou erro de leitura\n");
fclose(fp);
return 1;
}
while (fread(&temp, sizeof(Aluno), 1, fp) == 1) {
if (temp.nota > melhor.nota) {
melhor = temp;
}
}
fclose(fp);
printf("Aluno com maior nota: %s\n", melhor.nome);
return 0;
}