第二次结对编程作业(四则运算生成程序)

时间:2023-02-22 08:31:30

第二次结对作业(四则运算自动生成程序)

职务:驾驶员

coding地址


一、需求分析

软件工程结对第二次作业,题目要求如下:

  •    能够自动生成四则运算练习题
  •    可以定制题目数量
  •    用户可以选择运算符
  •   用户设置最大数(如十以内、百以内等)
  •   用户选择是否有括号
  •   用户选择输出方式(如输出到文件等)
  •   最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)

    一、开发环境:

系统   Windows 10  
   编辑器       eclipse    
    语言       JAVA      
    版本      1.8.0_45     

二、功能分析:

  本次作业是一个用于小学生四则运算的程序,要求可以选择题目所需运算符(将需要符号存于数组,利用随机函数 random()随机生成数字,选定符号),设置最大数,有无括号等可通过界面上的TextField进行参数交互即可。

(1)、算式生成函数

主要的思想是利用random取余目的数字来生成目的范围内的随机数。

代码如下:

private String get_question() {
        int bracket_n = 0;
        String ques = "";
        int i;
        if( Question_bracket == 1){
            i = 4;
            bracket_n = 2 + (int)(Math.random() * 2); //随机括号位置
        }
        else
            i = 2;
        int factor;
        String oper = "";
        factor = 1 + (int) (Math.random() * Number_MAX); // 产生大于1小于Number_MAX的随机数
        ques = ques + factor;
        if(Question_point == 1){
            factor = (int) (Math.random() * 100); // 产生两位小数部分
            ques = ques + '.' + factor;
        }
        while(i!=0){
            i--;
            oper = operator.get((int) (Math.random() * oper_NUM));// 产生随机符号
            ques = ques + oper;
            if(Question_bracket == 1 && bracket_n + i == 5)
                ques = ques +'(';
            factor = 1 + (int) (Math.random() * Number_MAX); // 产生大于1小于Number_MAX的随机数
            ques = ques + factor;
            if(Question_point == 1){
                factor = 1 + (int) (Math.random() * Number_MAX); // 产生两位小数部分
                ques = ques + '.' + factor;
            }
            if(Question_bracket == 1 && bracket_n + i == 3)
                ques = ques +')';
        }
        return ques + '=' + "\r\n" ;
        
    }

    public void get_questions() {
        int i;
        
        for (i = 0; i < Question_MAX; i++) {
            questions.add(get_question());
        }
    }

(2)、防止重复题目的处理

由于random是由当前时间作为种子生成的伪随机数,生成题目的速度非常快,所用时间很短,因此利用HashSet存储题库,避免打印相同题目

private Set<String> questions = new HashSet<String>();

(3)、界面设计

emmm..不得不说设计界面我真的没有天赋。随便设计了一个不堪入目的界面暂时充当程序的门面吧。

代码如下:

public class GUI {
    public static void main(String[] args) throws IOException {
        calcu ques = new calcu();
        ques.init();
        
        JFrame f = new JFrame("迷你随机数自动生成程序");
        try {  
            //设置样式 
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            
        } catch (Throwable e) {  
          
            e.printStackTrace();  
          
        }  
        f.setSize(40, 40);
        f.setLocation(50, 250);
        f.setLayout(null);
        
        JLabel Label1 = new JLabel("选择功能:");
        Label1.setBounds(15,10,80,25);
        
        
        JCheckBox bCheckBox = new JCheckBox("加法");
        bCheckBox.setSelected(true);
        bCheckBox.setBounds(80, 30, 50, 30);
        JCheckBox bCheckBox2 = new JCheckBox("减法");
        bCheckBox2.setBounds(180, 30, 50, 30);
        JCheckBox bCheckBox3 = new JCheckBox("乘法");
        bCheckBox3.setBounds(80, 60, 50, 30);
        JCheckBox bCheckBox4 = new JCheckBox("除法");
        bCheckBox4.setBounds(180, 60, 50, 30);
        JCheckBox bCheckBox5 = new JCheckBox("括号");
        bCheckBox5.setBounds(80, 90, 50, 30);
        JCheckBox bCheckBox6 = new JCheckBox("小数");
        bCheckBox6.setBounds(180, 90, 50, 30);
        JLabel Label2 = new JLabel("输入上界:");
        Label2.setBounds(17,130,80,25);
        JTextField jtf1 = new JTextField("");
        jtf1.setBounds(80, 130, 155, 30);
        JLabel Label3 = new JLabel("样例个数:");
        Label3.setBounds(17,170,80,25);
        JTextField jtf2 = new JTextField("");
        jtf2.setBounds(80, 170, 155, 30);
        
        f.add(jtf1);
        f.add(jtf2);
        f.add(Label1);
        f.add(Label2);
        f.add(Label3);
        f.add(bCheckBox);
        f.add(bCheckBox2);
        f.add(bCheckBox3);
        f.add(bCheckBox4);
        f.add(bCheckBox5);
        f.add(bCheckBox6);
        
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setVisible(true);

        JButton b = new JButton("生成");
        b.setBounds(100, 220, 65, 30);
        b.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                
                if(bCheckBox.isSelected())      // 判断 是否 被 选中
                    ques.Question_plus = 1;
                else
                    ques.Question_plus = 0;
                if(bCheckBox2.isSelected()) 
                    ques.Question_minus = 1;
                else
                    ques.Question_minus = 0;
                if(bCheckBox3.isSelected()) 
                    ques.Question_multiply = 1;
                else
                    ques.Question_multiply = 0;
                if(bCheckBox4.isSelected()) 
                    ques.Question_divid = 1;
                else
                    ques.Question_divid = 0;
                if(bCheckBox5.isSelected()) 
                    ques.Question_bracket = 1;
                else
                    ques.Question_bracket = 0;
                if(bCheckBox6.isSelected()) 
                    ques.Question_point = 1;
                else
                    ques.Question_point = 0;
                ques.Question_MAX= Integer.valueOf(jtf2.getText());
                ques.Number_MAX= Integer.valueOf(jtf1.getText());
                ques.Questions_choose2();
                ques.get_questions();
                
                try {
                    ques.showQuestions();
                } catch (IOException e1) {
                    JOptionPane.showMessageDialog(null,"生成失败!");
                    e1.printStackTrace();
                }
                 JOptionPane.showMessageDialog(null,"生成成功!");
            }
        });
        f.add(b);
        f.setSize(300, 250);
        f.setLocationRelativeTo(null);
        f.setLayout(null);
        f.setVisible(true);
    }
}

三、结果图片:

界面:

第二次结对编程作业(四则运算生成程序)

题目生成:

第二次结对编程作业(四则运算生成程序)

输入至文件的结果:

第二次结对编程作业(四则运算生成程序)


四、总结

  本次是与王之光同学的第二次合作,是真正意义上的结对编程,课上的时候,老师说结对编程将代码复查发挥到了极致,在本次的合作中,我们也有所体会,作为领航员的王同学在本次合作中替我复审出不少的错误,为我后来复审代码带来了极大的便利,与王同学的合作经历是一次愉快的体验,作为驾驶员的我在领航员的辅助下成功完成全部代码工作,程序基本实现全部要求功能。

  下面聊聊程序本身,本次程序的使用对象是小学生,在制作程序的过程中,我大量使用了random()伪随机函数,由于生成的时间很短,因此时间种子应该相差不大,造成的结果就是,生成的题目常常好几题数字范围相仿,这是我需要改进的地方。


五、双人合作花絮:

认真的编程与认真的审查:

第二次结对编程作业(四则运算生成程序)