首页 > 代码库 > 结对编程1-四则运算(基于GUI)

结对编程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

四.总结

在我们看来,结对编程是能够带来1+1>2的效果。虽然第一次结对编程我们遇到了很多问题,但同时我们也收获了很多。作为“驾驶员”,在编程时就会格外的认真,注意每一段代码的格式,按照统一的规范来写,以便队友审查。作为“领航员”,你会时刻关注你旁边的人写的代码,思维在不停的运作,不仅提高了代码质量,也减少了复审所需要的时间,不用事后再去花大精力去阅读、修改代码。而且当一个人独自写程序时,我们总是容易出现懈怠的情绪,而当两个人结对编程时,通过互相监督、提醒,编程效率大大提高。

技术分享

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