aboutsummaryrefslogtreecommitdiff
path: root/week12/ex4.cpp
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2024-01-05 15:29:15 +0200
committerSyndamia <kamen@syndamia.com>2024-01-05 15:29:15 +0200
commit1f1bba9cbb7c9924da7aa25de46596c11bd6f202 (patch)
tree4624f83c40f0de28c965f2e2923d9ca479bec9b0 /week12/ex4.cpp
parent7e7c710287f25b9c958c9026b18f88587174d47f (diff)
downloadupp-2023-solutions-1f1bba9cbb7c9924da7aa25de46596c11bd6f202.tar
upp-2023-solutions-1f1bba9cbb7c9924da7aa25de46596c11bd6f202.tar.gz
upp-2023-solutions-1f1bba9cbb7c9924da7aa25de46596c11bd6f202.zip
[w12] Added solutions
Diffstat (limited to 'week12/ex4.cpp')
-rw-r--r--week12/ex4.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/week12/ex4.cpp b/week12/ex4.cpp
new file mode 100644
index 0000000..98bbe72
--- /dev/null
+++ b/week12/ex4.cpp
@@ -0,0 +1,68 @@
+#include <iostream>
+
+// Главното неприятно нещо в тази задача е, че трябва да обгърнем вградените оператори във фунцкии
+int add(int a, int b) {
+ return a + b;
+}
+int sub(int a, int b) {
+ return a - b;
+}
+int mul(int a, int b) {
+ return a * b;
+}
+int divi(int a, int b) {
+ return a / b;
+}
+int pow(int a, int b) {
+ int res = 1;
+ while (b-- > 0) {
+ res *= a;
+ }
+ return res;
+}
+
+int recRPN(int (*&op)(int, int), int &on) {
+ int num;
+ std::cin >> num;
+
+ // Ако имаме операция, "връщаме" указател към конкретната функция
+ if (std::cin.fail()) {
+ std::cin.clear();
+ char c;
+ std::cin >> c;
+ if (c == '\'') std::cin >> c;
+
+ switch (c) {
+ case '+': op = add; on = 2; break;
+ case '-': op = sub; on = 2; break;
+ case '*': op = mul; on = 2; break;
+ case '/': op = divi; on = 2; break;
+ case '^': op = pow; on = 2; break;
+ case '$': on = -1; break;
+ }
+ return 0;
+ }
+
+ // Докато не плучим "операция" $, гледаме следващите изрази какво ще върнат
+ do {
+ int rightValue = recRPN(op, on);
+ // Ако сегашната стойност е дясната страна на оператора
+ if (on == 2) {
+ on = 1;
+ return num;
+ }
+ // Ако сегашната стойност е лявата страна на оператора
+ if (on == 1) {
+ on = 0;
+ num = (*op)(num, rightValue);
+ }
+ } while(on > -1);
+
+ return num;
+}
+
+int main() {
+ int (*op)(int, int);
+ int on;
+ std::cout << recRPN(op, on) << std::endl;
+}