1 import java.util.Scanner;
2
3 public class CaculationTest {
4
5 public static void main(String[] args) {
6
7 Scanner reader = new Scanner(System.in);
8 double a, b, result = 0;
9 String operator;
10 Operation operation = null;
11
12 System.out.println("************************");
13 System.out.println("* 学号:1308060310 *");
14 System.out.println("* 班级:网络131班 *");
15 System.out.println("* 姓名:王朝远 *");
16 System.out.println("************************");
17
18 TwoFromConsole twoFromConsole = new TwoFromConsole();
19 a = twoFromConsole.getFirstDoubleFromConsole(); // 获取第一个数
20 b = twoFromConsole.getTwoDoubleFromConsole(); // 获取第二个数
21
22 OperatorFromConsole operatorFromConsole = new OperatorFromConsole();
23 operator = operatorFromConsole.getOperator(); // 获取运算符号
24 do {
25 if (operator.equals("/") && b == 0) {
26 System.out.print("除法运算分母不能为0,请重新输入,");
27 b = twoFromConsole.getTwoDoubleFromConsole(); // 获取第二个数
28 continue;
29 }
30 break;
31 } while (true);
32
33 // 获取要运算的对象
34 operation = Factory.getInstance(operator);
35 result = operation.getResult(a, b);
36
37 // 判断用户是否继续对数运算,如果是继续对数运算,结果的输出方式就不一样,并且让用户选择是否再次计算
38 if (operator.equals("log")) {
39
40 System.out.println("log" + "(" + b + ")" + a + "=" + result);
41 } else {
42 System.out.println(a + operator + b + "=" + result);
43 }
44 }
45 }
46
47 class TwoFromConsole {
48
49 Scanner reader = new Scanner(System.in);
50
51 // 获取数字的方法的具体实现
52 public double getFirstDoubleFromConsole() {
53
54 double x = 0;
55 System.out.print("请输入第一个数字:");
56 do {
57 double temp = 0;
58 try {
59 temp = reader.nextDouble();
60 } catch (Exception e) {
61 System.out.print("请重新输入第一个数字:");
62 continue;
63 }
64 x = temp;
65 break;
66 } while (true);
67 return x;
68 }
69
70 public double getTwoDoubleFromConsole() {
71
72 double x = 0;
73 System.out.print("请输入第二个数字:");
74 do {
75 double temp = 0;
76 try {
77 temp = reader.nextDouble();
78 } catch (Exception e) {
79 System.out.print("请重新输入第二个数字:");
80 continue;
81 }
82 x = temp;
83 break;
84 } while (true);
85 return x;
86 }
87 }
88
89 /**
90 * 获取运算符类
91 */
92 class OperatorFromConsole {
93
94 Scanner reader = new Scanner(System.in);
95
96 /**
97 * @return 合理的运算符
98 */
99 public String getOperator() {
100 System.out.print("请输入运算符:");
101
102 String operator;
103 boolean b;
104 do {
105 operator = reader.nextLine();
106 b = !(operator.equals("+") || operator.equals("-") || operator.equals("*") || operator.equals("/")
107 || operator.equals("log"));
108 if (b == true) {
109 System.out.print("请重新输入运算符:");
110 }
111 } while (b);
112
113 return operator;
114 }
115 }
116
117 /**
118 * 功能:各个运算的父接口,子类必须实现父接口里面的方法
119 */
120 interface Operation {
121
122 double getResult(double x, double y);
123 }
124
125 /**
126 * 实现加法运算的类
127 */
128 class Add implements Operation {
129
130 /**
131 * 重写接口里面的方法,并实现加法功能
132 */
133 @Override
134 public double getResult(double x, double y) {
135 // TODO Auto-generated method stub
136 return x + y;
137 }
138
139 }
140
141 /**
142 * 实现减法运算的类
143 */
144 class Sub implements Operation {
145
146 /**
147 * 重写接口里面的方法,并实现减法功能
148 */
149 @Override
150 public double getResult(double x, double y) {
151 // TODO Auto-generated method stub
152 return x - y;
153 }
154 }
155
156 /**
157 * 实现乘法运算的类
158 */
159 class Mul implements Operation {
160
161 /**
162 * 重写接口里面的方法,并实现乘法功能
163 */
164 @Override
165 public double getResult(double x, double y) {
166 // TODO Auto-generated method stub
167 return x * y;
168 }
169
170 }
171
172 /**
173 * 实现除法运算的类
174 */
175 class Div implements Operation {
176
177 /**
178 * 重写接口里面的方法,并实现除法功能
179 */
180 @Override
181 public double getResult(double x, double y) {
182 // TODO Auto-generated method stub
183 return x / y;
184 }
185
186 }
187
188 /**
189 * 实现对数运算的类
190 */
191 class Logarithm implements Operation {
192
193 /**
194 * 重写接口里面的方法,并实现对数运算功能
195 */
196 @Override
197 public double getResult(double x, double y) {
198 // TODO Auto-generated method stub
199 return Math.log(x) / Math.log(y); // x表示对数,y表示底数
200 }
201
202 }
203
204 /**
205 * 生成用户所需要的对象工厂类
206 */
207 class Factory {
208
209 /**
210 * @param operator
211 * 用户选择的运算
212 * @return 用户所需要的对象
213 */
214 public static Operation getInstance(String operator) {
215 Operation operation = null;
216 switch (operator) {
217 case "+":
218 operation = new Add(); // 实例化加法对象
219 break;
220 case "-":
221 operation = new Sub(); // 实例化减法对象
222 break;
223 case "*":
224 operation = new Mul(); // 实例化乘法对象
225 break;
226 case "/":
227 operation = new Div(); // 实例化除法对象
228 break;
229 case "log":
230 operation = new Logarithm(); // 实例化对数运算对象
231 break;
232 }
233
234 return operation;
235 }
236 }