结对编程1
结对队友学号:201421123036 201421123048
项目代码:
https://git.coding.net/YJh_/Cal.git
题目描述:
我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:
- 记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。
- 有计时功能,能显示用户开始答题后的消耗时间。
- 界面支持中文简体/中文繁体/英语,用户可以选择一种;
需求分析:
- 在作业一中已经完成了四则运算的分数算法。
- 在控制台的输入操作不够人性化,使用GUI界面让用户使用更加方便。
- 在用户使用程序做题时需要记录用户做题的对错题数。
- 针对不同的用户,需要用到不同的语言,繁体字,简体字,英文版。
- 对于能力不同的用户,需要有难易不同程度的题目。
- 如果需要测试完成题目所用的时候,需要有记录做题的消耗时间。
功能分析:
- 基本功能
- GUI界面显示程序
- 记录做题时间
- 记录用户做题总数和正确题数
- 收集用户的错题集并显示给用户
- 提供简体繁体英文界面
- 拓展功能
- 题目难度分为初级中级高级可供用户选择
- 在各个难度中还有整数和整数型,整数和分数型,分数和分数型
程序设计:
用户操作运行流程:
主要分类:
Calculator类
程序测试
测试截图:
部分代码展示:
public class LoginMiddle { float sum; int dadui=0; int dacuo=0; int tishu; int noanswer=0; int summary=0; String parten = "0.00"; DecimalFormat decimal = new DecimalFormat(parten); String str; static Timer timer = null; static SimpleDateFormat df=new SimpleDateFormat("mm:ss"); long starttime; long finishtime; long duration; long allduration; private JFrame frame; public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { LoginMiddle window = new LoginMiddle(); window.frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } public LoginMiddle() { initialize(); } private void initialize() { frame = new JFrame(); frame.setTitle("实战界面中级版两个整数与一个分数型"); frame.setSize(750,230); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Label L1=new Label("总题数:",Label.RIGHT); Label L2=new Label("题目:",Label.RIGHT); Label L3=new Label("请输入答案:",Label.RIGHT); Label L4=new Label("答题情况:",Label.RIGHT); Label L5=new Label("答对题数:",Label.RIGHT); Label L6=new Label("答错题数:",Label.RIGHT); Label L7=new Label("答题时间:",Label.RIGHT); final JButton B1=new JButton("开始"); final JButton B2=new JButton("下一题"); final JButton B3=new JButton("退出"); final JTextField T1=new JTextField(5); final JTextField T2=new JTextField(10); final JTextField T3=new JTextField(5); final JTextField T4=new JTextField(20); final JTextField T5=new JTextField(10); final JTextField T6=new JTextField(10); final JTextField T7=new JTextField(10); JPanel panel=new JPanel(); JPanel panel0=new JPanel(); JPanel panel1=new JPanel(); JPanel panel2=new JPanel(); JPanel panel3=new JPanel(); panel.add(panel0); panel.add(panel1); panel0.add(panel2); panel0.add(panel3); frame.getContentPane().add(panel,"Center"); L1.setFont(new java.awt.Font("宋体", 1, 14)); L2.setFont(new java.awt.Font("宋体", 1, 14)); L3.setFont(new java.awt.Font("宋体", 1, 14)); L4.setFont(new java.awt.Font("宋体", 1, 14)); L5.setFont(new java.awt.Font("宋体", 1, 14)); L6.setFont(new java.awt.Font("宋体", 1, 14)); L7.setFont(new java.awt.Font("宋体", 1, 14)); panel.setLayout(new FlowLayout()); panel0.setLayout(new GridLayout(1,2)); panel2.setLayout(new GridLayout(4,2,5,10)); panel3.setLayout(new GridLayout(4,2,10,10)); panel2.add(L1); panel2.add(T1); panel2.add(L2); panel2.add(T2); panel2.add(L3); panel2.add(T3); panel2.add(L4); panel2.add(T4); panel3.add(L5); panel3.add(T5); panel3.add(L6); panel3.add(T6); panel3.add(L7); panel3.add(T7); panel1.add(B1); panel1.add(B2); panel1.add(B3); B3.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { JOptionPane.showMessageDialog(null, "答题总题数为"+tishu+",答对题数为"+dadui+",答错题数为"+dacuo+",未答题题数为"+noanswer+"。"); frame.setVisible(false); new Middle(); } }); B1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { tishu=Integer.parseInt(T1.getText()); noanswer=tishu-dadui-dacuo; summary++; timer = new Timer(); finishtime=System.currentTimeMillis(); starttime=finishtime; timer.schedule(new TimerTask() { public void run() { finishtime=System.currentTimeMillis(); duration=finishtime-starttime; if(duration/1000==27&&summary<tishu) { JOptionPane.showMessageDialog(null, "答题时间已到。答题总题数为"+(dadui+dacuo)+",答对题数为"+dadui+",答错题数为"+dacuo+",未答题题数为"+(tishu-dacuo-dadui)+",答题使用时间:"+(allduration+duration)/1000+"秒。"); frame.setVisible(false); new Middle(); } String str=df.format(new Date(duration)); T7.setText(str); } }, 1000, 1000); allduration=allduration+duration; char a[]={'+','-','×','÷'}; char b[]={'+','-','×','÷'}; int c=(int)(Math.random()*4); int d=(int)(Math.random()*4); int f=(int)(Math.random()*100); int g=(int)(Math.random()*99+1); int h=(int)(Math.random()*99+1); int l=(int)(Math.random()*99+1); T3.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { str= decimal.format(sum); if(Float.parseFloat(str)==Float.parseFloat(T3.getText())) { T4.setText("恭喜你!答对了!"); dadui++; T5.setText(String.valueOf(dadui)); } else { T4.setText("真遗憾!答错了!正确答案是"+Float.parseFloat(str)); dacuo++; T6.setText(String.valueOf(dacuo)); } noanswer=tishu-dadui-dacuo; } }); B2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) { if(summary==tishu) { JOptionPane.showMessageDialog(null, "答题已完成。答题总题数为"+tishu+",答对题数为"+dadui+",答错题数为"+dacuo+",未答题题数为"+noanswer+",答题使用时间:"+allduration/1000+"秒。"); frame.setVisible(false); new Middle(); } else { T2.setText(null); T3.setText(null); T4.setText(null); } } }); Toolkit kit = Toolkit.getDefaultToolkit(); Dimension screenSize = kit.getScreenSize(); int w1 = screenSize.width; int h = screenSize.height; int x1 = w1/3; int y1 = h/5; frame.setLocation(x1,y1); frame.setVisible(true); frame.setResizable(false); }
PSP:
PSP2.1 | Personal Software Process Stages | Time (%) Senior Student(/day) | Time (%)(/day) |
Planning | 计划 | 8 | 15 |
· Estimate | 估计这个任务需要多少时间 | 8 | 7 |
Development | 开发 | 6 | 7 |
· Analysis | 需求分析 (包括学习新技术) | 1 | 1 |
· Design Spec | 生成设计文档 | 1 | 1 |
· Design Review | 设计复审 | 0 | 0 |
· Coding Standard | 代码规范 | 1 | 1 |
· Design | 具体设计 | 5 | 4 |
· Coding | 具体编码 | 2 | 2 |
· Code Review | 代码复审 | 1 | 1 |
· Test | 测试(自我测试,修改代码,提交修改) | 3 | 3 |
Reporting | 报告 | 1 | 1 |
·Test Report | 测试报告 | 1 | 1 |
· Size Measurement | 计算工作量 | 2 | 2 |
·Postmortem & Process Improvement Plan | 并提出过程改进计划 | 0 | 0 |
小结感受:
- 结队编程真的能够带来1+1>2的效果,编写和实现这个程序过程很漫长,两个人的征讨也挺多的,一开始觉得两个人合作好像很麻烦,进度很很慢,可是到了过了几天,两个人的磨合期过后,真的带来了1+1>2的效果。
- 在结对编程一开始我是扮演领航员的角色的,在一边审查队友的代码和提供一些界面上的设计建议。
- 在编写代码里面我是负责中级难度的编写的,主要是模仿队友初级难度来编写的,因为基础相对比较差。在我自己编写代码的时候,队友会时常提醒我变量名称的命名,在Eclipse编写中,经常出现常规的错误,还有一些函数的使用,比如标签按钮设置位置大小背景灯。有点拖累了队友,有点不好意思哦。
- 首先一开始结对一起编程程序,对于我来说编程十分困难,基本功太差了,但是在中间要是有什么好的建议和想法,都有会利用给人提意见的方式:给人一个汉堡包,给队友一些意见,换个好的角度来给队友评价
- 最后总结一点,在这段漫长又痛苦的一周里,学到了很多,特别是两个人合作的重要性,还有对GUI的学习认识,虽然可能以后不从事编程方面,学到了这些也觉得很有意义。
合作照片: