结对编程1-四则运算(基于GUI)

林晓芳201421123092、陈惠201421123096

coding 地址:https://git.coding.net/lianlian/92.96.1.git


一.题目描述

我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:

  1. 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算;
  2. 有计时功能,能显示用户开始答题后的消耗时间;
  3. 界面支持中文简体/中文繁体/英语,用户可以选择一种。

二.分析实现

a.需求分析:

1.实现GUI界面;

2.实现历史对错题数记录;

3.能够显示用户答题时间;

4.提供中文简体/中文繁体/英语多种语言选择。

b.功能设计:

1.基本功能:多种语言选择、显示历史正确率、答题计时;

2.扩展功能:生成用户错题集。

c.设计实现:

  • Background//后台事件处理类:

        方法:createTest()//定义一个随机数

                 checkAnswer(String[] answers)//传入一组答案,校验答案

                 getQuestions()//获取完整的题目

                 getStandardAnswer()//获取标准答案

                 upDate(Integer right,Integer all)//上传正确率

  • Client//客户端类:

        方法:Client()//客户端构造器

                 createComponent()//创建面板

                 showTime()//显示答题时间

                 showHistory()//显示历史正确率

                 setLanguage()//设置客户端语言

                 actionPerformed(ActionEvent e)//按钮事件

  • Calculator//计算类:

        方法:add(Fraction a, Fraction b)//加法

                 sub(Fraction a, Fraction b)//减法 

                 mul(Fraction a, Fraction b)//乘法

                 div(Fraction a, Fraction b)//除法

  • Fraction//分数类:

        属性:numerator//分子

                 denominator//分母

        方法:creatfraction()//创建分数   

                 GCD(int m, int n)//计算最大公约数

                 Reduction(int m, int n)//约分

                 compare(String m, String n)//比较输入结果与答案

  • Test//运行类:

        main函数执行

d.代码说明:

上传正确率:

复制代码
    public void upDate(Integer right,Integer all){
        try {
            writer = new BufferedWriter(new FileWriter(new File("history/accuracy.txt")));
            writer.write(right.toString());
            writer.newLine();
            writer.write(all.toString());
            writer.newLine();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
    }
复制代码

显示答题时间:

复制代码
public void showTime() {
        labTime = new JLabel(tips.get(1) + "00:00");
        labTime.setBounds(580, 0, 120, 50);
        jpMain.add(labTime);
        // 启动记时线程
        new Thread() {
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                        seconds++;
                        if (seconds >= 60) {
                            seconds = 0;
                            minutes++;
                        }
                        // 修正分钟数和秒钟数
                        if (seconds < 10)
                            secStr = "0" + seconds.toString();
                        else
                            secStr = seconds.toString();
                        if (minutes < 10)
                            minStr = "0" + minutes.toString();
                        else
                            minStr = minutes.toString();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    labTime.setText(tips.get(1) + minStr + ":" + secStr);
                    if(isEnd)
                        break;
                }
            }
        }.start();
    }
复制代码

显示历史正确率:

复制代码
    public void showHistory() {
        labAccuracy = new JLabel();
        labAccuracy.setBounds(150, 0, 120, 50);
        try {
            reader = new BufferedReader(new FileReader(new File("history/accuracy.txt")));
            his_rightNum = reader.readLine();
            his_allNum = reader.readLine();
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        labAccuracy.setText(tips.get(2) + his_rightNum + "/" + his_allNum);
        jpMain.add(labAccuracy);
    }
复制代码

设置客户端语言:

复制代码
public void setLanguage() {
        String[] choiceLanguage = { "简体中文", "繁体中文", "English" };
        String language = (String) JOptionPane.showInputDialog(null, "请选择客户端的语言:\n", "Choice a language for client",
                JOptionPane.PLAIN_MESSAGE, new ImageIcon("icon.png"), choiceLanguage, "简体中文");
        if (language == null) {
            System.exit(-1);
        } else {
            try {
                reader = new BufferedReader(new FileReader(new File("language/" + language + ".txt")));
                String s;
                while ((s = reader.readLine()) != null) {
                    tips.add(s);
                }
                reader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
复制代码

e.测试运行:

三.PSP展示

 

PSP2.1

Personal Software Process Stages

Time (%) Senior Student

Time (%)

Planning

计划

2h

2.5h

· Estimate

估计这个任务需要多少时间

40h

42h

· Analysis

需求分析 (包括学习新技术)

3h

4h

· Coding Standard

代码规范

1h

1h

· Design

具体设计

3h

3h

· Coding

具体编码

25h

30h

· Test

测试(自我测试,修改代码,提交修改)

1.5h

2h

Reporting

报告

1h

1h

四.总结

      不同的两个人在面对同件事情上会产生不一样的想法,这使得我们在刚刚开始合作的时候发生了一些小争执,但是我们俩都属于“说服型”的人,能够按照自己的分析将对方说服并与对方建立共识,最后成功的完成了这次的结对编程作业。对我来说,我认为结对编程是一次有趣的体验,它能够让你发现自身的不足,更能让你体会团队的魅力。但是,两个人在交流的时候一定要敢于提出自己的想法和看法,一定在大致上要达成共识,这样两个人的作用才能发挥到最大。互相影响、互相鞭策,我想这就是结对编程最大的魅力。

 

 
 
posted @ 2017-03-13 22:13  脸脸ya  阅读(259)  评论(6编辑  收藏  举报