Формулы.
От: Zh0rzh  
Дата: 25.03.03 03:24
Оценка:
Вот такая вот незадача.

Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3
Так же вводятся b, a. Нужно вычислить значение.

Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия.
Не обделите советом.

25.03.03 17:57: Перенесено из 'C/C++'
28.03.03 20:30: Перенесено модератором из 'Прочее' в 'Исходники' — ХД
Re: Формулы.
От: Nikto Россия  
Дата: 25.03.03 03:27
Оценка:
Здравствуйте, Zh0rzh, Вы писали:

Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3

Z>Так же вводятся b, a. Нужно вычислить значение.

на www.sources.ru посмотри.
Re: Формулы.
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 25.03.03 04:07
Оценка:
Здравствуйте, Zh0rzh, Вы писали:

Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3

Z>Так же вводятся b, a. Нужно вычислить значение.

Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы.


Файлы->Классы — http://www.rsdn.ru/files/?Classes/tparser.xml
Если вы смотрите телевизор, вы, должно быть, заметили, что хорошие парни побеждают плохих всегда, кроме девятичасовых новостей.
Re: Формулы.
От: promko Украина  
Дата: 25.03.03 06:41
Оценка:
Здравствуйте, 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 struct
    struct BAD_LEXEM
    {    
        BAD_LEXEM(char chLex, int nPos)
            :nPosition(nPos), chLexem(chLex){;}
        int nPosition;
        char chLexem;
    };

// constructor/destructor
    Expression();
    Expression(const char*);    

// Mutators/accessors
    char* 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));    
    }    

// misc
    int 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;
    }            
}
Re: Формулы.
От: peterbes Россия  
Дата: 25.03.03 07:18
Оценка:
Здравствуйте, Zh0rzh, Вы писали:

Z>Вот такая вот незадача.


Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3

Z>Так же вводятся b, a. Нужно вычислить значение.

Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия.

Z>Не обделите советом.

А самому почему не написать ? Неужели самому не интересно?
Re[2]: Формулы.
От: small_cat Россия  
Дата: 25.03.03 07:29
Оценка:
Здравствуйте, peterbes, Вы писали:

P>А самому почему не написать ? Неужели самому не интересно?


В догонку. Читай Страуструпа (у него есть с чего начать)
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Re: Формулы.
От: Chorkov Россия  
Дата: 25.03.03 08:02
Оценка: 73 (9)
Здравствуйте, Zh0rzh, Вы писали:

Z>Вот такая вот незадача.


Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3

Z>Так же вводятся b, a. Нужно вычислить значение.

Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия.

Z>Не обделите советом.

Если пользоваться придется только под Win32, то можно воспользоваться стандартной
технологией от M$. По крайней мере отлаженная технология, и сообщения об ошибках,
будут выдоваться в соотвествии с национальными настройками.


#pragma warning (disable : 4786)

#include <string>
#include <iostream>
#include <iomanip>
using namespace std;

#import "D:\winnt\system32\msscript.ocx"

void main(void)
{
    ::CoInitialize(NULL);
    MSScriptControl::IScriptControlPtr ScriptEngine;
    ScriptEngine.CreateInstance("MSScriptControl.ScriptControl"); 

    ScriptEngine->Language="VBScript"; // or "JScript"
    //ScriptEngine->AddCode("Option Explicit");


    cout<<"Enter equation to evalueate or 'exit' to exit."<<endl
        <<"Lines satrted form char '!' interpretated "<< endl
        <<" as varaible definitions, or execute statament"<<endl
        <<" all other stataments interpreted as equation to"<<endl
        <<" be evaluated."<<endl<<endl;
    for(string input; cout<<">"<<flush, cin>>input, input!="exit";)
    {
        try 
        {
            if(input[0]=='!')
            {
                cout<< endl << "try execute: " << input << endl;
                ScriptEngine->ExecuteStatement(input.c_str()+1);
                cout<<"Ok"<<endl;
            }
            else
            {
                cout<< endl << "try evaluate: " << input << endl;
                _variant_t result=ScriptEngine->Eval(input.c_str());
                cout<< "result=" << (double)result << endl 
                    << flush;
            }

        }
        catch(_com_error err)
        {
            cout<<"Error:"<<endl
                <<"Err namber: "<<hex<<err.Error<<endl
                <<"Err description: "<<(const char*)err.Description()<<endl
                <<flush;
        };
    };
    ::CoUninitialize();
};


Пример использования:


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=2
try execute: !A=2
Ok
>!B=3

try execute: !B=3
Ok
>(b^2+3)/2+a^3

try evaluate: (b^2+3)/2+a^3
result=14
Re: Формулы.
От: Рома Мик Россия http://romamik.com
Дата: 25.03.03 13:00
Оценка:
Здравствуйте, Zh0rzh, Вы писали:
Z>Вот такая вот незадача.
Почему незадача? Задача!
Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3
Z>Так же вводятся b, a. Нужно вычислить значение.
Уже советовали См. Страуструпа.
А также посмотри flex/bizon. Можно только bizon, известный также как yacc, byacc и т.п. И потом пригодится.
... << RSDN@Home 1.0 beta 6a >>
Re: Формулы.
От: e-buch Россия  
Дата: 02.05.03 17:00
Оценка: 3 (1)
Здравствуйте, Zh0rzh

ищи "польская запись" :
url=http://algolist.manual.ru/syntax/revpn.php
url=http://indev.virtualave.net/cgi-bin/use.pl?content=tech/alib/symform/index.html
Ну ... За работу !!!
Re: Формулы.
От: Boris Гондурас  
Дата: 03.05.03 10:07
Оценка:
Здравствуйте, Zh0rzh, Вы писали:

Math.NET (symbolic math library)

Z>Кто нибудь занимался такой проблемой.

Waterloo Maple
... << RSDN@Home 1.0 beta 6a >>
Re: Формулы.
От: Аноним  
Дата: 06.05.03 15:55
Оценка: :)
Здравствуйте, Zh0rzh, Вы писали:

Z>Вот такая вот незадача.


Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3

Z>Так же вводятся b, a. Нужно вычислить значение.

Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия.

Z>Не обделите советом.

Помню, помню эту задачу... Когда я учился в универе, то эта задача была у меня на лабу, суть которой предполагала написания парсера. Но время как то незаметно прошло, и пришло время сдавать лабу, ну а под рукой ничего небыло... Вот тогда мне то и пришла идея, заюзать для этого сам компилер, смысл заключался в следующем, генерировался код, затем незаметно компилился, выполнялся, результат в файл, который я считывал из основной программы. Самое интересно было наблюдать изумление препода, так как какой бы он сложности формулу невводил, все равно прога работала правильно. Благо то что он не всматривался в код программы и меня пронесло...
Re[2]: Формулы.
От: Аноним  
Дата: 06.05.03 17:24
Оценка:
Здравствуйте, Аноним, Вы писали:

<...>

Круто придумал !
А что выводилось, если компилятор выдавал ошибку ?
Re: Формулы.
От: MadCoders Россия  
Дата: 07.05.03 07:21
Оценка:
Здравствуйте, Zh0rzh, Вы писали:

Z>Вот такая вот незадача.


Z>Вводитм с клавиатуры формулу, вроде (b^2+3)/2+a^3

Z>Так же вводятся b, a. Нужно вычислить значение.

Z>Кто нибудь занимался такой проблемой. Может существуют уже готовые классы. Или у кого есть едия.

Z>Не обделите советом.

есть уже закоденный алгоритм, если надо пиши своё мыло пришлю.
...Почему разум становится более ленивым по мере развития технологий? Он привыкает к ним и не заботится о разработке новых...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.