代码之家  ›  专栏  ›  技术社区  ›  Tool

C++语言中的练习第三版-台式计算器

c++
  •  1
  • Tool  · 技术社区  · 14 年前

    我不知道比亚恩这个练习是什么意思:

    “将桌面计算器转换为使用符号结构,而不是使用静态变量数字值和字符串值。”

    他是指将这两个变量放入一个结构中,然后通过一个结构使用它们吗?

    编辑:还有一个与clculator相关的练习,它说: “允许用户在Claculator中定义函数。提示:将一个函数定义为一系列操作,就像用户输入它们一样。这样的序列可以存储为char字符串或标记列表。然后在调用函数时读取并执行这些操作。如果希望用户定义的函数接受参数,则必须为此发明一个表示法。”

    有人能给妈妈举个例子吗? 用户应该定义什么类型的函数,我不明白。例如,能够定义从参数返回^2值的函数吗?

    这是密码。

    #include <iostream>
    #include <map>
    
    using namespace std;
    
    double term(bool);
    double expr(bool);
    double prim(bool);
    double error(const string&);
    
    double number_value;
    string string_value;
    
    int no_of_errors;
    map<string, double> table;
    
    enum Token_value {
         NAME,          NUMBER,          END,
         PLUS = '+',    MINUS = '-',     MUL = '*',    DIV = '/',
         PRINT = ';',   ASSIGN = '=',    LP = '(',     RP = ')'
    };
    
    Token_value curr_tok = PRINT;
    Token_value get_token();
    
    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;
               }
    }
    
    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 zero");
                  default:
                          return left;
               }
    }
    
    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");
           }
    }
    
    Token_value get_token()
    {
           char ch = 0;
           do {
               if(!cin.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 '.':
                    cin.putback(ch);
                    cin >> number_value;
                    return curr_tok = NUMBER;
               default:
                       if(isalpha(ch)) {
                           string_value = ch;
                           while(cin.get(ch) && isalnum(ch))
                              string_value.push_back(ch);
                           cin.putback(ch);
                           return curr_tok = NAME;
                       }
                       error("bad token");
                       return curr_tok = PRINT;
           }
    }
    
    double error(const string &s)
    {
           no_of_errors++;
           cerr << "error: " << s << '\n';
           return 1;
    }
    
    int main()
    {
          table["pi"] = 3.14;
          table["e"] = 2.71;
    
          while(cin) {
              get_token();
              if(curr_tok == END)
                 break;
              if(curr_tok == PRINT)
                 continue;
              cout << expr(false) << endl;
          }
          return no_of_errors;
    }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Ben Voigt Caesar    14 年前

    在我看来,这正是他的意思。此外,结构也不应该是全局的,它应该作为参数(通过值或适当的引用)传递。