博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第一次作业--四则运算
阅读量:5827 次
发布时间:2019-06-18

本文共 9837 字,大约阅读时间需要 32 分钟。

功能:

    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 createArithmetic(int range)
  • 功能点4:计算表达式结果并输出文档

    逆波兰式转换:    public ArrayList toRPN(ArrayList list)逆波兰式计算 public Num countRPN(ArrayList 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 toRPN(ArrayList list) { 10         ArrayList right = new ArrayList();// 存储右序表达式 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         } else100             return false;101     }102 103     // 逆波兰式计算104     public Num countRPN(ArrayList right) {105         // 栈106         Stacks aStack = new Stacks();107         Num op1, op2, result = null;108         String is = null;109         Iterator 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 } else123 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 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 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
 
 

转载于:https://www.cnblogs.com/miracleStone/p/7586806.html

你可能感兴趣的文章
聊一聊前端的监控
查看>>
数据结构java版之大O表示法
查看>>
数据结构与算法(十四)深入理解红黑树和JDK TreeMap和TreeSet源码分析
查看>>
ES6的开发环境搭建
查看>>
我的这套VuePress主题你熟悉吧
查看>>
Redis在Web项目中的应用与实践
查看>>
linux下使用su切换到其他用户下只能看到sh-4.2$解决
查看>>
[LeetCode题解] ZigZag Conversion
查看>>
表单系列之input number总结
查看>>
刷屏的海底捞超级APP究竟是怎样与阿里云合作的
查看>>
前端框架Vue、angular、React的优点和缺点,以及应用场景
查看>>
nuxt 简单介绍
查看>>
Python解析MNIST数据集
查看>>
阿里云对象存储OSS 符合美国证券交易委员会(SEC)和金融业监管局(FINRA)合规要求 ...
查看>>
单片机之模块化编程
查看>>
大数据入门学习?
查看>>
开发商城app如何找一家好的app开发公司呢?
查看>>
2.Ext JS MVVM特性
查看>>
如何测试Kubernetes RBAC?
查看>>
window powershell 获取本机IP
查看>>