(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/
freepara 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:
fopencom modo"w"cria (ou sobrescreve) o arquivo.fprintffunciona igual aoprintf, mas manda a saída pro arquivo.- É importante fechar o arquivo com
fclosee 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;
}