• C++桌面计算机


    #include<iostream>
    #include<string>
    #include<map>
    #include<cctype>
    using namespace std;
    enum Token_value{
        NAME,      NUMBER,      END,
        PLUS='+',  MINUS='-',   MUL='*',  DIV='/',
        PRINT=';', ASSIGN='=',  LP='(',   RP=')',
    };
    Token_value curr_tok=PRINT;
    double number_value;
    string string_value;
    map<string,double>table;
    int no_of_errors;
    double error(const string& s)
    {
        no_of_errors++;
        cerr<<"error:"<<s<<'
    ';
        return 1;
    }
    //==============================================================================
    Token_value get_token()
    {
        char ch=0;
        cin>>ch;
        switch(ch){
            case  0:
                return curr_tok=END;
            case';':
            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'.':
                cin.putback(ch);
                cin>>number_value;
                return curr_tok=NUMBER;
            default:
                if(isalpha(ch)){
                    cin.putback(ch);
                    cin>>string_value;
                    return curr_tok=NAME;
                }
                error("bad token");
                return curr_tok=PRINT;
        }
    }
    //==============================================================================
    double expr(bool);
    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;
                    }
                    return error("divide by 0");
                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);break;
                default:return left;
            }
    }
    //==============================================================================
    int main()
    {
        table["pi"]=3.1415926535897932385;
        table["e"]=2.7182818284590452354;
        while(cin){
            get_token();
            if(curr_tok==END)break;
            if(curr_tok==PRINT)continue;
            cout<<expr(false)<<'
    ';
        }
        return no_of_errors;
    }
  • 相关阅读:
    ReportViewer,RDLC 报表开发之分页
    Mvc2.0 处理自定义错误.
    使用 WPS中粘贴VS里的代码,并整理格式
    Sql2008中添加程序集.
    快速整理列说明.SQL2008.
    ASP.NET MVC在IIS6下部署的小技巧
    MS SQL Server将数据导出Insert语句的存储过程
    在IE6下发生Internet Explorer cannot open the Internet site错误
    Windows7 中配置IIS7的方法(HTTP 错误 404.3 Not Found)
    安卓2.2手动开启APP2SD方法
  • 原文地址:https://www.cnblogs.com/little-white/p/3594396.html
Copyright © 2020-2023  润新知