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