构建之法--简单四则运算

作业要求地址: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     }

运行结果:

 总结:

这个程序相对比较简单,主要是对进栈出栈的应用,其重点在于如何进栈的点和出栈的把握。

 

 

posted @ 2018-10-10 11:12  GMUK  阅读(300)  评论(2编辑  收藏  举报