陈阳:2017282110288
胡志权:2016282110143
1、Github地址:
https://github.com/VicLily/softwareEngineering
2、
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
30 |
60 |
· Estimate |
· 估计这个任务需要多少时间 |
30 |
60 |
Development |
开发 |
1490 |
1850 |
· Analysis |
· 需求分析 (包括学习新技术) |
20 |
30 |
· Design Spec |
· 生成设计文档 |
60 |
120 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
40 |
60 |
· Coding |
· 具体编码 |
970 |
1200 |
· Code Review |
· 代码复审 |
90 |
140 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
120 |
100 |
Reporting |
报告 |
80 |
80 |
· Test Report |
· 测试报告 |
30 |
20 |
· Size Measurement |
· 计算工作量 |
20 |
30 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
40 |
合计 |
1520 |
1910 |
3、解题思路:
①思路:
功能一、本次要求把这个程序做成GUI功能:我们在确定了在第一次和第二次代码的基础上,将控制台显示和交互的内容用java swing显示出来,并初步设计了界面内容。
功能二、记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算: 实现这个功能的思路是将历史答题记录存储在score.txt文件中,设置两个静态变量记录本次答题正误个数,判断每个题答案正误时对应的变量自加,本次答题结束时本次正误个数与历史正误个数加一起显示并存储到文件中。(查看历史记录时读取文件的内容以对应的语言显示出来。)
功能三、有计时功能,能显示用户开始答题后的消耗时间:刚开始并没有经验,是在功能一、二完成后增量加上去的,用到java的Timer类和listener类。
功能四、界面支持中文简体/中文繁体/英语,用户可以选择一种:这个功能也是在功能一、二、三完成后增量加上去的,界面设计进行了修改,将选择语言放到了用户登录界面,另外创建java类,用于判断不同语言在页面中对应不同的输出。
②找资料和分歧:
找资料:主要是有些具体代码忘记了,通过工具书解决。实现方面比如在计时功能上,会查看别人的博客的实现工程修改自己的代码。
分歧:因为每个人负责不同的功能,所以一般只会在思路上出现少许不同意见,实现者说出自己的主要思路,另一个人会询问详细过程,没有问题会达成一致意见。
4、设计实现过程:
①操作流程图:
② 类的调用和功能:
(大图可查看 存储在github项目文件夹“四则运算GUI”下)
index.java为启动开始的主文件。
5、代码说明
①语言判断:将获取的下拉列表值的数组下标存为静态变量,在Title.java中有不同的方法,根据不同的下标值对应输出不同的语言内容给调用者。
public String SetRecordTitle(){ if(index.Q==1){ s="曆史記錄"; }else if(index.Q==2){ s="history record"; }else{ s="历史记录"; } return s; } public String SetInputN(){ if(index.Q==1){ s="輸入題目個數"; }else if(index.Q==2){ s="Enter the number of questions"; }else{ s="输入题目个数"; } return s; }
②调用FileIO.java获取score.txt中的历史记录内容,在这里做一个拆分,历史记录加上本次的答题情况,再次调用FileIO.java存储到score.txt文件中。
public class saveScore { int n1,n2,i;//n1为正确个数,n2为错误个数。 String s1,s2,s3,s; FileIO f; saveScore(){ comput(); } public void comput(){ f=new FileIO(); s1=f.FileInN(); i=s1.indexOf(','); s2=s1.substring(0,i).trim();//正确 s3=s1.substring(i+1,s1.length()).trim(); //错误 n1= Integer.valueOf(s2); n2= Integer.valueOf(s3); n1=n1+inputNum.m1; n2=n2+inputNum.m2; s=String.valueOf(n1)+","+String.valueOf(n2); //System.out.println("n1="+n1+",n2="+n2+",s="+s); try { f.FileOut(s); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
③计时功能:将计时的文本框放在窗体右上角。用Timer和Listener类完成计时。在最后得分输出时,将耗时以分秒的形式输出。
text.addActionListener(listener); listener.setCount(text); count = new Timer(1000, listener); count.start(); class Listener implements ActionListener { JTextField text; public void setCount(JTextField text) { this.text = text; } public void actionPerformed(ActionEvent e) { String str = text.getText(); int x = Integer.parseInt(str); x++; text.setText("" + x); } }
6、测试运行
(更多运行结果图片存储在github项目文件夹“四则运算GUI”下)
操作说明:
1:点击github此项目的“clone or download”下载此项目的所有文件(因刚开始缺乏经验,将所有的版本放在一个项目中,后续会分开在不同的项目),启动运行只用到了“四则运算程序版”这一个文件就可以(要保证这个文件的完整性,即lib、score文件与comput.jar在同一个目录下)
2:点击comput.jar即可运行程序。
用户名:Jack
密码:123
3:整个过程用户的输入只在A输入栏,Q输入栏只做显示。
举例:
登录选择语言后,
点击查看记录:即可看到本用户历史答题记录。
点击开始答题:
此时计时器开始计时,
在Q栏中会显示“输入题目个数”,用户只需在A栏中输入偶数个数,点击提交,屏幕显示“满分100分,每题n分!”,点击“下题”,题目会自动生成,用户在A栏中输入自己的答案后点击下题,屏幕显示本题对错、给出正确答案和用户答案。
整个答题结束后,屏幕显示总分、总耗时。点击返回本次答题结束。
7、合作情况:
陈阳:我们刚开始是交流了下大概思路后,各自实现一部分功能,但后期要增量的添加新的功能,我们两个人的几块功能合并时出现了场面混乱。后来我又重新将代码进行了模块化,直到最后实现。整个过程我主要复杂编码,觉得代码能力在这个过程中提高很快。
面临如果是代码问题,则编代码的人网上查阅资料。面临思路问题是主要是商量、沟通为主。
胡志权:我们的实现主要是都会针对我们各自的想法、结合目前的功能集成,商量确定好思路后才进行下一步,整个过程合作还算比较愉快,搭档写代码为主,我复杂审查和总结。
8、项目小结:
陈阳:还是觉得代码熟练程度还有欠缺,同样的功能虽然可以找到思路并解决,但遇到bug时却废了好长时间才解决。比如有一个bug,在获取到文件的历史记录后,得到的字符串拆分成正确个数和错误个数两个字符串类型的数,将两个转换成整型时,一直出现“java.lang.NumberFormatException:” ,查了好久的资料才知道应该在拆分每个字符串类型的数后边加.trim()去掉空格。熟能生巧,以后还是要多动手。
胡志权:个人觉得在刚开始进行估计时,觉得项目挺简单的,没想太复杂,但两个人的编码习惯都有不同,所以在沟通和理解上花费了时间,希望以后搭档之间可以多多熟悉,多多沟通。
9、结对照片: