Crie um programa que receba como entrada o número de alunos de uma disciplina. Aloque dinamicamente dois vetores para armazenar as informações a respeito desses alunos. O primeiro vetor contém o nome dos alunos e o segundo contém suas notas finais. Crie um arquivo que armazene, a cada linha, o nome do aluno e sua nota final. Use nomes com no máximo 40 caracteres. Se o nome não contém 40 caracteres, complete com espaço em branco.
Passo 1
O programa vai receber do usuário o número de alunos n e criar dinamicamente dois vetores: um para armazenar n nomes (cada nome com exatamente 40 caracteres) e outro para armazenar n notas finais.
Passo 2
Para garantir nomes de 40 caracteres, vamos armazená-los num bloco contíguo de memória: char (*nomes)[40] = malloc(n * sizeof *nomes); e as notas num vetor double *notas = malloc(n * sizeof *notas).
Passo 3
No loop de leitura, usamos fgets para ler o nome num buffer temporário, removemos o ‘\n’, copiamos até 40 caracteres para nomes[i] e, se faltar, preenchemos com espaços em branco.
Ainda no mesmo loop, lemos a nota final com scanf e armazenamos em notas[i].
Ainda no mesmo loop, lemos a nota final com scanf e armazenamos em notas[i].
Passo 4
Depois de ler todos os dados, abrimos um arquivo texto em modo escrita: FILE *fp = fopen(“dados.txt”,“w”); e testamos se fp != NULL.
Passo 5
Fazemos outro loop de 0 a n–1 e em cada iteração fazemos
Assim o nome sai alinhado à esquerda num campo de 40 caracteres preenchido com espaços.
Passo 6
Por fim, fechamos o arquivo com fclose(fp) e liberamos a memória com free(nomes) e free(notas).
Resposta
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
int n;
printf(“Número de alunos: “);
if (scanf(”%d”, &n) != 1 || n <= 0) {
fprintf(stderr, “Entrada inválida\n”);
return 1;
}
int n;
printf(“Número de alunos: “);
if (scanf(”%d”, &n) != 1 || n <= 0) {
fprintf(stderr, “Entrada inválida\n”);
return 1;
}
// aloca dinamicamente nomes e notas
char (*nomes)[40] = malloc(n * sizeof *nomes);
double *notas = malloc(n * sizeof *notas);
if (!nomes || !notas) {
fprintf(stderr, "Falha na alocação\n");
free(nomes);
free(notas);
return 1;
}
// limpa buffer depois do scanf
getchar();
for (int i = 0; i < n; i++) {
char buffer[100];
printf("Nome do aluno %d: ", i + 1);
if (!fgets(buffer, sizeof buffer, stdin)) {
fprintf(stderr, "Erro na leitura do nome\n");
return 1;
}
// remove '\n' se houver
buffer[strcspn(buffer, "\n")] = '\0';
// copia até 40 chars e preenche com espaços
size_t len = strlen(buffer);
if (len >= 40) {
memcpy(nomes[i], buffer, 40);
} else {
memcpy(nomes[i], buffer, len);
memset(nomes[i] + len, ' ', 40 - len);
}
printf("Nota final do %s: ", buffer);
if (scanf("%lf", ¬as[i]) != 1) {
fprintf(stderr, "Erro na leitura da nota\n");
return 1;
}
getchar(); // limpa '\n' do buffer de entrada
}
// cria arquivo e escreve dados
FILE *fp = fopen("dados.txt", "w");
if (!fp) {
fprintf(stderr, "Não foi possível criar o arquivo\n");
free(nomes);
free(notas);
return 1;
}
for (int i = 0; i < n; i++) {
// %-40s alinha à esquerda em campo de 40 e completa com espaços
fprintf(fp, "%-40s %.2f\n", nomes[i], notas[i]);
}
fclose(fp);
free(nomes);
free(notas);
printf("Dados gravados em dados.txt\n");
return 0;
}