【发布时间】:2009-05-16 00:28:55
【问题描述】:
我正在做 Stroustrup 的新书 "Programming Principles and Practice Using C++" 中的练习,想知道 StackOverflow 上是否有人做过这些练习并愿意分享知识?
具体说一下第6章和第7章开发的计算器。比如添加!操作符和sqrt()、pow()等问题。这些我都做过,不知道有没有我的解决方案是“好”的做事方式,Bjarne 的网站上没有发布的解决方案。我想知道我是否走在正确的轨道上。也许我们可以为练习制作一个 wiki?
基本上我有一个令牌解析器。它一次从 cin 读取一个字符。它旨在标记 5*3+1 之类的表达式,并且非常适合。练习之一是添加一个 sqrt() 函数。所以我修改了标记化代码以检测“sqrt(”,然后返回一个表示 sqrt 的 Token 对象。在这种情况下,我使用 char 's'。其他人会这样做吗?如果我需要实现 sin() 怎么办? case 语句会变得混乱。
char ch;
cin >> ch; // Note that >> skips whitespace (space, newline, tab, etc.)
switch (ch) {
case ';': // For "print"
case 'q': // For "quit"
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 the input stream
double val;
cin >> val; // Read a floating-point number
return Token('8', val); // Let '8' represent "a number"
}
case 's':
{
char q, r, t, br;
cin >> q >> r >> t >> br;
if (q == 'q' && r == 'r' && t == 't' && br == '(') {
cin.putback('('); // Put back the bracket
return Token('s'); // Let 's' represent sqrt
}
}
default:
error("Bad token");
}
【问题讨论】:
-
只需在此处发布您的代码,很多人会很乐意告诉您可以改进的地方。这个站点是您需要的所有 wiki。 :)
-
没看过这个练习,但看起来很奇怪的是,你试图将遇到的每个数字和小数点都加倍。
-
如果输入读取 'sin(2)',那么您的代码会将 'i'、'n' 和 '(' 读取到 q、r、t 中;然后它决定这些是不是统称为“q”、“r”和“t”,所以......它放弃了一切。我相信你需要更加努力地看待错误恢复。
-
我相信 Bjarne Stroustrup 本人已经回答了您的问题。
-
@MichaelMyers:我认为他根本没有回答这个问题。
标签: c++