Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2010, 16:32   #1
napanin
Пользователь
 
Регистрация: 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. Причина: помешали смайлы.
napanin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Калькулятор 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