首页 > 解决方案 > C++ PPP第8章练习1

问题描述

  1. 修改第 7 章中的计算器程序,使输入流成为显式参数(如 §8.5.8 所示),而不是简单地使用 cin。还要给 Token_stream 构造函数(第 7.8.2 节)一个 istream& 参数,以便当我们弄清楚如何制作自己的 istream(例如,附加到文件)时,我们可以使用计算器来计算这些。提示:不要试图复制 istream。

我会说这是可能与我必须在这里做的事情有关的代码?

class Token_stream {
public:
    Token get();                // get a Token
    void putback(Token t);      // put a token back
    void ignore(char c);        // discard characters up to and including a c
private:
    bool full{ false };        // is there a Token in the buffer?
    Token buffer{ '0' };  
    // here is where putback() stores a Token
};


Token Token_stream::get()
{
    if (full) {             // do we already have a Token?
        full = false;       // remove Token from buffer
        return buffer;
    }

    char ch;
    cin.get(ch);            // look for any char including whitespace

    while (isspace(ch) && ch != '\n') cin.get(ch);

    switch (ch) {
    case '\n':
        return Token{ print };
    case print:
    case quit:
    case help:
    case '(':
    case ')':
    case '{':
    case '}':
    case '!':
    case '+':
    case '-':
    case '*':
    case '/':
    case '%':
    case '=':
    case ',':
        return Token{ ch };    // let each character represent itself
    case '.':
    case '0': case '1': case '2': case '3': case '4':
    case '5': case '6': case '7': case '8': case '9':
    {
        cin.putback(ch);    // put digit back into input stream
        double val;
        cin >> val;         // read floating-point number
        return Token{ number, val };
    }
    default:
        if (isalpha(ch)) {
            string s;
            s += ch;
            while (cin.get(ch) &&
                ((isalpha(ch) || isdigit(ch) || ch == '_')))
                s += ch;
            cin.putback(ch);
            if (s == declkey) return Token{ let };    // declaration keyword
            else if (s == sqrtkey) return Token{ square_root };
            else if (s == expkey) return Token{ exponent };
            else if (s == sinkey) return Token{ c_sin };
            else if (s == coskey) return Token{ c_cos };
            else if (s == quitkey) return Token{ quit };
            else if (s == helpkey) return Token{ help };
            else return Token{ name, s };
        }
        error("Bad token");
    }
};

但我仍然不确定我必须在这里做什么?就像我只是不明白我需要做什么以及如何.. 任何人都可以帮助我吗?我对 istream 是什么进行了一些研究,但我仍然不确定在这里做什么..

标签: c++

解决方案


他的意思是将令牌作为参数提供给函数,而不是std::cin在函数内部使用语句。

void Token_stream::putback(Token t) //like this one
{
    if (full) error("putback() into full buffer");
    buffer = t;     
    full = true;    
}

// ignore Tokens up to specific kind
void Token_stream::ignore(char c) // and this one

{
    // first look in buffer:
    if (full && c==buffer.kind) {
        full = false;
        return;
    }
    full = false;

    
    char ch = 0;
    while (cin>>ch)
    if (ch==c) return;
}

推荐阅读