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


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

职务:驾驶员

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()伪随机函数,由于生成的时间很短,因此时间种子应该相差不大,造成的结果就是,生成的题目常常好几题数字范围相仿,这是我需要改进的地方。


五、双人合作花絮:

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

posted @ 2018-04-16 23:54  heshengyuan1311  阅读(191)  评论(0编辑  收藏  举报
levels of contents