(4) Crie um novo tipo chamado Aluno para representar um aluno. Leia o nome (string de tamanho máximo 50), nota (float) e percentual de frequência (int) de
alunos e armazene estes dados em um arquivo texto, com o nome “alunos.txt”.
Utilize alocação dinâmica para criar um vetor de tamanho
digitado pelo usuário.
Importante: a primeira linha do arquivo deve conter o valor de
e as linhas seguintes devem conter os dados dos alunos (um aluno por linha) separados com um espaço simples.
Exemplo de um arquivo:
Exemplo de execução:
Exemplo de entrada:
Informe a quantidade de alunos: 3
Nome do aluno 1: Maria
Nota do aluno 1: 10
Frequencia do aluno 1: 100
Nome do aluno 2: João
Nota do aluno 2: 5.2
Frequencia do aluno 2: 65
Nome do aluno 3: Jose
Nota do aluno 3: 8.9
Frequencia do aluno 3: 70
Exemplo de saída:
alunos.txt
3
Maria 10.0100
João 5.265
José 8.970
Utilize alocação dinâmica para criar um vetor de tamanho
Importante: a primeira linha do arquivo deve conter o valor de
Exemplo de um arquivo:
Exemplo de execução:
Nome do aluno 1: Maria
Nota do aluno 1: 10
Frequencia do aluno 1: 100
Nome do aluno 2: João
Nota do aluno 2: 5.2
Frequencia do aluno 2: 65
Nome do aluno 3: Jose
Nota do aluno 3: 8.9
Frequencia do aluno 3: 70
3
Maria 10.0100
João 5.265
José 8.970
Passo 1
Então, o que o exercício pede é: a gente tem que criar um tipo em C chamado ) ele quer cadastrar, alocar dinamicamente um vetor de , ler os dados de cada um e, por fim, gravar tudo num arquivo texto chamado alunos.txt. Na primeira linha do arquivo vai o valor de
, e depois cada aluno em uma linha, com nome, nota e frequência separados por espaço.
Conteúdo da matéria que vamos usar:
Aluno
que guarde nome (string de até 50), nota (float) e frequência (int). Depois, o programa vai pedir ao usuário quantos alunos (
Aluno
de tamanho
Conteúdo da matéria que vamos usar:
- struct em C, para agrupar nome, nota e frequência
- malloc/
free
para alocação dinâmica de memória - fopen, fprintf, fclose para escrever em arquivo
Passo 2
Primeiro, vamos definir o tipo
Aluno
. Em C, a gente usa struct
para juntar vários campos:typedef struct {
char nome[51]; // +1 para o '\0'
float nota;
int frequencia;
} Aluno;
Teoria aplicada:
struct
é um “pacote” de variáveis de tipos diferentes. O typedef
só dá um apelido pra esse pacote, pra gente usar Aluno
em vez de struct Aluno
.Passo 3
Agora, precisamos saber quantos alunos o usuário quer cadastrar. A gente lê um inteiro
n
e, em seguida, usa malloc
pra criar um vetor de Aluno
com n
posições:int n;
printf("Informe a quantidade de alunos: ");
scanf("%d", &n);
// Aloca dinamicamente um vetor de n Aluno
Aluno *v = (Aluno *) malloc(n * sizeof(Aluno));
if (v == NULL) {
printf("Erro de alocação!\n");
return 1;
}
Teoria aplicada:
malloc
devolve um ponteiro para um bloco de memória bruto. A gente converte pra Aluno *
. Se não tiver memória, malloc
retorna NULL
.Passo 4
Com o vetor em mãos, vamos ler os dados de cada aluno. A gente faz um e, pra cada índice
for
de 0 até
i
, pergunta nome, nota e frequência:for (int i = 0; i < n; i++) {
printf("Nome do aluno %d: ", i+1);
scanf(" %50[^\n]", v[i].nome);
printf("Nota do aluno %d: ", i+1);
scanf("%f", &v[i].nota);
printf("Frequencia do aluno %d: ", i+1);
scanf("%d", &v[i].frequencia);
}
Teoria aplicada: no
scanf(" %50[^\n]", ...)
a gente garante que o nome lê até 50 caracteres ou até o usuário apertar Enter. O espaço antes do %
descarta eventuais “quebras de linha” que ficaram no buffer.Passo 5
Terminada a leitura, vamos abrir o arquivo alunos.txt e gravar. Primeiro colocamos a linha com
, depois cada aluno em uma linha com
fprintf
:FILE *fp = fopen("alunos.txt", "w");
if (fp == NULL) {
printf("Erro ao criar o arquivo!\n");
free(v);
return 1;
}
fprintf(fp, "%d\n", n);
for (int i = 0; i < n; i++) {
fprintf(fp, "%s %.2f %d\n",
v[i].nome,
v[i].nota,
v[i].frequencia);
}
fclose(fp);
Teoria aplicada:
fopen
com modo"w"
cria (ou sobrescreve) o arquivo.fprintf
funciona igual aoprintf
, mas manda a saída pro arquivo.- É importante fechar o arquivo com
fclose
e liberar a memória comfree
.
Resposta
#include <stdio.h>
#include <stdlib.h>
typedef struct {
char nome[51];
float nota;
int frequencia;
} Aluno;
int main() {
int n;
printf("Informe a quantidade de alunos: ");
scanf("%d", &n);
Aluno *v = (Aluno *) malloc(n * sizeof(Aluno));
if (v == NULL) {
printf("Erro de alocação!\n");
return 1;
}
for (int i = 0; i < n; i++) {
printf("Nome do aluno %d: ", i+1);
scanf(" %50[^\n]", v[i].nome);
printf("Nota do aluno %d: ", i+1);
scanf("%f", &v[i].nota);
printf("Frequencia do aluno %d: ", i+1);
scanf("%d", &v[i].frequencia);
}
FILE *fp = fopen("alunos.txt", "w");
if (fp == NULL) {
printf("Erro ao criar o arquivo!\n");
free(v);
return 1;
}
fprintf(fp, "%d\n", n);
for (int i = 0; i < n; i++) {
fprintf(fp, "%s %.2f %d\n",
v[i].nome,
v[i].nota,
v[i].frequencia);
}
fclose(fp);
free(v);
return 0;
}