Autor Tema: Taller de estructuras en C++ struct arreglo bidimensional estudiantes funciones  (Leído 1665 veces)

choi_hyeki

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
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

Código: [Seleccionar]
#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;
}
« Última modificación: 11 de Enero 2022, 20:38 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re: Taller de estructuras en c++
« Respuesta #1 en: 09 de Mayo 2021, 12:27 »
En la definición del struct, el campo calificación no ha de ser un arreglo.

Citar
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.
Citar
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.

Código: [Seleccionar]
#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;
        }
    }
}
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".