使用循环语句添加数字总和

时间:2010-03-28 18:03:06

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

我需要认真帮助划分正数和负数。

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

数据假设如下:

  

-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;   
}

6 个答案:

答案 0 :(得分:2)

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

逻辑:

  • 使用与for相对的while循环结构来循环遍历数组的每个元素。
  • 初始化两个变量以保持计数,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都应保留正确的计算金额。

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

答案 1 :(得分:0)

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

如果数字为负数,则为negativeNumberTotal + = currentValue

否则为正,positiveNumberTotal + = currentValue

您可以通过这种方式获得个人总数。非常简单。

答案 2 :(得分:0)

你有几个魔术数字,其目的我不确定,例如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

答案 3 :(得分:0)

你显然过于复杂化了这个问题。首先,您不需要两个单独的数字循环,因为它们之间存在恒定的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 :(得分:0)

这很容易用纯数学解决:

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

答案 5 :(得分:0)

我不是程序员,但我认为最好保持循环内部尽可能精益。这个版本在循环中没有任何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

我不确定这是不是很好的编程习惯,我只是觉得它很有效。如果你可以解释如何分数。