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

  • 相关阅读:
    Uva
    Uva
    Uva
    Uva
    Uva
    Uva
    Uva
    Uva
    第二次结队编程作业
    第三次软件工程作业的总结
  • 原文地址:https://www.cnblogs.com/lxf-092/p/6545087.html
Copyright © 2020-2023  润新知