https://git.coding.net/kjc976118457/work2.git
201421123017 康建灿 201421123016 郑怀勇
一、需求分析
- 记录用户的对错总数。
- 程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算。
- 有计时功能,能显示用户开始答题后的消耗时间。
- 具有GUI界面
二、功能设计
三、代码展示:
文件数据保存:
public class pro{ int t=0,f=0; void file(int d,int count) { File file = new File("D:/text.txt"); String line =null; try { BufferedReader br = new BufferedReader(new FileReader(file)); try { while((line = br.readLine()) != null){ String[] num = line.split("#"); t=Integer.parseInt(num[1]); f=Integer.parseInt(num[3]); }} catch (IOException ex) { } } catch (FileNotFoundException ex) { get(d,count); } get(d,count); } public void get(int d,int count) { FileOutputStream fop = null; File file; String content = " #"+(d+t)+"# ȷ#"+(count+f)+"#"; try { file = new File("D:/text.txt"); fop = new FileOutputStream(file); if (!file.exists()) { file.createNewFile(); } byte[] contentInBytes = content.getBytes(); fop.write(contentInBytes); fop.flush(); fop.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fop != null) { fop.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
GUI主界面:
public class start extends JFrame implements ActionListener{ private JLabel numText; private JLabel tagLabel,messageLabel; private JTextField numEdit; private JButton commitBtn; public start(){ this.setBounds(500, 200, 300, 300); this.setResizable(false); this.setTitle(" "); initView(); } private void initView(){ JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BorderLayout(5,5)); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(2,2)); numEdit = new JTextField(); commitBtn= new JButton("ȷ "); commitBtn.setFont(new java.awt.Font(" ", 100, 32)); commitBtn.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); commitBtn.addActionListener(this); panel.add(new JLabel(" ɼ Ŀ ")); panel.add(numEdit); numEdit.setFont(new java.awt.Font(" ", 100, 32)); numEdit.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); JPanel panel2 = new JPanel(); panel2.setLayout(new GridLayout(2,1)); tagLabel = new JLabel(); panel2.add(tagLabel); panel2.add(commitBtn) ; mainPanel.add("Center",panel); mainPanel.add("South",panel2); add(mainPanel); } @Override public void actionPerformed(ActionEvent arg0) { String num = numEdit.getText(); boolean pass = false; if(num==null||num.equals("")){ messageLabel.setText(" Ŀ "); return; } else pass=true; if(pass){ int m=Integer.parseInt(num); new test(m).show(); this.dispose(); }else{ messageLabel.setText(" "); } } }
计时器:
timer.start(); timeText.setText(" ʱ :"+timeText.getText()); //timeText.setText("time"); commitBtn = new JButton("ȷ "); commitBtn.addActionListener(this); commitBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { timer.stop(); for(int i=0;i<m;i++){ String answer = answerEdit[i].getText(); if(answer.equals(c[i])){ count++; } } int d=(int)m-count; pro r=new pro(); r.file(d,count); String time= timeText.getText(); double g=(double)count/m; new result(m,count,g,time).show(); } });
生成四则运算:
private void check(String answer) { } public static String Fenshu(int i,String b[],int a[][],String c[]){ int x=(int)(0+Math.random()*(9-0+1)); int y=(int)(0+Math.random()*(9-0+1)); while(x>=y||y==0||x==0) { x=(int)(0+Math.random()*(9-0+1)); y=(int)(0+Math.random()*(9-0+1)); } int k=(int)(0+Math.random()*(9-0+1)); int t=(int)(0+Math.random()*(9-0+1)); while(k>=t||t==0||k==0) { k=(int)(0+Math.random()*(9-0+1)); t=(int)(0+Math.random()*(9-0+1)); } int o=(int)(0+Math.random()*(3-0+1)); if(o==0) { b[i]="("+x+"/"+y+")+("+k+"/"+t+")="; a[i][0]=x*t+k*y; a[i][1]=y*t; int n=divisor(a[i][0],a[i][1]); c[i]=a[i][0]/n+"/"+a[i][1]/n; } if(o==1) { b[i]="("+x+"/"+y+")-("+k+"/"+t+")="; a[i][0]=x*t-k*y; a[i][1]=y*t; int n=divisor(a[i][0],a[i][1]); c[i]=a[i][0]/n+"/"+a[i][1]/n; } if(o==2) { b[i]="("+x+"/"+y+")*("+k+"/"+t+")="; a[i][0]=x*k; a[i][1]=y*t; int n=divisor(a[i][0],a[i][1]); c[i]=a[i][0]/n+"/"+a[i][1]/n; } if(o==3) { b[i]="("+x+"/"+y+") ("+k+"/"+t+")="; a[i][0]=x*t; a[i][1]=k*y; int n=divisor(a[i][0],a[i][1]); c[i]=a[i][0]/n+"/"+a[i][1]/n; } return b[i]+c[i]; }; public static String Zhengshu(int i,String b[],String c[]){ int x=(int)(0+Math.random()*(100-0+1)); int y=(int)(0+Math.random()*(100-0+1)); int z=(int)(0+Math.random()*(3-0+1)); if(z==0){ b[i]=x+"+"+y+"="; c[i]=x+y+""; } if(z==1){ b[i]=x+"-"+y+"="; c[i]=x-y+""; } if(z==2){ b[i]=x+"*"+y+"="; c[i]=x*y+""; } if(z==3){ b[i]=x+" "+y+"="; int n=divisor(x,y); c[i]=x/n+"/"+y/n; } return b[i]+c[i]; } public static int divisor(int i, int j) { int k=1,s; for(s=1;s<=i&&s<=j;s++){ if(i%s==0&&j%s==0) k=s; } return k; }
四、测试运行截图:
五、PSP
PSP2.1 | Personal Software Process Stages | Estimated time(h) | actual time(h) |
Planning | 计划 | 1 | 1.5 |
· Estimate | 估计这个任务需要多少时间 | 24 | 40 |
Development | 开发 | 24 | 34 |
· Analysis | 需求分析 (包括学习新技术) | 1 | 1.2 |
· Design Spec | 生成设计文档 | 7 | 10 |
· Design Review | 设计复审 | 0.5 | 0.5 |
· Coding Standard | 代码规范 | 0.5 | 0.8 |
· Design | 具体设计 | 1.5 | 1.5 |
· Coding | 具体编码 | 20 | 30 |
· Code Review | 代码复审 | 10 | 15 |
· Test | 测试(自我测试,修改代码,提交修改) | 1 | 3 |
Reporting | 报告 | 20 | 25 |
· | 测试报告 | 1 | 1.5 |
· | 计算工作量 | 0.5 | 1 |
· | 并提出过程改进计划 | 2 | 4 |
六、总结
经过将近一星期的对题目的理解与分析,虽然最终完成了任务,但在这过程中发现了许多问题。
首先,因为Java是在大二的时候学习的,经过一年的时间,加上平时编程量太少,对GUI界面的编程基本上忘光了,许多步骤了程序需要重新再学习。
其次,第一次作业的程序在这次发现有许多不完善的地方需要改进。花费了不少时间。
再次,关于两人的分工探讨,对题目的理解与解决方法有许多不同的见解需要达成一致。特别是文件存储和图形界面,更是花费了好一阵子。
最后,对两人在此次的完成作业的过程做出所谓“汉堡包”式的评价:
先说贬义的:很明显两个人都是懒人协会的,对作业只会一拖再拖,不到万不得已绝不动程序。
来在夸自己的:在时间紧迫的关键时候我们总能爆发出背水一战的勇气,完成任务的速度飞快。
最后在批判一下:或许程序员真的不适合我们,两个人的编程技术真的是烂到家里。
七,综上,附上合照一张