一、计划
1.随机生成10道100以内的小学生加减乘除算式,要求不出现负数
2.当提交页面后,判断结果是否正确,并且,计算出正确率和所用时间
二、需求分析
作为一名一年级小学生的家长,我希望制作一个出题软件,完成100以内的正整数的加减法题随机产生。以便减轻我的家庭负担
三、具体设计
系统开始,随机产生10道加法或者减法,计算完成后,统计做了多少道题,正确率
四、具体编码
package jisuan; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Mytest { private JFrame mainWindow = new JFrame("四则运算练习软件"); //面板 private JPanel selectPanel = new JPanel(); private JPanel mainPanel = new JPanel(); private JPanel commandP = new JPanel(); private JButton JBRedo = new JButton("重做"); private JButton JBStart = new JButton("开始做题"); private JLabel JLBAnsTip = new JLabel("输入答案"); //显示题目的JLabel private JLabel[] JLBQuestions= new JLabel[10]; //显示正确答案的JLabel private JLabel[] JLBAnswers = new JLabel[10]; //显示用户答案是否正确的JLabel private JLabel[] JLBIsTrue = new JLabel[10]; private JTextField[] JTFUsersAnswer = new JTextField[10];//用户答案 private Font buttonFont = new Font("微软雅黑",Font.PLAIN,16); private Font JLBFont = new Font("微软雅黑",Font.BOLD,18); private Font JTFFont = new Font("微软雅黑",Font.PLAIN,18); private Font JLBAnsFont = new Font("微软雅黑",Font.PLAIN,16); private Yunsuan[] questions = new Yunsuan[10]; //用户答案数组 private int[] userAnswer = new int[10]; private int scores =1; private JLabel JLBScores = new JLabel("你的成绩为:"); private int usedTime; boolean runFlag = false; private JPanel PTime = new JPanel(); private JLabel JLBRemainTime = new JLabel("剩余时间:"); private JTextField JTFWtime = new JTextField("300"); private JLabel JLBTime = new JLabel("用时:"); //倒计时 class LimitTime extends Thread{ public void run() { runFlag = true; int i = 300; usedTime = 0; while(runFlag && i >= 0) { JTFWtime.setText(""+i); try { sleep(1000); usedTime++; } catch (InterruptedException e) { JFrame jf = new JFrame(); JOptionPane.showMessageDialog(jf,"出现了未知问题,请重启程序"); } i--; } //没答案为0 for(int j = 0;j < 10;j++) { if(JTFUsersAnswer[j].getText().equals("")) { JTFUsersAnswer[j].setText("0"); } } printAnswer();//倒计时结束,则调用printAnswer()方法 JBStart.setText("开始做题"); JLBTime.setText("用时:"+usedTime); } } public Mytest(){ //布局主面板 mainPanel.setPreferredSize(new Dimension(700,400)); GridBagLayout gridbag = new GridBagLayout(); GridBagConstraints GBC = new GridBagConstraints(); GBC.weightx = 1; GBC.weighty = 1; GBC.gridx = 1; GBC.gridy = 0; GBC.anchor = GridBagConstraints.WEST; gridbag.setConstraints(JLBAnsTip, GBC); JLBAnsTip.setFont(JLBFont); mainPanel.add(JLBAnsTip); GBC.gridx = 4; GBC.gridwidth = 2; GBC.anchor = GridBagConstraints.CENTER; gridbag.setConstraints(JLBScores, GBC); JLBScores.setFont(JLBFont); mainPanel.add(JLBScores); for(int i = 0;i < 5;i++) { JLBQuestions[i] = new JLabel("请点击开始做题"); JLBQuestions[i].setFont(JLBFont); JTFUsersAnswer[i] = new JTextField(5); JTFUsersAnswer[i].setFont(JTFFont); JLBAnswers[i] = new JLabel(""); JLBAnswers[i].setFont(JLBAnsFont); JLBIsTrue[i] = new JLabel(""); JLBIsTrue[i].setFont(JLBAnsFont); GBC.gridwidth = 1; GBC.gridx = 0; GBC.gridy = 2*i+1; GBC.anchor = GridBagConstraints.EAST; gridbag.setConstraints(JLBQuestions[i], GBC); mainPanel.add(JLBQuestions[i]); GBC.anchor = GridBagConstraints.CENTER; GBC.gridy = 2*i+2; GBC.gridwidth = 2; gridbag.setConstraints(JLBAnswers[i], GBC); mainPanel.add(JLBAnswers[i]); GBC.gridwidth = 1; GBC.gridx = 1; GBC.gridy = 2*i+1; GBC.anchor = GridBagConstraints.WEST; gridbag.setConstraints(JTFUsersAnswer[i],GBC); mainPanel.add(JTFUsersAnswer[i]); GBC.gridx = 2; GBC.gridy = 2*i+2; gridbag.setConstraints(JLBIsTrue[i], GBC); mainPanel.add(JLBIsTrue[i]); } for(int i = 5;i < 10;i++) { JLBQuestions[i] = new JLabel("请点击开始做题"); JLBQuestions[i].setFont(JLBFont); JTFUsersAnswer[i] = new JTextField(5); //获取内容 JTFUsersAnswer[i].setFont(JTFFont); JLBAnswers[i] = new JLabel(""); JLBAnswers[i].setFont(JLBAnsFont); JLBIsTrue[i] = new JLabel(""); JLBIsTrue[i].setFont(JLBAnsFont); GBC.gridx = 4; GBC.gridy = 2*i-9; GBC.anchor = GridBagConstraints.EAST; gridbag.setConstraints(JLBQuestions[i], GBC); mainPanel.add(JLBQuestions[i]); GBC.anchor = GridBagConstraints.CENTER; GBC.gridy = 2*i-8; GBC.gridwidth = 2; gridbag.setConstraints(JLBAnswers[i], GBC); mainPanel.add(JLBAnswers[i]); GBC.gridwidth = 1; GBC.gridx = 5; GBC.gridy = 2*i-9; GBC.anchor = GridBagConstraints.WEST; gridbag.setConstraints(JTFUsersAnswer[i],GBC); mainPanel.add(JTFUsersAnswer[i]); GBC.gridx = 6; GBC.gridy = 2*i-8; gridbag.setConstraints(JLBIsTrue[i], GBC); mainPanel.add(JLBIsTrue[i]); } mainPanel.setLayout(gridbag); //布局命令面板 commandP.setLayout(new FlowLayout(FlowLayout.CENTER,60,20)); JLBRemainTime.setFont(JLBFont); JLBTime.setFont(JLBFont); JTFWtime.setFont(JTFFont); PTime.setLayout(new FlowLayout(FlowLayout.LEFT,10,20)); PTime.add(JLBRemainTime); PTime.add(JTFWtime); PTime.add(JLBTime); commandP.add(PTime); JBStart.setFont(buttonFont); commandP.add(JBStart); JBRedo.setFont(buttonFont); commandP.add(JBRedo); JBStart.addActionListener( new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(JBStart.getText().equals("开始做题")) { start(); //如果按钮上面的文字是"开始做题",则调用start()方法出题 JBStart.setText("提交答案"); //倒计时线程开始 LimitTime t = new LimitTime(); t.start(); } else { for(int i = 0;i < 10;i++) { if(JTFUsersAnswer[i].getText().equals("")) { JTFUsersAnswer[i].setText("0"); } } runFlag = false;//将runFlag设置为false(线程就会不再执行while循环里的内容) JLBTime.setText("用时:"+usedTime); JBStart.setText("开始做题"); } } } ); //监听重做按钮 JBRedo.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ if(JBStart.getText().equals("开始做题")) { for(int i = 0;i < 10;i++) { JTFUsersAnswer[i].setText(""); JLBAnswers[i].setText(""); JLBIsTrue[i].setText(""); JLBScores.setText(""); } JLBTime.setText("用时:"); LimitTime t = new LimitTime(); t.start(); JBStart.setText("提交答案"); } else//答案未提交 不能重做 { JFrame notSubmit = new JFrame(); JOptionPane.showMessageDialog(notSubmit,"提交后才可以重做!提交前可以直接更改答案!"); } } }); //在主窗体添加几个窗体并设置几个窗体在主窗体的位置 mainWindow.add(selectPanel,BorderLayout.NORTH); mainWindow.add(mainPanel,BorderLayout.CENTER); mainWindow.add(commandP, BorderLayout.SOUTH); mainWindow.pack();//调整此窗口的大小,以适合其子组件的首选大小和布局。 mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainWindow.setSize(800,500);//设置窗体大小 mainWindow.setLocationRelativeTo(null);//将窗口置于屏幕中间 mainWindow.setVisible(true);//设置为可见 要放在最后 放在前面则只能看见用户名和选择面板 主面板等需要拖动窗口大小才能看见 } public void start(){ //清除TextField和答案标签的内容 for(int i = 0;i < 10;i++) { JTFUsersAnswer[i].setText(""); JLBAnswers[i].setText(""); JLBIsTrue[i].setText(""); JLBScores.setText(""); JLBTime.setText("用时:"); } for(int i = 0;i < 10;i++) { int tempCh = (int)(Math.random()*2+1); switch(tempCh) { case 1: questions[i] = new Jiafa(); JLBQuestions[i].setText(questions[i].printQuestion()); break; case 2: questions[i] = new Jianfa(); JLBQuestions[i].setText(questions[i].printQuestion()); break; default: JFrame jf = new JFrame(); JOptionPane.showMessageDialog(jf,"出现未知错误,请重启程序。"); } } } //在面板上显示每题的正确答案、得分和用时,并且将每次做题的记录写入文件 public void printAnswer() { //成绩初始值为100 scores = 100; //对于每道题 for(int i = 0; i < 10;i++) { //给用户的答案这一数组赋值(getText的结果为String) userAnswer[i] = Integer.valueOf(JTFUsersAnswer[i].getText()); questions[i].setUsersAnswer(userAnswer[i]); //使正确答案显示在面板上 JLBAnswers[i].setText(questions[i].ptintQA()); //在面板上显示答案是否正确 JLBIsTrue[i].setText(questions[i].isCorrect()); //如果错误则将答案和是否正确两个标签的字体颜色设置为红色 if(JLBIsTrue[i].getText().equals("回答错误")) { JLBAnswers[i].setForeground(Color.BLUE); JLBIsTrue[i].setForeground(Color.BLUE); scores-=10; } //正确为黑色 else { JLBAnswers[i].setForeground(Color.BLACK); JLBIsTrue[i].setForeground(Color.BLACK); } } //显示成绩 JLBScores.setText("你的成绩为:"+ scores); } }
psp阶段:
PSP阶段 | 实际花费时间百分比 | 估计花费时间百分比 |
计划 | 8 | 6 |
明确需求和其他相关因素,估计每个阶段的时间成本 | 8 | 6 |
开发 | 84 | 86 |
需求分析 | 7 | 8 |
生成设计文档 | 4 | 8 |
设计复审(和同事审核设计文档) | 4 | 4 |
代码规范(为目前的开发制定合适的规范) | 2 | 3 |
具体设计 | 11 | 13 |
具体代码 | 31 | 30 |
代码复审 | 13 | 10 |
测试(自测,修改代码,提交修改) | 12 | 10 |
报告 | 8 | 8 |
测试报告 | 3 | 3 |
计算工作量 | 2 | 2 |
事后总结,并提出过程改进计划 | 3 | 3 |