Skip to content

Commit b9fd0e8

Browse files
Merge pull request #484 from 76vx/patch-1
Refactor Calculator class and add safety checks
2 parents c47eb11 + d12813a commit b9fd0e8

File tree

1 file changed

+74
-120
lines changed

1 file changed

+74
-120
lines changed

Calculator using Java/Calc.java

Lines changed: 74 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -4,167 +4,121 @@
44
import static java.lang.Math.log10;
55
import static java.lang.Math.pow;
66

7-
8-
9-
7+
/**
8+
* Clase Calculator que maneja operaciones matemáticas básicas y avanzadas.
9+
* Mejorada con estructuras switch y validaciones de seguridad.
10+
*/
1011
public class Calculator {
1112

13+
/**
14+
* Modos para operaciones que requieren dos números (binarias).
15+
*/
1216
public enum BiOperatorModes {
13-
14-
normal, add, minus, multiply, divide , xpowerofy
15-
17+
normal, add, minus, multiply, divide, xpowerofy
1618
}
1719

20+
/**
21+
* Modos para operaciones que requieren un solo número (monarias).
22+
*/
1823
public enum MonoOperatorModes {
19-
20-
square, squareRoot, oneDividedBy, cos, sin, tan ,log , rate, abs
21-
24+
square, squareRoot, oneDividedBy, cos, sin, tan, log, rate, abs
2225
}
2326

2427
private double num1, num2;
25-
2628
private BiOperatorModes mode = BiOperatorModes.normal;
2729

30+
/**
31+
* Implementación interna de los cálculos binarios utilizando switch para mayor claridad.
32+
* @return El resultado de la operación aplicada a num1 y num2.
33+
*/
2834
private double calculateBiImpl() {
29-
30-
if (mode == BiOperatorModes.normal) {
31-
32-
return num2;
33-
34-
}
35-
36-
if (mode == BiOperatorModes.add) {
37-
38-
if (num2 != 0) {
39-
35+
switch (mode) {
36+
case add:
4037
return num1 + num2;
41-
42-
}
43-
44-
return num1;
45-
46-
}
47-
48-
if (mode == BiOperatorModes.minus) {
49-
50-
return num1 - num2;
51-
52-
}
53-
54-
if (mode == BiOperatorModes.multiply) {
55-
56-
return num1 * num2;
57-
58-
}
59-
60-
if (mode == BiOperatorModes.divide) {
61-
62-
return num1 / num2;
63-
38+
case minus:
39+
return num1 - num2;
40+
case multiply:
41+
return num1 * num2;
42+
case divide:
43+
// Validación para evitar división por cero
44+
return (num2 != 0) ? num1 / num2 : NaN;
45+
case xpowerofy:
46+
return pow(num1, num2);
47+
case normal:
48+
return num2;
49+
default:
50+
throw new UnsupportedOperationException("Modo de operación no soportado");
6451
}
65-
66-
if (mode == BiOperatorModes.xpowerofy) {
67-
68-
return pow(num1,num2);
69-
70-
}
71-
72-
// never reach
73-
74-
throw new Error();
75-
7652
}
7753

54+
/**
55+
* Prepara y ejecuta un cálculo binario.
56+
* @param newMode El nuevo modo de operación a establecer.
57+
* @param num El número actual ingresado.
58+
* @return El resultado acumulado o NaN si es la primera entrada.
59+
*/
7860
public Double calculateBi(BiOperatorModes newMode, Double num) {
79-
8061
if (mode == BiOperatorModes.normal) {
81-
8262
num2 = 0.0;
83-
8463
num1 = num;
85-
8664
mode = newMode;
87-
8865
return NaN;
89-
9066
} else {
91-
9267
num2 = num;
93-
9468
num1 = calculateBiImpl();
95-
9669
mode = newMode;
97-
9870
return num1;
99-
10071
}
101-
10272
}
10373

74+
/**
75+
* Ejecuta el cálculo final (botón igual).
76+
*/
10477
public Double calculateEqual(Double num) {
105-
10678
return calculateBi(BiOperatorModes.normal, num);
107-
10879
}
10980

81+
/**
82+
* Reinicia los valores de la calculadora.
83+
*/
11084
public Double reset() {
111-
11285
num2 = 0.0;
113-
11486
num1 = 0.0;
115-
11687
mode = BiOperatorModes.normal;
117-
11888
return NaN;
119-
12089
}
12190

91+
/**
92+
* Realiza operaciones de un solo operando con validaciones matemáticas.
93+
* @param newMode Operación a realizar.
94+
* @param num Número sobre el cual operar.
95+
* @return Resultado del cálculo.
96+
*/
12297
public Double calculateMono(MonoOperatorModes newMode, Double num) {
123-
124-
if (newMode == MonoOperatorModes.square) {
125-
126-
return num * num;
127-
128-
}
129-
130-
if (newMode == MonoOperatorModes.squareRoot) {
131-
132-
return Math.sqrt(num);
133-
134-
}
135-
136-
if (newMode == MonoOperatorModes.oneDividedBy) {
137-
138-
return 1 / num;
139-
140-
}
141-
142-
if (newMode == MonoOperatorModes.cos) {
143-
144-
return Math.cos(Math.toRadians(num));
145-
146-
}
147-
148-
if (newMode == MonoOperatorModes.sin) {
149-
150-
return Math.sin(Math.toRadians(num));
151-
152-
}
153-
154-
if (newMode == MonoOperatorModes.tan) {
155-
if (num == 0 || num % 180 == 0) {
156-
return 0.0;
157-
}
158-
if (num % 90 == 0 && num % 180 != 0) {
98+
switch (newMode) {
99+
case square:
100+
return num * num;
101+
case squareRoot:
102+
return (num >= 0) ? Math.sqrt(num) : NaN;
103+
case oneDividedBy:
104+
return (num != 0) ? 1 / num : NaN;
105+
case cos:
106+
return Math.cos(Math.toRadians(num));
107+
case sin:
108+
return Math.sin(Math.toRadians(num));
109+
case tan:
110+
// Manejo de asíntotas de la tangente
111+
if (num % 180 == 0) return 0.0;
112+
if (num % 90 == 0 && num % 180 != 0) return NaN;
113+
return Math.tan(Math.toRadians(num));
114+
case log:
115+
return (num > 0) ? log10(num) : NaN;
116+
case rate:
117+
return num / 100;
118+
case abs:
119+
return Math.abs(num);
120+
default:
159121
return NaN;
160-
}
161-
return Math.tan(Math.toRadians(num));
162-
}
163-
164-
if (newMode == MonoOperatorModes.log) {
165-
return log10(num);
166-
}
167-
168-
if (newMode == MonoOperatorModes.rate) {
169-
return num / 100;
170122
}
123+
}
124+
}

0 commit comments

Comments
 (0)