Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Pterodaktel
Сообщений: n/a
#1

string для решения мат.выражений - C++

13.07.2012, 17:07. Просмотров 1342. Ответов 1
Метки нет (Все метки)

Написать программу, которая использует класс string для анализа строки, содержащей математическое выражение, например, вида - (2+3)*4+1. Строка вводится с клавиатуры. Программа выдает результат вычисления выражения.
Помогите написать код.Заранее спасибо
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
Преобразование инфиксного выражения в постфиксное и вычисление постфиксного выражения
Алгебраические выражения, изучаемые в школе, являются инфиксными. Это значит, что каждый бинарный оператор находится между своими операндами: a+b
Это вынуждает устанавливать правила ассоциативности, приоритеты, а также использовать скобки во избежание неоднозначности.
a+b*c               (a+b)*c
У традиционной инфиксной записи есть две альтернативы: префиксная и постфиксная форма.
        префиксная:     +ab
a+b   =>
        постфиксная:        ab+
(a+b)*c =>              ab+c*
Рассмотрим как можно использовать стек для вычислений инфиксных выражений.
Для начала необходимо преобразовать инфиксное выражение в постфиксное. Для наглядности возьмем конкретное выражение: a-(b+c*d)/e.
a-(b+c*d)/e =>  abcd*+e/-
Выполняя преобразование в постфиксную форму можно заметить что:
1.  Порядок следования операндов никогда не меняется
2.  Оператор всегда находится справа от своих операндов
3.  Все скобки удаляются
Инструкции, которыми необходимо следовать при преобразовании выражения следующие:
1.  Обнаружив операнд добавляем его в строку postfixExp
2.  Обнаружив '(' заталкиваем ее в стек
3.  Если в момент обнаружения оператора
a.  стек пуст: затолкнуть оператор в стек
b.  стек НЕ пуст: выталкиваем из стека операторы более высокого или равного приоритета и добавляем их в строку postfixExp
Остановится если:
a.  стек пуст
b.  обнаружен оператор более низкого приоритета
c.  обнаружен символ '('
4.  Обнаружив символ ')' выталкиваем операторы из стека и добавляем их в конец строки  postfixExp, пока не встретим в стеке символ '('
 
infixExp    Стек
(от дна к вершине)  postfixExp
a       a
-   -   a
(   -(  a
+   -(+ ab
c   -(+ abc
*   -(+*    abc
d   -(+*    abcd
)   -(+ abcd*
    -(  abcd*+
        abcd*+
/   -/  abcd*+
e   -/  abcd*+e
    -   abcd*+e/
    стек пуст   abcd*+e/-
 
Описанные этапы позволяют сформулировать псевдокод.
    for()
    {
        switch(ch)
        {
        case operand:
            break;
        case '(':
            break;
        case ')':
            while(stack.pop()!='(')
            {
                postfixExp+=stack.pop();
            }
            stack.pop();
            break;
        case operator:
            while()
            break;
        }//конец  switch
    }//конец for
 
После того как инфиксное выражение преобразовано в постфиксное используем стек для его решения. Для примера разберем выражение: 2*(3+4)  => 234+*
    
infixExp    действие    Стек
(от дна к вершине)
2   push(2) 2
3   push(3) 2 3
4   push(4) 2 3 4
+   operand2 =pop() 2 3
    operand1 =pop() 2
    result = operand1+ operand2 2
    push(result)    2 7
*   operand2 =pop() 
    operand1 =pop() 
    result = operand1* operand2 
    push(result)    
Псевдокод алгоритма будет иметь вид:
    for(каждый символ ch в троке, пока не конец строки)
    {
        if(символ ch является операндом)
            stack.push(ch);
        else
        {
            operand2 = stack.pop();
            operand1 = stack.pop();
            result = operand1 operator operand2;
            stack.push(result);
        }
    }
По завершении результат выражения находится на вершине стека.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2012, 17:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос string для решения мат.выражений (C++):

Написать программу для решения сложных выражений. - C++
Написать программу для решения выражений. http://s004.***********/i205/1002/6e/2bd2fa636b69.jpg помогите, завтра сдавать, а у нас...

Написать парсер математических выражений с функцией упрощения этих выражений - C++
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На вход подается строка вида "a*b+a*c", являющаяся корректным...

Доступ к паре в map<string, vector<pair<string, string>>>Temp - C++
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string, string&gt;&gt;&gt;Temp) { ...

Программа для вычисления выражений - C++
A= min(sin x, min (y,x)) Max(x^y,y) (не использовать макрокоманд Max и Min)

Парсер для математических выражений - C++
Здравствуйте уважаемые товарищи форумчане. Я пишу интерпретатор математических выражений и, собственно, для этого, сначала перевожу...

Стек для обработки выражений со скобками - C++
Помогите понять что требуется, чет я не догоняю. Можно кодом, можно на словах.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Avazart
Эксперт С++
7152 / 5329 / 278
Регистрация: 10.12.2010
Сообщений: 23,585
Записей в блоге: 17
13.07.2012, 23:41 #2
Смотри калькулятор из книги Страуструпа
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2012, 23:41
Привет! Вот еще темы с ответами:

Калькулятор для расчета сложных выражений - C++
в общем вот что у меня есть Добавлено через 3 минуты #include &lt;iostream&gt; #define PI 3.14159265 using namespace std; void...

написать универсальную функцию для вычисления выражений - C++
написать универсальную функцию для вычисления выражений(См ниже). В main() обеспечить вызов этой функции и отображение результатов...

Напишите грамматику для описания логических выражений - C++
Здравствуйте.Помогите пожалуйста решить задачу, a точнее вот: ...

Разработать программу для вычисления логических выражений - C++
Разработать программу для вычисления логических выражений. На вход программы подаётся выражение, записанное в строковом формате....


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

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

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