2

我正在努力通过Principles and Practice Using C++。我一直很好地理解它,但最近我遇到了chapter 6. 假设您开始编写一个计算器程序,并且随着您继续编写它,它会逐渐变得更加丰富。它最终导致代币,这让我很困惑。

任何人!我的问题是我正在遵循这段代码,但它并没有像它解释的那样工作。我已经多次检查了这本书的代码,它看起来很相似。代码只是不断地接受 lval 而没有做任何事情。输入 3 个 cin 后,它只会显示 lval 最初设置的值。我也不是 100% 确定在 while 循环中使用 cin >> op 。是什么让它停下来?它什么时候知道停止?错误功能似乎也不起作用。我一直试图破坏程序,但它没有弹出任何错误消息。

这只是令人沮丧,因为我正在学习,如果没有导师,我很难解决自己的问题:/ 谢谢大家的时间!传入代码......这是我到目前为止所拥有的

#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");
}

PS 我尝试使用断点来查看如何逐行编写代码,但它开始将我扔到 iostream 文件中,我现在不知道如何阅读这些文件!

4

3 回答 3

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");
 }
于 2013-06-04T18:33:26.660 回答
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");
}
于 2013-06-04T18:36:25.763 回答
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");
}

这应该有效。

于 2013-06-04T18:38:10.843 回答