powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Дурацкая формула
6 сообщений из 6, страница 1 из 1
Дурацкая формула
    #33354947
Помоги мне
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужна помощь: пользователь вводит формулу (н-р 2*х+3*х^6+67), которая заранее неизвестна. как это организовать??? есть ли такая возможность вообще в С++??? в формуле присутствует неизвестное х, числа и математические знаки.
...
Рейтинг: 0 / 0
Дурацкая формула
    #33355041
Станислав C.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помоги мнеМне нужна помощь: пользователь вводит формулу (н-р 2*х+3*х^6+67), которая заранее неизвестна. как это организовать??? есть ли такая возможность вообще в С++??? в формуле присутствует неизвестное х, числа и математические знаки.
Не вижу проблемы... EditBox и вперед! А вот вычислить введенное выражение... Но это уже совсем другая история...
...
Рейтинг: 0 / 0
Дурацкая формула
    #33355067
Tov. Drujba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Набери в гугле "польская нотация" и узреешь ответы...
...
Рейтинг: 0 / 0
Дурацкая формула
    #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
Дурацкая формула
    #33356091
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSScriptControl.

Все вычислит.
________________________________________________________
Глюк - это высокоорганизованная система не поддающихся определению частиц
...
Рейтинг: 0 / 0
Дурацкая формула
    #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
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Дурацкая формула
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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