Anuncios Google

Error en pieza de código de suma con for

Bien, el error es un error lógico, no un error decódigo.

A continuación, pongo un trozo de código y os explico el problema.

    for(i = 0; i < nalumnos; i++){
          n = 0;
          suma = 0;
          while(n < nnotas){
              suma = suma + notas[i][n];
              n++;
          }
          mediaal[i] = (suma / nnotas2);
 
    }

Bien, esa es la pieza de código defectuosa. Lo que debería de hacer es que se le vaya sumando a i 1 siempre que sea menor a nalumnos (una cantidad introducida previamente que se refiere a la cantidad de alumnos de la que se van a hallar las medias), y se haya realizado todas las tareas del bucle. Todas las variables están definidas y las bibliotecas incluidas son sdio y sdlib.

Lo de dentro del bucle sirve para que mientras que n sea menor al numero de notas de cada alumno (nnotas), a suma se le ñada el valor de notas[i][n] (o lo que es lo mismo, notas[alumnoactual][notaactual]), y se le aumente en 1 a n su valor. Por último, antes de repetir el bucle for, a la media del alumno se le calucla lo que aparece en esa sentencia.

Bueno, os subo el archivo completo por si lo queréis ojear bien. Queda decir que nnotas2 la uso porque nnotas no la puedo poner como float pero pensé que alomejor el problema del calculo residía en que dividí float por int, así que la puse con el alor de nnotas en float, pero no vale.

Saludos


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de pspgorrister

El problema es que en C no

El problema es que en C no puedes pasar parámetros como referencia, (en C++ SÍ, GRAN diferencia entre ambos). Es decir cuanto tu llamas a la función

pednotas(notas, nnotas, nombres, i);

Los valores notas, nnotas, etc. se crean como variable locales en la función llamada, vamos, que no son las mismas que las que tú tienes en el programa principal Como solución, tendrías que tratar esas variables como punteros.

También tratas el nombre como un entero, está mal.

Sobre la linea

 printf("\nPuntuacion No %d: ", ++n);

También está mal, aparte de no es políticamente correcta, fíjate que estás sumando "n" antes de usarla, cuando lo pones en el array, nunca usas el elemento 0, esto también puede dar fallos de segmentación ya que puedes escribir fuera de la memoria reservada del array (TOTAL +1). Es mejor hacer el ++n al final del bucle, es un error muy difícil de detectar. Así que mejor no usar los ++Variable en los printf().

 

Un saludo.


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de P22

Bien, tras poner los

Bien, tras poner los punteros, y arreglar alguna que otra cosa:

#include <stdio.h>
#include <stdlib.h>
 
#define ALUMNOS 20
#define MAXNOTAS 10
#define LONGNOMB 10
 
int main(){
/*Variables auxiliares*/
    int i = 0, n, nnotas, nalumnos;
 
    float suma, nnotas2;
 
/*Media de la clase*/
    float mediacl;
 
/*Nombres de los estudiantes*/
    char nombres[ALUMNOS][LONGNOMB];
 
/*Notas alumnos*/
    float notas[ALUMNOS][MAXNOTAS];
 
/*Media de cada alumno*/
    float mediaal[ALUMNOS];
 
/*Declaraciones varias*/
    void pednotas(float a[][MAXNOTAS], int numnot, char nombres[][LONGNOMB], int *i);
    void mediaalum();
 
 
    printf("Bienvenido, cuantas notas por alumno?: ");
    scanf("%i", &nnotas);
    nnotas2 = (float)nnotas;
 
    printf("\nCuantos alumnos?: ");
    scanf("%i", &nalumnos);
 
 
/*Petición de las notas y nombres de alumnos*/    
    while(i < nalumnos){
            pednotas(notas, nnotas, nombres, &i);
            i++;
            }
 
 
/*Hallar la media de cada alumno*/
 
printf("%i", notas[1][1]);
    for(i = 0; i < nalumnos; i++){
          n = 0;
          suma = 0;
          while(n < nnotas){
              suma = suma + notas[i][n];
              n++;
          }
          mediaal[i] = (suma / nnotas2);
 
    }
 
 
    printf("\n\n%.2f\n%.2f", mediaal[1], mediaal[2]);
 
 
    printf("\n\n");
    system("PAUSE");
    return 0;
}
 
 
void pednotas(float a[][MAXNOTAS], int numnot, char nombres[][LONGNOMB], int *i){
     int n = 0, z = 0, pausa;
 
           printf("\n\nIntroduce el nombre del alumno No %i\n", *i++);
           scanf("%i", pausa);
           *i--;
           while((z <= LONGNOMB) && ((nombres[*i][z] = getchar()) != '\n'))
                 z++;
 
           printf("\nIntroduce sus notas: ");
 
           while( n < numnot){
                  printf("\nPuntuacion No %d: ", n);
                  scanf("%f", &a[*i][n]);
                  n++;
                  }
    return;
}
 
/*Función para hallar la media de cada alumno*/
void mediaalum(float notas[][MAXNOTAS], int i, int numnotas, float mediaal[ALUMNOS], int z){
     float suma = 0, aux;
 
     suma = suma + notas[i][z];
 
     aux = (suma / numnotas);
     mediaal[i] = aux;
 
     return;
}
/*Función para hallar la media de las notas de toda la clase
float mediaclas(*/

Me sale siempre el mismo valor aunquevlo cambie.


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de pspgorrister

Redundante:

Redundante:

          printf("\n\nIntroduce el nombre del alumno No %i\n", *i++);
           scanf("%i", pausa);
           *i--;

No tiene sentido esa instruccion, ¿sumas y luego restas?, si lo que quieres es mostrar i + 1, tan sencillo como poner "i + 1", en vez de "i++" xD. Cuidado con esas cosas no me hiciste caso, y ya te dije que NUNCA uses un cambio de valor de variable en un printf. Es un error muy difícil de detectar.

 

Nombre de alumno, sigue siendo un variable entera, no un texto :P

 

Sigues sin pasar los valores como punteros, por eso no te los cambia. Sólo mandas la variable "i", la cual no hace falta porque no le cambias el valor (aunque le sumes 1 y luego se lo restes como te he dicho más arriba)


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de P22

Bien, lo de i++ lo he

Bien, lo de i++ lo he cambiado. Pero o otro, lo de nombre alumno, lo uso con getchar así que que lo trate como un entero es muy dificil. Por otro lado, no paso los valores como punteros porque en C automáticamente todas las arrays se tratan como tal.

Saludos


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de P22

Aprendido

Consultando mi libro de C yya he comprendido la diferencia de pasar las variables por valor o referencia. Pues eso, que si ves otro error me lo puedes decir por favor? yo igualmente sigo buscando.


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Imagen de pspgorrister

Creo que con lo que te he

Creo que con lo que te he dicho ya debería de funcionar, recompilalo con los cambios a ver si diera otro error.

Imagen de P22

Esque no pretendía sumar 1 a

Esque no pretendía sumar 1 a n, sino mostrar el valor de n + 1 pero que mantenga su valor.

Lo otro sigo sin entenderlo, me lo puedes explicar? Por último, decirte que he comprobado el error del bucle, y detecté que las notas se cogen bien mostrando los valores del array una vez btenidos.

Saludos


¡Iníciate en Linux fácilmente! Sólo entra aquí y comprueba que distribución se adapta mejor a tí.

Mi review: iPod Touch 4G

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.