Здравствуйте, Zh0rzh, Вы писали:
Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3 Z>Так же вводятся b, a. Нужно вычислить значение.
Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы.
Здравствуйте, Zh0rzh, Вы писали:
Z>Вот такая вот незадача. Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3 Z>Так же вводятся b, a. Нужно вычислить значение.
#include<iostream>
#include<map>
using namespace std;
class Expression
{
private:
int m_nPos;
int m_nSize;
int m_nExpressionResult; // no multiply calculating bool m_bCalculated; // flag char* m_szExpression;
map<char, int> m_VariablesTable;
public:
// exception structstruct BAD_LEXEM
{
BAD_LEXEM(char chLex, int nPos)
:nPosition(nPos), chLexem(chLex){;}
int nPosition;
char chLexem;
};
// constructor/destructor
Expression();
Expression(const char*);
// Mutators/accessorschar* GetExpression() const {return m_szExpression;}
int GetLength() const {return m_nSize;}
void AddVariable(char s, int nValue)
{
m_VariablesTable.insert(pair<char, int>(s, nValue));
}
// miscint Calculate();
private:
enum LEXEM
{
NUMBER, PLUS, MINUS, MUL, DIV
};
int Prim();
int Term();
int Expr();
};
Expression::Expression()
:m_nPos(0),m_nSize(0),
m_nExpressionResult(0),m_bCalculated(false)
{
m_szExpression = new char[0];
}
Expression::Expression(const char* szInput)
:m_nPos(0),m_nSize(0),
m_nExpressionResult(0),m_bCalculated(false)
{
if((szInput)&&(szInput[0]))
{
m_nSize = strlen(szInput);
m_szExpression = new char[m_nSize];
strcpy(m_szExpression, szInput);
}
}
int Expression::Calculate()
{
if (!m_bCalculated)
{
m_nExpressionResult = Expr();
m_bCalculated = true;
}
return m_nExpressionResult;
}
int Expression::Prim()
{
if (isdigit(m_szExpression[m_nPos]))
{
return atoi(&m_szExpression[m_nPos++]);
}
else if (isalpha(m_szExpression[m_nPos++]))
{
if (m_VariablesTable.find(m_szExpression[m_nPos-1])
!=m_VariablesTable.end())
return m_VariablesTable[m_szExpression[m_nPos-1]];
else
throw Expression::BAD_LEXEM
(m_szExpression[m_nPos-1], m_nPos);
}
else
throw Expression::BAD_LEXEM
(m_szExpression[m_nPos], m_nPos+1);
}
int Expression::Term()
{
int nTemp = Prim();
while(true)
{
switch(m_szExpression[m_nPos])
{
case'*':
m_nPos++;
nTemp *= Prim();
break;
case'/':
m_nPos++;
nTemp /= Prim();
break;
default:
return nTemp;
}
}
}
int Expression::Expr()
{
int nTemp = Term();
while(true)
{
switch(m_szExpression[m_nPos])
{
case'+':
m_nPos++;
nTemp += Term();
break;
case'-':
m_nPos++;
nTemp -= Term();
break;
default:
if (m_nPos!=m_nSize)
throw Expression::BAD_LEXEM
(m_szExpression[m_nPos], m_nPos+1);
else
return nTemp;
}
}
}
void main()
{
try
{
Expression ex2("2+d+9"); // здесь задай выражение ex2.AddVariable('a',1);
ex2.AddVariable('d',2);
Expression ex = ex2;
cout << ex.Calculate() << endl;
}
catch(Expression::BAD_LEXEM& e)
{
cout << "Bad lexem: " << e.chLexem << endl;
cout << "in position: " << e.nPosition << endl;
}
}
Здравствуйте, Zh0rzh, Вы писали:
Z>Вот такая вот незадача.
Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3 Z>Так же вводятся b, a. Нужно вычислить значение.
Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия. Z>Не обделите советом.
А самому почему не написать ? Неужели самому не интересно?
Здравствуйте, Zh0rzh, Вы писали:
Z>Вот такая вот незадача.
Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3 Z>Так же вводятся b, a. Нужно вычислить значение.
Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия. Z>Не обделите советом.
Если пользоваться придется только под Win32, то можно воспользоваться стандартной
технологией от M$. По крайней мере отлаженная технология, и сообщения об ошибках,
будут выдоваться в соотвествии с национальными настройками.
Enter equation to evalueate or 'exit' to exit.
Lines satrted form char'!' interpretated
as varaible definitions, or execute statament
all other stataments interpreted as equation to
be evaluated.
>!A=2try execute: !A=2
Ok
>!B=3try execute: !B=3
Ok
>(b^2+3)/2+a^3try evaluate: (b^2+3)/2+a^3
result=14
Здравствуйте, Zh0rzh, Вы писали: Z>Вот такая вот незадача.
Почему незадача? Задача! Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3 Z>Так же вводятся b, a. Нужно вычислить значение.
Уже советовали См. Страуструпа.
А также посмотри flex/bizon. Можно только bizon, известный также как yacc, byacc и т.п. И потом пригодится.
Здравствуйте, Zh0rzh, Вы писали:
Z>Вот такая вот незадача.
Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3 Z>Так же вводятся b, a. Нужно вычислить значение.
Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия. Z>Не обделите советом.
Помню, помню эту задачу... Когда я учился в универе, то эта задача была у меня на лабу, суть которой предполагала написания парсера. Но время как то незаметно прошло, и пришло время сдавать лабу, ну а под рукой ничего небыло... Вот тогда мне то и пришла идея, заюзать для этого сам компилер, смысл заключался в следующем, генерировался код, затем незаметно компилился, выполнялся, результат в файл, который я считывал из основной программы. Самое интересно было наблюдать изумление препода, так как какой бы он сложности формулу невводил, все равно прога работала правильно. Благо то что он не всматривался в код программы и меня пронесло...
Re[2]: Формулы.
От:
Аноним
Дата:
06.05.03 17:24
Оценка:
Здравствуйте, Аноним, Вы писали:
<...>
Круто придумал !
А что выводилось, если компилятор выдавал ошибку ?
Здравствуйте, Zh0rzh, Вы писали:
Z>Вот такая вот незадача.
Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3 Z>Так же вводятся b, a. Нужно вычислить значение.
Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия. Z>Не обделите советом.
есть уже закоденный алгоритм, если надо пиши своё мыло пришлю.
...Почему разум становится более ленивым по мере развития технологий? Он привыкает к ним и не заботится о разработке новых...