实验三 软件工程结对项目
Github仓库主页链接地址:https://github.com/huicunzhang/Sizeyunsuan2
结对伙伴博客地址:http://www.cnblogs.com/mumay12447/p/8715603.html
一、需求分析
1. 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
2. 题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试。
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
二、设计类图:
Start类:用来创建进入系统的界面;
SimpleFrame类:做题界面、随机出题、调用shishi3类中的计时功能;
Sort类:成绩汇总界面,以柱状图的形式展现,用数组记录每次测试的结果。
三、程序流程图:
四、核心代码:
搭建系统开始界面
public Start() { JPanel south = new JPanel(); JLabel label1 = new JLabel("欢迎同学们,是否要开始测试?",JLabel.CENTER); JButton btn1 = new JButton("确定"); JButton btn2 = new JButton("取消"); add(label1); south.add(btn1); south.add(btn2); add(south,BorderLayout.SOUTH); Font font=new Font("华文行楷",Font.BOLD,20); label1.setFont(font); label1.setForeground(Color.BLUE);//设置字体颜色 //label1.setBackground(Color.GREEN); btn1.setFont(font); btn1.setForeground(Color.BLUE); btn1.setBackground(Color.CYAN); btn1.setBorder(BorderFactory.createRaisedBevelBorder()); btn1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { setVisible(false); SimpleFrame0 frame = new SimpleFrame0(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } }); btn2.setFont(font); btn2.setBorder(BorderFactory.createRaisedBevelBorder()); btn2.setForeground(Color.BLUE); btn2.setBackground(Color.CYAN); btn2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { System.exit(0); } }); setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setTitle("四则运算系统"); setLocation(500,200); } }
计时器
class shishi3 extends Thread { private long noww = 0l; private long start = System.currentTimeMillis();// 程序启动时间的毫秒值 private long time; public void run() { int i=0; while (true) { noww = System.currentTimeMillis();// 获取一秒之后的毫秒值 time = noww - start;// 两个时间相减的到毫秒差 timetime=time; String ssss=String.format("计时: %02d:%02d:%02d\n", time / (1000 * 60 * 60) % 60/* 时 */, time / (1000 * 60)% 60/* 分 */, (time / 1000 % 60)/* 秒 */);// 格式化字符串输出 l1.setText(ssss); i++; try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
绘制柱状图代码
public void paint(Graphics g) { int snum2 = Integer.parseInt(snum[0]); File file = new File("result.txt"); StringBuilder result = new StringBuilder(); try { BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件 String s = new String(); do { for(int i=0;i<4;i++) { s = br.readLine() ;//使用readLine方法,一次读一行 save[i] = Integer.parseInt(s); } } while((s = br.readLine())!=null); br.close(); } catch(Exception e){ e.printStackTrace(); } int Width = 600; int Height = 450; Random ran = new Random(); int leftMargin = 10;//柱形图左边界 int topMargin = 50;//柱形图上边界 Graphics2D g2 = (Graphics2D) g; g2.translate(10, 100); int ruler = Height-topMargin-5; int rulerStep = ruler/10;//将当前的高度评分为10个单位 g2.setColor(Color.BLACK);//绘制黑色背景 g2.fillRect(0, 0, Width, Height);//绘制矩形图 g2.setColor(Color.green); for(int i=0;i<=10;i++){ //绘制绿色横线和百分比 g2.drawString((100-10*i)+"", 10, topMargin+rulerStep*i);//写下百分比 g2.drawLine(10, topMargin+rulerStep*i, Width, topMargin+rulerStep*i);//绘制灰色横线 } g2.setColor(Color.red); for(int i=0;i<4;i++){ //绘制柱形图 int value =save[i]*4;//产生柱形的百分比 int step = (i+1)*50;//设置每隔柱形图的水平间隔为50 g2.fillRoundRect(leftMargin+step*2, Height-value-10, 40, value, 40, 10); //绘制矩形 g2.drawString("第"+(i+1)+"轮测试", leftMargin+step*2, Height-value-15); //列出 测试轮次 }
五、运行结果:
六、结对过程:
七、总结与评价
在这次结队项目中,我和我的好朋友结为一对,因为平时一直在一起,互相特别熟悉,对彼此都比较信任,所以很自然的结为一对。我这个人平时做事希望做的完美一些,因此做事比较慢,在这次结对项目里伙伴的督促使我发现我应该改掉我的这个习惯,真的自己做事太慢了。虽然我们俩的编程基础都很弱,但我们都有一颗上进的心,我们都希望通过我两的努力,能做出一个比较好的项目。虽然现实有些残酷,我们在做的过程中有气馁想放弃的时候,但我们还是彼此鼓励,作出了一个相对比较可以的系统。在做的过程里,想在开始的界面里添加背景图片,可是试了好几次都没成功,希望后面通过学习可以将这一问题克服了。
对于结对编程真的能够带来1+1>2的效果的说法,我是同意的。平时一个人做的时候,自己的想法是比较单一固定的,通过结对可以碰撞出更多想法。虽然一开始不理解对方的想法,但在不断地沟通交流后,一下明白了对方的想法。而且编程过程中有出错的地方,自己找不出的时候就很急躁,然后就不想继续了,然而有了伙伴可以一起找错,就不会很急躁,也能很快的找出错误,并解决问题。所以团结的力量是不容小觑的,好的合作会带来好的项目作品。
八、PSP
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 10 | 10 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 10 |
Development | 开发 | 1302 | 1065 |
·· Analysis | 需求分析 (包括学习新技术) | 10 | 20 |
· Design Spec | · 生成设计文档 | 5 | 5 |
· Design Review | · 设计复审 (和同事审核设计文档) | 2 | 5 |
· Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | 具体设计 | 30 | 25 |
· Coding | 具体编码 | 1200 | 960 |
· Code Review | · 代码复审 | 30 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 20 | 25 |
Reporting | 报告 | 25 | 28 |
·· Test Report | · 测试报告 | 10 | 5 |
· Size Measurement | 计算工作量 | 5 | 3 |
· Postmortem & Process Improvement Plan | · 事后总结 ,并提出过程改进计划 | 10 | 20 |