⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pr25007.cpp

📁 c++编程宝典源码及Quincy99编译器 是《标准C++编程宝典》电子工业出版社的光盘
💻 CPP
字号:
////////////////////////////////////////
// File Name: pr25007.cpp
////////////////////////////////////////
#include <iostream>
#include <cstdlib>
#include <cctype>
#include <string>

// Declare the error class.
class Error {};

////////////////////////////////////////
// Calculator class declaration.
////////////////////////////////////////
class Calculator
{
    int pos;
    std::string expr;
    int addsubt();
    int multdiv();
    int number() throw(Error);

public:
    Calculator(){ }
    int Compute(const std::string& str) throw(Error);
};

////////////////////////////////////////
// Calculator class definition.
////////////////////////////////////////
int Calculator::Compute(const std::string& str) throw(Error)
{
    int rtn = 0;
    try
    {
        pos = 0;
        expr = str;
        rtn = addsubt();
        if (pos < expr.length() && expr[pos] != '\0')
            throw Error();
    }
    catch(Error)
    {
        std::cout << '\r';
        while (pos--)          // position error pointer
            std::cout << ' ';
        std::cout << "^ syntax error" << std::endl << '\a';
        throw;
    }

    return rtn;
}

// Top of recursive descent: add/subtract.
int Calculator::addsubt()
{
    int rtn = multdiv();
    while (expr[pos] == '+' || expr[pos] == '-')
    {
        int op = expr[pos++];
        int opr2 = multdiv();
        if (op == '+')
            rtn += opr2;
        else
            rtn -= opr2;
    }

    return rtn;
}

// Highest precedence: multiply/divide.
int Calculator::multdiv()
{
    int rtn = number();
    while (expr[pos] == '*' || expr[pos] == '/')
    {
        int op = expr[pos++];
        int opr2 = number();
        if (op == '*')
            rtn *= opr2;
        else
            rtn /= opr2;
    }

    return rtn;
}

// Extract a number.
int Calculator::number() throw(Error)
{
    int rtn;

    if (expr[pos] == '(')
    {
        // Parenthetical expression.
        pos++;
        rtn = addsubt();         // Back to top.
        if (expr[pos++] != ')')  // Must have ')'
            throw Error();
    }
    else
    {
        // Extract the number.
        if (!std::isdigit(expr[pos]))
            throw Error();
        char ans[80] = "0";
        int i = 0;
        while (std::isdigit(expr[pos]) && pos < expr.length())
            ans[i++] = expr[pos++];
        ans[i] = '\0';
        rtn = std::atoi(ans);
    }

    return rtn;
}

////////////////////////////////////////
// The main() function.
////////////////////////////////////////
int main()
{
    int ans;
    do
    {
        // Read an expression.
        std::cout << "Enter expression (0 to quit):"
                  << std::endl;
        std::string expr;
        std::cin >> expr;

        try
        {
            Calculator calc;
            ans = calc.Compute(expr);
            if (ans != 0)
                std::cout << ans << std::endl;
        }
        catch(Error)
        {
            std::cout << "Try again" << std::endl;
            ans = 1;
        }
    }
    while (ans != 0);

    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -