第一次作业--四则运算

功能:

    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
 
 
posted @ 2017-09-24 11:57  miracle_stone  阅读(175)  评论(1编辑  收藏  举报