2013-03-24 19 views
0

我有一个任务,我必须从一个文件读取数据并对其执行各种计算并将答案写入输出文件。一切都很好,直到我来到这一步:C++ simple如果语句使得程序的其余部分不能执行

“只要总和不超过1000重读文件并计算文件中的整数的总和。使用标志控制的循环结构。”

我的代码片段如下:

dataFile2.close(); 
dataFile2.clear(); 
dataFile2.open("J:\\datafile2.txt"); 

sum = 0; 
while(sum < 1000) 
{ 
    dataFile2 >> num; 
    sum = sum + num; 
    if(sum > 1000) 
     sum = sum - num; 
} 

answers << "The sum of the integers not exceeding 1000 is " << sum << endl; 
cout << "The sum of the integers not exceeding 1000 is " << sum << endl; 
return 0; 

我的变量已经被宣布。当我取出if语句时,总和增加了最后一个数字,并且总和超过了1000.当If语句留下时,答案和cout语句不会执行,并且没有编译器警告或错误。

任何帮助,将不胜感激。

-ThePoloHobo

+7

您正在进入一个无限循环。在一张带有样本值的纸上手动跟踪您的循环,以查看发生的位置和原因。 – us2012 2013-03-24 21:29:11

+0

试图告诉我,当循环实际结束? – Spook 2013-03-24 21:32:24

+0

另外,我认为你正在阅读错误的问题。你不应该添加总数为1000的数字,你应该添加所有小于1000的数字。总数可以超过1000. – 2013-03-24 21:32:28

回答

-1

你似乎没有被使用标志变量,这可能会在这种情况下帮助。像这样的东西应该修复它:

sum = 0; 
bool sumUnder1000 = true; //Or the C++ equivalent, I'm a bit rusty 
while(sumUnder1000) 
{ 
    if(!dataFile2.good()){ 
     sumUnder1000 = false; //We've reached end of file or an error has occurred 
     return; 
    } 
    dataFile2 >> num; 
    sum = sum + num; 
    else if(sum > 1000){ 
     sum = sum - num; 
     sumUnder1000 = false; 
    } 
} 
+0

当我上次编程的C++,我不认为bools存在:)或者,也许这是简单的C ...感谢编辑。 – 2013-03-24 21:35:07

+0

哦,你是对的,我仍然在使用计数控制循环。谢谢,我绝对会在这里错过点。 – user2205534 2013-03-24 21:36:20

+0

还有一个问题,即他没有检查输入是否成功就访问'num'。如果所有数字的总和小于1000,他可能会得到一个错误的答案。 – 2013-03-24 21:36:56

1

因为似乎没有人想给你一个正确的答案......(和 是公平的,它是很难给出一个正确的答案,而无需实际 做你的工作您)。

您的代码有两个问题。首先是您要使用标志的要求 。正如我在我的评论中所说的,惯用的 解决方案不会使用标志,但使用标志没有问题。 一个标志是一个布尔变量,它将在 while中进行测试,并且在 找到让你想离开循环的东西时,将在循环中设置为有条件。

第二个问题是,您正在使用num而没有检查 输入已成功。您必须检查>> 运营商。检查的习惯的方法(和应该曾经被人在 语言没有经历过被使用的唯一的事情 )是治疗流,就好像它是一个布尔值:

dataFile2 >> num; 
if (dataFile2) { 
    // Input succeeded... 
} else { 
    // Input failed for some reason, maybe end of file 
} 

由于溪流上的所有操作返回到 流的引用,它是通常的合并测试和输入:

if (dataFile2 >> num) { 
    // succeeded 
} else { 
    // failed 
} 

(个人而言,我发现在条件修正状态的想法的ifwhile可怕的 但这成语是这么 无处不在,你应该使用它,很简单 原因,那就是每个人都期望。)

在教学环境中,它可能是可以接受的 考虑任何故障是文件的末尾,只需移动测试 到while(当然,除非你被要求 使用一个标志)。在其他情况下,您需要考虑 帐户的事实,该故障可能是由于输入—中的某个语法错误 导致某人将​​插入文件,其中 您期望得到一个数字。 有多种处理方法,所有这些方法都超出了你所要做的 的范围,但请注意,在之后你检测到失败, 你可以通过interogate流来知道原因。特别是,如果 dataFile2.eof()是真的,那么失败是(可能)由于您已阅读所有数据而导致 ,并且一切正常。 ( 换句话说,读取数据失败不一定是错误。 它可以简单地结束文件。)

相关问题