2017-2018-2 1723 『Java程序设计』课程 结对编程练习_四则运算

一.结对对象

二.本周内容

1.程序需求

  • (1).自动生成题目

  • 可独立使用(能实现自己编写测试类单独生成题目的功能)
    可生成不同等级题目,类似于:
    1级题目:2 + 5 = 、10 - 5 = 之类的两个数,一个运算符的题目

  • (2).题目运算(判题)
    可独立使用,实现中缀表达式转为后缀表达式并计算;判断用户答题正误,并输出正确结果

  • (3).支持真分数

  • 可独立使用,实现分数算式的计算

  • (4).扩展需求:题目去重

  • 可独立使用,实现对自动生成表达式的去重:如下若生成:2 + 5 = & 5 + 2 = 为同一题目

2.设计分析

  • 1.自动生成题目:这里的题目的难度我是采用操作符的个数来定义的,根据操作符再产生操作符加一的数字(这里暂时没有编写真分数的情况),然后使用循环进行产生,然后以字符串形式输出出来。
  • 2.题目运算(判题):
    先将生成的表达式转换为后缀表达式:通过写一个方法,如果是操作数则放进栈,如果是操作符则进行判断:加减一级的操作符遇到栈顶操作符为乘除或加减,则输出栈顶操作符,压进加减一级的操作符;乘除一级的操作符遇到栈顶操作符为乘除则栈顶操作符出栈,压进将入栈的操作符,遇到加减一级操作符则直接进栈。
    计算后缀表达式:写一个方法:从左向右扫描后缀表达式,遇到操作数进栈,遇到操作符则弹出栈顶的两个元素,将结果计算出来再压进栈,最后栈内剩余一个元素即为最终答案
  • 3.支持真分数:暂未完成

3.设计UML类图

4.遇到问题及解决方法

5.代码展示

第一部分:生成题目

import java.util.Stack;
import java.util.Random;
import java.util.ArrayList;
import java.util.Scanner;

class Questions {
    ArrayList<Object> array = new ArrayList<Object>();
    Random generator = new Random();
    char[] newchar = {'+', '-', '*', '/'};
    protected int number;
    int NUM;

    public Questions() {
        number = 0;
    }

    public Object getQuestion(int num) {
        int num1 = num;

        while (num > 0) {
            int figure = (int) generator.nextInt(9) + 1;
            array.add(figure);
            number = (int) (Math.random() * 4);
            array.add(newchar[number]);
            num--;
        }
        String obj = "";
        while (num < 2 * num1) {
            obj += array.get(num);
            num++;
        }
        int other = (int) generator.nextInt(9) + 1;
        array.add(other);
        obj += other + "=";

        return obj;
    }
}

第二部分:题目运算

//生成后缀表达式

public class Calculations {
    public static void main(String[] args) {
        Questions questions=new Questions();
        Stack stack = new Stack();

        Scanner Scan=new Scanner(System.in);

        char c;
        int count=0,answer;
        char[] operation = new char[100];
        String str = (String) questions.getQuestion(3);

        System.out.println("请回答以下问题:\n"+str);
        System.out.println("请输入你的答案:");
        answer=Scan.nextInt();

        for (int i = 0; i < str.length(); i++) {
            c = str.charAt(i);
            if (c >= '0' && c <= '9') {

                operation[i] = c;
                count++;

               }
            else {

                if (c == '*' || c == '/') {
                    if (stack.empty()) {
                        stack.push((char) c);
                    } else if ((char) stack.peek() == '*' || (char) stack.peek() == '/') {
                        operation[i] = (char) stack.pop();
                        stack.push(c);
                    } else
                        stack.push(c);
                } else if (c == '+' || c == '-') {
                    if (stack.empty()) {
                        stack.push(c);
                    } else if ((char) stack.peek() == '+' || (char) stack.peek() == '-') {
                        operation[i] = (char) stack.pop();
                        stack.push(c);
                    } else {
                        operation[i] = (char) stack.pop();
                        stack.push(c);
                    }

                } else
                    stack.push(c);

            }
        }
        int num = stack.size();
        for (int a = 0; a < num; a++) {
            operation[str.length() + a] = (char) stack.pop();
        }
//后缀表达式计算

Stack<Integer> stack1 = new Stack<Integer>();

    int m, n, sum,num1=str.length()+(str.length()-count);

        for (int b = 0; b <= num1; b++) {
        if (operation[b] >= '0' && operation[b] <= '9')
            stack1.push((int) operation[b]-48);
        else {
            if (operation[b] == '+') {
                m =  stack1.pop();
                n =  stack1.pop();
                sum = n + m;
                stack1.push(sum);
            } else if (operation[b] == '-') {
                m = stack1.pop();
                n = stack1.pop();
                sum = n- m;
                stack1.push(sum);
            } else if (operation[b] == '*') {
                m = stack1.pop();
                n = stack1.pop();
                sum = n * m;
                stack1.push(sum);
            } else if (operation[b] == '/') {
                m =  stack1.pop();
                n =  stack1.pop();
                sum = n / m;
                stack1.push(sum);
            }
            else if (operation[b] == ' ')
                continue;
        }
    }
        if ((int)stack1.peek()==answer)
            System.out.println("恭喜你答对了!");
        else
            System.out.println("很遗憾,答错了!答案是:"+stack1.peek());
}
}

三.PSP分析

|PSP2.1 | Personal Software Process Stages | 预估耗时(分钟)| 实际耗时(分钟)|
| -------- | :----------------😐:----------------😐
|Planning | 计划 | 60 | 65 |
|Estimate | 估计这个任务需要多少时间 | 3 | 2|
|Development | 开发 2000 | 3000 |
|Analysis | 需求分析 (包括学习新技术) | 350 | 300 |
|Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 10 |
|Design UML | 设计项目UML类图 | 60 | 60 |
|Coding | 具体编码 | 1500 | 2000 |
|Code Review | 代码复审 | 30 | 30|
|Test 测试|(自我测试,修改代码,提交修改)| 300| 300|
|Size Measurement 计算工作量(实际时间 )| 2 | 2|
|Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 30 | 10|
| | 合计 | 4395 | 5229|

posted @ 2018-05-01 22:55  20172308周亚杰  阅读(224)  评论(3编辑  收藏  举报