第二次结对作业(四则运算自动生成程序)
职务:驾驶员
一、需求分析
软件工程结对第二次作业,题目要求如下:
- 能够自动生成四则运算练习题
- 可以定制题目数量
- 用户可以选择运算符
- 用户设置最大数(如十以内、百以内等)
- 用户选择是否有括号
- 用户选择输出方式(如输出到文件等)
-
最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
一、开发环境:
系统 | 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()伪随机函数,由于生成的时间很短,因此时间种子应该相差不大,造成的结果就是,生成的题目常常好几题数字范围相仿,这是我需要改进的地方。
五、双人合作花絮:
认真的编程与认真的审查: