내가 비얀이 운동으로 무엇을 의미하는지 확실하지 않다 :운동 - 책상 계산기
"대신 정적 변수 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;
}
왜 변수가 정적이라고 말합니까? 그것들은 정적이 아닌 전역 적입니다. 또는 전역 변수도 자동으로 정적입니까? – Tool
그 자체로 "글로벌"변수 그 자체는 없으며 글로벌 네임 스페이스의 정적 변수입니다. – GManNickG
그리고 사용자 정의 함수는 어떻습니까? 어떻게해야합니까? 나는 func (x)를 정의하는 것과 같은 것을 구현해야한다. x * x; (일종의 매크로 스타일) - 그러면 lexer가 "define"키워드를 찾으면 함수 정의/인수를 적절한 구조 안에 저장합니까? – Tool