Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: droken26 en 18 Marzo 2015, 09:35 am



Título: Error de suma
Publicado por: droken26 en 18 Marzo 2015, 09:35 am
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.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define max_alumnos 10
  4. #define max_pruebas 4
  5. //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  6. int main()
  7. {
  8.  
  9. float notas[4][10];
  10. float nota[max_alumnos];
  11. float A[max_alumnos][max_pruebas];
  12. int prueba = 1,alumno = 1;
  13. int a,b,i,j,opc;
  14. int aprobados=0;
  15. int suspensos=0;
  16.  
  17.  
  18.  
  19. printf("Calculo aprobados y suspensos:\n");
  20.       for(a=0; a<max_pruebas; a++){
  21.           printf("\nNumero de Prueba %d: \n", prueba++);
  22.           for(b=0;b<max_alumnos;b++){
  23.               printf("Calificacion del Alumno %d:", alumno++);
  24.               scanf("%f", &A[a][b]);
  25.              alumno = 1;
  26.            {
  27.            if (A[a][b]>=5)
  28.               aprobados++;
  29.               else
  30.               suspensos++;
  31.              }
  32. }
  33.    printf("\nNOTAS DE LOS ALUMNOS");
  34.    printf("\nAlumnos aprobados ...............: %d",aprobados);
  35.    printf("\nAlumnos suspendidos .............: %d\n",suspensos);
  36.  
  37.     }
  38.  
  39.     system("pause");
  40. return 0;
  41. }
  42.  
  43.  
  44.  
  45.  


Título: Re: Error de suma
Publicado por: rir3760 en 18 Marzo 2015, 16:44 pm
El 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.

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.
Las ocurrencias de la variable "alumno" son:
Código
  1. int prueba = 1, alumno = 1; /* 1 */
  2.  
  3. printf ("Calificacion del Alumno %d:", alumno++); /* 2 */
  4. scanf ("%f", &A[a][b]);
  5. 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.

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.
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:
Código
  1. for (j = 0; j < max_pruebas; j++){
  2.   printf("Prueba No %d:\n", j + 1);
  3.  
  4.   /* Alguna operacion */
  5. }
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:
Código
  1. puts("Calculo aprobados y suspensos");
  2. for (j = 0; j < max_pruebas; j++){
  3.   printf("Prueba No %d:\n", j + 1);
  4.   for (i = 0; i < max_alumnos; i++){
  5.      printf("Calificacion del Alumno %d:\n", i + 1);
  6.      scanf ("%f", A[i] + j);
  7.  
  8.      /* Alguna operacion por cada nota */
  9.   }
  10.  
  11.   /* Alguna operacion por cada prueba */
  12. }

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


Título: Re: Error de suma
Publicado por: ecfisa en 18 Marzo 2015, 16:49 pm
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:
Código
  1. ...
  2. int main() {
  3.  float A[max_alumnos][max_pruebas];
  4.  int a,b;
  5.  int aprobados=0;
  6.  int suspensos=0;
  7.  
  8.  printf("Calculo aprobados y suspensos:\n");
  9.  for(a=0; a<max_pruebas; a++) {
  10.    printf("\nNumero de Prueba %d: \n", a+1);
  11.    for(b=0;b<max_alumnos;b++) {
  12.      printf("Calificacion del Alumno %d:", b+1);
  13.      scanf("%f", &A[a][b]);
  14.      A[a][b] >= 5 ? aprobados++ : suspensos++;
  15.    }
  16.  }
  17.  printf("\nNOTAS DE LOS ALUMNOS");
  18.  printf("\nAlumnos aprobados ...............: %d",aprobados);
  19.  printf("\nAlumnos suspendidos .............: %d\n",suspensos);
  20. ...
  21.  

Saludos.

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


Título: Re: Error de suma
Publicado por: droken26 en 18 Marzo 2015, 22:42 pm
Muchisimas gracias por vuestra ayuda y paciencia.
Un saludo