es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas con el código que pueden estar causando la salida incorrecta:

    1. En main(), el array weights_array no está inicializado ni se le asigna ningún espacio en memoria. Esto significa que pasarlo a average_weight() resultará en un comportamiento indefinido.

    Para solucionar esto, asigna memoria para weights_array utilizando malloc() según el valor de number_of_seals ingresado por el usuario. Por ejemplo, agrega la siguiente línea después de scanf() en main():

    int *weights_array = malloc(number_of_seals * sizeof(int));
    

    Luego, en lugar de pasar la dirección del elemento n-ésimo del array a average_weight(), simplemente pasa el array mismo:

    printf("Su peso promedio es %lf\n", average_weight(number_of_seals, weights_array));
    
    1. En el bucle while dentro de average_weight(), la instrucción count++ está incluida dos veces. Esto significa que el array weights_array se está llenando con un elemento adicional, y la variable count se está incrementando dos veces en cada iteración del bucle.

    Para solucionar esto, elimina una de las instrucciones count++.

    while (!feof(elephant_seal_data))
    {
        fscanf(elephant_seal_data, "%i", &weight);
        weights_array[count++] = weight;
        sum += weight;
    }
    

    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.

Comments are closed.