|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.05.2010, 16:32 | #1 |
Пользователь
Регистрация: 07.06.2009
Сообщений: 12
|
C++ калькулятор
как в данном случае правильно использовать compare, чтобы можно было использовать все функции?
#include <iostream> #include <map> #include <cctype> #include <cmath> #include <cstring> #include <string> using namespace std; enum Token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=',', ASSIGN='=', LP='(', RP=')', FUNC }; struct SyntaxError { const char* p; SyntaxError(const char* q){p=q;} }; struct MathError { const char* p; MathError(const char* q){p=q;} }; Token_value curr_tok=PRINT; map <string, double> table; int no_of_errors; int error (const string& s) { no_of_errors++; cerr<<"Oshibka: "<<s<<'\n'; return 1; } double number_value; string string_value; string s1("abs"); 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 ("Nepravil'naya leksema"); 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("Oghidalas' )"); get_token(); return e; } case FUNC: { if(compare(Token_value,"abs")==0)re turn fabs(prim(true)); if(compare(Token_value,"sin")==0)re turn sin(prim(true)); if(compare(Token_value,"cos")==0)re turn cos(prim(true)); if(compare(Token_value,"tg")==0) { double angle=prim(true); double temp= cos(angle); if(temp==0) throw(MathError("can't calculate tg")); return sin(angle)/temp; } if (compare(Token_value,"ctg")==0) { double angle=prim(true); double temp= sin(angle); if(temp==0) throw(MathError("can't calculate сtg")); return cos(angle)/temp; } if (compare(Token_value,"ln")==0) { double temp=prim(true); if(temp<=0) throw(MathError("argument of lg is <= zero")); return log(temp); } if (compare(Token_value,"exp")==0) return exp(prim(true)); if (compare(Token_value,"asin")==0) { double temp=prim(true); if(temp<-1||temp>1)throw(MathError("argument of asin is out of ranges")); return asin(temp); } if (compare(Token_value,"acos")==0) { double temp=prim(true); if(temp<-1||temp>1)throw(MathError("argument of acos is out of ranges")); return acos(temp); } throw(SyntaxError("Incorrect function")); } default: return error ("Oghidalos' pervichnoe vi'raghenie"); } } 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("Delenie na 0"); default: return left; } } double expr(bool get) { double left = term(get); for(;;) switch(curr_tok) { case PLUS: left += term(true); break; case MUL: left*=prim(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)<<'\n'; } return no_of_errors; } Последний раз редактировалось napanin; 09.05.2010 в 16:34. Причина: помешали смайлы. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Калькулятор | SPQR10000 | Помощь студентам | 11 | 25.02.2010 22:01 |
Калькулятор | Иринка26 | Помощь студентам | 11 | 19.02.2010 17:05 |
Калькулятор на C++ | stox11 | Помощь студентам | 2 | 09.02.2010 07:31 |
Калькулятор | Levsha100 | Софт | 7 | 10.07.2009 12:07 |
Калькулятор | slivochny | Общие вопросы C/C++ | 4 | 17.06.2009 20:49 |