-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcalculation.cpp
More file actions
105 lines (89 loc) · 3.33 KB
/
Copy pathcalculation.cpp
File metadata and controls
105 lines (89 loc) · 3.33 KB
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
#include "calculation.h"
Calculation::Calculation(QVector<QString> vector)
{
infix=vector;
}
int Calculation::precedence(QString str)
{
if(str=="*" || str=="/")
return 2;
else if(str=="+" || str=="-")
return 1;
else
return 0;
}
bool Calculation::isDouble(QString str)
{
bool success;
double num=str.toDouble(&success);
return success;
}
double Calculation::evaluate(double num1, double num2, QString operation)
{
if(operation=="+")
return num1+num2;
else if(operation=="-")
return num1-num2;
else if(operation=="*")
return num1*num2;
else if(operation=="/")
return num1/num2;
else
return 0;
}
void Calculation::infixToPostfix()
{
QVector<QString> op; //fronta operatoru
for(int i=0;i<infix.length();i++){
if(isDouble(infix[i])) // pokud je prvek infix[i] cislo, pridej ho do postfix
postfix.push_back(infix[i]);
else if(infix[i]=="(") // pokud je prvek infix[i] zavorka "(", prida se do fronty operatoru na vrchni pozici (nejvetsi precedence)
op.push_front(infix[i]);
else if(infix[i]==")"){ // pokud je prvek infix[i] ukoncujici zavorka, pridaji se vsechny operatory mezi zavorkami do postfix a odstrani se z fronty operatoru
while(op.front()!="("){
postfix.push_back(op.front());
op.pop_front();
}
op.pop_front(); // odstraneni zavorky "(" z fronty
}
else{ // prvek je nektery z operatoru + - * /
// pokud jde do fronty operatoru operator s mensi nebo stejnou hodnotou precedence (prednosti),
// operatory s vyssi prednosti se z fronty ulozi do postfix a pote se do fronty operatoru ulozi prichozi operator
// pokud ma operator vyssi prednost, ulozi se do fronty
while(!op.empty() && precedence(infix[i])<=precedence(op.front())){
postfix.push_back(op.front());
op.pop_front();
}
op.push_front(infix[i]);
}
}
while(!op.empty()){ // ulozeni zbyvajicich operatoru z fronty do postfix
postfix.push_back(op.front());
op.pop_front();
}
}
void Calculation::evaluatePostfix()
{
QVector<double> nums; // vektor, do ktereho jsou ukladana cisla nasledovne:
// dokud neni prvek operator, jsou ukladana cisla
// kdyz se narazi na operator, 2 cisla pred nim se z vektoru odstrani a provede se operace, vysledek se pak ulozi do vektoru
// nakonec ve vektoru zbyde jedno cislo, ktere je vysledkem
for(int i=0;i<postfix.length();i++){
if(postfix[i]=="+" || postfix[i]=="-" || postfix[i]=="*" || postfix[i]=="/"){
// cisla pred operaci se odstrani z vektoru nums a vyhodnoti se jejich vysledek, ten se pak ulozi zpet do nums
double number2=nums.back();
nums.pop_back();
double number1=nums.back();
nums.pop_back();
nums.push_back(evaluate(number1, number2, postfix[i]));
}else{ // jedna se o cislo, to se ulozi do nums
nums.push_back(postfix[i].toDouble());
}
}
// nakonec zbyde v nums jen vysledek
result=nums[0];
}
double Calculation::getAns()
{
return result;
}