第一次作业--四则运算
功能:
1.将用户的输入作为参数n
2.算式的运算符数量不超过3个(随机生成1-3运算符的算式)
3.组成算数表达式
4.判断用户的答案是否正确
5.计算题目结果并输出文档
6.比较答案并给出错误题号
设计分析:
1.表达式不重复
2.考虑分数的情况
程序设计
-
功能点1:生成随机数
随机数生成方法: public Num createNum(int range)
1 package method;
2
3 import java.util.Random;
4 import method.Num;
5
6 public class randomNum {
7 public Num createNum(int range) {
8 Num num = new Num();
9 Random rand = new Random();
10 int numerator = rand.nextInt(range + 1);
11 int denominator = rand.nextInt(10) + 1;
12 if (rand.nextInt(1) == 1) {
13 num.setNumerator(numerator);
14 num.setDenominator(1);
15 } else {
16 num.setNumerator(numerator);
17 num.setDenominator(denominator);
18 }
19 num = reduction(num);
20 return num;
21 }
22
23 public Num reduction(Num num) {
24 int numerator = num.getNumerator();
25 int denominator = num.getDenominator();
26 if (numerator == 0) {
27 num.setDenominator(1);
28 return num;
29 }
30 int divisor = getMaxDivisor(numerator, denominator);
31 if (divisor == 1) {
32 return num;
33 } else {
34 num.setNumerator(num.getNumerator() / divisor);
35 num.setDenominator(num.getDenominator() / divisor);
36 return num;
37 }
38 }
39
40 public int getMaxDivisor(int numerator, int denominator) {
41 if (denominator == 0) {
42 return numerator;
43 } else {
44 return getMaxDivisor(denominator, numerator % denominator);
45 }
46 }
47 }
-
功能点2:生成随机运算符
随机运算符生成方法: public String createOperator()
1 package method;
2
3 import java.util.Random;
4
5 public class randomOperator {
6 public String createoperator() {
7 String operator = null;
8 Random rand = new Random();
9 int n = rand.nextInt(4);
10 switch (n) {
11 case 0:
12 operator = "+";
13 break;
14 case 1:
15 operator = "-";
16 break;
17 case 2:
18 operator = "*";
19 break;
20 case 3:
21 operator = "÷";
22 break;
23 default:
24 operator = "+";
25 break;
26 }
27 return operator;
28 }
29 }
-
功能点3:组成算数表达式
表达式表示: 类型:ArrayList 组成方法: public ArrayList<Object> createArithmetic(int range)
-
功能点4:计算表达式结果并输出文档
逆波兰式转换: public ArrayList<Object> toRPN(ArrayList<Object> list) 逆波兰式计算 public Num countRPN(ArrayList<Object> right) private Num twoResult(String is, Num op1, Num op2)
1 package method;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import method.Num;
6 import method.Stacks;
7
8 public class RPN {
9 public ArrayList<Object> toRPN(ArrayList<Object> list) {
10 ArrayList<Object> right = new ArrayList<Object>();// 存储右序表达式
11 Stacks aStack = new Stacks();// 栈
12 String operator;
13 int position = 0;// 当前指针位置
14 while (true) {
15 // 当前指针为符号
16 if (isOperator(list.get(position).toString())) {
17 // 栈为空,或指针为(,直接进栈
18 if (aStack.top == -1
19 || ((String) list.get(position)).equals("(")) {
20 aStack.push(list.get(position));
21 } else {
22 // 指针为)
23 if (((String) list.get(position)).equals(")")) {
24 // 将栈内(后的运算符出栈
25 while (true) {
26 if (aStack.top != -1
27 && !((String) aStack.top()).equals("(")) {
28 operator = (String) aStack.pop();
29 right.add(operator);
30 } else {
31 if (aStack.top != -1)
32 aStack.pop();
33 break;
34 }
35 }
36 } else {
37 while (true) {
38 // 栈不为空,判断优先级
39 if (aStack.top != -1
40 && priority((String) list.get(position),
41 (String) aStack.top())) {
42 operator = (String) aStack.pop();
43 if (!operator.equals("("))
44 right.add(operator);
45 } else {
46 break;
47 }
48
49 }
50 aStack.push(list.get(position));
51 }
52 }
53 }
54 // 数字入栈
55 else {
56 right.add(list.get(position));
57 }
58 position++;
59 if (position >= list.size())
60 break;
61 }
62 // 栈内剩余运算符出栈
63 while (aStack.top != -1) {
64 operator = (String) aStack.pop();
65 if (!operator.equals("("))
66 right.add(operator);
67 }
68 return right;
69 }
70
71 // 判断是否为运算符
72 public static boolean isOperator(String operator) {
73 if (operator.equals("+") || operator.equals("-")
74 || operator.equals("*") || operator.equals("÷")
75 || operator.equals("(") || operator.equals(")"))
76 return true;
77 else
78 return false;
79 }
80
81 // 设置操作符号的优先级别
82 public static boolean priority(String operatorout, String operatorin) {
83 int m = 0, n = 0;
84 String addop[][] = { { "+", "-", "*", "÷", "(", ")" },
85 { "+", "-", "*", "÷", "(", ")" } };
86 int first[][] = { { 1, 1, 2, 2, 2, 0 }, { 1, 1, 2, 2, 2, 0 },
87 { 1, 1, 1, 1, 2, 0 }, { 1, 1, 1, 1, 2, 0 },
88 { 2, 2, 2, 2, 2, 0 }, { 2, 2, 2, 2, 2, 2 } };
89 for (int i = 0; i < 6; i++) {
90 if (operatorin.equalsIgnoreCase(addop[0][i]))
91 m = i;
92 }
93 for (int i = 0; i < 6; i++) {
94 if (operatorout.equalsIgnoreCase(addop[1][i]))
95 n = i;
96 }
97 if (first[m][n] == 1) {
98 return true;
99 } else
100 return false;
101 }
102
103 // 逆波兰式计算
104 public Num countRPN(ArrayList<Object> right) {
105 // 栈
106 Stacks aStack = new Stacks();
107 Num op1, op2, result = null;
108 String is = null;
109 Iterator<Object> it = right.iterator();
110
111 while (it.hasNext()) {
112 Object ob = it.next();
113 is = ob.toString();
114 if (isOperator(is)) {
115 op2 = (Num) aStack.pop();
116 op1 = (Num) aStack.pop();
117 Num do_0 = twoResult(is, op1, op2);
118 if (do_0.getDenominator() == 0) {
119 return (new Num(-1, 1));
120 }
121 aStack.push(do_0);
122 } else
123 aStack.push(ob);
124 }
125 result = (Num) aStack.pop();
126 return result;
127 }
128
129 // 计算两个数
130 private Num twoResult(String is, Num op1, Num op2) {
131 // 结果数
132 Num result = new Num();
133 randomNum f1 = new randomNum();
134 // 获取分子分母
135 int n1 = op1.getNumerator();
136 int d1 = op1.getDenominator();
137 int n2 = op2.getNumerator();
138 int d2 = op2.getDenominator();
139 // 判断运算符
140 switch (is) {
141 case "+":
142 if (d1 != d2) {
143 n1 = n1 * d2;
144 n2 = n2 * d1;
145 d1 = d1 * d2;
146 d2 = d1;
147 result.setNumerator(n1 + n2);
148 result.setDenominator(d1);
149 result = f1.reduction(result);
150 } else {
151 result.setNumerator(n1 + n2);
152 result.setDenominator(d1);
153 result = f1.reduction(result);
154 }
155 break;
156 case "-":
157 if (d1 != d2) {
158 n1 = n1 * d2;
159 n2 = n2 * d1;
160 d1 = d1 * d2;
161 d2 = d1;
162 result.setNumerator(n1 - n2);
163 result.setDenominator(d1);
164 result = f1.reduction(result);
165 } else {
166 result.setNumerator(n1 - n2);
167 result.setDenominator(d1);
168 result = f1.reduction(result);
169 }
170 break;
171 case "*":
172 result.setNumerator(n1 * n2);
173 result.setDenominator(d1 * d2);
174 result = f1.reduction(result);
175 break;
176 case "÷":
177 if (n2 == 0) {
178 result = new Num(0, 0);
179 break;
180 }
181 result.setNumerator(n1 * d2);
182 result.setDenominator(d1 * n2);
183 result = f1.reduction(result);
184 break;
185 default:
186 break;
187 }
188 return result;
189 }
190 }
- 功能点5:比较答案
1 package method;
2
3 import java.util.ArrayList;
4 import java.util.Scanner;
5
6 import method.Arithmetic;
7 import method.RPN;
8
9 public class Main {
10 public static void main(String[] args){
11 Arithmetic arithmetic = new Arithmetic();
12 ArrayList<Object> list = arithmetic.createarithmetic(3);
13 for (int i = 0; i < list.size(); i++) {
14 System.out.print(list.get(i));
15 }
16 RPN rpn = new RPN();
17 ArrayList<Object> right = rpn.toRPN(list);
18 Num num = new Num();
19 num = rpn.countRPN(right);
20 String a = num.toString();
21 Scanner answer = new Scanner(System.in);
22 System.out.println();
23 System.out.print("输入答案:");
24 String name = answer.nextLine();
25 if(name.equals(a)){
26 System.out.println("正确 ");
27 }else{
28 System.out.println("错误 ");
29 System.out.print("正确答案:" + a);
30 }
31 }
32 }
PSP记录表
| PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
| Planning | 计划 | 10 | 10 |
| · Estimate | 估计这个任务需要多少时间 | 10 | 8 |
| Development | 开发 | 158 | 324 |
| · Analysis | 需求分析 (包括学习新技术) | 13 | 15 |
| · Design Spec | 生成设计文档 | 17 | 8 |
| · Design Review | 设计复审 | 5 | 3 |
| · Coding Standard | 代码规范 | 10 | 25 |
| · Design | 具体设计 | 20 | 50 |
| · Coding | 具体编码 | 60 | 150 |
| · Code Review | 代码复审 | 10 | 30 |
| · Test | 测试(自我测试,修改代码,提交修改) | 20 | 20 |
| Reporting | 报告 | 10 | 50 |
| · | 测试报告 | 10 | 20 |
| · | 计算工作量 | 10 | 25 |
| · | 并提出过程改进计划 | 20 | 40 |
浙公网安备 33010602011771号