Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 15.12.2015
Сообщений: 2
1

Обратная польская нотация (калькулятор)

27.12.2018, 17:56. Показов 2327. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Форумчане, хелп ми плиз, создал калькулятор на основе ОПН, однако он работает только для одноразрядных чисел, поэтому такой вопрос, как сделать так, чтобы считывались не только одноразрядные числа, но и числа с плавающей точкой и функции, такие как sin, cos и т.д. Код прилагаю


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
127
128
int prior(char c){
    switch(c){
        case '(': return 0;
        case '+': return 1;
        case '-': return 1;
        case '*': return 2;
        case '/': return 2;
    }
}
bool is_op(char c){
    return c=='+' || c=='-' || c=='*' || c=='/';
}
bool is_num(char c){
    return c>='0' && c<='9';
}
bool is_neizv(char c){
    return c == 'x';
}
 
bool is_point(char c){
    return c == ',';
}
 
void OPN(char *a, char *out){
    Stack <char> S;
    int i = 0, j = 0;
 
    AnsiString A_Str= Form1->Edit4->Text;
    char *Str_2;
    Str_2 = new char[ A_Str.Length()];
    strcpy(Str_2,A_Str.c_str());
 
    while (a[i] != '\0'){
 
    if (is_point(a[i])) {
            out[j] = a[i];
            j++;
    }else
        if (is_neizv(a[i])) {
            out[j] = Str_2[0];
            j++;
        } else if (is_num(a[i])){
            out[j] = a[i];
            j++;
        } else if (is_op(a[i])){
            if (S.empty() || prior(S.top()) < prior(a[i])){
               S.push(a[i]);
            } else{
                while (!S.empty() && prior(S.top()) >= prior(a[i])) {
                    out[j++] = S.top();
                    S.pop();
 
                    //j++;
                }
                S.push(a[i]);
            }
        } else if (a[i] == '('){
           S.push(a[i]);
        } else if (a[i] == ')'){
            if (S.empty() || S.top() == '('){
               break;
            } else {
                while (S.top() != '('){
                    out[j] = S.top();
                    S.pop();
                    j++;
                }
            }
            S.pop();
        }
        i++;
    }
    while (!S.empty()){
        if (S.top() == '('){
            break;
        } else {
            out[j] = S.top();
            S.pop();
            j++;
 
        }
    }
}
 
double Calc(char *out){
    int j = 0, c = 0; double r1 = 0, r2 = 0, r3 = 0;
    Stack <double> S;
    double *Str2;
    Str2 = new double[10];
 
    while (out[j] != '\0'){
        if (out[j]>='0' && out[j]<='9'){
            Str2[j] = StrToFloat(out[j]);
            S.push(Str2[j]);
        } else if (is_op(out[j])){
            r1 = S.top(); S.pop();
            r2 = S.top(); S.pop();
 
            switch(out[j]){
                case '+': r3 = r2+r1; S.push(r3); break;
                case '-': r3 = r2-r1; S.push(r3); break;
                case '*': r3 = r2*r1; S.push(r3); break;
                case '/': r3 = r2/r1; S.push(r3); break;
            }
        };
        j++;
    }
    return (S.top());
}
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    AnsiString AStr= Form1->Edit1->Text;
    char *Str2;
    Str2 = new char[ AStr.Length() + 1 ];
    strcpy(Str2,AStr.c_str());
 
 
    char *out_string;
    out_string = new char[ AStr.Length()];
 
 
   OPN(Str2, out_string);
   Edit2->Text = out_string;
   Edit3->Text = FloatToStr(Calc(out_string));
 
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2018, 17:56
Ответы с готовыми решениями:

Обратная польская запись в калькуляторе
Есть калькулятор к нему нужно добавить &quot;(&quot;, &quot;)&quot;. Погуглив понял, что нужно внедрять обратную...

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

Обратная польская нотация
Как имея вид выражения в записи обратной польской нотации правильно расставить скобки?

Обратная Польская Нотация
Пытался реализовать ОПН....ничего не вышло,обращаюсь за помощью: в чем ошибка(и)? #include...

1
случайный прохожий
2935 / 1951 / 606
Регистрация: 20.07.2013
Сообщений: 5,159
28.12.2018, 10:47 2
Обратная польская запись (на этом форуме имеется куда подобных тем)
0
28.12.2018, 10:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2018, 10:47
Помогаю со студенческими работами здесь

Обратная польская нотация
Всем привет, хотел написать программу которая бы преобразовывала формулу в обратную польскую...

Обратная польская нотация через структуру
есть такая структура, как через нее сделать ОПН? /*ФУНКЦИЯ ДОБАВЛЕНИЯ ЭЛЕМЕНТА В СТЕК*/ void...

Обратная Польская Нотация на большом наборе формул
Собственно проблема не в понимании алгоритма, а как лучше представить данные, когда нужно...

Калькулятор: обратная польская запись
Всем доброго времени суток! Решил написать для себя калькулятор, который бы решал сложные...


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

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