Github地址:https://github.com/wulezha/JDXM/blob/master/jdxm
1、需求分析
(1)该项目要求程序有人机交互界面,由计算机从题库文件中随机选择若干道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,且可评判成绩;
(2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成;
(3)可为用户提供百以内整数算式、带括号算式、真分数算式三种练习;
(4)可为进行多轮测试并记录成绩生成柱状图并且记录用户消耗的时间。
2、功能分析
3、设计实现
4、运行测试
- 登录页面
- 登陆成功后,跳转主页面,选择题目。
-
选择试题类型后,进行答题,并可查看错误答案
- 答题结束后,提交并获取分数,绘柱形图
5核心代码
import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.util.Random; import javax.swing.JFrame; public class ChartPrint extends JFrame{ //绘制柱形统计图 private Random ran; public ChartPrint(){ super(); ran = new Random(); setTitle("绘制得分柱形图"); setBounds(100, 100, 400, 271); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } @Override public void paint(Graphics g){ int Width = getWidth(); int Height = getHeight(); int leftMargin = 20;//柱形图左边界 int topMargin = 50;//柱形图上边界 Graphics2D g2 = (Graphics2D) g; int ruler = Height-topMargin-5; int rulerStep = ruler/10;//将当前的高度评分为10个单位 g2.setColor(Color.WHITE);//绘制白色背景 g2.fillRect(0, 0, Width, Height);//绘制矩形图 g2.setColor(Color.LIGHT_GRAY); for(int i=0;i<=10;i++){//绘制灰色横线和百分比 g2.drawString((100-10*i)+"%", 5, topMargin+rulerStep*i);//写下百分比 g2.drawLine(5, topMargin+rulerStep*i, Width, topMargin+rulerStep*i);//绘制灰色横线 } g2.setColor(Color.cyan); for(int i=0;i<4;i++){//绘制柱形图 int value = ran.nextInt(Height-topMargin-10)+10;//随机产生柱形的百分比 int step = (i+1)*40;//设置每隔柱形图的水平间隔为40 //绘制矩形 // g2.drawRoundRect(leftMargin+step*2, Height-value, 40, value, 40, 10); g2.fillRoundRect(leftMargin+step*2, Height-value, 40, value, 40, 10); //列出产品的编号 g2.drawString("练习次数"+(i+1), leftMargin+step*2, Height-value-5); } } public static void main(String[] args) { ChartPrint demo = new ChartPrint(); demo.setVisible(true); } } 柱形图 import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class Login { private JFrame frame = new JFrame("四则运算"); private Container c = frame.getContentPane(); private JTextField username = new JTextField(); private JPasswordField password = new JPasswordField(); private JButton ok = new JButton("确定"); private JButton cancel = new JButton("取消"); public Login(){ frame.setSize(300,200); c.setLayout(new BorderLayout()); initFrame(); frame.setVisible(true); } private void initFrame() { //顶部 ok.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { new chuti(); } }); JPanel titlePanel = new JPanel(); titlePanel.setLayout(new FlowLayout()); titlePanel.add(new JLabel("学生登录")); c.add(titlePanel,"North"); //中部表单 JPanel fieldPanel = new JPanel(); fieldPanel.setLayout(null); JLabel l1 = new JLabel("学 号:"); l1.setBounds(50, 20, 50, 20); JLabel l2 = new JLabel("密 码:"); l2.setBounds(50, 60, 50, 20); fieldPanel.add(l1); fieldPanel.add(l2); username.setBounds(110,20,120,20); password.setBounds(110,60,120,20); fieldPanel.add(username); fieldPanel.add(password); c.add(fieldPanel,"Center"); //底部按钮 JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new FlowLayout()); buttonPanel.add(ok); buttonPanel.add(cancel); c.add(buttonPanel,"South"); } public static void main(String[] args){ new Login(); } } 登录界面 import java.util.Random; public class chuti { int a,b,c,d; int an[]=new int [5]; String bn[]=new String [5]; Random cn =new Random(); chuti(){ int i=0; do{ a=cn.nextInt(100); b=cn.nextInt(100); d=cn.nextInt(100)%4+1; switch(d){ case 1: an[i]=a+b; bn[i]=String.valueOf(a)+"+"+String.valueOf(b)+"="; i++; break; case 2: an[i]=a-b; bn[i]=String.valueOf(a)+"-"+String.valueOf(b)+"="; i++;break; case 3:an[i]=a*b; bn[i]=String.valueOf(a)+"*"+String.valueOf(b)+"="; i++; break; case 4:an[i]=a/b; bn[i]=String.valueOf(a)+"/"+String.valueOf(b)+"="; i++;break; } }while(i<5); for(int j=0;j<bn.length;j++) {System.out.println(bn[j]);System.out.println(an[j]); } new yunsuan(an,bn); } } 出题 import java.awt.BorderLayout; import java.awt.Container; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JPasswordField; import javax.swing.JTextField; public class yunsuan extends JFrame{ JLabel l1 = new JLabel("答对题数:"); private JFrame frame = new JFrame("四则运算"); private Container c = frame.getContentPane(); private JButton KO = new JButton("确定"); private JTextField A = new JTextField(6); private JTextField AA = new JTextField(4); private JTextField AAA = new JTextField(4); private JTextField B = new JTextField(6); private JTextField BB = new JTextField(4); private JTextField BBB = new JTextField(4); private JTextField C = new JTextField(6); private JTextField CC = new JTextField(4); private JTextField CCC = new JTextField(4); private JTextField D = new JTextField(6); private JTextField DD = new JTextField(4); private JTextField DDD = new JTextField(4); private JTextField E = new JTextField(6); private JTextField EE = new JTextField(4); private JTextField EEE = new JTextField(4); private JPasswordField password = new JPasswordField(); private JButton ok = new JButton("确定"); private JTextField QQ = new JTextField(6); int num=0; int an[]=new int [5]; String bn[]=new String [5]; String cn[]=new String [5]; yunsuan(int a[],String b[]) { an=a; bn=b; JPanel fieldPanel = new JPanel(); fieldPanel.add(A);A.setBounds(30, 10, 100, 20); A.setVisible(true); fieldPanel.add(AA);AA.setBounds(40, 10, 100, 20); fieldPanel.add(AAA);AAA.setBounds(50, 10, 100, 20); fieldPanel.add(B);B.setBounds(30, 15, 50, 20); fieldPanel.add(BB);BB.setBounds(40, 15, 100, 20); fieldPanel.add(BBB);BBB.setBounds(50, 10, 100, 20); fieldPanel.add(C);C.setBounds(30, 20, 50, 20); fieldPanel.add(CC);CC.setBounds(40, 20, 100, 20); fieldPanel.add(CCC);CCC.setBounds(50, 10, 100, 20); fieldPanel.add(D);D.setBounds(30, 25, 50, 20); fieldPanel.add(DD);DD.setBounds(40, 25, 100, 20); fieldPanel.add(DDD);DDD.setBounds(50, 10, 100, 20); fieldPanel.add(E);E.setBounds(30, 30, 50, 20); fieldPanel.add(EE);EE.setBounds(40, 30, 100, 20); fieldPanel.add(EEE);EEE.setBounds(50, 10, 100, 20); fieldPanel.add(KO);KO.setBounds(30, 50, 20, 20); fieldPanel.add(l1);l1.setBounds(20, 60, 100, 20); fieldPanel.add(QQ);QQ.setBounds(40, 70, 100, 20); KO.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { cn[0]=AA.getText(); cn[1]=BB.getText(); cn[2]=CC.getText(); cn[3]=DD.getText(); cn[4]=EE.getText(); AAA.setText(String.valueOf(an[0])); BBB.setText(String.valueOf(an[1])); CCC.setText(String.valueOf(an[2])); DDD.setText(String.valueOf(an[3])); EEE.setText(String.valueOf(an[4])); for(int i=0;i<an.length;i++) if(String.valueOf(an[i]).equals(cn[i]))num++; QQ.setText(String.valueOf(num)); } }); fieldPanel.setVerifyInputWhenFocusTarget(true); A.setText(bn[0]); B.setText(bn[1]); C.setText(bn[2]); D.setText(bn[3]); E.setText(bn[4]); this.add(fieldPanel); this.setBounds(400, 400, 250, 270); this.setVisible(true); } } 文本框
6结对编程过程
我们首先根据项目要求进行分析,确定了三个主要的部分:绑定事件、计时器、画流程图。经过详细的探讨和分析,我们设计了软件的整体框架,然后进行分工完成项目。
7、展示PSP
PSP2.1 |
任务内容 |
计划完成需要的时间(min) |
实际完成需要的时间(min) |
Planning |
计划 |
30 |
30 |
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
50 |
50 |
Development |
开发 |
300 |
360 |
Analysis |
需求分析 (包括学习新技术) |
30 |
30 |
Design Spec |
生成设计文档 |
40 |
60 |
Design Review |
设计复审 (和同事审核设计文档) |
20 |
10 |
Coding Standard |
代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
Design |
具体设计 |
60 |
40 |
Coding |
具体编码 |
180 |
150 |
Code Review |
代码复审 |
10 |
20 |
est |
测试(自我测试,修改代码,提交修改) |
40 |
60 |
Reporting |
报告 |
30 |
45 |
Test Report |
测试报告 |
25 |
30 |
Size Measurement |
计算工作量 |
10 |
6 |
Postmortem & Process Improvement Plan |
事后总结 ,并提出过程改进计划 |
10 |
20 |
8、对小伙伴的评价
首先,我要谢谢我的小伙伴,我觉得她是一个能静下心来的姑娘,欣赏她的能在一堆代码中认真调试的心境,这一点非常值得我学习。其次,我认为我们的编码习惯真的是有待改进。在整个项目的实现过程中,她都表现的都很积极,共同设计、写代码、查找资料以及最后的界面和代码优化她都很积极很认真,比起她感觉自己总是对自己要求不够高,做的差不多感觉就做好了,没有做的更好的想法,这让我很惭愧,在与她合作的过程中我也发现了我自己的很多不足之处,以后我也会尽最大的努力把事情做到最好。总之,这是一个很愉快的合作。
9、 结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。
通过这次编程,我觉得能够带来1+1>2的效果,之前一个人做的时候,遇到不懂得问题时,就会陷入迷茫。当两个人一起编程时,有不懂的还可以一起讨论,说出自己的意见,也为整个编程过程节约了时间,除此之外,两个人一起合作时就会产生更多更好的想法,可以更好的优化整个项目的设计,遇到问题时可以相互帮助解决问题,效率也比较高。两个人合作还可以发现多方身上的优点,找出自己身上的不足,并能相互监督让彼此变得更好,还可以彼此分享好的学习经验,所以我们认为两个人合作的效率远远大于一个人。