Como ordenar las notas de las Alumnas de M ayor a Menor

Iniciado por Gabriele7, 30 Octubre 2016, 00:48 AM

0 Miembros y 1 Visitante están viendo este tema.

Gabriele7

Hola a Todos. Bueno mi problema es que tengo las sig preguntas de un trabajo pero hay una que no pude resolver, y quisiera saber si ustedes me podrian dar una mano, la pregunta que no entiendo es la N°2, que es imprimir la lista de las 10 mejores Alumnas (no Alumnos).

Acá les dejo cuales son las preguntas asi entienden mejor el codigo:

N1° : Ingresar los datos de los alumnos de un establecimiento consistentes en NOMBRE(string de30 caracteres) ; Sexo (char) ; Y NOTAS de 10 materias codificadas de 0 a 9 (int).El ingreso terminara cuando se ingrese el nombre "FIN".Se sabe que el establecimiento no tiene mas de 1000 Alumnos.

N2° : IMPRIMIR LA LISTA DE LAS 10 MEJORES ALUMNAS. (ESTE ES EL QUE NO EINTIENDO) :-\

N°3: Indicar cuantos alumnos hay en el establecimiento cuyo promedio sea mayor o igual que 4 y menor que 7.

N°4: Permitir el ingreso de un nombre y mostrar la totalidad de sus datos, o bien si no pertenece al establecimiento.

Acá les dejo el código que hice :


#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<ncurses.h>

#define MAX_ALUMNOS 3


#define MAX_NOTAS 3

struct alumno
{
    char nombre[20];
    char sexo;
    int notas[MAX_NOTAS];
    float promedio_final;
};

char nombre_a_buscar[20];

int main()
{
    struct alumno alumnos[MAX_ALUMNOS];
    int num_alumnos;

    for(num_alumnos=0; num_alumnos<MAX_ALUMNOS; num_alumnos++)
    {
        printf("Nombre del alumno (para terminar teclee FIN): ");
        scanf("%s",alumnos[num_alumnos].nombre);
        if( strcmp(alumnos[num_alumnos].nombre,"FIN") == 0 )
            break;

        // else ....
        // nota que como el if tiene un break no es necesario el else
        do
        {
            char sexo;
            printf("Sexo: M o F: ");
            scanf("%s",&sexo);
            alumnos[num_alumnos].sexo = toupper(sexo);
        }

        while(alumnos[num_alumnos].sexo != 'M' && alumnos[num_alumnos].sexo !='F');
        float prom = 0.0;
        int sum = 0;

        for (int j=0; j<MAX_NOTAS; j++)
        {
            printf("Ingrese nota #%d: ",j+1);
            scanf("%d",&alumnos[num_alumnos].notas[j]);
            sum += alumnos[num_alumnos].notas[j];

        }
        prom = (float) sum / MAX_NOTAS;
        printf("Promedio de este alumno: %.2f \n", prom);


    }

    int total = 0;

    for (int i=0; i<num_alumnos; i++)
    {
        int suma = 0;
        float promedio = 0.0;

        for (int j=0; j<MAX_NOTAS; j++)
            suma += alumnos[i].notas[j];

        promedio = (float) suma / MAX_NOTAS;
        alumnos[i].promedio_final = promedio;

        if (promedio >= 4.0 && promedio < 7.0 )
            total++;
    }

    printf("Total de alumnos con promedio >= 4 y promedio < 7 = ");
    printf("%d \n", total);

    do
    {
    printf("Ingrese un nombre para mostrar datos: ");
    scanf("%s", nombre_a_buscar);

    bool hay_coincidencia = false;

    for(int i=0;i<MAX_ALUMNOS;i++){

        if(strcmp(alumnos[i].nombre, nombre_a_buscar) == 0) {
            hay_coincidencia = true;
            printf("Nombre: %s \nSexo: %c \n", alumnos[i].nombre, alumnos[i].sexo);
            for(int j=0;j<MAX_NOTAS;j++)
                printf("Nota: #%d: %d \n", j+1, alumnos[i].notas[j]);
            printf("Promedio: %.2f \n", alumnos[i].promedio_final);
        }
    }
    if(!hay_coincidencia)
        printf("El nombre ingresado no se encuentra en la lista\n");
    }
    while(true);
    return 0;
}


MAFUS

Como ves pides un dato que es el sexo del alumno. Ahora viene cuándo debes hacer uso de este dato para mostrar solo el resultado de las alumnas.

arcanaer

#2
Hice un problema similar hace un tiempo, das el numero de cuenta de un alumno y este puede tener varias calificaciones, despues ordena las calificaciones mas altas y las imprime, es un programa un poco completo, te dejo el codigo para que lo cheques.

#include <stdio.h>
#include "stdafx.h"
#include <windows.h>

void main(void)
{
int dat, i, j, k1, aux;
int num[2000];
float cal[2000], aux1;
float mayor = 0;

//printf("Dame el numero de datos: ");
scanf_s("%i", &dat);
int k[2000];

for (i = 0; i < dat; i++)
{
//printf("Dame el numero de cuenta numero %i: ", i+1);
scanf_s("%i", &num[i]);
//printf("Dame la calificacion numero %i: ", i+1);
scanf_s("%f", &cal[i]);

}

for (i = 0;i<dat;i++)
{
for (j = 0;j<dat - 1;j++)
{
if (num[j] >= num[j + 1])
{
aux = num[j];
num[j] = num[j + 1];
num[j + 1] = aux;

aux1 = cal[j];
cal[j] = cal[j + 1];
cal[j + 1] = aux1;

}
}
}
//printf("Ordenados de manera Ascendente\n");
for (i = 0;i<dat;i++)
{
//printf("%i %f\n", num[i], cal[i]);
}
//printf("\n");
//printf("Ordenados de manera descendente\n");
for (i = dat - 1;i >= 0;i--)
{
//printf("%i %f\n", num[i], cal[i]);
}
for (i = 0;i<dat;i++)
{
k[i] = 0
;
for (j = 0;j<dat;j++)
{
if (num[i] == num[j])
{
k[i]++;
}

}

}
//printf("\n");
i = 0;
while (i<dat)
{
if (k[i] != 1)
{
//printf("El numero de cuenta %i se repite %i veces\n", num[i], k[i]);
}
else
{
//printf("El numero de cuenta %i solo se encuentra una vez\n", num[i]);
}

i = i + k[i];
}
//printf("\n");
k1 = 0;
for (i = 0;i<dat;i++)
{
if (num[i] != num[i + 1])
{
k1++;
}
}
//Programa realizado por Carlos Valdes
printf("%i\n", k1);
i = 0;
while (i<dat)
{
if (k[i] != 1)
{
for (j = i;j<k[i];j++)
{

if (cal[j] >= mayor)
{
mayor = cal[j];
}
else
{
mayor = mayor;
}
}
}
else
{
mayor = cal[i];
}
//checa que aqui se imprimen solo una calificacion, si se repite solo mostrara la mas alta
printf("%i %.2f\n", num[i], mayor);
i = i + k[i];
}
}



El programa puede tener un alumno repetido con varias calificciones distintas, las ordena y despues toma solo la calificacion mas alta de ese alumno y los imprime en orden de menor a mayor.