This repository has been archived by the owner on May 25, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArithmetic.java
132 lines (119 loc) · 3.47 KB
/
Arithmetic.java
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
129
130
131
132
import java.util.*;
/**
*
* @author 13513006 / Rahman Adianto, 13513022 / Husni Munaya, 13513078 Gazandi Cahyadarma
*/
public class Arithmetic extends Expression {
/**
* A constructor.
* Membuat objek Arithmetic
* @param ekspresi
*/
public Arithmetic(String ekspresi) {
super(ekspresi);
}
/**
* Mengkalkulasi ekspresi
* @return hasil perhitungan
*/
public float calculate() {
Stack<Float> calc = new Stack<>();
String word_temp;
float operan1, operan2;
Scanner sc = new Scanner(ekspresi);
while (sc.hasNext()) {
word_temp = sc.next();
if (isOperan(word_temp)) {
calc.push(Float.parseFloat(word_temp));
} else {
operan2 = calc.pop();
operan1 = calc.pop();
calc.push(binaryOpt(word_temp, operan1, operan2));
}
}
return calc.peek();
}
/**
* Method yang mengembalikan hasil dari operasi binary
* Menghitung dua buah integer
* @param oprt sebuah string
* @param a sebuah float
* @param b sebuah float
* @return hasil perhitungan operasi binary
*/
public float binaryOpt(String oprt, float a, float b) {
switch(oprt) {
case "*":
return a * b;
case "/":
return a / b;
case "+":
return a + b;
case "-":
return a - b;
default:
return 0;
}
}
/**
* Fungsi yang mengecek apakah string berupa operan
* @param opr yang berupa operan
* @return boolean yang bernilai true jika string == operan
*/
@Override
public boolean isOperan(String opr) {
return (!isOperator(opr)) && (!opr.equals("(")) && (!opr.equals(")"));
}
/**
* Fungsi yang mengecek apakah string berupa operator
* @param oprt yang berupa operator
* @return boolean yang bernilai true jika string == operator
*/
@Override
public boolean isOperator(String oprt) {
return (oprt.equals("*") ||
oprt.equals("/") ||
oprt.equals("+") ||
oprt.equals("-")
);
}
/**
* Fungsi yang mengecek apakah string berupa operator unary
* @param oprt yang berupa string
* @return boolean yang bernilai true jika string == operator unary
*/
@Override
public boolean isUnaryOpt(String oprt) {
return false;
}
/**
* Fungsi yang mengecek apakah operator o1 mempunyai prioritas lebih dibanding o2
* @param o1 operator yang berupa string
* @param o2 operator yang berupa string
* @return boolean yang bernilai true jika o1 memiliki prioritas lebih dibanding o2
*/
@Override
public boolean higherPrecedence(String o1, String o2) {
return (getOperatorWeight(o1) > getOperatorWeight(o2));
}
/**
* Fungsi yang menghasilkan berat operator
* @param op operator yang berupa string
* @return integer yang merupakan bobot dari operator
*/
@Override
public int getOperatorWeight(String op) {
switch(op) {
case "*":
return 4;
case "/":
return 3;
case "+":
return 2;
case "-":
return 1;
default:
return 0;
}
}
}