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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 53, средняя оценка - 4.98
killer007
0 / 0 / 0
Регистрация: 25.05.2009
Сообщений: 18
#1

Постфиксный (стековый) калькулятор (Рекурсия) - C++

01.06.2010, 20:53. Просмотров 7157. Ответов 4
Метки нет (Все метки)

Задание:
Реализовать постфиксный (стековый) калькулятор, 4 действия, вещественные числа, ввод выражений в цикле.

Я вообще не могу понять какой калькулятор мне нужно сделать. Помогите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.06.2010, 20:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Постфиксный (стековый) калькулятор (Рекурсия) (C++):

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

Стековый калькулятор - C++
Нужно создать калькулятор, который сможет выполнять вычисление выражения a+b-c*d/e. Т.е. без скобок, степеней и прочего. Калькулятор...

Стековый калькулятор, как подправить код? - C++
Всем доброго времени суток. Написал стековый калькулятор,который принимает строку в виде обратной польской записи и через стек...

Стековый калькулятор - успешная компиляция и неуспешная работа - C++
Пытаюсь написать стековый калькулятор работающий с введенной строкой(курсач такой). До скобок пока не доходил. Не могу написать для...

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

постфиксный инкремент - C++
class Inkrement { Inkrement(){}; Inkrement &operator++(int) { Inkrement temp = *this; ++*this; return temp; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
01.06.2010, 22:35 #2
нужно сделать что бы на вход подавалось арефмитическое выражение а твоя программа считала результат.
например:
8*4+2(5-1) в постфиксной нотации будет 8 4 * 2 5 1- * +
это подается на вход, если непонятки с постфиксной нотацией - на википедии все очень четко расписано.
Алгоритм такой:
Считываем один символ, если это операнд то кладем его в стек, если это знак арифметической операции то вынимаем два операнда из стека и производим над ними эту операцию и кладем результат в стек. и так пока символы не закончатся во входном потоке. в конце работы результат будудет лежать на вершине стека.
должно быть, что-то вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void stackmachine(stack<int>& S)
{
     char c;
     while (cin >> c,c!='\n')
     {
         switch(c)
         {
              case '+':{ // если операция сложения
                      int op1=S.top();
                      S.pop();
                      int op2=S.top();
                      S.pop();
                      int result=op1 + op2;
                      S.push(result);
              }
              // ...
              default: // если цифра
                         S.push(c-'0');
         }
     }
}
типа того. осталось тлько сделать чтобы цифры были многорадными и чтобы функция пропускала пробелы
killer007
0 / 0 / 0
Регистрация: 25.05.2009
Сообщений: 18
01.06.2010, 23:01  [ТС] #3
Спасибо большое!!! Я вообще ничего не понял.)) Буду разбираться.
Aye Aye
367 / 281 / 36
Регистрация: 17.12.2009
Сообщений: 567
02.06.2010, 12:33 #4
чтобы цифры были многорадными
я опечатался, хотел написать "многоразрядными"
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
#include <iostream>
#include <stack>
using namespace std;
void stackmachine(stack<double>& S)
{
    char c;
    while (cin.get(c),c!='\n')
    {
        switch(c)
        {
            case '+':{ // если операция сложения
                double op1=S.top();
                S.pop();
                double op2=S.top();
                S.pop();
                double result=op2 + op1;
                S.push(result);
            }break;
            case '-':{ // если операция вычитания
                double op1=S.top();
                S.pop();
                double op2=S.top();
                S.pop();
                double result=op2 - op1;
                S.push(result);
            }break;
            case '*':{ // если операция умножения
                double op1=S.top();
                S.pop();
                double op2=S.top();
                S.pop();
                double result=op2 * op1;
                S.push(result);
            }break;
            case '/':{ // если операция деления
                double op1=S.top();
                S.pop();
                double op2=S.top();
                S.pop();
                double result=op2 / op1;
                S.push(result);
            }break;
            default: // если цифра
                S.push(c-'0');
        }
    }
}
int main()
{
    stack<double> Stack;
    stackmachine(Stack);
    cout << Stack.top() << '\n';
    return 0;
}
вот, приведи к приличному виду. сделай пропуск разделителей (пробел, табуляция) и обработку ошибок, сделай так чтобы действительные числа считывались (подсказка, в switch(c) после default: надо вставить функцию, которая будет считывать число), сделай функцию stackmachine рекурсивной, если в задании требуется, хотя помоему это глупость.
Марта_киска
-2 / 0 / 0
Регистрация: 29.05.2010
Сообщений: 76
09.06.2010, 15:38 #5
скажите а в Pascal-е можите сделать ,


пмогите пожалуйста
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2010, 15:38
Привет! Вот еще темы с ответами:

Постфиксный и префиксный декремент - C++
#include &lt;iostream&gt; using std::cout; int main() { int a=5; cout &lt;&lt; (--a)-- &lt;&lt; &quot; &quot;; cout &lt;&lt; a &lt;&lt; &quot; &quot;; cout &lt;&lt; (--a)-- &lt;&lt;...

Указатель на постфиксный инкремент x - C++
Почему так нельзя делать? int *p = &amp;(x++); Вроде же все ясно должно быть компилятору

Перегруженный постфиксный оператор ++ - C++
Есть задание: Создать класс &quot;нота&quot;: название, октава, продолжительность звучания. Производные: &quot;звук&quot; (частота) и &quot;изображение&quot;...

Префиксный и постфиксный инкремент - C++
#include &lt;iostream&gt; using namespace std; int main() { int c=0; cout&lt;&lt;с++&lt;&lt;++с&lt;&lt;++с&lt;&lt;с++&lt;&lt;endl; return 0; ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.06.2010, 15:38
Ответ Создать тему
Опции темы

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