为什么我的 while 循环对于特定输入中断,而对于其他输入工作正常?

Why is my while-loop breaking for specific inputs and works fine for other inputs?

本文关键字:输入 其他 工作 循环 while 我的 于特定 中断 为什么 于其他      更新时间:2023-10-16

我是编程新手,我正在使用"Bjarne Stroustrup"的"编程:使用C++原理和实践(第二版("一书。我被告知在第6章中尝试编写一个简单的计算器程序。

能够执行"+"和"-"的许多操作,但是当程序读取"*"或"/"时,它会中断while循环,对于我的一生,我无法理解为什么。

我要求用户输入一个表达式,在表达式结束时,他们必须输入"X"。

operation是存储+-*/字符double_in是修改modified双精度,最后modified将是输出。

这是我的代码:

double modified{ 0 }, double_in{ 0 };
char operation{ 0 };
cout << "Expression with 'X' at the end :n";
cin >> modified;
cout << modified << "n";
while (cin >> operation)
{
while (cin >> double_in)
{
if (operation == 'X')
{
break;
}
else if (operation == '+')
{
modified += double_in;
cout << modified << "n";
}
else if (operation == '-')
{
modified -= double_in;
cout << modified << "n";
}
else if (operation == '*')
{
modified *= double_in;
cout << modified << "n";
}
else if (operation == '/')
{
if (double_in == 0)
{
throw zero_div{};
}
modified /= double_in;
cout << modified << "n";
}
else
{
throw invalid_operation{};
}
}
}

下面是输出的示例:

Expression with 'X' at the end :
10+20-10*2/3X
10
30
20
Answer : 20

如果您要回答,请提前感谢您。非常感谢。

整个if (operation == 'X')块需要移动到while (cin >> double_in)循环上方,否则cin >> double_in到达X时将失败。

更重要的是,while (cin >> double_in)需要改为if (cin >> double_in),因为每个operation字符只需要读取 1 个double值,然后您可以在while (cin >> operation)循环的下一次迭代中读取新operation

你现在循环的方式,一旦你在operation中读取,你就会读取多个double值,对所有这些值应用相同的operation(+20-10等是double值的有效表示(,直到operator>>遇到没有-+前缀的double时失败, 然后你cin处于一个糟糕的状态,所以它不能再读了。

对于2+3*6X

  • cin >> modified设置modified2
  • 然后cin >> operationoperation设置为'+'
  • 然后cin >> double_indouble_in设置为3
    • operation'+',所以modified递增3,变成5
  • cin >> double_in*上失败

对于10+20-10*2/3X

  • cin >> modified设置modified10
  • 然后cin >> operationoperation设置为'+'
  • 然后cin >> double_indouble_in设置为20
    • operation'+',所以modified递增20,变成30
  • 然后cin >> double_indouble_in设置为-10
    • operation'+',所以modified递增-10,变成20
  • 然后cin >> double_in失败*

试试这个:

double modified, double_in;
char operation;
cout << "Expression with 'X' at the end :n";
if (cin >> modified)
{
while (cin >> operation)
{
if (operation == 'X')
{
break;
}
if (cin >> double_in)
{
if (operation == '+')
{
modified += double_in;
}
else if (operation == '-')
{
modified -= double_in;
}
else if (operation == '*')
{
modified *= double_in;
}
else if (operation == '/')
{
if (double_in == 0.0)
{
throw zero_div{};
}
modified /= double_in;
}
else
{
throw invalid_operation{};
}
cout << modified << "n";
}
else
{
throw invalid_operation{};
}
}
}
else
{
throw invalid_operation{};
}

现场演示

相关文章: