Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Дурацкая формула / 6 сообщений из 6, страница 1 из 1
01.11.2005, 12:20
    #33354947
Помоги мне
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дурацкая формула
Мне нужна помощь: пользователь вводит формулу (н-р 2*х+3*х^6+67), которая заранее неизвестна. как это организовать??? есть ли такая возможность вообще в С++??? в формуле присутствует неизвестное х, числа и математические знаки.
...
Рейтинг: 0 / 0
01.11.2005, 12:52
    #33355041
Станислав C.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дурацкая формула
Помоги мнеМне нужна помощь: пользователь вводит формулу (н-р 2*х+3*х^6+67), которая заранее неизвестна. как это организовать??? есть ли такая возможность вообще в С++??? в формуле присутствует неизвестное х, числа и математические знаки.
Не вижу проблемы... EditBox и вперед! А вот вычислить введенное выражение... Но это уже совсем другая история...
...
Рейтинг: 0 / 0
01.11.2005, 13:03
    #33355067
Tov. Drujba
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дурацкая формула
Набери в гугле "польская нотация" и узреешь ответы...
...
Рейтинг: 0 / 0
01.11.2005, 18:18
    #33356069
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дурацкая формула
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
#include <iostream>
#include <string>
#include <vector>
#include <boost\spirit.hpp>
using namespace boost::spirit;
std::vector<double> stack;
void calc_push(double d)
{
    stack.push_back(d);
}
void calc_add(char const*, char const*)
{ 
    double b=stack.back();stack.pop_back();
    double a=stack.back();stack.pop_back();
    stack.push_back(a+b);
}
void calc_sub(char const*, char const*)
{ 
    double b=stack.back();stack.pop_back();
    double a=stack.back();stack.pop_back();
    stack.push_back(a-b);
}
void calc_mul(char const*, char const*)
{ 
    double b=stack.back();stack.pop_back();
    double a=stack.back();stack.pop_back();
    stack.push_back(a*b);
}
void calc_div(char const*, char const*)
{ 
    double b=stack.back();stack.pop_back();
    double a=stack.back();stack.pop_back();
    stack.push_back(a/b);
}
void calc_neg(char const*, char const*)
{ 
    double a=stack.back();stack.pop_back();
    stack.push_back(-a);
}

struct calculator : public grammar<calculator>
{
    template <typename ScannerT>
    struct definition
    {
        definition(calculator const& /*self*/)
        {
            expression
                =   term
                    >> *(   ('+' >> term)[&calc_add]
                        |   ('-' >> term)[&calc_sub]
                        )
                ;
            term
                =   factor
                    >> *(   ('*' >> factor)[&calc_mul]
                        |   ('/' >> factor)[&calc_div]
                        )
                ;
            factor
                =   real_p[&calc_push]
                |   '(' >> expression >> ')'
                |   ('-' >> factor)[&calc_neg]
                |   ('+' >> factor)
                ;
        }
        rule<ScannerT> expression, term, factor;
        const rule<ScannerT>& start() const { return expression; }
    };
};

int main()
{
    calculator calc;
    while(true)
    {
        std::string src;
        std::cout<<"expression: ";std::cin>>src;
        if(src=="exit")break;
        parse_info<> info = parse(src.c_str(), calc, space_p);
        if(info.full)
        {
            std::cout<<"-------------------------\n";
            std::cout<<"Parsing succeeded\n";
            std::cout<<"result= "<<stack.back()<<"\n";
            std::cout<<"-------------------------\n";
        }
        else
        {
            std::cout<<"-------------------------\n";
            std::cout<<"Parsing failed\n";
            std::cout<<"error at: " << src << "\n";
            std::cout<<"          ";
            for(size_t i= 0 ;i<info.length+ 1 ;++i)std::cout<<" ";
            std::cout<<"^\n";
            std::cout<<"-------------------------\n";
        }
    }
    return  0 ;
}
 
...
Рейтинг: 0 / 0
01.11.2005, 18:29
    #33356091
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дурацкая формула
MSScriptControl.

Все вычислит.
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
01.11.2005, 19:54
    #33356213
Lepsik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Дурацкая формула
или еще так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
...\boost_1_30_0\libs\spirit\example\fundamental\calc\calc_plain.cpp
/*=============================================================================
    Spirit v1.6.0
    Copyright (c) 1998-2003 Joel de Guzman
    http://spirit.sourceforge.net/

    Permission to copy, use, modify, sell and distribute this software is
    granted provided this copyright notice appears in all copies. This
    software is provided "as is" without express or implied warranty, and
    with no claim as to its suitability for any purpose.
=============================================================================*/
////////////////////////////////////////////////////////////////////////////
//
//  Plain calculator example.
//
//  [ JDG 5/10/2002 ]
//
////////////////////////////////////////////////////////////////////////////
#include "boost/spirit/core.hpp"
#include <iostream>
#include <string>

////////////////////////////////////////////////////////////////////////////
using namespace std;
using namespace boost::spirit;

////////////////////////////////////////////////////////////////////////////
//
//  Semantic actions
//
////////////////////////////////////////////////////////////////////////////
namespace {

    void    do_int(char const* str, char const* end)
    {
        string  s(str, end);
        cout << "PUSH(" << s << ')' << endl;
    }

    void    do_add(char const*, char const*)    { cout << "ADD\n"; }
    void    do_subt(char const*, char const*)   { cout << "SUBTRACT\n"; }
    void    do_mult(char const*, char const*)   { cout << "MULTIPLY\n"; }
    void    do_div(char const*, char const*)    { cout << "DIVIDE\n"; }
    void    do_neg(char const*, char const*)    { cout << "NEGATE\n"; }
}

////////////////////////////////////////////////////////////////////////////
//
//  Our calculator grammar
//
////////////////////////////////////////////////////////////////////////////
struct calculator : public grammar<calculator>
{
    template <typename ScannerT>
    struct definition
    {
        definition(calculator const& /*self*/)
        {
            expression
                =   term
                    >> *(   ('+' >> term)[&do_add]
                        |   ('-' >> term)[&do_subt]
                        )
                ;

            term
                =   factor
                    >> *(   ('*' >> factor)[&do_mult]
                        |   ('/' >> factor)[&do_div]
                        )
                ;

            factor
                =   lexeme_d[(+digit_p)[&do_int]]
                |   '(' >> expression >> ')'
                |   ('-' >> factor)[&do_neg]
                |   ('+' >> factor)
                ;
        }

        rule<ScannerT> expression, term, factor;

        rule<ScannerT> const&
        start() const { return expression; }
    };
};

////////////////////////////////////////////////////////////////////////////
//
//  Main program
//
////////////////////////////////////////////////////////////////////////////
int
main()
{
    cout << "/////////////////////////////////////////////////////////\n\n";
    cout << "\t\tExpression parser...\n\n";
    cout << "/////////////////////////////////////////////////////////\n\n";
    cout << "Type an expression...or [q or Q] to quit\n\n";

    calculator calc;    //  Our parser

    string str;
    while (getline(cin, str))
    {
        if (str[ 0 ] == 'q' || str[ 0 ] == 'Q')
            break;

        parse_info<> info = parse(str.c_str(), calc, space_p);

        if (info.full)
        {
            cout << "-------------------------\n";
            cout << "Parsing succeeded\n";
            cout << "-------------------------\n";
        }
        else
        {
            cout << "-------------------------\n";
            cout << "Parsing failed\n";
            cout << "stopped at: \": " << info.stop << "\"\n";
            cout << "-------------------------\n";
        }
    }

    cout << "Bye... :-) \n\n";
    return  0 ;
}
 
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Дурацкая формула / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]