Вычислить значение произвольного выражения, представленного в обратной польской записи - C (СИ) (73634)
Формулировка задачи:
Здравствуйте. Помогите с прогой пожалуйста.
Дано арифметическое выражение длиной до 30 символов, заканчивающееся знаком равенства. Выражение содержит знаки операции +, -, *, / и представлено в обратной польской записи. Если это операнд, то записать его в стек; если это операция, то извлечь два элемента из стека, выполнить математическую операцию и занести результат в стек. Вычислить значение выражения, используя стек операндов. Язык программирования С++. Помогите пожалуйста
Пример: 345+2*63/-+ = 19
Прогу сделал, но почему-то выводит не тот результат.
Проверьте, пожалуйста. Но мне надо, чтобы числа были максимум 4-значные и массив строки был динамический. Спасибо, заранее
#include <stdio.h> #include <iostream> using namespace std; int Chislo ( char text [], int *i ) { int c = 0; while ( text [*i] >= '0' && text [*i] <= '9999' ) { c = c * 10000 + ( text [*i] - '0' ); (*i)++; } return c; } int main() { char text [80]; int i; float opd [3]; char opc [3]; int pr [3]; int j = -1; cout << "Vvedite verazenie: "; gets ( text ); i = -1; do { i++; opd [++j] = Chislo ( text, &i ); opc [j] = text [i]; switch ( text [i] ) { case '+': case '-': pr [j] = 1; break; case '*': case '/': pr [j] = 2; break; case ' ': pr [j] = 0; } while ( j > 0 && pr [j] <= pr [j-1]) { switch ( opc [j-1]) { case '+': opd [j-1] = opd [j-1] + opd [j]; break; case '-': opd [j-1] = opd [j-1] - opd [j]; break; case '*': opd [j-1] = opd [j-1] * opd [j]; break; case '/': opd [j-1] = opd [j-1] / opd [j]; } opd [j-1] = opc [j]; pr [j-1] = pr [j]; j = j-1; } } while ( text [i] != ' '); cout << "Rezultat: " << opd [0] << endl; system ( "pause" ); return 0; }
Решение задачи: «Вычислить значение произвольного выражения, представленного в обратной польской записи»
textual
Листинг программы
#include <cstdio> int main() { bool run = true; char op[666]; double stack[666]; int top = -1; while (run) { scanf("%s", op); double val; if (sscanf(op, "%lf", &val) == 1) { stack[++top] = val; } else { val = stack[top--]; if (op[1] == '\0') { switch (op[0]) { case '+': stack[top] += val; break; case '-': stack[top] -= val; break; case '*': stack[top] *= val; break; case '/': stack[top] /= val; break; case '=': printf("%f\n", val); run = false; break; default: printf("error\n"); run = false; break; } } else { printf("error\n"); run = false; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д