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