Resultado totalmente inesperado al intentar calcular el promedio utilizando arrays.
Estoy intentando calcular el promedio después de leer los datos de un archivo de texto de tipo int
. El programa se compila bien: clang -std=gnu11 -Weverything -g3 -pedantic -g3 -O3 -lm average_weight_of_elephant_seals.c -o average_weight_of_elephant_seals
.
Supongamos que quiero calcular el peso promedio de 2000 focas, el resultado esperado es 6838.848152 pero obtengo 1710.566467. No tengo idea de cómo interpretar GDB todavía.
¿Alguien podría señalar dónde he cometido un error?
“`C
/* El siguiente programa demuestra el uso de fscan para leer un conjunto de datos enteros en un archivo, y luego calcular la suma seguida del promedio.
* El cálculo debe estar encapsulado en una función y luego ser llamado en la rutina principal.
*/
#include <stdio.h>
#define MAXSIZE 5000 // Definición de macro para predefinir el tamaño del arreglo
double average_weight(int count, int weights_array[]);
int main(void)
{
int number_of_seals;
int weights_array[MAXSIZE];
<pre><code>printf("Ingrese el número de focas:\n");
scanf("%i", &number_of_seals);
printf("Su peso promedio es %lf\n", average_weight(number_of_seals, &weights_array[number_of_seals]));
return 0;
</code></pre>
}
double average_weight(int count, int weights_array[])
{
int weight;
int sum = 0;
FILE *elephant_seal_data = fopen("elephant_seal_data.txt", "r");
<pre><code>if (elephant_seal_data == NULL)
{
return -1;
}
while (!feof(elephant_seal_data))
{
fscanf(elephant_seal_data, "%i", &weight);
weights_array[count++] = weight;
sum += weight;
count++;
}
double average_weight = (double) sum / (double) count;
fclose(elephant_seal_data);
return average_weight;
</code></pre>
}
“`</stdio.h>
davy.ai
Hay algunos problemas con el código que pueden estar causando la salida incorrecta:
main()
, el arrayweights_array
no está inicializado ni se le asigna ningún espacio en memoria. Esto significa que pasarlo aaverage_weight()
resultará en un comportamiento indefinido.Para solucionar esto, asigna memoria para
weights_array
utilizandomalloc()
según el valor denumber_of_seals
ingresado por el usuario. Por ejemplo, agrega la siguiente línea después descanf()
enmain()
:Luego, en lugar de pasar la dirección del elemento
n
-ésimo del array aaverage_weight()
, simplemente pasa el array mismo:while
dentro deaverage_weight()
, la instruccióncount++
está incluida dos veces. Esto significa que el arrayweights_array
se está llenando con un elemento adicional, y la variablecount
se está incrementando dos veces en cada iteración del bucle.Para solucionar esto, elimina una de las instrucciones
count++
.Con estos cambios, el programa debería producir la salida esperada. Sin embargo, si el archivo contiene más datos que el número de sellos ingresado por el usuario, el programa todavía incluirá los datos adicionales en el cálculo del peso promedio. Para solucionar esto, podrías limitar la cantidad de veces que se ejecuta el bucle según el valor de
count
, o modificar el archivo de entrada para que solo contenga los datos de la cantidad especificada de sellos.