林晓芳201421123092、陈惠201421123096
coding 地址:https://git.coding.net/lianlian/92.96.1.git
一.题目描述
我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:
- 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算;
- 有计时功能,能显示用户开始答题后的消耗时间;
- 界面支持中文简体/中文繁体/英语,用户可以选择一种。
二.分析实现
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 |
四.总结
不同的两个人在面对同件事情上会产生不一样的想法,这使得我们在刚刚开始合作的时候发生了一些小争执,但是我们俩都属于“说服型”的人,能够按照自己的分析将对方说服并与对方建立共识,最后成功的完成了这次的结对编程作业。对我来说,我认为结对编程是一次有趣的体验,它能够让你发现自身的不足,更能让你体会团队的魅力。但是,两个人在交流的时候一定要敢于提出自己的想法和看法,一定在大致上要达成共识,这样两个人的作用才能发挥到最大。互相影响、互相鞭策,我想这就是结对编程最大的魅力。