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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
#1

Обратная польская запись - C++

31.05.2011, 14:27. Просмотров 1469. Ответов 0
Метки нет (Все метки)

Задание: надо посчитать значения выражения ОПЗ
в первоим листинге, у меня все работает, но там он работает без приоритетов, и в этом определенная проблема
во втором, я расставляю приоритеты и добавляю скобки, и тут начинается проблема, с закрывающейся скобкой, точнее с удалением скобок () и выражения внутри с заменой на число, ведь по приоритету скобки выполняются первыми
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
#include "stdafx.h"
#include <stdio.h>
#include "locale.h"
#include <string.h>
#include "iostream"
#include "conio.h"
using namespace std;
int main(void)
{
    setlocale (LC_ALL, "Russian");
       int stack[100];// выходная строка
        int m = 0;//cчетчики
        char q[100];// массив введеных данных
        int res;
            
        printf("Введите выражение: ");
        gets(q);
        for (int i = 0; i < strlen(q); i++)
        {
                if (q[i] >= '0' && q[i] <= '9')
                {
 
                        stack[m] = q[i] - '0';
                        m++;
                }
                switch (q[i])
                {
                        case '+':
                        {
                                res = stack[m - 2] + stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        } 
                        case '-':
                        {
                                res = stack[m - 2] - stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '*':
                        {
                                res = stack[m - 2] * stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '/':
                        {
                                res = stack[m - 2] / stack[m - 1];
                                stack[m-2]=res;
                                m--;
 
 
                }
        }
        printf("Ответ: %d", res);
        getchar();
        return 0;
}
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
#include "stdafx.h"
#include <stdio.h>
#include "locale.h"
#include <string.h>
#include "iostream"
#include "conio.h"
using namespace std;
int m=0;
const int N=10;
int S[N];
int STACK_EMPTY(int S[N])       //функция проверяет пуст ли стек
{
if (m==0) return true;
else return false;
}; 
 
int pop(int S[N])                  // извлечение из стека 
{
if (STACK_EMPTY(S))    printf("error underflow \n");
else m=m-1;
    return S[m];
};
 
int main(void)
{
    setlocale (LC_ALL, "Russian");
       int stack[100];// выходная строка
        int m = 0, f=0, t=0;//cчетчики
        char q[100];// массив введеных данных
        
        int res, u;
        int p[35]; // приоритет знака 1-наим, 2-меньший, 3-нивысш
    
        printf("Введите выражение: ");
        gets(q);
        for (int i = 0; i < strlen(q); i++)
        {
                if (q[i] >= '0' && q[i] <= '9')
                {
 
                        stack[m] = q[i] - '0';
                        m++;
                }
                else 
                    if(q[i]=='+'||q[i]=='-')
                    {
                        p[f]=2;
                        f++;
                    }
                    else
                        if(q[i]=='*'||q[i]=='/')
                            {
                                p[f]=3;
                                f++;
                            }   
                        else
                            if(q[i]=='(')
                            {
                                p[f]=1;
                                f++;
                            }
                        else
                            if(q[i]==')')
                            {
                                p[f]=4;
                                f++;
                            }
 
                            
        if(p[t]<p[t+1])
        {
                switch (q[i])
                {
                        case '+':
                        {
                                res = stack[m - 2] + stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        } 
                        case '-':
                        {
                                res = stack[m - 2] - stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '*':
                        {
                                res = stack[m - 2] * stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '/':
                        {
                                res = stack[m - 2] / stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '(':
                        {
                                stack[m] = q[i];
                                u=m; // начало скобки
                                break;
                        }
                        case ')':
                        {
                            int y=m-u;// длина скобок
                            //stack.splice(u,y);// начиная с индекса u удалить y элементов
                            for(int j=0; j<y; j++)
                            {
                                int a=pop(stack);
                            }
                            stack[m]=res;
                            
                        }   
 
                }
        }
        }
        printf("Ответ: %d", res);
        getchar();
        return 0;
}
Добавлено через 10 часов 9 минут
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
#include "stdafx.h"
#include <stdio.h>
#include "locale.h"
#include <string.h>
#include "iostream"
#include "conio.h"
using namespace std;
int m=0;
const int N=10;
int S[N];
 
int main(void)
{
    setlocale (LC_ALL, "Russian");
       int stack[100], s[50];// выходная строка
        int m = 0, f=0, t=0;//cчетчики
        char q[100];// массив введеных данных   
        int res, u;
        int p[35]; // приоритет знака 1-наим, 2-меньший, 3-нивысш
    
        printf("Введите выражение: ");
        gets(q);
        for (int i = 0; i < strlen(q); i++)
        {
                if (q[i] >= '0' && q[i] <= '9')
                {
                        stack[m] = q[i] - '0';
                        m++;
                }
                else 
                    if(q[i]=='+'||q[i]=='-')
                    {
                        p[f]=2; s[f]=q[i]; f++;
                        
                    }
                    else
                        if(q[i]=='*'||q[i]=='/')
                            {
                                p[f]=3;
                                s[f]=q[i]; f++;
                            }   
                        else
                            if(q[i]=='(')
                            {
                                p[f]=1; s[f]=q[i]; f++;
                                
                            }
                        else
                            if(q[i]==')')
                            {  
                                p[f]=4; s[f]=q[i]; f++;
                                
                            }   
        }
        for(int i=0; i<f; i++)
        {
                switch (s[i])
                {
                    if(p[i]<=p[i+1])
                        {
                        case '+':
                        {
                                res = stack[m - 2] + stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        } 
                        case '-':
                        {
                                res = stack[m - 2] - stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '*':
                        {
                                res = stack[m - 2] * stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '/':
                        {
                                res = stack[m - 2] / stack[m - 1];
                                stack[m-2]=res;
                                m--;
                                break;
                        }
                        case '(':
                        {
                                stack[m] = q[i];
                                u=m; // начало скобки
                                break;
                        }
                        case ')':
                        {
                            int y=m-u;// длина скобок
                            for(int j=y; j>=u; j--)
                            {
                                stack[j]=NULL;
                                m--;
                            }
                            stack[m]=res;       
                        }   
                    t++;
                }
        }
}
 
        
        printf("Ответ: %d", res);
        getchar();
        return 0;
}
Тот трабл я решила, теперь проблема с приоритетом... считает не правильно
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.05.2011, 14:27     Обратная польская запись
Посмотрите здесь:

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

Дополнение к калькулятору, обратная польская запись - C++
Прошу помощи! Вопрос жизни и смерти( Нужно создать класс постфиксных калькуляторов, использовать алгоритм вычисления постфиксных...

Перевод инфиксного выражения в постфиксное (обратная польская запись) - C++
Всем привет! Надо с помощью стека на динамическом массиве реализовать перевод инфиксного выражения в постфиксное. (обратная польская...

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

Польская запись - C++
Здравствуйте, у меня возникли некоторые проблемы с данной задачей(если сказать точнее, то я ее вообще не понял): Дано выражение...

Польская инверсная запись числа С++ - C++
Подскажите, пожалуйста,что это такое-Польская инверсная запись)

польская инверсная запись. Помогите с алгоритмом. - C++
Не знаю как организовать алгоритм польской инверсной записи на С++. Если кто-то знает помогите пожалуйста.

польская запись,нашел какой то код - C++
char * pol(char * in, char * out) { st *OPR=NULL; int k,point; k=point=0; while(in!='\0' &amp;&amp; in!='=') // пока не дойдем до равно...

Программа построения ПОЛИЗ(польская инверсная запись) - C++
Здравствуйте, ув. программисты, помогите написать программу построения польской имперсной записи. Задание на фото

Польская инверсная нотация - C++
помогите пожалуста зделать !!! уже ниделю сижу никак не могу зделать ((


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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