计应193第一组小学生做题软件——任文凯

.计划

UML 图

 

Psp个人计划:

 

1.随机产生一组(10个)算数题,产生算式,除去不够减,循环产生。

2.在界面显示出题目,结果文本框,计时器,以及开始重置提交功能

3.显示对错,统计正确率,统计时间。

二.开发

1.需求分析

作为一名一年级小学生的家长,我希望制作一个出题软件,完成100以内的正整数的加减法题随机产生。以便减轻我的家庭负担。

2.生成设计文档

3.设计复审

4.代码规范

注意大小写,注意缩进,括号一定要配对,注意要分行。

5.具体设计

系统开始,随机产生10道加法或者减法,计算完成后,统计做了多少道题,正确率,以及用了多少时间,系统结束。

6.具体编码

package test;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.*;

import java.util.List;

//StudentTopic

//主窗口

public class StudentTopic extends JFrame{

    public static int firstnum,secondnum,sign;//第一个数,第二个数,sign:0-1:0="+";1="-"

    public static String c = null;//运算符,+  -   

    public static  JPanel Result;//计算面板

    public JPanel Buttonpanel;//按钮及结果面板

    public static JButton Resetbutton;//重置按钮

    public static JButton Printfbutton;//打印按钮

    public static JButton Startbutton;//开始按钮

    public static JLabel CountLable;//正确率在标签显示

    public static JLabel sumtimeLable;//显示时间

    public static List<Integer>/*Integer*/ Resultlist = new ArrayList<>();//文本框结果的集合

    public static List<JLabel> Topiclist = new ArrayList<>();//(标签)集合,题目在标签显示

    public static List<JTextField> Textlist = new ArrayList<>();//文本框集合

    public static List<Integer> Correctlist = new ArrayList<>();//正确答案集合

    public static int j=0;

    public static int k=0;

    public static int i=0;

    public static int num ;//设置用户答对的题数

    public static long sum1,sum2,sum3;//存放开始时间,结束时间;sum3=sum1-sum2

    public StudentTopic(){

        //初始化按钮

        Resetbutton = new JButton("重置");

        Printfbutton = new JButton("提交");

        Startbutton = new JButton("开始");

        //设置按钮大小

        Resetbutton.setSize(50,100);

        Printfbutton.setSize(50,100);

        Startbutton.setSize(50,100);

        sumtimeLable = new JLabel("                       ");

        sumtimeLable.setPreferredSize(new Dimension(100, 100));

        sumtimeLable.setFont(new Font("楷体",Font.BOLD, 15));

        sumtimeLable.setText("耗时:");

        //初始化计数面板

        Result = new JPanel();

        Result.setLayout(new GridLayout(25, 4));

        //初始化按钮面板

        Buttonpanel = new JPanel();

        Buttonpanel.setLayout(new FlowLayout());

        Buttonpanel.setSize(600,80);

Buttonpanel.setBorder(BorderFactory.createLineBorder(Color.GREEN));

        Buttonpanel.add(Startbutton);

        CountLable = new JLabel("      ");

        CountLable.setFont(new Font("楷体",Font.BOLD, 15));

        CountLable.setPreferredSize(new Dimension(100,20));

        CountLable.setText("正确率:");

        //将按钮添加至按钮及结果面板中

        Buttonpanel.add(Resetbutton);

        Buttonpanel.add(Printfbutton);

        Buttonpanel.add(CountLable);

        Buttonpanel.add(sumtimeLable);

        //为计数面板添加标签和文本框

        //设置窗体属性

        setLayout(new BorderLayout());

        setBounds(100,100,600,600);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container container = getContentPane();

        //将计数面板,按钮面板放置在容器中指定位置

        container.add(Result, BorderLayout.NORTH);

        container.add(Buttonpanel,BorderLayout.SOUTH);

    }

    //设置Result面板中的组件

    public static void Result(){

        for(i=0;i<10;i++){

            JLabel label = new JLabel();

            //在设置布局的条件下,调用setPreferredSize(new Dimension(80, 20))可以设置标签的大小

            //不能调用setsize()方法

            label.setPreferredSize(new Dimension(80, 20));

            label.setFont(new Font("楷体",Font.BOLD, 20));      label.setBorder(BorderFactory.createLineBorder(Color.GREEN));//设置标签的边框

            Topiclist.add(label);

         // Topiclist为题目(标签)集合,题目在标签中呈现

            JTextField textField = new JTextField(4);

            textField.enable(false);

          //Textlist为用户输入计算结果的文本框集合

            Textlist.add(textField);

        }

        for(i = 0;i<20;i++){

         //if-else语句来间隔输出标签和文本框

            if(i%2 == 0){//如果余数为0,则添加标签

                Result.add( Topiclist.get(j));

                j++;

            }else{//如果余数为1,则添加文本框

                Result.add(Textlist.get(k));

                k++;

            }

        }

      //调用创建随机题目的方法CreateRandom();

        CreateRandom();

      //调用按钮的动作监听方法myAddActionLIstener()

        myAddActionLIstener();

    }

    //随机创建算术题

