GitHub地址:https://github.com/zhouheqh
1、需求分析
(1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分;
(2)题库自动生成或手动输入;
(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;
(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:
(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;
(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。
(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。
2、软件设计
3、核心代码
绘制图表
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); } }
4、程序运
5、同学习过程:
6、展示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 |
7、对小伙伴的评价
首先,我要谢谢我的小伙伴,因为她带给我学习过程中科院相互讨论相互学习的感觉,使我们都能投入到学习当中去,用我们共同的力量去寻求更好的解决问题的方法。这是一个难能可贵的优点,值得我们好好学习。总之,通过结对学习,使我们之间受益匪浅。
8、 结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会。
通过这次编程,我觉得能够带来1+1>2的效果,之前一个人做的时候,遇到不懂得问题时,就会陷入迷茫。当两个人一起编程时,有不懂的还可以一起讨论,说出自己的意见,也为整个编程过程节约了时间,除此之外,两个人一起合作时就会产生更多更好的想法,可以更好的优化整个项目的设计,遇到问题时可以相互帮助解决问题,效率也比较高。两个人合作还可以发现多方身上的优点,找出自己身上的不足,并能相互监督让彼此变得更好,还可以彼此分享好的学习经验,所以我们认为两个人合作的效率远远大于一个人。