(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 n 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 n digitado pelo usuário.
Importante: a primeira linha do arquivo deve conter o valor de n 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

Passo 1

Então, o que o exercício pede é: a gente tem que criar um tipo em C chamado Aluno que guarde nome (string de até 50), nota (float) e frequência (int). Depois, o programa vai pedir ao usuário quantos alunos ( n) ele quer cadastrar, alocar dinamicamente um vetor de Aluno de tamanho n, 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 n, 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:
  • 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 for de 0 até n-1 e, pra cada índice 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 n, 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 ao printf, mas manda a saída pro arquivo.
  • É importante fechar o arquivo com fclose e liberar a memória com free.

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;
}

Exercícios relacionados