繁体   English   中英

如何在 C 中正确平均这些数字?

[英]How can I average these numbers correctly in C?

我写了一些从另一个文件中读取数字的代码,它应该输入文件中的数字和 output 的平均值。 我输入的数字是(1,2,3,4,5,6,7,8,9,10)。 但它给我的平均值是 2,4,6,8.10。

我该如何纠正?

代码:

#include <stdio.h>
#include <stdlib.h>

int main(){
  FILE *myFile;
  myFile = fopen("numbers.txt", "r");
  int numberArray[10];
  int i;
  int sum = 0;
  int n = 0;
  int avg = 0;

  if (myFile == NULL){
    printf("Error Reading File\n");
    exit (0);
  }

  for (i = 0; i < 10; i++){
    fscanf(myFile, "%d,", &numberArray[i] );
  }
  for (i = 0; i < 10; i++){
    sum += n;
    i++;
    avg = (sum / i);
    printf("Average is: %d\n\n", numberArray[i]);
  }

  fclose(myFile);
  return 0;
}

“...我输入的数字是 (1,2,3,4,5,6,7,8,9,10) 而不是平均值,它给了我 2,4,6,8.10。我该如何纠正这个……”

只关注最后一个循环,需要考虑的几个项目将解决这个问题,以及其他一些:

根据分子和除数的值,由于 integer 除法舍入误差,平均值可能不完全正确。 如果这对您来说是个问题,第一个代码片段会解决它。 如果不是,则以下代码段仅处理跳过的数组元素...

如前所述,原始帖子中的以下代码段将i递增两次,一次在for()循环中,然后在i++语句中。 以下地址中的每一个,也更正了赋值语句,所有这些都带有注释......

float sum = 0.0;//to avoid integer division rounding error, use a floating point type
float ave = 0.0;

for (i = 0; i < 10; i++){
    //sum += n;//n does not represent the values strore
    sum += (float)numberArray[i];
    //i++;//not needed, i is incremented in for loop
    avg = (sum/i);
    printf("Average is: %f\n\n", ave);
    //                   ^ changed from d to f, 
    //                     and numberArray[i] to ave
}

请注意,如果integer 除法的效果对于您的目的是可以接受的,则使用以下命令:

int sum = 0;
int ave = 0;

for (i = 0; i < 10; i++){
    sum += numberArray[i];
    avg = (sum/i);
    printf("Average is: %d\n\n", ave);
}

并且,如果只需要输出最终结果(而不是所有中间值),请将最后两个语句移到 for 循环之后:

for (i = 0; i < 10; i++){
    sum += numberArray[i];
}
avg = (sum/i);
printf("Average is: %d\n\n", ave);

“是否可以将给定的平均值放回文件中?”

原语句: myFile = fopen("numbers.txt", "r"); 以只读方式打开文件。 但是将得到的平均值放回文件中需要重新打开append的文件并使用fputs()

...
    fclose(myFile);
    //add the following...
    char sAve[20] = {0};
    myFile = fopen("numbers.txt", "a");
    if(myFile)
    {
          sprintf(sAve, "\nAverage is: %f0.6", ave)
          fputs(sAve, myFile);
          fclose(myFile);
    }
    return 0;
}

在这个 for 循环中,您将 i 递增两次,一次在 for() 语句中,一次在 i++ 中。

for (i = 0; i < 10; i++){

sum += n;

i++;

avg = (sum/ i);

printf("Average is: %d\n\n", numberArray[i]);

}

如果我理解正确,应该删除第二个增量。 此外,您的预期 output 我也不太清楚。 如果这不能解决问题,也许可以指定您的问题。

如果您只想要所有数字的平均值,请先将它们加在一起:

for(i=0; i<10; i++){
sum+=numberArray[i];
}

然后除以元素个数

avg = sum/10;

然后你可以打印出平均值:

printf("平均值为:%d\n", avg);

我认为这就是您的代码打算做的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM