一、计划

    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
posted on 2021-05-31 10:34  第三学习小组  阅读(108)  评论(0编辑  收藏  举报