软工随堂小测——四则运算

我说的都队

031402304 陈燊 031402342 许玲玲 031402337 胡心颖 03140241 王婷婷 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬涛


一、算法流程

1020306-20161203105130631-69133128.png

二、算法功能

  • 能对0--10之间的整数进行四则运算(加减乘除)
  • 程序能接收用户输入的整数答案,并判断对错
  • 支持真分数的四则运算
  • 程序结束时,统计出答对、答错的题目数量。

三、算法分析

类CaculatorView: UI界面的加载,程序的主体框架,对运算式的正确答案以及用户给定的答案进行检验,并返回检验结果。

类Equation: 随机成成运算式,并返回

类Caculate: 对给定的运算式,计算出结果并返回

类MatchAnswer: 对用户的输入答案与正确答案进行检验,并返回检验结果

类Fraction: 实现真分数的四则运算

/**
 * 程序的UI界面,对用户的输入输出进行判定运算,并给出相应的提示
 * 程序的主框架,调用了其他类封装好的静态方法
 * @author 陈燊
 *
 */
public class CaculatorView extends JFrame implements ActionListener {

    /** 窗口的宽度 */
    public static final int WIDTH = 810;
    /** 窗口的高度 */
    public static final int HEIGTH = 500;//窗口的高度
    
    //swing部件的定义
    .
    .
    .

    private StringBuffer equationStrs = new StringBuffer();//表达式的字符串缓冲区
    private StringBuffer resultStrs = new StringBuffer();//用户给定答案的字符串缓冲区
    private StringBuffer matchOutputStrs = new StringBuffer();//检测结果的字符串缓冲区

    private String[] userResult = new String[100];//用户给定的答案
    private String[] rightResult = new String[100];//运算式的正确答案
    private String[] expression = new String[100];//随机生成的表达式
    private int ensureNumber;//运算式的题量
        
    /**
     * CaculatorView的构造方法
     */
    public CaculatorView() {
        
        //设置标题和大小
        this.setTitle("运算器");
        this.setSize(WIDTH,HEIGTH);
        
        //swing部件的初始化
        .
        .
        .
        
        //生成表达式的数据初始化方法
        Equation.createEquation();
        
    }
    
    public static void main(String[] args) throws IOException{
        new CaculatorView();
    }
    
