Me pueden hacer el favor de ayudarme con el siguiente ejercicio. CODIGO EN C
Ejercicio 3
El centro educativo “Mis años Dorados”, necesita implementar un programa que le permita llevar un conteo de la cantidad de estudiantes en diferentes categorías (Destacado, Bueno y regular) partiendo de que la escala de notas es de 1 a 10. Para lo cual deben de ubicarse bajo los siguientes criterios:
• Primaria
o Si la nota del estudiante es mayor a 8, es estudiante destacado
o Si la nota esta entre 6 y 7 es estudiante aceptable
o Si la nota es menor a 6, es estudiante regular
• Bachillerato
o Si la nota del estudiante es mayor a 9, es estudiante destacado
o Si la nota esta entre 7 y 8 es estudiante aceptable
o Si la nota es menor a 7, es estudiante regular
El programa debe de mostrar la cantidad total de estudiantes por cada categoría, tanto en primaria como en bachillerato; adicionalmente debe de mostrar el promedio de cada categoría (destacado, aceptable y regular) tanto para primaria como para bachillerato.
El programa debe de ejecutarse hasta que el usuario encargado de registrar los estudiantes marque la opción de salida.
Respuestas a la pregunta
Para implementar el programa podemos implementar una estructura como lista simplemente enlazada. Esta consiste en una estructura autoreferenciada que almacena nombre y promedio:
struct nodo{
...
struct nodo *sig;
};
El nombre se guarda en un string y el promedio en una variable de punto flotante de 32 bits. Primero se ingresan los estudiantes y luego se muestran las estadísticas. El código queda:
typedef enum nivel{PRIMARIA,BACHILLERATO} NIVEL
struct nodo{
char Nombre[30];
NIVEL nivel;//variable que solo puede tomar valores de la enumeración
float promedio;
};
void agregar(struct nodo*);
void mostrar(struct nodo*);
int main()
{
struct nodo *Lista=NULL;
char Opc;
int DestacPrim, DestacBachi, AcepPrim, AcepPrim, RegBachi, RegPrim;
while(1){
printf("Elija una opción\n");
printf("(A)gregar Estudiante");
printf("(S)alir\n");//Muestro menú en pantalla
Opc=getchar();
if(toupper(Opc)=='S') break;
if(toupper(Opc)=='A'){
agregar(&Lista);//Paso el puntero a la función de ingreso.
}
}
mostrar(&Lista);
printf("Programa finalizado, presiona una tecla para salir\n");
getchar();//Espero la presión de una tecla para salir
}
La función agregar() añade nodos a la lista y los ubica al final:
void agregar(struct nodo *lista)
{
struct nodo *nuevo,aux*;
float nivel;
nuevo=(struct nodo*)malloc(sizeof(struct nodo));//Creo un nuevo nodo.
printf("Ingrese nombre: ");
gets(nuevo->nombre);
printf("Ingresar promedio: ");
scanf("%f",&nuevo->promedio);
printf("(P)rimaria o (B)achillerato");
scanf("%c",&nivel);
switch(nivel){
case 'P': nuevo->nivel=PRIMARIA;break;
case 'B': nuevo->nivel=BACHILLERATO;break;
}
aux=lista;
while(aux)
aux->sig;
aux->sig=nuevo;//Lo ubico al final de la lista donde aux->sig=NULL
}
La función que muestra las estadísticas hace el conteo de todos los casos:
void mostrar (struct nodo *lista)
{
struct nodo *aux;
int DestPri=0, DestBac=0, AcPri=0, AcBac=0, RegPri=0, RegBac=0;
float AcDestPri=0, AcDestBac=0, AcAcPri=0, AcAcBac=0, AcRegPri=0, AcRegBac=0;
aux=lista;
while(aux->sig){
if(aux->nivel==PRIMARIA){
if(aux->promedio>8){
DestPri++;
AcDestPri+=aux->promedio;}
...//Según la nota se van incrementando el contador y el acumulador de cada categoría y grado.
}
if(aux->nivel==BACHILLERATO){
....//Según la nota hago lo mismo que con los de primaria.
}
aux=aux->sig;
}
printf("Estudiantes destacados de primaria: %d, promedio %.2f\n",DestPri,AcDestPri/DestPri);
printf("Estudiantes aceptables de primaria: %d, promedio %.2f\n",AcPri,AcAcPri/AcPri);
printf("Estudiantes regulares de primaria: %d, promedio %.2f\n",RegPri,AcRegPri/AcPri);
printf("Estudiantes destacados de bachillerato: %d, promedio %.2f\n",DestBac,AcDestBac/DestBac);
printf("Estudiantes aceptables de primaria: %d, promedio %.2f\n",AcBac,AcAcBac/AcBac);
printf("Estudiantes regulares de primaria: %d, promedio %.2f\n",RegBac,AcRegBac/AcBac);
}
Respuesta:
no te entendi xd
Explicacion:
∑⊂⊃∝