结对作业(1)----基于GUI的四则运算
小伙伴:201421123031 余洋 201421123044 潘志坚
题目要求:
我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:
- 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。
- 有计时功能,能显示用户开始答题后的消耗时间。
- 界面支持中文简体/中文繁体/英语,用户可以选择一种。
题目分析:
1.GUI实现。
2.数据提取,保存历史纪录。
3.计时功能。
4.多语言的支持。
功能分析:
1.基本功能
实现GUI界面。
2.扩展功能
计时功能,支持多语言。
3.用户数据提取,历史纪录。
设计实现:
1.本实验采用JAVA。
2.编写GUI界面,调整窗口位置。
3.编写计时器类。
4.编写多语言支持类。
5.编写数据提取类。
代码说明:
1.GUI
public void createComponent() { jpMain = new JPanel(); jpMain.setBackground(Color.gray); jpMain.setLayout(null); showTime(); showHistory(); btnSubmit = new JButton(tips.get(3)); btnSubmit.setBounds(250, 500, 90, 40); btnSubmit.addActionListener(this); jpMain.add(btnSubmit); btnReset = new JButton(tips.get(4)); btnReset.setBounds(450, 500, 90, 40); btnReset.addActionListener(this); jpMain.add(btnReset); jpTest = new JPanel(); jpTest.setLayout(new GridLayout(Background.testNum, 1, 20, 20)); jpTest.setBackground(Color.gray); for (int i = 0; i < Background.testNum; i++) { jpQuestions[i] = new JPanel(); jpQuestions[i].setBackground(Color.gray); jpQuestions[i].setLayout(null); labQuestions[i] = new JLabel(questions[i], JLabel.CENTER); labQuestions[i].setFont(new Font("Consolas", 0, 20)); jpQuestions[i].add(labQuestions[i]); labQuestions[i].setBounds(0, 0, 350, 25); tfdAnswer[i] = new JTextField(8); tfdAnswer[i].setFont(new Font("Consolas", 0, 12)); tfdAnswer[i].setBackground(Color.white); jpQuestions[i].add(tfdAnswer[i]); tfdAnswer[i].setBounds(350, 0, 60, 25); jpTest.add(jpQuestions[i]); } jpMain.add(jpTest).setBounds(100, 60, 500, 400); add(jpMain); }
2.计时功能的实现。
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(); }
3.多语言的实现。
public void setLanguage() { String[] choiceLanguage = { "简体", "繁体", "Eng" }; String language = (String) JOptionPane.showInputDialog(null, "选择语言:\n", "Choose language", 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(); } } }
4.数据提取的实现。
public void actionPerformed(ActionEvent e) { if (e.getSource() == btnSubmit) { isEnd=!isEnd; for (int i = 0; i < Background.testNum; i++) { answers[i]=tfdAnswer[i].getText(); } wrong= background.checkAnswer(answers); String s=null; if(wrong.length==0) s=tips.get(5); else{ s=tips.get(6)+"\n"; String standardAnswer[]=new String[Background.testNum]; standardAnswer=background.getStandardAnswer(); for(int i=0;i<wrong.length;i++){ s=s+new Integer(wrong[i])+":"+standardAnswer[new Integer(wrong[i])-1]; s=s+"\n"; } } JOptionPane.showMessageDialog(null, s, "report",JOptionPane.PLAIN_MESSAGE); background.upDate(new Integer(his_rightNum+(Background.testNum-wrong.length)),new Integer(his_allNum+Background.testNum)); } } }
测试运行:
码市:https://coding.net/u/AJIAN044/p/cyuyan/git/tree/%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%BD%9C%E4%B8%9A/
PSP展示:
PSP | Personal Software Process Stages | Time (%) Senior Student | Time (%) |
Planning | 计划 | 3 | 2 |
· Estimate | 估计这个任务需要多少时间 | 78 | 111.5 |
Development | 开发 | 10 | 10 |
· Analysis | 需求分析 (包括学习新技术) | 1 | 1.5 |
· Design Spec | 生成设计文档 | 5 | 6 |
· Design Review | 设计复审 | 4 | 6 |
· Coding Standard | 代码规范 | 1 | 2 |
· Design | 具体设计 | 5 | 6 |
· Coding | 具体编码 | 36 | 60 |
· Code Review | 代码复审 | 7 | 9 |
· Test | 测试(自我测试,修改代码,提交修改) | 8 | 10 |
Reporting | 报告 | 1 | 1 |
小结:
个人作业1使用的是C语言实现,但不会使用C语言实现GUI,便查阅资料使用JAVA实现此次实验。有一个伙伴,坐在一起,并肩作战,面对着同一台显示器,使用着同一键盘,同一个鼠标,一起思考,一起分析,一起编程是一个有趣的过程,通过此次实验我了解到1+1有时会>2,所谓旁观者清,这样会更好更快速准确的找到错误并修改,事半功倍。
汉堡包评价:
第一片面包:潘志坚同学认真,愿意面对困难并设法解决问题,比较耐心,和我性格互补所以选择同他合作,两个人结对编程,可以优势互补,互相学习。
中间的肉:结对编程优势在于两人有各自擅长的模块,能较高效率。
中间的青菜:因为不会使用C语言实现GUI,是我们俩共同的短板,所以在新的语言环境下花了较多的时间。
第二片面包:我本身没有很扎实的编程基础,在编写过程中会有些吃力,而这次结对编程则给我留下了深刻的印象,不仅在一定程度上避免了这些问题,还让我明显体会到了结对编程的优越性。两个人一起编程可以有效避免一些可笑的低级错误,还有可以一起分析、解决问题,就好像是通过两人不断的头脑风暴和知识碰撞来解决问题。