    /**
     * 所有数据的重置
     * @param flag
     * flag为true,表示点击了重置按钮,则numberText清空
     * flag为false,表示点击了确定按钮,则numberText不清空
     */
    void resetDatas(boolean flag) {
        if (flag) {
            numberText.setText("");
        }
        equationInput.setText("");
        answerInput.setText("");
        matchAnswer.setText("");
        ensureNumber = 0;
        equationStrs.delete(0, equationStrs.length());
        resultStrs.delete(0, resultStrs.length());
        matchOutputStrs.delete(0, matchOutputStrs.length());
        userResult = new String[100];
        rightResult = new String[100];
        expression = new String[100];
        MatchAnswer.setRightNums(0);
        MatchAnswer.setWrongNums(0);
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        String button = e.getActionCommand();
        if (button.equals("确认")) {
            resetDatas(false);
            String numberStr = numberText.getText();
            
            if (numberStr.length() != 0) {
                
                /**
                 * 对输入题量进行判断,上限为100题,如果超出或则小于等于0题,都会给出相应提示
                 * 当输入正确时,把输入转化为int型保存在ensureNumber里
                 */
                if ((Integer.parseInt(numberStr) > 100) || (Integer.parseInt(numberStr) <= 0)) {
                    JOptionPane.showMessageDialog(null, "题量最多为100题!请重新输入!", "提示", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    ensureNumber = Integer.parseInt(numberStr);
                }
            } else {
                JOptionPane.showMessageDialog(null, "请先输入题量!", "提示", JOptionPane.INFORMATION_MESSAGE);
            }
            
            for (int i = 0; i < ensureNumber; i ++) {
                
                /**
                 * 调用Equation类的getEquation()生成表达式方法
                 * 并把生成的表达式保存在expression数组里面
                 */
                expression[i] = Equation.getEquation();
                equationStrs.append("题" +  (i + 1) + ": " + expression[i] + "\n");
          
                /**
                 * 调用Calculate类的getAnswer()方法
                 * 计算出运算式的答案并保存在rightResult数组里面
                 */
                rightResult[i] = Calculate.getAnswer(expression[i]);
                resultStrs.append("题" +  (i + 1) + ": " + rightResult[i] + "\n");
            }
            equationInput.setText(equationStrs.toString());         
        } else if (button.equals("确认答案")) {
            String numberStr = numberText.getText();
            
            /**
             * 对输入进行判断,当题量或则表达式未生成时,给出相应错误提示
             */
            if (numberStr.length() == 0) {
                JOptionPane.showMessageDialog(null, "请先输入题量!", "提示", JOptionPane.INFORMATION_MESSAGE);
            } else if(ensureNumber == 0) {
                JOptionPane.showMessageDialog(null, "请先生成表达式!", "提示", JOptionPane.INFORMATION_MESSAGE);
            } else {
                userResult = answerInput.getText().split("\n");
                
                /**
                 * 对用户给定的答案数量进行判断
                 * 当答案数小于或大于运算式的数量时,给出相应错误提示
                 */
                if (userResult.length < ensureNumber) {
                    JOptionPane.showMessageDialog(null, "答案数量过少,请给出正确数量的答案!", "提示", JOptionPane.INFORMATION_MESSAGE);
                } else if (userResult.length > ensureNumber) {
                    JOptionPane.showMessageDialog(null, "答案数量过多,请给出正确数量的答案!", "提示", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    
                    /**
                     * 调用MatchAnswer类的match()方法,对用户给定的答案进行检验
                     * 并把检验结果保存到matchOutputStrs字符缓冲区里
                     * 给出正确和错误的答案数
                     */
                    for (int i = 0; i < ensureNumber; i ++) {
                        matchOutputStrs.append(MatchAnswer.match(rightResult[i], userResult[i]));
                    }
                    matchOutputStrs.append("\n共有 " + ensureNumber + " 题运算式\n");
                    matchOutputStrs.append("正确答案: " + MatchAnswer.getRightNums() + "题\n");
                    matchOutputStrs.append("错误答案: " + MatchAnswer.getWrongNums() + "题\n");
                    if (MatchAnswer.getRightNums() == ensureNumber) {
                        matchOutputStrs.append("厉害了我的哥!你答对了所有题目!\n");
                    } else if (MatchAnswer.getRightNums() == 0) {
                        matchOutputStrs.append("一题都没答对。。。小学校长想你了!");
                    } else {
                        matchOutputStrs.append("谢谢参与,欢迎再次挑战!");
                    }
                    matchAnswer.setText(matchOutputStrs.toString());
                }
            }
        } else if (button.equals("重置")) {
            /**
             * 清空所有文本框,以及所有数据
             */
            resetDatas(true);
        }   
        
    }

}

四、程序运行流程GIF图演示

1020306-20161204200735240-1417976970.gif

五、单元测试

  • 分数加减法的单元测试

    1020306-20161205163141397-539729277.png

  • 答案检验的单元测试

    1020306-20161205163225897-1748382677.png

六、结果测试

测试样例一:答案全部正确
1020306-20161203171029443-2101714861.jpg
测试样例二:答案全部错误
1020306-20161203170829084-1221869828.jpg
测试样例三:部分正确部分错误
1020306-20161203170841787-1570852659.jpg

七、组员分工和Git提交记录

  • 陈 燊(031402304)图形化界面输入、比较结果并输出

    1019353-20161204095918662-507866612.png

  • 陈齐民(031402203)程序流图、main函数

    1019353-20161204100015256-160243276.png

  • 黄炜伟(031402209)生成计算题

    1019353-20161204100020474-2083165805.png

  • 郑扬涛(031402233)计算结果

    1019353-20161204100030943-1728362291.png

  • 胡心颖(031402337)分数的加减乘除

    1019353-20161204100035506-780077079.png

  • 许玲玲(031402342)单元测试

    1019353-20161204100043818-1695476530.png

  • 王婷婷(031402341)博客编写

    1019353-20161204100048677-93473403.png

八、Github项目记录

  • 项目地址:https://github.com/SoftwareTeam5/Arithmetic

1020306-20161203225940177-971303699.png

九、分支合并记录

1020306-20161203165842381-1556387573.jpg

转载于:https://www.cnblogs.com/wangtingting007/p/6128206.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值