Error de suma

Iniciado por droken26, 18 Marzo 2015, 09:35 AM

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

droken26

Muy buenas, estoy un poco desesperado porque no encuentro el error, seguro que es una tonteria.
El programa trata de sumar los suspensos y aprobados de una clase de 10 en 4 asignaturas

Tengo dos problemas:
1.- La recogida de datos empieza con el alumno 1, asignatura 1, posteriormente asignatura 2 pero me mantiene el alumno 1, cuando deberia poner alumno 2.

2.- Una vez introducida las calificaciones, la primera asignatura me suma los suspensos y aprobados, pero los sucesivos lo que hace es sumar los anteriores no me contabiliza los suspensos ya aprobados de la segunda asignatura y asi sucesivamente.
Ruego un cable.

Os dejo el codigo.


#include <stdio.h>
#include <stdlib.h>
#define max_alumnos 10
#define max_pruebas 4
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
int main()
{

float notas[4][10];
float nota[max_alumnos];
float A[max_alumnos][max_pruebas];
int prueba = 1,alumno = 1;
int a,b,i,j,opc;
int aprobados=0;
int suspensos=0;



printf("Calculo aprobados y suspensos:\n");
       for(a=0; a<max_pruebas; a++){
           printf("\nNumero de Prueba %d: \n", prueba++);
           for(b=0;b<max_alumnos;b++){
               printf("Calificacion del Alumno %d:", alumno++);
               scanf("%f", &A[a][b]);
              alumno = 1;
            {
            if (A[a][b]>=5)
               aprobados++;
               else
               suspensos++;
              }
}
    printf("\nNOTAS DE LOS ALUMNOS");
    printf("\nAlumnos aprobados ...............: %d",aprobados);
    printf("\nAlumnos suspendidos .............: %d\n",suspensos);

     }
     
     system("pause");
return 0;
}




rir3760

Cita de: droken26 en 18 Marzo 2015, 09:35 AMEl programa trata de sumar los suspensos y aprobados de una clase de 10 en 4 asignaturas
Lo primero que debes hacer es eliminar las variables "i", "j", "nota", "notas" y "opc" ya que no se utilizan en el programa.

Cita de: droken26 en 18 Marzo 2015, 09:35 AM1.- La recogida de datos empieza con el alumno 1, asignatura 1, posteriormente asignatura 2 pero me mantiene el alumno 1, cuando deberia poner alumno 2.
Las ocurrencias de la variable "alumno" son:
int prueba = 1, alumno = 1; /* 1 */

printf ("Calificacion del Alumno %d:", alumno++); /* 2 */
scanf ("%f", &A[a][b]);
alumno = 1; /* 3 */

A ella le das el valor inicial de uno (1), imprimes su valor antes del incremento (2) y le asignas nuevamente el valor uno (3). En resumen la variable mantiene el mismo valor antes de su uso.

Cita de: droken26 en 18 Marzo 2015, 09:35 AM2.- Una vez introducida las calificaciones, la primera asignatura me suma los suspensos y aprobados, pero los sucesivos lo que hace es sumar los anteriores no me contabiliza los suspensos ya aprobados de la segunda asignatura y asi sucesivamente.
El programa solo hace lo que tu indicas que haga, no hay mas.

Aquí mejor un paréntesis y lo digo en buen plan: consigue un libro de calidad, si necesitas recomendaciones aplica el consejo usual (utilizar el motor de búsqueda de los foros).

----

Si necesitas de un bucle que itere por cada una de las cuatro asignaturas utilizas un bucle como este:
for (j = 0; j < max_pruebas; j++){
   printf("Prueba No %d:\n", j + 1);
   
   /* Alguna operacion */
}

Como puedes ver solo necesitas de una variable (el contador del bucle).

Y si necesitas leer las diez notas por cada prueba utilizas dos bucle anidados de esta forma:
puts("Calculo aprobados y suspensos");
for (j = 0; j < max_pruebas; j++){
   printf("Prueba No %d:\n", j + 1);
   for (i = 0; i < max_alumnos; i++){
      printf("Calificacion del Alumno %d:\n", i + 1);
      scanf ("%f", A[i] + j);
     
      /* Alguna operacion por cada nota */
   }
   
   /* Alguna operacion por cada prueba */
}


Para obtener el promedio por cada materia lo que debes hacer es inicializar las variables "aprobados" y "suspensos" justo antes del bucle interno, en este obtienes todas las notas de la prueba y justo después de este (del mentado bucle) imprimes los resultados.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

ecfisa

#2
Hola.

No sé si las variables que declaraste tendrán uso en otra parte del código, pero creo que bastaría de este modo:

...
int main() {
 float A[max_alumnos][max_pruebas];
 int a,b;
 int aprobados=0;
 int suspensos=0;

 printf("Calculo aprobados y suspensos:\n");
 for(a=0; a<max_pruebas; a++) {
   printf("\nNumero de Prueba %d: \n", a+1);
   for(b=0;b<max_alumnos;b++) {
     printf("Calificacion del Alumno %d:", b+1);
     scanf("%f", &A[a][b]);
     A[a][b] >= 5 ? aprobados++ : suspensos++;
   }
 }
 printf("\nNOTAS DE LOS ALUMNOS");
 printf("\nAlumnos aprobados ...............: %d",aprobados);
 printf("\nAlumnos suspendidos .............: %d\n",suspensos);
...


Saludos.

Edito: (no había visto el mensaje de rir3760)

droken26

Muchisimas gracias por vuestra ayuda y paciencia.
Un saludo