作业要求地址:http://www.cnblogs.com/xiangxuer/p/9695909.html
github地址:https://github.com/GVictory/MakeOutQuestions
前言:
上软件工程课中出现了一道例子,即阿超做了一个简单的四则运算用于给他儿子出题,为了练手,将在于此模仿阿超将简单的四则运算做出来,该四则运算为初步版本,仅仅包含正整数的加减乘除,不包括括号。
题目要求:
任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11
所用版本:
操作系统:windows10
开发环境:intellij IDEA 2016.4
开发语言:java
实现思路:
这个程序分两个步骤,第一个是出题,第二个是解题,出题即使用stringbuilder的方式将字符串拼接起来,将四个操作字符归为一个字符组,然后使用随机函数随机获取,数字也是采用随机函数获得的。第二个是解题,解题使用到了栈,将每一个遇到的数字入到数字栈,将每一个遇到的操作字符进行判断,如果为*或/就直接取出数字栈的数字进行运算,如果遇到+或-则压入操作栈中,当将所有的数字压入栈后,最后将所有的数字按栈的数字进行加减运算。
个人软件过程耗时估计与统计表:
Personal Software Process Stages | Time Senior Student | Time |
计划 | 1 | 1 |
估计这个任务需要多少时间 | 4 | 6 |
开发 | 1 | 2 |
需求分析 (包括学习新技术) | 0.5 | 0.5 |
生成设计文档 | 0.5 | 0.5 |
设计复审 | 0.5 | 0 |
代码规范 | 0 | 0.5 |
具体设计 | 0.5 | 0.5 |
具体编码 | 1 | 2 |
代码复审 | 0.5 | 0.5 |
测试(自我测试,修改代码,提交修改) | 0.5 | 0.5 |
报告 | 0.5 | 0.5 |
测试报告 | 0.5 | 0.5 |
计算工作量 | 2 | 2 |
并提出过程改进计划 | 1 | 1 |
实现代码:
设计一个栈出来:
1 public class Stack<T> { 2 private int top; 3 private List<T> list; 4 5 public Stack() { 6 top=-1; 7 list=new ArrayList<T>(); 8 } 9 10 public T getTop(){ 11 return list.get(top); 12 } 13 14 public T pop(){ 15 T template=list.get(top); 16 list.remove(top); 17 top--; 18 return template; 19 } 20 21 public T push(T data){ 22 list.add(data); 23 top++; 24 T template=list.get(top); 25 return template; 26 } 27 28 public Boolean isEmpty(){ 29 if (top==-1){ 30 return true; 31 }else { 32 return false; 33 } 34 } 35 }
编写创建题目函数:
1 private static String getQuestion(Integer operatorNumber,Integer numberRange){ 2 char[] operator = new char[]{'+', '-', '*', '/'}; 3 Random random = new Random(); 4 StringBuilder stringBuilder = new StringBuilder(); 5 for (int operatorIndex = 0; operatorIndex < operatorNumber; operatorIndex++) { 6 stringBuilder.append(random.nextInt(numberRange+1)); 7 stringBuilder.append(operator[random.nextInt(4)]); 8 } 9 stringBuilder.append(random.nextInt(numberRange+1)); 10 return stringBuilder.toString(); 11 }
编写解题函数:
1 private static Float getAnswer(String question){ 2 Stack<Character> operatorStack=new Stack<Character>(); 3 Stack<Float> numberStack=new Stack<Float>(); 4 char operatorTemp; 5 StringBuilder numberTemp=new StringBuilder(); 6 for (int questionIndex=0;questionIndex<question.length();questionIndex++){ 7 char singleChar=question.charAt(questionIndex); 8 if (Character.isDigit(singleChar)){ 9 numberTemp.append(singleChar); 10 }else { 11 if (!operatorStack.isEmpty()&&operatorStack.getTop()=='*'){ 12 operatorStack.pop(); 13 numberStack.push(numberStack.pop()*Float.valueOf(numberTemp.toString())); 14 }else if (!operatorStack.isEmpty()&&operatorStack.getTop()=='/'){ 15 operatorStack.pop(); 16 numberStack.push(numberStack.pop()/Float.valueOf(numberTemp.toString())); 17 }else if(!operatorStack.isEmpty()&&operatorStack.getTop()=='-'){ 18 numberStack.push(-Float.valueOf(numberTemp.toString())); 19 }else { 20 numberStack.push(Float.valueOf(numberTemp.toString())); 21 } 22 operatorStack.push(singleChar); 23 numberTemp.delete(0,numberTemp.length()); 24 } 25 } 26 if (!operatorStack.isEmpty()&&operatorStack.getTop()=='*'){ 27 numberStack.push(numberStack.pop()*Float.valueOf(numberTemp.toString())); 28 operatorStack.pop(); 29 }else if (!operatorStack.isEmpty()&&operatorStack.getTop()=='/'){ 30 numberStack.push(numberStack.pop()/Float.valueOf(numberTemp.toString())); 31 operatorStack.pop(); 32 }else if(!operatorStack.isEmpty()&&operatorStack.getTop()=='-'){ 33 numberStack.push(-Float.valueOf(numberTemp.toString())); 34 }else { 35 numberStack.push(Float.valueOf(numberTemp.toString())); 36 } 37 while (!operatorStack.isEmpty()){ 38 operatorStack.pop(); 39 numberStack.push(numberStack.pop()+numberStack.pop()); 40 } 41 return numberStack.pop(); 42 } 43 }
编写启动主类代码:
1 public static void main(String[] args) { 2 Scanner scanner = new Scanner(System.in); 3 HashMap<String, Float> hashMap = new HashMap<>(); 4 System.out.print("请输入需要创建的题目的个数:"); 5 int count = scanner.nextInt(); 6 String questionTemp; 7 float answertemp; 8 for (int index = 0; index < count; index++) { 9 do { 10 questionTemp = getQuestion(2, 100); 11 answertemp = getAnswer(questionTemp); 12 } while (answertemp < 0); 13 hashMap.put(questionTemp, answertemp); 14 } 15 Set<Map.Entry<String, Float>> ms = hashMap.entrySet(); 16 for (Map.Entry entry : ms) { 17 System.out.println(entry.getKey() + "=" + entry.getValue()); 18 } 19 }
运行结果:
总结:
这个程序相对比较简单,主要是对进栈出栈的应用,其重点在于如何进栈的点和出栈的把握。