Print the largest N notes and names among the values that are in the struct array

Asked

Viewed 1,725 times

0

Hello, I would like some help here, more specifically in case 4 if. I would like some solution without having to order the vector. Grateful.

#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string>



 struct informacoes_do_aluno {
    char nome[30];
    int matricula[20];
    float av1;
    float av2;
    float media;
    float nota_final;
    char resultado[30];
    int x;
};

int main (void){
    //aluno alunos[10];
    int j;
    int n=3;
    int maior_nota[2];
    int i;
    int escolha;
    struct informacoes_do_aluno aluno[3];
        for(i=0; i<n; i++){
        printf("Nome do aluno .....: ");
        scanf("%s", aluno[i].nome);
        printf("Matricula do aluno .....: ");
        scanf("%i", aluno[i].matricula);
        printf("Nota da AV1: ");
        scanf("%f", &aluno[i].av1);
        printf("Nota da AV2: ");
        scanf("%f", &aluno[i].av2);
        printf("A media do aluno eh = %f \n\n", aluno[i].media = (aluno[i].av1+aluno[i].av2)/2);

        printf("Situacao do aluno: ");
        if(aluno[i].media >= 7)
        {
            //aluno[i].resultado = "aprovado";
            strcpy(aluno[i].resultado,"Aprovado");
            printf("%s\n\n",aluno[i].resultado);
        }
        else if(aluno[i].media < 7 && aluno[i].media >= 4 )
        {
            printf("Prova final\n\n");
            {
                printf("Nota da prova final: " );
                scanf("%f", &aluno[i].nota_final);
                printf("Resultado final: ");
                if((aluno[i].nota_final+aluno[i].media)/2 >= 6)
                {
                    strcpy(aluno[i].resultado,"Aprovado");
                    printf("%s\n\n",aluno[i].resultado);
                }
                else
                {
                    strcpy(aluno[i].resultado,"Reprovado");
                    printf("%s\n\n",aluno[i].resultado);
                }
            }
        }
        else
        {
            strcpy(aluno[i].resultado,"Reprovado");
            printf("%s\n\n",aluno[i].resultado);
        }
    }
    while (escolha!=5)
{

printf("\n\n ----------------------- ");

printf("\n 1 - Exibir lista de alunos ");
printf("\n 2 - Exibir alunos aprovados ");
printf("\n 3 - Exibir alunos reprovados ");
printf("\n 4 - Exibir as 5 maiores notas ");
printf("\n 5 - Fechar Programa ");
printf("\n\n Escolha uma opcao: ");
scanf("%d",&escolha);


// estrutura switch
switch (escolha) {

case 1:
{

// a função clrscr(); é para limpar a tela
system("cls");
printf("\n\n Opcao escolhida: 1 ");
printf("\n Lista de alunos: \n");
for(i=0; i<n; i++){
    printf("%s\n", aluno[i].nome);
}

break;
}

case 2:
{
system("cls");
printf("\n\n Opcao escolhida: 2 ");
printf("\n\n Alunos aprovados: \n\n");
for(i=0; i<n; i++){
    if(strcmp(aluno[i].resultado, "Aprovado") == 0){
    //if(aluno[i].resultado == "Aprovado"){
        printf(" %s \n", aluno[i].nome);
    }
}
break;
}

case 3:
{
system("cls");
printf("\n\n Opcao escolhida: 3 ");
printf("\n\n Alunos reprovados: \n\n");
for(i=0; i<n; i++){
    if(strcmp(aluno[i].resultado, "Reprovado") == 0){
    //if(aluno[i].resultado == "Aprovado"){
        printf(" %s \n", aluno[i].nome);
    }
}
break;
}

case 4:
{
system("cls");
printf("\n\n Opcao escolhida: 4 ");
printf("\n\n As 5 maiores notas foram: \n\n");
maior_nota[0]=0;
maior_nota[1]=0;

for(j=0; j<2; j++)
{
 for(i=0; i<n; i++){
  if(maior_nota[j] < aluno[i].media && maior_nota[0]  !=  maior_nota[1] )
  {
   maior_nota[j] = i;
  }
}
     printf("%s\n%f\n", aluno[maior_nota[j]].nome, aluno[maior_nota[j]].media);
}
//for(i=0; i<2; i++){
    //printf("%s\n%f\n", aluno[maior_nota[i]].nome, aluno[maior_nota[i]].media);
//}
break;
}

// opção padrão
default:
{
system("cls");

// se for escolhida a opção 5, ele pula o while utilizando continue para isso
if( escolha==5)
{
continue;
}
// caso o usuário digite um numero acima de 5, ele irá informar que nao existe essa opção
printf("\n\n Opcao invalida, digite um numero entre 1 e 5. ");
break;
}

}

}

if( escolha==5)
printf("\n\n O Programa foi fechado");

getch();

}
  • 3

    Welcome to Sopt, try to be clearer, explain what your doubt is !

2 answers

1

You can make a "Selection Sort" only for the first 5 elements; it is not necessary to order the complete array.

0

You can simply scroll through the entire dataset and go updating the values of the resulting vector. At the end you will get the top five notes.

An immediate algorithm would be to assume that the first five notes are the largest in their set and would save it in an array (keeping an order to facilitate comparison). From the 6th, you would compare to the previous five and, if the latest one was larger than any of the previous ones, you would update the vector.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.