-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCalculadora.java
More file actions
118 lines (111 loc) · 3.15 KB
/
Calculadora.java
File metadata and controls
118 lines (111 loc) · 3.15 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
106
107
108
109
110
111
112
113
114
115
116
117
118
/**
* Universidad del Valle de Guatemala
* Algoritmos y Estructura de Datos
* Sección: 10
* 30/07/2015
* Hoja de Trabajo 2
*
*/
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
/**
* La clase <Calculadora> implementa la interfaz <ADTCalculadora>.
* Reciben archivos tipo String. Con esta clase se puede recibir un
* archivo y leerlo. Lanza errores sino se encuentra el archivo o es
* inaccesible. Luego de leerlo analiza los datos que trae. Los convierte
* a una cadea de caracteres sin espacios. Estos caracteres son analizados
* para realizar una operación con notación Postfix. Lo que hace es un push
* a los dos operandos en una pila y luego utiliza esos valores para operarlos
* dependiendo el operador que esté en la cadena y dependiendo su jerarquía.
*
* En esta clase se utilizan los siguietnes atributos:
* <MyStr>: para unir la cadena de caracteres
* <MySta>: una nueva Pila.
* <op1>: el primer operando
* <op2>: el segundo operando
* <res>: el resultado de la operacion
* <numeros>: los números que deben estar contenidos en la cadena de caracteres
*
* @author André Rodas
* @author Rudy Garrido
* @author Yosemite Meléndez
*
* @param <P> para tipo de datos String.
*/
public class Calculadora<P> implements ADTCalculadora<P>{
private String MyStr;
private Stack<Integer> MySta;
private Integer op1;
private Integer op2;
private Integer res;
final String numeros = "123456789";
/**
* Este es el constructor de la Clase. Crea cuatro objetos que son
* <MyStr>: para unir la cadena de caracteres, inicia vacío
* <op1>: el primer operando, inicia en cero
* <op2>: el segundo operando, inicia en cero
* <MySta>: una nueva Pila, tipo Stack
*
*/
public Calculadora() {
MyStr = "";
op1 = 0;
op2 = 0;
MySta = new Stack<Integer>();
}
@Override
public void readFile(String file) throws FileNotFoundException {
File archivo = new File(file);
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
StringBuilder sb = new StringBuilder();
try {
while ((line = br.readLine()) != null) {
sb.append(line);
//sb.append("\n");
}
} catch (IOException e) {
e.printStackTrace();
}
MyStr = sb.toString();
MyStr = MyStr.trim().replace(" ", "");
System.out.println(MyStr);
}
@SuppressWarnings("unchecked")
@Override
public P calcular() throws Exception {
for (int i=0;i<=(MyStr.length()-1);i++)
{
CharSequence MyChar = "" + MyStr.charAt(i);
if (numeros.contains(MyChar))
MySta.push(Integer.parseInt(MyChar.toString()));
else
{
String a = MyChar.toString();
op1 = (Integer) MySta.pop();
op2 = (Integer) MySta.pop();
if(a.equals("+"))
res = op1 + op2;
else
if(a.equals("-"))
res = op2 - op1;
else
if(a.equals("*"))
res = op1 * op2;
else
if(a.equals("/"))
res = op2 / op1;
else
if(a.equals("^"))
res = op2 ^ op1;
else
throw new Exception("Se ingreso un caracter desconocido!");
MySta.push(res);
}
}
return (P) MySta.peek();
}
}