添加!运算符和sqrt(),pow()等到计算器示例应用程序

Pow*_*101 29 c++

我正在Stroustrup的新书"使用C++编程原理和实践"中进行练习,并且想知道SO上是否有人做过这些并愿意分享这些知识?特别是关于在第6章和第7章中开发的计算器.例如关于添加的计算器!运营商和sqrt(),pow()等我已经完成了这些,但我不知道我所拥有的解决方案是否是"好"的做事方式,并且Bjarne网站上没有已发布的解决方案.我想知道我是否走上正轨.也许我们可以为练习制作一个维基?

基本上我有一个令牌解析器.它从cin一次读取一个字符.它意味着标记像5*3 + 1这样的表达式,它的效果非常好.其中一个练习是添加一个sqrt()函数.所以我修改了令牌化代码以检测"sqrt("然后返回表示sqrt的Token对象.在这种情况下,我使用char的'.这是其他人会怎么做的?如果我需要实现sin()怎么办?案件陈述会变得混乱.

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");
}
Run Code Online (Sandbox Code Playgroud)

小智 212

  • Stroustrup - Programming上发布的解决方案很少,而且随着时间的推移会有更多的解决方案.

  • 尝试使用目前在书中提供的语言功能和库设施来解决练习 - 真正的新手用户不能做任何其他事情.然后返回以查看如何改进解决方案.

  • 是的,我有点像地图一样作弊......直到后面的章节才出现.顺便说一句,我真的很喜欢这本书.我认为计算器实际上可能在现实世界中很有用,对于大多数入门书籍中提供的样本而言,这不是你可以说的. (2认同)

Pow*_*101 10

我认为函数指针的字符串映射可能是一种简洁的方式来表示像sqrt,sin,cos等取一个double并返回double的东西:

map<std::string, double (*)(double)> funcs;
funcs["sqrt"] = &sqrt;
funcs["sin"] = &sin;
funcs["cos"] = &cos;
Run Code Online (Sandbox Code Playgroud)

然后,当解析器检测到正确的字符串(str)时,它可以使用参数(arg)调用该函数,如下所示:

double result = funcs[str](arg);
Run Code Online (Sandbox Code Playgroud)

使用此方法,单个调用可以处理所有类型的函数(该类型).

实际上我不确定这是否是正确的语法,任何人都可以确认吗?

这看起来像一个有用的方法吗?

  • 它可能,但Bjarne Stroustrup回答了你的问题.跪拜. (8认同)