2010-07-22 4 views
1

내가 비얀이 운동으로 무엇을 의미하는지 확실하지 않다 :운동 - 책상 계산기

"대신 정적 변수 NUMBER_VALUE 및 STRING_VALUE를 사용하는 심볼 구조를 사용하는 책상 계산기를 변환합니다. "

2 개의 변수를 구조 안에 넣은 다음 구조를 통해 사용하는 것을 의미합니까?

편집 : clculator와 관련된 한 가지 운동 : "사용자가 퓰 레이 터에서 기능을 정의 할 수 있음 힌트 : 사용자가 입력 한 것처럼 일련의 작업으로 기능을 정의하십시오. 시퀀스는 char 문자열이나 토큰 목록으로 저장 될 수 있으며 함수가 호출 될 때 해당 연산을 읽고 실행한다. 사용자 정의 함수가 args를 취하도록하려면 해당 표기법을 고안해야한다. . "

아무에게도 무엇을 의미 할 수 있습니까? 어떤 종류의 기능을 사용자가 정의해야합니까? 예를 들어 인수에서^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

+1

그 자체로 "글로벌"변수 그 자체는 없으며 글로벌 네임 스페이스의 정적 변수입니다. – GManNickG

+0

그리고 사용자 정의 함수는 어떻습니까? 어떻게해야합니까? 나는 func (x)를 정의하는 것과 같은 것을 구현해야한다. x * x; (일종의 매크로 스타일) - 그러면 lexer가 "define"키워드를 찾으면 함수 정의/인수를 적절한 구조 안에 저장합니까? – Tool