Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 10
1

Вычислить значение арифметического выражения, заданного в виде строки

24.07.2016, 21:07. Показов 4880. Ответов 19
Метки нет (Все метки)

с клавиатуры вводиться строка типа: "(7+1)*23-1" в одну строку, нужно определить значение арифметического выражения
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.07.2016, 21:07
Ответы с готовыми решениями:

Найти значение арифметического выражения, заданного в виде строки
Помогите пожалуйста! Ввести с клавиатуры строку, которая содержит арифметическое выражение вида...

Вычислить значение выражения, заданного в виде строки
Здравствуйте, есть строка которая в себе содержит данные вот пример...

Рекурсия: вычислить значение логического выражения, заданного в виде строки
Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим...

Вычисление арифметического выражения заданного в виде строки
Собственно вопрос в названии: возможно ли преобразовать строку с оператором в оператор? string s =...

19
Любитель чаепитий
3589 / 1688 / 520
Регистрация: 24.08.2014
Сообщений: 5,712
Записей в блоге: 1
24.07.2016, 21:12 2
Chayn1k, И что конкретно непонятно?
0
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 10
24.07.2016, 21:14  [ТС] 3
дополнительное условие: использовать тип данных char
0
471 / 423 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
24.07.2016, 21:15 4
Chayn1k, уже была тема с парсером выражений чуть раньше, юзай поиск
0
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 10
24.07.2016, 21:17  [ТС] 5
GbaLog-, программа для вычисления нужна
0
Любитель чаепитий
3589 / 1688 / 520
Регистрация: 24.08.2014
Сообщений: 5,712
Записей в блоге: 1
24.07.2016, 21:19 6
Chayn1k, Сами-то что-нибудь сделали уже? Или может алгоритм подсказать? Или часть алгоритма?
0
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 10
24.07.2016, 21:25  [ТС] 7
GbaLog-, алгоритм пожалуйста. Я только учусь сам, по книге. Сейчас структуры данных прохожу, запара полная. Собственно как Вы осваивали программирование? Вам ктио-то помогал или только комп и интернет?
0
Любитель чаепитий
3589 / 1688 / 520
Регистрация: 24.08.2014
Сообщений: 5,712
Записей в блоге: 1
24.07.2016, 21:37 8
Цитата Сообщение от Chayn1k Посмотреть сообщение
Собственно как Вы осваивали программирование?
Самоучка я.
Цитата Сообщение от Chayn1k Посмотреть сообщение
Вам ктио-то помогал или только комп и интернет?
Мне никто не помогал, с техникой же была полная запара(как и сейчас, только хуже), поэтому я использовал книги, скачанные с компьютера друга и планшет, кодил и компилировал тоже на компе.

Добавлено через 3 минуты
алгоритм пожалуйста.
Ну а тут уж не знаю, можно так:
1. Передаём строку в функцию, которая ищет скобки левую и правую.
2. Далее полученную подстроку передаём в эту же функцию, так получаем самую "глубокую" скобку с выражением.
3. Вычисляем выражения во всех "самых глубоких" скобках.
4. Поднимаемся выше.
5. И так далее.
Хотя это уже как-то сложно получается, Вы не осилите, скорее всего. А мне надо будет слишком много времени, которого итак нет.
0
0 / 0 / 0
Регистрация: 28.06.2016
Сообщений: 10
24.07.2016, 21:40  [ТС] 9
GbaLog-, таже ситуация, какие книги можете посоветовать?

Добавлено через 2 минуты
GbaLog-, попробую своими силами осилить эту задачу, времени хватает пока. За алгоритм спасибо
0
Любитель чаепитий
3589 / 1688 / 520
Регистрация: 24.08.2014
Сообщений: 5,712
Записей в блоге: 1
24.07.2016, 21:40 10
Chayn1k, Вряд ли я что-то могу советовать, т.к. сам для начинающих читал только "С++ за 21 день", правда, признаюсь, читал её 2 месяца. Больше для начинающих я ничего не читал, ну только ещё некоторые статейки, т.к. в той книге не всё было упомянуто.

P.S. Книги можете в этой теме посмотреть.
1
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.07.2016, 21:53 11
EVAL.C - A simple mathematical expression evaluator in C
0
4 / 3 / 3
Регистрация: 17.07.2016
Сообщений: 17
24.07.2016, 21:59 12
C++
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <iostream>
#include <iomanip>
#include <cmath>
#include <list>
#include <stack>
#include <vector>
using namespace std;
 
bool isOperator( char p )
{
    char* oper[] = { "+", "-", "/", "*", "^" };
    int size = sizeof( oper )/sizeof( char* );
    for( int i = 0; i < size; i++ )
    {
        if( p == *oper[ i ] )
            return true;
    }
    return false;
}
 
double Add( double x, double y )
{
    return x + y;
}
 
double Sub( double x, double y )
{
    return y - x;
}
 
double Div( double x, double y )
{
    return y/x;
}
 
double Mult( double x, double y )
{
    return x*y;
}
 
double Exp( double x, double y )
{
    return pow( y, x );
}
 
double F( char p, double x, double y )
{
    double temp;
    char* oper[] = { "+", "-", "/", "*", "^" };
    double (*f[])( double, double ) = { Add, Sub, Div, Mult, Exp };
    int size = sizeof( oper )/sizeof( char* );
    for( int i = 0; i < size; i++ )
    {
        if( p == *oper[ i ] )
            temp = f[ i ]( x, y );
    }
    return temp;
}
 
bool Priority( const char& inf, const char& st )
{
    if( (inf == '+' || inf == '-') && (st == '*' || st == '/' || st == '^') )
        return true;
    else
        return false;
}
 
int main( int argc, char* argv[] )
{
    unsigned char temp = 0;
    list<unsigned char> infix,postfix;
    cout << "Input data:";
    while( (temp = cin.get()) != '\n' )
    infix.push_back( temp );
    temp = 0;
    infix.push_back( ')' );
    stack<char> st;
    st.push( '(' );
 
    /*пока стэк пустой читаем значения*/
    while( !st.empty() )
    {
        if( isOperator( infix.front() ) ) /*1 операция*/
        {
            if( isOperator( st.top() ) )
            {
                while( Priority( infix.front(), st.top() ) && isOperator( st.top()) )
                {
                    postfix.push_back( st.top() );
                    st.pop();
                }
            }
            st.push( infix.front() );
            infix.pop_front();
        }
        if( infix.front() == '(' ) /*2 операция*/
        {
            st.push( infix.front() );
            infix.pop_front();
        }
        else /*3 операция*/ 
        {
            if( infix.front() == ')' )
            {
                while( st.top() != '(' )
                {
                    postfix.push_back( st.top() );
                    st.pop();
                }
                st.pop();
                infix.pop_front();
            }
            else
            {
                vector<int> v;
                while( infix.front() != ')' && !isOperator( infix.front() ) )
                {
                    v.push_back( infix.front() - '0' );
                    infix.pop_front();
                }
                int rez = 0;
                for( unsigned int j = 0; j < v.size(); j++ )
                rez += *( v.begin() + j )*pow( 10, static_cast<double>( v.size() - j - 1 ) );
                postfix.push_back( rez + '0' );
            }
        }
    }
    copy( postfix.begin(), postfix.end(), ostream_iterator<unsigned char>( cout, " " ) );
    cout << endl;
    stack<double> st_int;
    double x = 0, y = 0, rez = 0;
    postfix.push_back( '\0' );
    while( postfix.front() != '\0' )
    {
        if( isOperator( postfix.front() ) )
        {
            x = st_int.top();
            st_int.pop();
            y = st_int.top();
            st_int.pop();
            rez = F( postfix.front(), x, y );
            st_int.push( rez );
            postfix.pop_front();
        }
        else
        {
            st_int.push( postfix.front() - '0' );
            postfix.pop_front();
        }
    }
    cout << setiosflags( ios::fixed | ios::showpoint ) << setprecision( 2 ) << st_int.top() << endl;
    st_int.pop();
}
0
Любитель чаепитий
3589 / 1688 / 520
Регистрация: 24.08.2014
Сообщений: 5,712
Записей в блоге: 1
24.07.2016, 22:16 13
Antony Coder, Сами-то проверяли?
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.07.2016, 22:49 14
Цитата Сообщение от GbaLog- Посмотреть сообщение
Сами-то проверяли?
:-)
0
Миниатюры
Вычислить значение арифметического выражения, заданного в виде строки  
Любитель чаепитий
3589 / 1688 / 520
Регистрация: 24.08.2014
Сообщений: 5,712
Записей в блоге: 1
24.07.2016, 23:36 15
gazlan,
1. Я не у Вас спрашивал.
2. Это не то, что вы скидывали выше, а вообще какой-то калькулятор с кучей функций, а не простенький.
0
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.07.2016, 23:56 16
Цитата Сообщение от GbaLog- Посмотреть сообщение
Это не то, что вы скидывали выше
Ну, как бы мне лучше знать :-)

Это моя "обертка" (tray, tape) к тому простейшему калькулятору, линк на который был приведен выше.
0
Заблокирован
25.07.2016, 00:05 17
gazlan, то что приведено по ссылке кромешная ср@нь господня, а не концепт, как бы писал и говорю по опыту. Т.е я бы не приводил то омно что выше(уверен оно ещё и долгое по работе т.к код далёк от оптимальности)
Кликните здесь для просмотра всего текста
f(x) = sin(x + cos(5*x))
[a;b]= [0;1]
шаг = 0.001
----------------------
x f(x)
----------------------
0 0.841470984808
0.001 0.842004122980
0.002 0.842522974015
0.003 0.843027598738
0.004 0.843518056797
0.005 0.843994406662
0.006 0.844456705617
0.007 0.844905009748
0.008 0.845339373947
0.009 0.845759851897
0.01 0.846166496072
0.011 0.846559357729
0.012 0.846938486904
0.013 0.847303932410
0.014 0.847655741831
0.015 0.847993961516
0.016 0.848318636578
0.017 0.848629810893
0.018 0.848927527091
0.019 0.849211826562
0.02 0.849482749445
0.021 0.849740334632
0.022 0.849984619766
0.023 0.850215641235
0.024 0.850433434179
0.025 0.850638032484
0.026 0.850829468781
0.027 0.851007774449
0.028 0.851172979617
0.029 0.851325113158
0.03 0.851464202699
0.031 0.851590274612
0.032 0.851703354026
0.033 0.851803464821
0.034 0.851890629635
0.035 0.851964869865
0.036 0.852026205668
0.037 0.852074655968
0.038 0.852110238458
0.039 0.852132969601
0.04 0.852142864636
0.041 0.852139937586
0.042 0.852124201256
0.043 0.852095667244
0.044 0.852054345940
0.045 0.852000246540
0.046 0.851933377041
0.047 0.851853744258
0.048 0.851761353824
0.049 0.851656210197
0.05 0.851538316668
0.051 0.851407675371
0.052 0.851264287284
0.053 0.851108152244
0.054 0.850939268952
0.055 0.850757634977
0.056 0.850563246772
0.057 0.850356099681
0.058 0.850136187943
0.059 0.849903504708
0.06 0.849658042044
0.061 0.849399790945
0.062 0.849128741344
0.063 0.848844882124
0.064 0.848548201127
0.065 0.848238685164
0.066 0.847916320027
0.067 0.847581090505
0.068 0.847232980389
0.069 0.846871972486
0.07 0.846498048633
0.071 0.846111189710
0.072 0.845711375651
0.073 0.845298585454
0.074 0.844872797201
0.075 0.844433988067
0.076 0.843982134333
0.077 0.843517211402
0.078 0.843039193814
0.079 0.842548055256
0.08 0.842043768581
0.081 0.841526305822
0.082 0.840995638202
0.083 0.840451736156
0.084 0.839894569345
0.085 0.839324106667
0.086 0.838740316277
0.087 0.838143165602
0.088 0.837532621358
0.089 0.836908649563
0.09 0.836271215559
0.091 0.835620284024
0.092 0.834955818990
0.093 0.834277783864
0.094 0.833586141437
0.095 0.832880853913
0.096 0.832161882916
0.097 0.831429189514
0.098 0.830682734232
0.099 0.829922477079
0.1 0.829148377556
0.101 0.828360394682
0.102 0.827558487007
0.103 0.826742612637
0.104 0.825912729247
0.105 0.825068794102
0.106 0.824210764081
0.107 0.823338595687
0.108 0.822452245076
0.109 0.821551668071
0.11 0.820636820181
0.111 0.819707656625
0.112 0.818764132351
0.113 0.817806202054
0.114 0.816833820196
0.115 0.815846941030
0.116 0.814845518616
0.117 0.813829506846
0.118 0.812798859459
0.119 0.811753530070
0.12 0.810693472182
0.121 0.809618639210
0.122 0.808528984507
0.123 0.807424461377
0.124 0.806305023102
0.125 0.805170622960
0.126 0.804021214249
0.127 0.802856750304
0.128 0.801677184526
/////////////////фрорумский редактор не даёт вставить много текста
0.998 0.955708849227
0.999 0.957401262655
0
Миниатюры
Вычислить значение арифметического выражения, заданного в виде строки  
3171 / 1930 / 313
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
25.07.2016, 00:20 18
Цитата Сообщение от Unknownx Посмотреть сообщение
то что приведено по ссылке <ваше оценочное суждение>
Реализация там, действительно, отличается от классической, но очень проста и изящна (в одном из проектов я встроил ее для работы с пользовательскими данными). Быстродействие определяется run-time библиотекой С/С++.
0
Эксперт С++
3207 / 1734 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
25.07.2016, 04:08 19
Цитата Сообщение от Chayn1k Посмотреть сообщение
алгоритм пожалуйста
Ну, тут можно двумя способами: методом рекурсивного спуска и с помощью обратной польской записи (обе задачи мной уже решались раньше в этом разделе).
Так как
Цитата Сообщение от Chayn1k Посмотреть сообщение
дополнительное условие: использовать тип данных char
, то через польскую будет удобнее.
0
Любитель чаепитий
3589 / 1688 / 520
Регистрация: 24.08.2014
Сообщений: 5,712
Записей в блоге: 1
25.07.2016, 14:31 20
Цитата Сообщение от gazlan Посмотреть сообщение
Это моя "обертка" (tray, tape) к тому простейшему калькулятору, линк на который был приведен выше.
Ну так и скинули бы вместе с оберткой, а то какой-то непонятный вброс с вашей стороны, ведь я и понятия не имел.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.07.2016, 14:31

Вычислить значение арифметического выражения, введённого в виде строки.
Нужно вернуть значения арифметического выражения введённого в виде строки. Объясните, пожалуйста, ...

Вычислить значение числового арифметического выражения, заданного пользователем
Вроде бы и задача не сложная, но застопился на одном месте, помогите кто-нибудь оперативно......

Арифмометр: посчитать значение выражения, заданного в виде строки
Всем доброе время суток! Столкнулся с задачей и не могу сообразить даже в какую сторону шагать!...

Вывести значение логического выражения, заданного в виде строки S.
Вывести значение логического выражения, заданного в виде строки S. Выражение определяется следующим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.