【问题标题】:Why i am getting wrong sum here?为什么我在这里得到错误的总和?
【发布时间】:2025-12-14 19:50:01
【问题描述】:

例如,如果我输入 20 5 次,那么我应该得到 sum 为 100,但我得到的是 99。它一直在发生,我得到 sum-1。

代码如下:

#include <iostream>

using namespace std;

int main() {
  double sum = 0, marks = 0, count = 0;
  cout << " Enter the marks, enter -1 if you want to stop: " << endl;

  while (marks >= 0) {
    cin >> marks;
    sum = sum + marks;
    if (marks != -1) {
      count = count + 1;
    }
  }

  cout << "count= " << count << "   sum=" << sum
       << endl; // Why i am getting sum-1 in here?

  if (sum == -1) {
    cout << "Please enter atleast 2 marks to calculate the average." << endl;
  } else {
    double average = sum / count;
    cout << "Average of all the marks is: " << average << endl;
  }

  return 0;
}

【问题讨论】:

  • 提示:如果marks 不等于-1,您只添加到count。添加到sum 怎么样?
  • 退出循环时添加 -1。例外,因此不添加 -1。
  • 细节很重要:“例如,如果我输入 20 5 次”您实际输入的是 20 20 20 20 20 -1 并且您计算所有这些数字的总和

标签: c++ average


【解决方案1】:

您将 -1(停止循环的信号)添加到总和中; 你可以这样做来解决它

while (marks >= 0) {
    cin >> marks;
   if (marks != -1) {
     sum = sum + marks;
      count = count + 1;
    }
  }

【讨论】:

    【解决方案2】:

    无论marks 的值如何,都添加到sum,因此在末尾添加-1。

    先读取,再校验,再添加,读取失败或输入为负数时停止:

    while (cin >> marks && marks >= 0)
    {
        sum += marks;
        count += 1;
    }
    

    【讨论】:

      【解决方案3】:

      您可以重新排列循环以进行检查,在正文开始时完成,在读取下一个输入之后,即在新输入被汇总和计数之前。

      如果你将 counter 和 sum 的初始值考虑在内,这甚至可以去掉 if。这似乎不太可读,不太明确地编程您的想法。考虑这一点很重要。但除此之外它有一些优雅。

      double sum = 0, marks = 0, count = 0;
      while (marks >= 0)
      {
          sum = sum + marks; // init value 0 -> NoOp in first iteration
          count = count + 1; // count one iteration ahead
          cin >> marks;
      }
      count--; // undo the ahead counting
      

      或者将计数初始化为 -1。
      请注意,对于计数器之类的东西,intdouble 更好。

      double sum = 0, marks = 0;
      int count = -1;
      while (marks >= 0)
      {
          sum = sum + marks; // init value  0 -> NoOp in first iteration
          count = count + 1; // init value -1 -> count to zero before first input
          cin >> marks;
      }
      

      另一方面,通过相等比较来信任浮点值/变量是有风险的。如果您打算将“0.0”视为有效标记,请考虑比较 while (marks &gt; -0.0001)。偏执狂对程序员来说是一种健康的心态......

      【讨论】:

        【解决方案4】:

        如果我们要分析和阅读您的代码,我们可以看到您创建了一个条件,即如果变量 marks 设置为小于 0,则循环的条件将导致 false 最终停止循环。预期结果为 -1 的原因是您输入或将变量 marks 设置为 -1 以退出循环。但是,在再次测试循环的条件之前,它需要完成循环内的代码(除非您要创建一个条件来中断循环)。因此,在必须输入 -1 之后,代码仍会继续执行下一行代码 sum = sum + marks;,这会导致您的变量 sum = sum + (-1) 导致您的预期结果不准确。

        这类问题可以通过不同的方法来解决。您可能可以使用break; 的条件。例如在cin &gt;&gt; marks; 之后添加if 语句if(marks == -1){break;}。另一种方法是使用另一个条件来结束循环,而不是使用 marks 变量。

        我强烈建议,如果您正在处理数字,您可以在这样的条件下使用布尔类型的变量。出现这种问题是因为将变量用作多用途。这没有错,但有时会导致这样的问题。另外,我建议有一个更清晰的条件来结束循环。良好的编码实践是必须的。祝你有美好的一天!

        【讨论】:

          最近更新 更多