2016-01-22 46 views
0

我的教授是说,while循环运行条件是n> = 1的循环。但是我没有给变量n赋任何值,因此取决于它的“默认”值,循环可能不会被输入。而且我不确定如何解决他在说什么!?如何保证被输入(C++)

#include <iostream> 
using namespace std; 

int main() 

{ 
cout.setf(ios::fixed); 
cout.setf(ios::showpoint); 
cout.precision(2); 

int n, count; 
double sum; 

while (n >=1) 
{ 
    cout << "Enter a positive integer N (<1 to stop): "; 
    cin >> n; 
    sum = 0; 
    for (count = 1; count <= n; count++) 
    sum = sum + (1.0/count); 
    cout << "Sum = " << sum << endl; 
    } 
cout << "Bye! "; 

return 0; 
} 
+0

ñ,因为它不是初始化 – ivan

+2

@ivan未初始化变量将永远不会进入可以在C++中的任何值,因此您的评论是不正确的(参见下面的答案)。 – jofel

+0

@jofel它在Visual Studio中运行代码时引发运行时异常 – novice

回答

4

这里是n被声明

int n, count; 

在这种情况下n值是unspecified as it is left uninitialized线。你应该初始化它

int n = 1; 
+0

这确实解决了我的问题。但是,Sum = 0.00会显示出来,而且这在技术上并不假设在输出中,只是语句“Bye!”。任何想法如何解决这个问题? – MSK

2

如果你总是希望循环至少运行一次,然后你想有一个do...while();循环。它将始终在第一次迭代中进入循环并执行循环体,然后它将检查while条件以确定它是再次循环还是退出。一个do...while();

do 
{ 
    statements 
} while (condition); 

在这种情况下的形式,将节省您不必初始化n你从用户输入之前。

在这种情况下,虽然这似乎并不像你想要什么,只要你想,如果用户输入一个数小于1就可以解决的方法之一就是把你的输出和输入到时发生什么循环检查n。如果用户输入小于1,这将阻止任何事情发生,但仍允许您在每次迭代时提示usr并获取输入。

while (cout << "Enter a positive integer N (<1 to stop): " && cin >> n && n >= 1) 
{ 
    sum = 0; 
    for (count = 1; count <= n; count++) 
     sum = sum + (1.0/count); 
    cout << "Sum = " << sum << endl; 
} 
0

将n设置为大于或等于1的值,以保证循环进入。既然你没有自己设置,默认值可以小于1,这意味着外观有机会,但不保证触发。

int n = 1 

此外,你应该设置计数= 0在for循环,因为如果n和计数彼此相等,for循环自动断开,并在0

不执行所有,留下总和

为了确保您除以0,设置计算+ 1

for (count = 0; count <= n; count++) 
    sum = sum + (1.0/(count + 1)); 
+0

这确实解决了我的问题。但是,Sum = 0.00会显示出来,而且这在技术上并不假设在输出中,只是语句“Bye!”。任何想法如何解决这个问题? – MSK

+0

设置计数等于0而不是1.如果count等于1且n等于1,则for循环根本不会执行,并且总和为0.另外,在for循环中设置count为count + 1,这样您没有除以0 –

+0

是的,但你仍然得到sum = 0.00的输出语句,那么“再见!”如果n <1,我需要它输出“再见!”,没有sum = 0.00语句 – MSK

1

的问题是,n尚未初始化。与Java或C#等其他语言不同,原始变量没有任何预定义的“默认”值。简单地占据了之前存在的任何堆栈空间;对于所有意图和目的,未初始化变量的默认值可以被视为“随机”。

为了解决这个问题,在进入循环之前简单地初始化变量。

n = 1; 
+0

这确实解决了我的问题。但是,Sum = 0.00会显示出来,而且这在技术上并不假设在输出中,只是语句“Bye!”。任何想法如何解决这个问题? – MSK

+0

呃,删除打印总和的行? 'cout <<“Sum =”<< sum << endl;' –

+0

不,我想你误解了我,程序输出正确输入正整数N(<1停止):6(用户输入)Sum = 2.45输入正整数N(<1停止):0(用户输入)再见! – MSK

0

您只需使用另一种循环即do-while循环。例如

do 
{ 
    cout << "Enter a positive integer N (<1 to stop): "; 
    cin >> n; 
    sum = 0; 
    for (count = 1; count <= n; count++) 
    sum = sum + (1.0/count); 
    if (n > 0) cout << "Sum = " << sum << endl; 
} while (n > 0); 
cout << "Bye! "; 

而且

int n, count; 

,而不是声明中,您应该使用声明

unsigned int n, count; 

你比其他所有人都要检查输入是否有效。例如

if (!(cin >> n) || n == 0) break; 

考虑到这一点你也可以使用以下类型的循环

while (true) 
{ 
    cout << "Enter a positive integer N (<1 to stop): "; 

    unsigned int n; 

    cin >> n; 

    if (!(cin >> n) || n == 0) break; 

    sum = 0; 
    for (unsigned int count = 1; count <= n; count++) 
     sum = sum + (1.0/count); 
    if (n > 0) cout << "Sum = " << sum << endl; 
} 
cout << "Bye! "; 
+0

使'n'无符号将允许输入负数而不停止循环。 – NathanOliver

+0

@NathanOliver无法输入负值。 –

+0

尽管您的答案中没有任何内容。 – NathanOliver