c++ - C++ PPP第8章练习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 是什么进行了一些研究,但我仍然不确定在这里做什么..
解决方案
他的意思是将令牌作为参数提供给函数,而不是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;
}
推荐阅读
- c# - Richtextbox DetectUrl 错误
- c++ - 我的选择排序代码是否存在问题,导致它跳过数组中的元素?
- machine-learning - ValueError:检查目标时出错:预期dense_3的形状为(1,)但得到的数组形状为(11,)
- c++ - 如何正确搜索 4 x 4 2d 矩阵中的值?
- mathjax - mathjax 3 的配置问题
- function - 在 QUERY 函数中包含标准 Google 表格函数时的语法是什么?
- excel - 创建一个按钮,如果按下则将值添加到单元格
- c# - 是否建议将大型字典拆分为多个部分?
- javascript - Puppeteer 抛出“节点不可见...”错误
- jquery - 使用 jQuery 迭代 .getJSON 响应