|
4 | 4 | import static java.lang.Math.log10; |
5 | 5 | import static java.lang.Math.pow; |
6 | 6 |
|
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 | + */ |
10 | 11 | public class Calculator { |
11 | 12 |
|
| 13 | + /** |
| 14 | + * Modos para operaciones que requieren dos números (binarias). |
| 15 | + */ |
12 | 16 | public enum BiOperatorModes { |
13 | | - |
14 | | - normal, add, minus, multiply, divide , xpowerofy |
15 | | - |
| 17 | + normal, add, minus, multiply, divide, xpowerofy |
16 | 18 | } |
17 | 19 |
|
| 20 | + /** |
| 21 | + * Modos para operaciones que requieren un solo número (monarias). |
| 22 | + */ |
18 | 23 | 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 |
22 | 25 | } |
23 | 26 |
|
24 | 27 | private double num1, num2; |
25 | | - |
26 | 28 | private BiOperatorModes mode = BiOperatorModes.normal; |
27 | 29 |
|
| 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 | + */ |
28 | 34 | 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: |
40 | 37 | 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"); |
64 | 51 | } |
65 | | - |
66 | | - if (mode == BiOperatorModes.xpowerofy) { |
67 | | - |
68 | | - return pow(num1,num2); |
69 | | - |
70 | | - } |
71 | | - |
72 | | - // never reach |
73 | | - |
74 | | - throw new Error(); |
75 | | - |
76 | 52 | } |
77 | 53 |
|
| 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 | + */ |
78 | 60 | public Double calculateBi(BiOperatorModes newMode, Double num) { |
79 | | - |
80 | 61 | if (mode == BiOperatorModes.normal) { |
81 | | - |
82 | 62 | num2 = 0.0; |
83 | | - |
84 | 63 | num1 = num; |
85 | | - |
86 | 64 | mode = newMode; |
87 | | - |
88 | 65 | return NaN; |
89 | | - |
90 | 66 | } else { |
91 | | - |
92 | 67 | num2 = num; |
93 | | - |
94 | 68 | num1 = calculateBiImpl(); |
95 | | - |
96 | 69 | mode = newMode; |
97 | | - |
98 | 70 | return num1; |
99 | | - |
100 | 71 | } |
101 | | - |
102 | 72 | } |
103 | 73 |
|
| 74 | + /** |
| 75 | + * Ejecuta el cálculo final (botón igual). |
| 76 | + */ |
104 | 77 | public Double calculateEqual(Double num) { |
105 | | - |
106 | 78 | return calculateBi(BiOperatorModes.normal, num); |
107 | | - |
108 | 79 | } |
109 | 80 |
|
| 81 | + /** |
| 82 | + * Reinicia los valores de la calculadora. |
| 83 | + */ |
110 | 84 | public Double reset() { |
111 | | - |
112 | 85 | num2 = 0.0; |
113 | | - |
114 | 86 | num1 = 0.0; |
115 | | - |
116 | 87 | mode = BiOperatorModes.normal; |
117 | | - |
118 | 88 | return NaN; |
119 | | - |
120 | 89 | } |
121 | 90 |
|
| 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 | + */ |
122 | 97 | 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: |
159 | 121 | 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; |
170 | 122 | } |
| 123 | + } |
| 124 | +} |
0 commit comments