    public static void CreateRandom(){

        Random random = new Random();

     // Topiclist为题目(标签)集合,题目在标签中呈现

        for(JLabel lable: Topiclist){

         firstnum = random.nextInt(101);

         secondnum = random.nextInt(101);

         sign = random.nextInt(2);

            String d = "=";

            switch (sign) {

                case 0:

                    c = "+";

                  //创建规定算数题范围函数,即和不大于100,差不小于0

                    RandomRange();

                 lable.setText(firstnum+c+secondnum+d);

                  //Correctlist为所有题目正确答案的集合

                   Correctlist.add(firstnum+secondnum);

                    break;

                default:

                    c = "-";

                  //创建规定算数题范围函数,即和不大于100,差不小于0

                    RandomRange();

                 lable.setText(firstnum+c+secondnum+d);

                  //Correctlist为所有题目正确答案的集合

                    Correctlist.add(firstnum-secondnum);

                    break;

            }

        }

    }

  //创建规定算数题范围函数,即和不大于100,差不小于0

    public static void RandomRange(){

        Random r = new Random();

        switch (c) {

            case "+":

                while(firstnum+secondnum>100){

                 firstnum = r.nextInt(101);

                 secondnum = r.nextInt(101);

                    if(firstnum + secondnum <= 100){

                    }

                }

                break;

            default:

                while(firstnum-secondnum<0){

                 firstnum = r.nextInt(101);

                 secondnum = r.nextInt(101);

                    if(firstnum - secondnum >= 0){

                        break;

                    }

                }

                break;

        }

    }

    //为按钮添加动作监听方法

    public static void myAddActionLIstener() {

        //为重置按钮添加动作监听

        Resetbutton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {

                for(JTextField cleartextField : Textlist){

                    cleartextField.setText("");

                }

                for(int i=0;i<Topiclist.size();i++) {

                 Topiclist.get(i).setText("");

Topiclist.get(i).setBorder(BorderFactory.createLineBorder(Color.GREEN));

                }

                Correctlist.removeAll(Correctlist);

                Resultlist.removeAll(Resultlist);

                CountLable.setText("正确率:");

                sum3=0;

                sum1=0;

                sum2=0;

                CreateRandom();

            }

        });

        //为提交按钮添加监听

        Printfbutton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {

                Integer i;

                Double result1;

                num = 0;

                //获取用户在文本框中输入的计算结果

              //Textlist为用户输入计算结果的文本框集合

                for(i = 0;i<Textlist.size();i++){

                 if("".equals(Textlist.get(i).getText())) {

                 Textlist.get(i).setText("-1");;

                 }

                 Resultlist.add(Integer.parseInt(Textlist.get(i).getText()));

                }

                //计算用户做对的题目个数

                //System.out.println(Correctlist.get(0)+"============"+Resultlist.get(0));

                for(i = 0;i<Resultlist.size();i++){

                 if(Correctlist.size()==0) {

                 break;

                 }

                    if(Resultlist.get(i)==Correctlist.get(i)){

                     num++;

                     //Correctlist为所有题目正确答案的集合

                    }else{

                     Topiclist.get(i).setBorder(BorderFactory.createLineBorder(Color.RED));

                     Topiclist.get(i).setText( Topiclist.get(i).getText()+"              错误    "

                    + "    正确答案:"+Correctlist.get(i)  );

                    }

                

                }

                //计算用户做题的正确率

                result1 = ((num*1.0)/( Topiclist.size())*100);

                CountLable.setText("正确率:");

                CountLable.setText(CountLable.getText()+result1 + "%");

                sumtimeLable.setText("耗时:");

                sum2=System.currentTimeMillis();

               sum3 =(sum2-sum1)/1000;

               if(sum1==0 && Integer.parseInt(Textlist.get(1).getText())==-1) {

                sumtimeLable.setText(sumtimeLable.getText()+""+0+"s");

               }else {           sumtimeLable.setText(sumtimeLable.getText()+""+sum3+"s");

               }

               Correctlist.removeAll(Correctlist);

               Resultlist.removeAll(Resultlist);

            }

        });

        Startbutton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {

                for(int i = 0;i<Textlist.size();i++) {

                 Textlist.get(i).setText("");

                 Textlist.get(i).enable(true);

Topiclist.get(i).setBorder(BorderFactory.createLineBorder(Color.GREEN));

                }

                Resultlist.removeAll(Resultlist);

                Correctlist.removeAll(Correctlist);

               CreateRandom();

               sum1= System.currentTimeMillis();

            }

        });

        }

    public static void main(String[] args) {

     for(int i1 = 0;i1<Textlist.size();i1++) {

         Textlist.get(i1).enable(false);

        }

        new StudentTopic().setVisible(true);

        Result();

    }

}

 运行结果

 

7.代码复审

8.测试

总结:看似简单实际上要考虑很多问题,界面的设计及其功能的实现,重置按钮如何重置等问题,虽然过程有点难,但是理清思路就好写很多,先写界面再写功能实现

原文地址:https://www.cnblogs.com/bladepoint/p/14829176.html