2010-07-22 32 views
1

我不知道是什么Bjarne的意思与此练习:运动在C++编程语言第三版 - 台计算器

“转换的桌面计算器使用,而不是使用静态变量NUMBER_VALUE和STRING_VALUE中的符号结构。 “

他的意思是把这两个变量放在一个结构中,然后通过一个结构使用它们?

编辑:另外一个练习与计算器相关,它说: “允许用户在分类器中定义函数提示:将函数定义为一系列操作,就像用户输入它们一样。序列可以存储为字符串或者标记列表,然后在函数调用时读取并执行这些操作。如果你想让一个用户定义的函数采用参数,你必须为此创建一个符号“。

任何人都可以举例说明它的含义吗? 用户应该定义什么类型的函数,我没有明白。能够定义例如从其参数返回^ 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

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

+0

他为什么说变量是“静态的”?他们是全球性的,不是静态的?还是全局变量也是自动静态的? – Tool 2010-07-22 22:52:56

+1

本身不存在“全局”变量,只是全局名称空间中的一个静态变量。 – GManNickG 2010-07-22 22:54:37

+0

那么用户定义函数呢? 有什么建议,我应该怎么做呢?我希望实现类似于定义func(x)x * x; (某种宏观风格) - 那么当词法分析器找到“define”关键字时,它将函数定义/参数存储在适当的结构中? – Tool 2010-07-22 23:04:15