kott78
1

Написание калькулятора в Обратной Польской Записи

12.05.2013, 19:17. Показов 15408. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, только недавно начал изучать С++ и преподаватель дал задание написать калькулятор в Обратной Польской Записи.
Сначала познакомился с ОПЗ ниже приведу свои изыскания (на оригинальность не притендую) может кому пригодиться -
"Пример вычисления выражения в обратной польской записи.
Обратная польская запись идеально подходит для вычисления формул на компьютере со стеком.
Формула состоит из n символов,
каждый из которых является либо операндом, либо оператором.
Нужно просто прочитать обратную польскую запись слева направо. Если встречается операнд, его нужно пометить в STACK. (a,b,c… 1,2,3…, )
Если встречается оператор
нужно выполнить заданную им операцию.1>'+','-' 2>*, /
В качестве примера рассмотрим вычисление следующего выражения:
(8+2*5)/(1+3*2-4) =6
Соответствующая формула в обратной польской записи:
825*+132*+4-/ =6
// (A+B)*(C+D)-E <=> AB+CD+*E-
// a+b -> a b +
// a+b*c -> a b c * +
// (a+b)*c -> a b +c *
// 123*(a+b)*c -> 123 a b + * c *
// 2/(3-(4+(5*6))) ->
Число на вершине стека – это правый операнд (а не левый). Это очень важно для операций деления, вычитания и возведения в степень, поскольку порядок следования операндов в данном случае имеет значение (в отличие от операций сложения и умножения).
Другими словами, операция деления действует следующим образом: сначала в стек помещается числитель, потом знаменатель, и тогда операция даёт правильный результат. Отметим, что преобразовать обратную польскую запись в машинный код очень легко: нужно просто двигаться по формуле в обратной польской записи, записывая по одной команде для каждого символа. Если символ является константой или переменной, нужно вписывать команду помещения этой константы или переменной в стек, если символ является оператором, нужно вписывать команду выполнения это операции."
Формула моего задания 2+3/2*(4^7-1) в ОПЗ перевел так 4,7^1-3,2/*2+
Далее здесь нашел простенький пример который решил взять за основу. Прокоментировал его для большей понятности.
Была проблема т.к. в примере небыло функции возведения в степень но на форуме есть подобный вопрос решается через добавление #include <cmath> и функцию "pow".

Теперь сам вопрос вроде бы добавил в цикл вычисления функцию возведения в степень но почему то не считает, подскажите по подробней что сделал не так, может еще какие есть ошибки буду признателен за любые подсказки. Спс.
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
#include <stdio.h>
#include <iostream>
#include <cmath>
int main()
{
       int stack[10];//массив чисел начинается с 0-999
    // sp = индекс ячейки, куда будет push-иться очередное число
    int sp = 0;      // (sp-1) = индекс ячейки, являющейся вершиной стека
    printf("enter retern poland expression\n");
    while ( !feof(stdin) ) //!- логическое "не" stdin (стандартный поток ввода)используется для считывания с консоли
    {   
        int c = getchar();//возвращает из стандартного потока stdin (ввода)следующий символ. При чтении символа предполагается, что символ имеет тип unsigned char, который потом преобразуется в целый.
        int x;
        switch (c)//цикл выполняющий мат. операции и записывающий их в стек
        {
            case  ' ':// ? пропустить этот символ в цикле
            case '\n':// ? пропустить этот символ в цикле
                break;
            case '=':
                printf("My Result = %d\n", stack[sp-1]);  sp--;
                break;
            case '+':
               stack[sp-2] = stack[sp-2]+ stack[sp-1];  sp--;
                break;
            case '-':
                stack[sp-2] = stack[sp-2] - stack[sp-1];  sp--;
                break;
            case '*':
                stack[sp-2] = stack[sp-1] * stack[sp-2];  sp--;
                break;
            case '/':
                stack[sp-2] = stack[sp-2] / stack[sp-1];   sp--;
                break;
            case '^':
                stack[sp-1] = pow (2,4); sp--;// не работает ((
                break;
 
            default:
                ungetc (c, stdin); // функция ungetc возвращает только что прочитанный символ обратно в поток ввода  filestream, через параметр character. Внутренний индикатор позиции файла уменьшается обратно, на предыдущее положение, так что этот символ возвращается при следующем вызове операции чтения для этого потока.
                if (scanf("%d", &x) != 1)//? по идее проверка введенного типа данных
                {
                    fprintf(stderr, "Can't read integer\n");//stderr (стандартный поток ошибок)для записи на консоль
                    return -1;
                }
                else {
                    stack[sp] = x;                       sp++;
                }
        }
    }
    printf("Result = %d\n",stack[sp-1]);
    return 0;
return 0;
}
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.05.2013, 19:17
Ответы с готовыми решениями:

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

Алгоритм сортировочной станции(вычисление по обратной польской записи).
Всем привет. Есть вот такой код: #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;fstream&gt;...

Калькулятор считающий выражения обратной польской записи из файла
Здравствуйте! У меня вот такое задание &quot;Напишите программу, вычисляющую выражение в обратной...

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

2
1 / 1 / 0
Регистрация: 15.10.2013
Сообщений: 29
20.10.2013, 22:29 2
в универе задали,только на паскале -__-, написать написал, но все время выдает 0 в ответе.__. подсказали пару идей, но не знаю как реализовать, если у вас, все-таки есть решение на с++, не могли бы вы скинуть код, хотелось бы разобраться, алгоритм все-равно схожий.
если что тык
0
54 / 54 / 37
Регистрация: 05.09.2013
Сообщений: 1,864
22.10.2013, 06:23 3
C++
1
stack[sp-2] = pow (2,4); sp--;// не работает ((
Работает.
0
22.10.2013, 06:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2013, 06:23
Помогаю со студенческими работами здесь

Вычислить значение выражения в обратной польской записи с использованием стека
Вычислить значение выражения в обратной польской записи с использованием стека. например 6 2 + = 6...

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

Калькулятор обратной польской записи
Всем здравствуйте! Необходимо написать программу реализующую калькулятор обратной польской записи,...

Калькулятор на основе обратной польской записи
Преподаватель задал создать калькулятор на основе обратной польской записи, а я в Java совсем...

K&R калькулятор обратной польской записи
В известной книге есть пример калькулятора в обратной польской записи. Проблема - не помещает числа...

Как усовершенствовать алгоритму обратной польской записи?
Коллеги, добрый день! Написал алгоритм ОПЗ на выполнение следующих операций: сложения, вычитания,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru