2017-10-09 100 views
-1

我在介绍C++当然,和我有这个提示麻烦:代码进入无限循环,不知道为什么

“写一个循环,从标准输入读取正整数和终止时它会读取一个不是正数的整数,在循环终止后,会打印所有偶数整数读取的总和,读取的所有奇数整数的总和,读取的偶数整数的数量,以及计数读取的奇数整数,全部用一个空格分隔,声明任何需要的变量。“

我的解决方案如下:

int num = 0; 
int evens = 0; 
int odds = 0; 
int evenSum = 0; 
int oddSum = 0; 

do { 
    cin >> num; 
    if (num % 2 == 0){ 
     evens++; 
     evenSum += num; 
    } 
    else if (num > 0) { 
     odds++; 
     oddSum += num; 
    } 
    else { 
     num = -1; 
    } 
} 
while (num >= 0); 
cout << evenSum << " " << oddSum << " " << evens << " " << odds; 

我没有得到任何反馈,除了“故障:代码进入无限循环”,从autograder。我究竟做错了什么?

+0

围绕此代码段构建测试框架,并通过开发环境随附的调试器运行它。无限循环通常很容易陷入并识别。 – user4581301

+1

有一件事错了,不是无限循环,而是与赋值规范有所不同:“当它读取一个不正确的整数时终止”。该程序尝试处理负数,然后退出循环。 – user4581301

+0

使用在线编译器提供的代码,它的工作原理 – xyious

回答

-2

您从未在您的循环中使num为正值。你所做的一切都在改变其他变量。如果它已经是负数,您也不需要重新指定num到-1

你需要补充一点:

else if (num > 0) { 
    odds++; 
    oddSum += num; 
    num = 1; //becomes positive and breaks the loop. 
} 
+0

为什么我的答案变得下调了? –

1

您也在此if (num % 2 == 0)部分处理负数(例如:这个条件的时候遇到的第一个负整数也将是真正的如-6),从而增加evens和把这个负数加到evenSum,这个数字根据你的问题的要求是不应该做的;其他的事情是,else部分是没有必要的,我的意思是为什么分配-1到num,而不是让它保持你刚读的相同数字(因为它不在你的问题的要求)。

我觉得需要这样的改变您的else ifelse部分:

#include <iostream> 

using namespace std; 

int main(){ 

int num; 
int evens = 0; 
int odds = 0; 
int evenSum = 0; 
int oddSum = 0; 

while (true) { 
    cin >> num; 

    if (num < 0){ 
     break; 
    } 

    if (num % 2 == 0){ 
     evens++; 
     evenSum += num; 
    } 
    else { 
     odds++; 
     oddSum += num; 
    } 
} 

cout << evenSum << " " << oddSum << " " << evens << " " << odds; 
return 0; 
} 

保持从输入接收号码,if num < 0然后break并显示结果,else检查次数为要么oddeven并相应地增加计数器。

+0

您还必须解释OP的代码不起作用的原因。 – CinCout

+0

@CinCout编辑了我的答案并添加了解释:) – tkhurana96

+0

*“我的意思是为什么递减刚刚读取的数字”*。 OP将'-1'分配给'num',而不是*递减它。 – CinCout

-2

你的循环的while部分将继续前进,直到将否定的答案放入。你从哪里得到你的num?用户输入?您的声明已将其设置为0,因为条件> =,所以您的while循环会继续。如果你想要用户输入,应该有一个cout语句来处理你的cin。