Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: choi_hyeki en 07 de Mayo 2021, 22:30
-
Escriba un programa que use FUNCIONES, que le permita al controlar las notas de un colegio:
El programa debe construir y almacenar en un arreglo bidimensional de estructuras, el nombre y calificación (de 1 a 5) de varios estudiantes. Para la matriz de estructuras, cada fila representa un grado (de 1 a 11), y cada grado recibe un máximo de 50 alumnos. Cada grado puede tener una cantidad de alumnos diferente.
El programa debe presentar un MENÚ con las siguientes opciones, las cuales deben ser desarrolladas por medio de FUNCIONES:
a. Permitir el ingreso de la información de estudiantes a los diferentes grados, así como la cantidad de estudiantes por grado.
b. Obtener el promedio de las calificaciones por grado y obtener el promedio de las
calificaciones total de todo el colegio
c. Obtener el nombre del alumno con la calificación más alta por grado y obtener el nombre del alumno con la calificación más alta de todo el colegio (Si se repiten las calificaciones altas, deberá indicar todos los alumnos con esa calificación tanto por grado como por todo el colegio)
Ese es el enunciado y hasta ahora llevo este código pero me dijeron que iba mal
#include <istream>
using namespace std;
const int limiteestudiante=50;
struct estudiante
{
string nombre;
float calificacion[5];
};
void llenar (estudiante [11][50],int alumnos[11]);
float promedio (int valor[], int cantidad);
int main()
{
int estudiante[11][50];
int opcion;
int notas;
int respuesta1, respuesta2, respuesta3;
int curso;
cout<<"digite opcion 1 para llenar la matriz"<<endl;
cin>>respuesta1;
cout<<"digite opcion 2 para ver el promedio"<<endl;
cin>>respuesta2;
cout<<"digite opcion 3 para el nombre del alumno con la calificacion mas alta por grado y al alumno de la calificacion mas alta en todo el colegio"<<endl;
cin>> respuesta3;
cout<<"estudiantes del curso (maximo"<<limiteestudiante<<"): ";
cin>>curso;
return 0;
}
void llenar (estudiante [11][50],int alumnos[11])
{
cout << "Ingrese el nombre y el apellido del estudiante: ";
getline(cin>>ws, nombre);
cout << "Ingrese el grado del estudiante: ";
cin >> grado;
for(int i = 0; i<materia ; i++)
{
cout << "Digite el nombre de la materia "<<i+1<<": ";
getline(cin>>ws, materia[i]);
cout << "Digite la notqa final de la materia "<<i+1<<": ";
cin >> nota[i];
}
return;
}
float promedio (int valor[], int cantidad)
{
int i;
float suma == 0;
for(i=0; i<cantidad; i++)
{
suma= suma+valor[i];
}
return suma;
}
-
En la definición del struct, el campo calificación no ha de ser un arreglo.
struct estudiante
{
string nombre;
float calificacion[5];
};
Según entiendo yo el enunciado, la calificación será un valor entre 1 y 5, pero no que sea un arreglo de hasta 5 elementos.
Luego, la matriz que se supone ha de contener los tipos "estructura estudiante", en realidad la has declarado como de tipo int, así que no está usando esta estructura.
int main()
{
int estudiante[11][50];
int opcion;
int notas;
No estoy muy versado en C++, lo mío es Java, pero he escrito un código que puede ayudarte de inspiración para completar el ejercicio.
Solo he hecho la parte de mostrar el menú de opciones e implementado la opción de capturar los datos: nombres y calificaciones para los 11 grados disponibles.
Cuando se elige la opción de "Fin de programa", antes de terminar se muestra el contenido de la matriz para poder comprobar que realmente se han recogido los datos introducidos.
Sin embargo, no se como hacer para que las "columnas" de la matriz tengan distintas longitudes.
Es decir, el enunciado dice que hay 11 grados (serían las filas) y por cada grado se pueden insertar hasta 50 (las columnas) datos de la estructura Estudiante.
Pero no tienen porque ser 50, pueden ser menos.
En mi función pregunto, para cada grado, cuántos Estudiantes se van a insertar.
Y si solo se pide insertar 1, pues solo pido datos para 1.
Si pide 10, pues se insertan 10.... pero igualmente se crean 50 columnas por cada fila, solo que en las columnas donde no inserto Estudiantes quedan con datos que no son válidos.
Así que al mostrar la matriz en pantalla, se puede ver como aparecen los datos insertados, junto con los "datos basura" de las columnas donde no se insertó nada.
No se como mejorar este aspecto. Lo ideal sería conseguir que las columnas tuviesen distintas longitudes, o bien saber como detectar las columnas con "datos basura" para omitirlas y no operar con ellas.
Pero bueno, quizás este código te sirva como punto de partida.
Un saludo.
#include <iostream>
using namespace std;
//Estructura estudiante
struct estudiante
{
string nombre;
float calificacion;//Entre 1 y 5
};
//Funciones
int menu();
void entrarCalificaciones(estudiante Calificaciones[11][50]);
int main()
{
//Matriz para calificaciones de estudiantes en los 11 grados
estudiante Calificaciones[11][50];
int opcion;
do
{
opcion = menu();
switch (opcion)
{
case 0:
cout << "\n\t\tFIN DE PROGRAMA";
break;
case 1:
entrarCalificaciones(Calificaciones);
break;
case 2:
//Obtener promedios
break;
case 3:
//Obtener calificaciones mas altas
break;
default:
cout << "Opcion equivocada" << endl;
}
} while (opcion != 0);
//El siguiente código no forma parte del enunciado, es para testeo. Se muestra la matriz para comprobar los datos introducidos.
for (int fila = 0; fila < 11; fila++)
{
for (int col = 0; col < sizeof(Calificaciones[fila]); col++)
cout << "Nombre: " << Calificaciones[fila][col].nombre << " Calificacion: " << Calificaciones[fila][col].calificacion << endl;
}
system("pause");
return 0;
}
int menu()
{
cout << "[1] - Introducir estudiantes y calificaciones" << endl;
cout << "[2] - Obtener promedios" << endl;
cout << "[3] - Obtener calificaciones mas altas" << endl;
cout << "[0] - Fin de programa" << endl;
cout << "Opcion: ";
int opcion;
cin >> opcion;
return opcion;
}
void entrarCalificaciones(estudiante Calificaciones[11][50])
{
for (int fila = 0; fila < 11; fila++)
{
int nAlumnos;
cout << "\nCalificaciones del grado #" << (fila + 1) << endl;
cout << "Cuantos alumnos (max=50): ";
cin >> nAlumnos;
if (nAlumnos > 50) //Comprobamos que no rebasamos límite
nAlumnos = 50;
//Pedimos datos
for (int col = 0; col < nAlumnos; col++)
{
cout << "\nAlumno #" << (col + 1) << endl;
cout << "Nombre: ";
cin >> Calificaciones[fila][col].nombre;
cout << "Calificacion [1-5]: ";
cin >> Calificaciones[fila][col].calificacion;
//Forzamos a que la calificación esté dentro de los límites
if (Calificaciones[fila][col].calificacion < 1)
Calificaciones[fila][col].calificacion = 1;
else if (Calificaciones[fila][col].calificacion > 5)
Calificaciones[fila][col].calificacion = 5;
}
}
}