zoukankan      html  css  js  c++  java
  • 构建之法--简单四则运算

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

    运行结果:

     总结:

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

     

  • 相关阅读:
    寒假周总结一
    1657. Determine if Two Strings Are Close
    1656. Design an Ordered Stream
    695. Max Area of Island (BFS)
    695. Max Area of Island (DFS)
    Daily Coding Problem: Problem #713
    939. Minimum Area Rectangle
    259. 3Sum Smaller
    29. Divide Two Integers
    16. 3Sum Closest
  • 原文地址:https://www.cnblogs.com/GMUK/p/9765270.html
Copyright © 2011-2022 走看看