【问题标题】:Adding the sum of numbers using a loop statement使用循环语句添加数字的总和
【发布时间】:2010-03-28 18:03:05
【问题描述】:

我需要认真的帮助来区分正数和负数。

我要累加负值的总和,分别累加正值的总和。在循环之后,您将显示负值的总和和正值的总和。

数据应该是这样的:

-2.3 -1.9 -1.5 -1.1 -0.7 -0.3 0.1 0.5 0.9 1.3 1.7 2.1 2.5 2.9
负值总和:-7.8 正值总和
值:12

到目前为止,我有这个:

int main () {

    int num, num2, num3, num4, num5, sum, count, sum1;
    int tempVariable = 0;
    int numCount = 100;
    int newlineCount = 0, newlineCount1 = 0;
    float numCount1 = -2.3;

    while (numCount <= 150)
    {
        cout << numCount << " ";

        numCount += 2;
        newlineCount ++; 
        if(newlineCount == 6)
        {
            cout<< " " << endl;
            newlineCount = 0;
        }
    }
    **cout << "" << endl;
    while (numCount1 <=2.9 ) 
    {
        cout << numCount1 << " ";
        numCount1 += 0.4;
        newlineCount1 ++;     
    } while (  newlineCount1  <= 0 && newlineCount >= -2.3 );

    cout << "The sum is " << newlineCount1 << endl;**

    return 0;   
}

【问题讨论】:

  • 谢谢迈克尔.. 阅读没有格式化是痛苦的。
  • 对不起...我对编程很陌生..

标签: coding-style loops while-loop for-loop


【解决方案1】:

我不知道 C/C++,但这里是循环的一般概念,假设值来自数组。 (因为我不知道它们是如何进入的,即用户输入等

逻辑:

  • 使用与while 相对的for 循环结构来循环数组的每个元素。
  • 初始化两个变量以保持计数,positiveSumnegativeSum
  • 在元素的每次迭代中,检查它是否大于0。这就是您可以相应地划分正数和负数的方法。
  • 如果大于零,则将该元素添加到运行的positiveSum,否则将其添加到运行的negativeSum
  • 当循环结束时,positiveSumnegativeSum 应该有计算的总和。

如果这是作业,(我不记得作业标记在问题之前是否存在,或者是后来添加的)这个伪代码应该在没有明确的情况下为您指明正确的方向为你做整个的工作。

伪 Java 代码(未经测试或编译

 // as a good convention, I always initialize variables, 
 // for numbers I always use zero's.
double positiveSum, negativeSum = 0.0; 
 // assuming array holds the array of values.
for (i=0; i < array.length; i++) {
 // if positive, add it to the count
 if (array[i] > 0) positiveSum = positiveSum + array[i];
 // else negative
 else negativeSum = negativeSum + array[i];
}

一旦完成,positiveSumnegativeSum 都应该保持正确的计算总和。

如果您在此过程中有任何问题,我可以编辑我的答案以帮助您获得正确的答案,我希望我可以将其放弃,但这就是您的家庭作业职责。

【讨论】:

  • 非常感谢。我会试试...但是如果它不在 C++ 代码中,代码会起作用吗?
  • 您必须将代码更改为 C++ 语法,我已经用 Java 编写了示例(一种我可以与问题相关的类似语言)另外请记住,我假设这些数字在array 中,因为我不确定您是如何获得这些数字的。我只是想演示在循环中对数字求和背后的逻辑。
【解决方案2】:

我会逐个循环遍历每个数字,我们称之为 currentValue

如果数字是负数,negativeNumberTotal += currentValue

else if positive, positiveNumberTotal += currentValue

您将通过这种方式获得个人总数。很简单。

【讨论】:

  • 我知道它很简单...但我不确定如何实际编写它,因为我一直得到不正确的总数...
  • 看看 Anthony 的伪 Java 代码 - 我也不懂 C,所以无法帮助语法,但他的代码示例是如何做到的。将您的数字放入数组中是最佳选择。
【解决方案3】:

你显然把问题复杂化了。首先,您不需要两个单独的数字循环,因为它们之间存在恒定的 0.4 差异,即使在 -0.30.1 之间也是如此。您只需要检查它是否为负数就知道如何总结它们。

如果使用整数作为计数器,循环会更简单。因为你想要 14 个数字,你可以简单地从 0 数到 13,然后你可以很容易地计算出相应的浮点值。

示例 C# 代码:

double negSum = 0.0, posSum = 0.0;
for (int i = 0; i < 14; i++) {
  double number = -2.3 + (double)i * 0.4;
  if (number < 0) {
    negSum += number;
  } else {
    posSum += number;
  }
}

您当然可以在循环中使用浮点数,但是您需要考虑浮点数的不精确性。您应该确保使用的结束间隔类似于您想要的最后一个数字和下一个数字之间的中间值。

double negSum = 0.0, posSum = 0.0;
for (double number = -2.3; number < 3.1; number += 0.4) {
  if (number < 0) {
    negSum += number;
  } else {
    posSum += number;
  }
}

此外,当反复累加浮点数时(例如一遍又一遍地加上 0.4),您也会累加舍入误差。大多数数字不能完全表示为浮点数,因此您实际上可能在每次迭代中添加 0.3999999999999994225 而不是 0.4 之类的东西。加起来不太可能足以在这个小例子中出现,但您应该意识到这种影响,以便您可以在数字更多的情况下预测它。

【讨论】:

  • 天啊!!!!你是一个巨大的帮助......我想我确实让它变得比实际更难......非常感谢!!!
【解决方案4】:

你有几个幻数,我不确定它们的用途,例如 numcount1 = -2.3 通常你想避免幻数。

您可能希望为变量指定比 num1、num2 等更具描述性的名称。

您能否更准确地解释一下您的作业的参数是什么?

编辑:

我注意到您使用非常奇怪的条件来控制您的循环。您将继续直到 numcount1 = 2.9,这是一种非常脆弱的设置。我会在你的鞋子里做的第一件事是重写你的程序,以便在没有更多数字要添加时循环终止。 (或者,你可以让它在 12 个值之后停止。)

再次编辑:

好的,这个怎么样

int sumOfPos = 0,sumOfNeg = 0,currentValue = -2.3,terminationValue = 2.9;

while (currentValue <= terminationValue) {
    if (  /* there is a missing condition here */ ) {
                // need a statement here to increment your negative counter
    } else {
                // need a statement here to increment your positive counter
    }
}
        // put some statements here to do output

【讨论】:

  • 确保分配状态:使用单个 while 循环显示十进制值 -2.3 到 2.9(含),显示的每个值增加 0.4。在循环内部,您将累加负值的总和,并分别累加正值的总和。在循环之后,您将显示负值的总和和正值的总和。
【解决方案5】:

这很容易用纯数学解决:

lowerBound = -2.3
upperBound = 2.9
incAmount = 0.4
signChange = lowerBound % incAmount
numBelowChange = -(lowerBound-signChange)/incAmount
avgNegValue = -(numBelowChange+1)/2.0*incAmount + signChange
sumOfNegative = numBelowChange*avgNegValue
numAboveChange = (upperBound-signChange)/incAmount
avgPosValue = (numAboveChange+1)/2.0*incAmount + signChange
sumOfPositive = numAboveChange*avgPosValue + signChange

它比循环和添加更准确,更有效。

使用您提供的常量,

signChange     =  0.1
numBelowChange =  6.0
avgNegValue    = -1.3
sumOfNegative  = -7.8
numAboveChange =  7.0
avgPosValue    =  1.7
sumOfPositive  =  12.0

如果您不熟悉 % 运算符,x%y 的意思是“将 x 除以 y 并返回余数”。所以5%2=1

http://en.wikipedia.org/wiki/Modulo_operator

【讨论】:

    【解决方案6】:

    我不是程序员,但我认为最好让循环内部尽可能精简。这个版本在循环中没有任何 if 语句,只是简单的添加。现在是深夜,我喝了几杯威士忌,但我认为这个算法会起作用(当我尝试在 python 中实现它时它起作用了)。这是伪代码,所以你必须用你选择的语言编写它:

    neg_total =0
    abs_total=0
    
    loop with i in all_your_numbers
        total += i
        abs_total += abs(i)
    end
    
    neg_total=(total-abs_total)/2
    pos_total=abs_Total+neg_Total
    
    print "sum of negative values =", neg_total
    print "sum of positive values =", pos_total
    

    我不确定这是否是一种好的编程习惯,我很高兴它奏效了。如果你能解释一下,点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2021-06-13
      • 2019-12-20
      • 2017-05-22
      • 1970-01-01
      • 2017-09-28
      相关资源
      最近更新 更多