我正在通过Principles and Practice Using C++
。我一直都很了解它,但最近我用chapter 6
打了一堵墙。您可能会开始编写计算器程序,并且随着您继续使用它逐渐变得更加丰富。它最终导致令牌混乱,令我感到困惑。
ANYWHO!我的问题是我正在遵循这个代码,它不能正常解释。我已经多次对这本书的代码进行了检查,它看起来很相似。代码只是继续使用lval并且没有对它做任何事情。在3个cin条目之后,它将只显示我首先设置的lval。我也不是100%肯定使用cin>> op在while循环中。是什么让它停止?什么时候知道停止?错误功能似乎也不起作用。我一直试图打破程序,但它不会弹出任何错误消息。
这只是令人沮丧,因为我正在学习,如果没有导师,我很难想出自己的问题:/感谢大家的时间!传入的代码...这是我到目前为止所拥有的
#include "std_lib_facilities.h"
int main()
{
cout << "Please enter an expression (we can handle ""+"",""-"",""*"",""/"")" << endl;
int lval = 0;
int rval;
char op;
/*int res;*/
cin >> lval; //read left most number
if (!cin) error("No first operand");
while (cin >> op) //Repeatedly read operand and right value
{
cin >> rval;
if (!cin) error("No second operand");
switch(op)
{
case '+':
lval += rval; //add: lval = lval + rval
break;
case '-':
lval -=rval;//subtract: lval = lval - rval
break;
case '*':
lval *= rval; //Multiply: lval = lval * rval
break;
case '/':
lval /= rval; //Divide: lval = lval / rval
break;
default:
cout << "Result: " << lval << endl;
keep_window_open();
return 0;
}
}
error("Bad expression");
}
P.S。我尝试使用断点来看看如何逐行编码,但它开始把我扔进iostream文件中,我不知道如何在这一点上阅读它们!
答案 0 :(得分:2)
它确实有点工作。例如,如果您引入以下序列:
3 <enter>
+ <enter>
3 <enter>
d <enter>
3 <enter>
它产生:
Result: 6
原因是cin总是希望输入完成。逻辑中也存在错误,即使您想要停止执行,也必须引入额外的虚拟值。要解决此问题,您必须在要求rval之前检查操作员。
编辑:
这可能接近你想要的东西:
#include "iostream"
#include <cstdio>
using namespace std;
int main()
{
cout << "Please enter an expression (we can handle ""+"",""-"",""*"",""/ "")" << endl;
int lval = 0;
int rval;
char op;
/*int res;*/
cin >> lval; //read left most number
if (!cin) printf("No first operand");
while (cin >> op) //Repeatedly read operand and right value
{
if(op != '+' && op != '-' && op != '*' && op != '/')
{
cout << "Result: " << lval << endl;
//keep_window_open();
getchar();
return 0;
}
cin >> rval;
if (!cin) printf("No second operand");
switch(op)
{
case '+':
lval += rval; //add: lval = lval + rval
break;
case '-':
lval -=rval;//subtract: lval = lval - rval
break;
case '*':
lval *= rval; //Multiply: lval = lval * rval
break;
case '/':
lval /= rval; //Divide: lval = lval / rval
break;
}
}
printf("Bad expression");
}
答案 1 :(得分:1)
第一个输出线出现问题。您需要使用反斜杠转义一组而不是两组引号,告诉C ++将引号视为字符而不是字符串的开头或结尾。此外,你的while循环似乎测试一个非常奇怪的条件。我不知道出了什么问题,但它只是不断地接受运算符,并且(可能)while循环中的代码永远不会被执行。下面是一个更好的代码解决方案。
#include "std_lib_facilities.h"
int main()
{
cout << "Please enter an expression (we can handle \"+\",\"-\",\"*\",\"/\")" << endl;
int lval = 0;
int rval;
int loop = 1;
char op;
/*int res;*/
while (loop == 1) //Repeatedly calculate
{
cout<<"Please enter the first number"<<endl;
cin >> lval; //read left most number
if (!cin) error("No first operand");
cout<<"Please enter operator"<<endl;
cin >> op;
cout<<"Please enter second number"<<endl;
cin >> rval;
if (!cin) error("No second operand");
switch(op)
{
case '+':
lval += rval; //add: lval = lval + rval
break;
case '-':
lval -=rval;//subtract: lval = lval - rval
break;
case '*':
lval *= rval; //Multiply: lval = lval * rval
break;
case '/':
lval /= rval; //Divide: lval = lval / rval
break;
default:
cout << "Result: " << lval << endl;
keep_window_open();
return 0;
}
cout<<"Enter 1 to calculate a new expression, or 0 to exit."<<endl;
cin>>loop;
}
error("Bad expression");
}
答案 2 :(得分:1)
关闭默认语句,也许您不应该使用default
来显示结果。
试试这个:
#include "std_lib_facilities.h"
int main()
{
cout << "Please enter an expression (we can handle ""+"",""-"",""*"",""/"")" << endl;
int lval = 0;
int rval;
char op;
/*int res;*/
cin >> lval; //read left most number
if (!cin) error("No first operand");
while (cin >> op) //Repeatedly read operand and right value
{
cin >> rval;
if (!cin) error("No second operand");
switch(op)
{
case '+':
lval += rval; //add: lval = lval + rval
break;
case '-':
lval -=rval;//subtract: lval = lval - rval
break;
case '*':
lval *= rval; //Multiply: lval = lval * rval
break;
case '/':
lval /= rval; //Divide: lval = lval / rval
break;
}
cout << "Result: " << lval << endl;
keep_window_open();
return 0;
}
error("Bad expression");
}
这应该有效。