Ir ao conteúdo
  • Cadastre-se

C Verifica a maior nota e o mais novo


NhemonF

Posts recomendados

Bom dia, galera!

Bom, estou com um problema neste programa. O objetivo é verificar a maior nota da Prova 1.

 

Algumas observações:

 - Em caso de empates na maior nota, imprima os dados do aluno mais novo;

 - Considere que NÃO haverá empate de idade;

 

Código para quaisquer informações:

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Struct
struct Alunos{
    char nome[50];
    int idade;
    char ra[10];
    char email[50];
    float prova[3];
    float media;
};

int main(){
    //Refereciando a struct
    struct Alunos *alunos;
  	
    int MAX = 0;
  	//Alicando dinamicamente o tamanho da array de struct
    alunos = malloc(MAX * sizeof(int));
    scanf("%d", &MAX);

    for (int i=0; i<MAX; i++){
        lerAlunos(alunos[i]);
    }

    //resultado da maior nota da prova 1
    printf("#### Maior Nota da Prova 1 ####\n");
    for (int i=0; i<MAX; i++){
        imprimeNotaProva1(alunos[i]);
    }

    //resultado das notas
    for (int i=0; i<MAX; i++){
        printf("Aluno: [%d]\n", i+1);
        imprimeAlunos(alunos[i]);
        printf("\n");
    }

    free(alunos);
    return 0;
}

void imprimeNotaProva1(struct Alunos alunos){
    float maior = 0;
    int maisNovo = 100;
    int idade = 0;
    if ((alunos.prova[0] > maior) && (alunos.idade < maisNovo)){ //Aqui que estou com bastante dúvida
        maior = alunos.prova[0];
        
        printf("Nome: %s\n", alunos.nome);
        printf("Nota: %.2f\n", maior);
    }
}

void lerAlunos(struct Alunos alunos){
    scanf(" %[^\t\n]s", alunos.nome);
    scanf("%d", &alunos.idade);
    scanf("%s", alunos.ra);
    scanf("%s", alunos.email);
    scanf("%f %f %f",
    &alunos.prova[0], 
    &alunos.prova[1], 
    &alunos.prova[2]);
    alunos.media = (alunos.prova[0] + alunos.prova[1] + alunos.prova[2])/3;
    printf("\n");
}

void imprimeAlunos(struct Alunos alunos){
    printf("Nome: %s\n", alunos.nome);
    printf("Idade: %d\n", alunos.idade);
    printf("RA: %s\n", alunos.ra);
    printf("E-mail: %s\n", alunos.email);
    printf("P1: %.2f\nP2: %.2f\nP3: %.2f\n", alunos.prova[0], alunos.prova[1], alunos.prova[2]);
    printf("Media: %.2f\n", alunos.media);
    if (alunos.media >= 6.0){
        printf("APROVADO");
    } else {
        printf("REPROVADO");
    }
    printf("\n");
}

 

Poderiam me ajudar neste problema?

Link para o comentário
Compartilhar em outros sites

@NhemonF Você está reservando memoria para a estrutura incorretamente.

54 minutos atrás, NhemonF disse:

alunos = malloc(MAX * sizeof(int));

Você está passando o tipo int para o sizeof sendo que você deveria passar o tipo e a referencia,

dessa forma

alunos = malloc(MAX * sizeof(struct Alunos));

Fora que você está pegando a quantidade de alunos depois de reservar a memoria para os mesmos.

 

Dica é de graça, então aqui vai algumas.

1>De nomes significativos para as suas declarações.

2>Resolva as partes importantes primeiro, exemplo vai trabalhar com a memoria ou ponteiros, então aprenda primeiro como funcionam.

 

Aqui um exemplo de como reservar memoria.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Constantes */
#define T_NOME 50
#define T_RA 10
#define T_EMAIL 30
#define Q_PROVAS 3

//Struct
struct aluno_dados
{
    char nome[T_NOME];
    int idade;
    char ra[T_RA];
    char email[T_EMAIL];
    float prova[Q_PROVAS];
    float media;
};

int main(void)
{
    struct aluno_dados *alunos = NULL;
    int q_alunos = 0;
    printf("\nDigite a quantidade de alunos:\t");
    scanf("%i%*c", &q_alunos);

    /* Reserva a memoria */
    alunos = malloc(sizeof(*alunos)*q_alunos);
    if (alunos == NULL) {
        perror("Erro memoria! ");
        exit(EXIT_FAILURE);
    } else {
        printf("\nMemoria reservada com sucesso!");
    }
    getchar();
    /* Apaga o ponteiro */
    free(alunos);
    return(0);
}

 

Fique a vontade para tirar qualquer duvida.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@KXSY Acho que você leu errado, mas as dicas também entram.

O erro do código é apenas verificar qual é a maior nota e privilegiar o aluno mais novo. Só que assim: quando executo o programa, ele imprime as notas da prova 1 dos alunos, como se ele imprimisse a nota de todos os alunos cadastrados. Como posso fazer isso?

Link para o comentário
Compartilhar em outros sites

@NhemonF Não encare como se eu estivesse tentado desanimá-lo.

 

Mas você não está passando os parâmetros para a função corretamente.

2 horas atrás, NhemonF disse:

void lerAlunos(struct Alunos alunos)

Você deveria passar o ponteiro para o aluno, dessa maneira.

void lerAlunos(struct Alunos *alunos)

 

Eu dei uma modificada no exemplo que eu dei lá atrás para você ver a maneira correta de como pegar as informações do aluno.

Spoiler

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Constantes */
#define T_NOME 50
#define T_RA 10
#define T_EMAIL 30
#define Q_PROVAS 3

//Struct
struct aluno_dados
{
    char nome[T_NOME];
    int idade;
    char ra[T_RA];
    char email[T_EMAIL];
    float prova[Q_PROVAS];
    float media;
};

void
pegaDadosAluno(struct aluno_dados *aluno);

void
mostraDadosAluno(struct aluno_dados *aluno);

int main(void)
{
    struct aluno_dados *alunos = NULL;
    int cont, q_alunos = 0;
    printf("\nDigite a quantidade de alunos:\t");
    scanf("%i%*c", &q_alunos);

    /* Reserva a memoria */
    alunos = malloc(sizeof(*alunos)*q_alunos);
    if (alunos == NULL) {
        perror("Erro memoria! ");
        exit(EXIT_FAILURE);
    }

    /* Pega os dados dos alunos */
    for (cont = 0; cont < q_alunos; cont++) {
        pegaDadosAluno(&alunos[cont]);
    }

    /* Mostra os dados dos alunos */
    for (cont = 0; cont < q_alunos; cont++) {
        mostraDadosAluno(&alunos[cont]);
    }
    getchar();
    /* Apaga o ponteiro */
    free(alunos);
    return(0);
}

void
pegaDadosAluno(struct aluno_dados *aluno)
{
    int cont;
    printf("\nDigite o nome do aluno:\t");
    fgets(aluno->nome, T_NOME, stdin);
    printf("\nDigite a idade do aluno:\t");
    scanf("%i%*c", &aluno->idade);
    printf("\nDigite o ra do aluno:\t");
    fgets(aluno->ra, T_RA, stdin);
    printf("\nDigite o email do aluno:\t");
    fgets(aluno->email, T_EMAIL, stdin);
    for (cont = 0; cont < Q_PROVAS; cont++) {
        printf("\nDigite a nota da %i prova:\t", cont+1);
        scanf("%f%*c", &aluno->prova[cont]);
    }

    /* Calcula media das provas */
    aluno->media = 0;
    for (cont = 0; cont < Q_PROVAS; cont++)
        aluno->media += aluno->prova[cont];
    
    aluno->media /= Q_PROVAS;
}

void
mostraDadosAluno(struct aluno_dados *aluno)
{
    int cont;
    printf("\n\tInformacoes do aluno.");
    printf("\nNome:\t%s", aluno->nome);
    printf("Idade:\t%i", aluno->idade);
    printf("\nRa:\t%s", aluno->ra);
    printf("Email:\t%s", aluno->email);
    for (cont = 0; cont < Q_PROVAS; cont++) {
        printf("\nNota prova (%i):\t%.2f", cont+1, aluno->prova[cont]);
    }
    printf("\nMedia das provas:\t%.2f", aluno->media);
}

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!