【问题标题】:Average subtracted of max and min returns wrong result减去最大值和最小值的平均值返回错误的结果
【发布时间】:2022-01-12 09:51:20
【问题描述】:

我想求除表格的最大值和最小值之外的 5 个数字的平均值。

尽管如此,以下代码提供了错误的结果。

#include <stdio.h> 

#define size 5

main() {
  int i;
  float table[size], max, min, mo, sum;
  max = 0;
  min = 0;
  mo = 0;

  printf("Provide a number: ");
  scanf("%f", &table[1]);
  max = table[1];
  min = table[1];

  for (i = 2; i <= size; i++) {
    printf("Provide a number: ");
    scanf("%f", &table[i]);

    if (max <= table[i])
      max = table[i];
    if (min >= table[i]) {
      min = table[i];
    }
    sum = sum + table[i];
  }

  mo = (sum - max - min) / (size - 2);
  printf("The average numberis: %f", mo);
}

例子:

如果您输入 1,2,3,4,5,则输出将是 2,666667 而不是 3。

您能告诉我为什么会这样吗?

【问题讨论】:

  • 首先,数组具有从 0 开始的索引,因此您的写入超出了 table 的范围。
  • IOW:table[1] -> table[0]for (i=2; i&lt;=size; i++) -> for (i = 1; i &lt; size; i++)。而且你没有初始化sum
  • OT:将第一个输入视为特殊情况非常尴尬。您最好将输入与实际计算分开。首先只做输入,然后有第二个 for 循环来进行计算。而且您还应该正确缩进您的代码(我已经为您完成了)
  • 除了已经提到的:总和不包括第一个数组元素。你需要学习如何调试程序,要么使用调试器,要么至少通过在代码中的关键位置打印相关变量的内容。
  • 感谢您的贡献!!我已经进行了您提出的更改并且它有效!我将第一个输入视为特殊情况的原因是我想用表的第一个值设置最小值和最大值,以便在 for 循环中实现 if

标签: c sum max average min


【解决方案1】:

我已经根据 cmets 编辑了代码,并且它的字词正确。非常感谢!

#include <stdio.h> 

#define size 5

main() {
  int i;
  float table[size], max, min, mo, sum;
  max = 0;
  min = 0;
  mo = 0;

  printf("Provide a number: ");
  scanf("%f", &table[0]);
  max = table[0];
  min = table[0];
  sum = table[0];

  for (i = 1; i < size; i++) {
    printf("Provide a number: ");
    scanf("%f", &table[i]);

    if (max <= table[i])
      max = table[i];
    if (min >= table[i]) {
      min = table[i];
    }
    sum = sum + table[i];
  }

  mo = (sum - max - min) / (size - 2);
  printf("The average numberis: %f", mo);
}

【讨论】:

    【解决方案2】:

    以下修改后的代码可以正常工作。

    #include <stdio.h>
    
    #define size 5
    
    void main()
    {
       int i=0, count=0;
       float table[size], max, min, sum=0, avg;
    
       //read all five numbers
       for (i = 0; i < size; i++)
       {
           printf("Provide a number: ");
           scanf("%f", &table[i]);
       }
    
       //find max and min
       max = table[0];
       min = table[0];
       for (i = 1; i < size; i++)
       {
          if(max < table[i])
           max = table[i];
    
          if(min > table[i])
           min = table[i];
       }
    
       //calculate sum and average leaving the max and min
       for (i = 0; i < size; i++)
       {
           if((table[i] != max) && (table[i] != min))
           {
               sum = sum + table[i];
               count++;
           }
       }
       avg = sum/count;
    
       printf("\r\nThe average number is: %f", avg);
    
    
    }
    

    `

    【讨论】:

    • 有趣的是,这段代码排除了所有出现的最小值和最大值。
    • 次要:idea if(min &gt; table[i]) min = table[i]; to else if(min &gt; table[i]) min = table[i];
    猜你喜欢
    • 2011-05-19
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    相关资源
    最近更新 更多