|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.05.2010, 17:49 | #1 |
Пользователь
Регистрация: 07.06.2009
Сообщений: 12
|
"ошибка" в калькуляторе
код на С++.
это калькулятор из страуструпа. #include <iostream> #include <string> #include <map> #include <cctype> using namespace std; enum Token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=',', ASSIGN='=', LP='(', RP=')' }; 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; 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; } 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; } 1) почему если ввести "pi+1" печатается 0, а если "1+pi" - 4.14159 ??? как это исправить? 2) проблема со скобками... если ввести "(1+pi) end" печатается " Oshibka: Oghidalas' ) ". в чём противоречие? что не так? Последний раз редактировалось napanin; 07.05.2010 в 17:51. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. | Каравай | Microsoft Office Excel | 13 | 17.02.2010 09:53 |
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" | aleksei78 | Microsoft Office Excel | 13 | 25.08.2009 12:04 |
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder | AleksP | C++ Builder | 7 | 11.04.2009 13:06 |
блок "cont" с права не принимает значение "margin: 10px;" которое описано в body | tabikA | HTML и CSS | 5 | 24.02.2009 21:50 |