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

📄 jisuanqi.txt

📁 1. 输入caculator
💻 TXT
字号:
/* Section 6.1 */
#include <iostream>
#include <string>
#include <map>
#include <cctype>
#include <sstream>
using namespace std;

enum Token_value {
    NAME,      NUMBER,     END,
    PLUS='+', MINUS='-', MUL='*', DIV='/',
    PRINT=';', ASSIGN='=', LP='(', RP=')'
};

Token_value curr_tok = PRINT;
map<string, double> table;
double number_value;
string string_value;
int no_of_errors;
istream* input;

double error(const string& s)
{
    no_of_errors++;
    cerr << "error:" << s << '\n';
    return 1;
}

Token_value get_token()
{
    char ch;
    do{
        if(!(*input).get(ch))
            return curr_tok = END;
    }while(ch !='\n' && isspace(ch));
    switch(ch) {
    case 0:
         return curr_tok = END;
    case ';':
    case '\n':
         return curr_tok = PRINT;
    case '*':
    case '/':
    case '+':
    case '-':
    case '(':
    case ')':
    case '=':
         return curr_tok = Token_value(ch);
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
    case '.':
    (*input).putback(ch);
    (*input) >> number_value;
         return curr_tok = NUMBER;
    default:
         if(isalpha(ch)){
             string_value = ch;
             while((*input).get(ch) && isalnum(ch))
                 string_value.push_back(ch);
             (*input).putback(ch);
             return curr_tok = NAME;
         }
         error("bad token");
         return curr_tok = PRINT;
    }
}

double expr(bool get);
double prim(bool get)
{
    if(get) get_token();
    switch(curr_tok) {
    case NUMBER:
    {
         double v = number_value;
         get_token();
         return v;
    }
    case NAME:
    {
         double& v = table[string_value];
         if(get_token() == ASSIGN)
             v = expr(true);
         return v;
    }
    case MINUS:
         return -prim(true);
    case LP:
    {
         double e = expr(true);
         if(curr_tok != RP)
             return error(") expected");
         get_token();
         return e;
    }
    default:
         return error("primary expected");
    }
}

double term(bool get)
{
    double left = prim(get);
    for(;;)
        switch(curr_tok) {
        case MUL:
             left *= prim(true);
             break;
        case DIV:
             if(double d = prim(true)) {
                 left /= d;
                 break;
             }
        default:
             return left;
        }
}

double expr(bool get)
{
    double left = term(get);
    for(;;)
        switch(curr_tok) {
        case PLUS:
             left += term(true);
             break;
        case MINUS:
             left -= term(true);
        default:
             return left;
        }
}

int main(int argc, char* argv[])
{
    switch(argc)
    {
    case 1:
         input = &cin;
         break;
    case 2:
         input = new istringstream(argv[1]);
         break;
    default:
         error("too many arguments");
         return 1;
    }

    table["pi"] = 3.1415926535897932385;
    table["e"] = 2.7182818284590452354;
    while(*input)
    {
        get_token();
        if(curr_tok == END)
            break;
        if(curr_tok == PRINT)
            continue;
        cout << expr(false) << '\n';
    }
    if(input != &cin)
        delete input;
    return no_of_errors;
}

⌨️ 快捷键说明

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