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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Pterodaktel
Сообщений: n/a
13.07.2012, 17:07     string для решения мат.выражений #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++ написать универсальную функцию для вычисления выражений
Определить функции для расчета значения арифметических выражений C++
Стек для обработки выражений со скобками C++
Программа для вычисления выражений C++
Разработать программу для вычисления логических выражений C++
Калькулятор для расчета сложных выражений C++
C++ Парсер для математических выражений

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,572
Записей в блоге: 17
13.07.2012, 23:41     string для решения мат.выражений #2
Смотри калькулятор из книги Страуструпа
Yandex
Объявления
13.07.2012, 23:41     string для решения мат.выражений
Ответ Создать тему
Опции темы

Текущее время: 12:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru