[ AYUDA ] Calcular el indice acumulado de un estudiante en .C

Iniciado por NelsonR, 25 Julio 2021, 06:24 AM

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

NelsonR

Buenas soy nuevo en el foro no se como son los debidos procedimientos para publicar pero vengo pidiendo ayuda, necesito hacer lo que dice el titulo ya he durado 2 días atorado en esto y no se que hacer.

Tengo esto:
float calcular_indiceacumulado(int cantidad, int nota[])
{
   float indiceacumulado =0;
   int i;
   for (i = 0; i < cantidad; i++)
   {
       indiceacumulado += nota[i];
   }
   return (indiceacumulado/i);
}

printf("Cuantos cuatrimestres curso el estudiante #%d: ", i + 1);
       scanf("%d", &estudiante.cuatrimestre);
       for (int o = 0; o < estudiante.cuatrimestre; ++o)
       {
           printf("Materias cursadas durante el cuatrimestre #%d del estudiante: #%d: ", o + 1, i + 1);
           scanf("%d", &estudiante.matcursadas);
           printf("\n------------INTRODUZCA LAS %d NOTAS------------\n\n", estudiante.matcursadas);

           for (int i = 0; i < estudiante.matcursadas; ++i)
           {
               printf("Nota %d: ", i + 1);
               scanf("%d", &estudiante.notas[i]);
           }
           estudiante.indice= calcular_indice(estudiante.matcursadas, estudiante.notas);
           printf("\nSu indice del cuatrimestre es %.2f con el estudiante #%d\n", estudiante.indice, i + 1);


Yo necesito hacer el indice acumulado de todos los cuatrimestre que agregue el usuario, no entiendo como, estoy frisado, cualquier ayuda me vendría muy bien, se lo agradecería de corazón.

MOD: Agregado resaltado de sintaxis C a las etiquetas de código.

K-YreX

Tienes un problema con la definición de la estructura y es que estás sobreescribiendo datos. Si en la primera iteración dices que cursa 4 materias, en la segunda vuelta dices 5 y vas a sobreescribir el 4 anterior por el 5.

A simple vista tienes 2 opciones sin crear más estructuras. De más simple/rápida a más correcta/profesional serían:
  • Crear un array auxiliar y guardar después de cada iteración, la nota media (índice acumulado) de ese cuatrimestre. Al terminar haces la media de todos los valores del array y ya tienes la media de todos los cuatrimestres.
  • Modificar la estructura Estudiante para poder almacenar todos los datos sin tener que sustituirlos en cada iteración.

    Yo te recomiendo la segunda opción.
    El sentido de utilizar una estructura es poder almacenar todos los datos internamente y si utilizas la primera opción (con la estructura tal y como la tendrás ahora) estás sobreescribiendo datos en cada iteración, lo cual no tiene mucho sentido.

    (En este ejemplo voy a utilizar arrays estáticos porque son más fáciles que los dinámicos pero si sabes usar ya los arrays dinámicos, te recomiendo utilizarlos)

    #define MAX_CUATRIMESTRES 4
    #define MAX_MATERIAS_CUATRIMESTRE 10

    typedef struct {
       // los campos que consideres (nombre, edad, ...)
       int num_cuatrimestres;
       int materias[MAX_CUATRIMESTRES]; // El indice i indicara el numero de materias cursadas en el cuatrimestre i
       float notas[MAX_CUATRIMESTRES][MAX_MATERIAS_CUATRIMESTRE]; // El campo (i, j) indicara la nota de la materia j durante el cuatrimestre i
    } Estudiante;


    Ahora solo tienes que rellenar todos los datos:

    #define MAX_ESTUDIANTES 50

    int main() {
     Estudiante estudiantes[MAX_ESTUDIANTES];

     int num_estudiantes;
     // Para asegurarte de que se introduce un numero valido puedes hacer un filtro:
     // Utiliza los filtros para el resto de valores que tiene que introducir el usuario para asegurarte de que introducen valores validos
     do {
       printf("Introduce el numero de estudiantes: ");
       scanf("%d", &num_estudiantes);
     } while(num_estudiantes < 1 || num_estudiantes > MAX_ESTUDIANTES);

     for(int i = 0; i < num_estudiantes; ++i) {
       printf("Introduce el numero de cuatrimestres del estudiante %d: ", i+1);
       scanf("%d", &estudiantes[i].num_cuatrimestres);

       for(int j = 0; j < estudiantes[i].num_cuatrimestres; ++j) {
         printf("Introduce el numero de materias del estudiante %d durante el cuatrimestre %d: ", i+1, j+1);
         scanf("%d", &estudiantes[i].materias[j]);

         for(int k = 0; k < estudiante[i].materias[j]; ++k) {
           printf("Introduce la nota de la materia %d del cuatrimestre %d del estudiante %d: ", k+1, j+1, i+1);
           scanf("%f", &estudiantes[i].notas[j][k]);
         }
       }
     }
    }


    Ahora si haces una función como:

    float calcularMediaCuatrimestre(Estudiante estudiante, int cuatrimestre) {
     // tu codigo aqui
    }


    La función para calcular la media completa de un estudiante, sería algo así:

    float calcularMediaCompleta(Estudiante estudiante) {
     float sumaNotasCuatrimestres = 0;
     for(int i = 0; i < estudiante.num_cuatrimestres; ++i)
       sumaNotasCuatrimestres += calcularMediaCuatrimestre(estudiante, i);
     return sumaNotasCuatrimestres / estudiant.num_cuatrimestres;
    }
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

NelsonR

Muchísimas gracias! me haz salvado la vida!, me sirvió mucho, una ultima consulta, como seria para llamar los 2 float?

Lo puse asi.

float calcularMediaCompleta(Estudiante estudiante) {
    int valor1, valor2;
  float sumaNotasCuatrimestres = 0;
  for(int i = 0; i < estudiante.num_cuatrimestres; ++i)
    sumaNotasCuatrimestres += calcularMediaCuatrimestre(valor1, valor2);
  return sumaNotasCuatrimestres / estudiante.num_cuatrimestres;
}
float calcularMediaCuatrimestre(int cantidad, int nota[])
{
    float indice =0;
    int i;
    for (i = 0; i < cantidad; i++)
    {
        indice += nota[i];
    }
    return (indice/i);
}

K-YreX

No entiendo la función de valor1 y valor2.
Deberías repasar bien las funciones y parámetros en C pues si no tienes eso claro, no sirve de nada intentar avanzar a duras penas.

Tampoco entiendo por qué has cambiado los parámetros de la segunda función.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;