“使用C ++的原理和实践”第6.3.1章代码错误?

时间:2013-06-04 18:12:37

标签: c++

我正在通过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文件中,我不知道如何在这一点上阅读它们!

3 个答案:

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

这应该有效。