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

📄 pr06025.cpp

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

// Function prototypes.
int addsubt();
int multdiv();
int number();
void error();

// Global expression buffer.
static char expr[81];
static int pos;

////////////////////////////////////////
// The main() function.
////////////////////////////////////////
int main()
{
    int ans;

    do
    {
        // Initialize the string subscript.
        pos = 0;

        // Read an expression.
        std::cout << "Enter expression (0 to quit):" 
                  << std::endl;
        std::cin >> expr;

        // Evaluate the expression.
        ans = addsubt();
        if (expr[pos] != '\0')
            error();
        if (ans != 0)
            std::cout << ans << std::endl;
    }
    while (ans != 0);

    return 0;
}

//////////////////////////////////////////
// Top of recursive descent: add/subtract.
//////////////////////////////////////////
int 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 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 number()
{
    int rtn;
    if (expr[pos] == '(')
    {
        // Parenthetical expression.
        pos++;
        rtn = addsubt();        // Back to top.
        if (expr[pos++] != ')') // Must have ')'
            error();

         return rtn;
    }

    // Extract the number.
    if (!isdigit(expr[pos]))
        error();
    rtn = atoi(expr+pos);
    while (isdigit(expr[pos]))
        pos++;

    return rtn;
}

////////////////////////////////////////
// Syntax error.
////////////////////////////////////////
void error()
{
    std::cout << '\r';
    while (pos--)     // Position error pointer.
        std::cout << ' ';
    std::cout << "^ syntax error" << std::endl << '\a';

    exit(-1);
}

⌨️ 快捷键说明

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