一、设计思想:
1.通过Java可视化界面实现对是否有乘除法、是否有负数、是否支持分数以及取值范围等条件的选择。
2.将选择后的真值调用到生成题目的函数中。
3.生成题目的函数中,每个限制条件的子函数通过if语句判断真值,确定是否进入此子函数。
4.子函数的实现:
取值范围:分别为生成随机数的上限和下限。
是否有负数:通过生成随机数的奇偶性来判断是否为负数。
是否有乘除法:若有,则生成随机数对4取余。否则,对2取余。
(注:取余后的值为1、2、3、4分别代表加减乘除)
是否有分数:对分子分母分别去随机值。
(注:若令分数的值在取值范围内,则分子或分母的值可能过大,极难计算。所以,此处将分子和分母的值控制在取值范围内)
注:打印方式没有函数实现。
5.打印题目。
二、源代码
1 package 四则运算; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.GridLayout; 6 import java.awt.Container; 7 import java.awt.event.ActionEvent; 8 import java.awt.event.ActionListener; 9 10 import javax.swing.ButtonGroup; 11 import javax.swing.JComboBox; 12 import javax.swing.JLabel; 13 import javax.swing.JButton; 14 import javax.swing.ImageIcon; 15 import javax.swing.JOptionPane; 16 import javax.swing.JPanel; 17 import javax.swing.JFrame; 18 import javax.swing.JRadioButton; 19 import javax.swing.JScrollPane; 20 import javax.swing.JTextArea; 21 import javax.swing.JTextField; 22 23 public class Main extends JFrame{ 24 public Main(){ 25 super("四则运算题目生成器"); 26 setResizable(false); 27 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 28 setBounds(100,100,500,400); 29 setVisible(true); 30 setLayout(null); 31 DrawMenu(); 32 Update(); 33 } 34 // 申请控件变量 35 JLabel cc_Label = new JLabel("是否有乘除法:"); 36 ButtonGroup bg1 = new ButtonGroup(); 37 JRadioButton cc_RB_Yes = new JRadioButton("有"); 38 JRadioButton cc_RB_No = new JRadioButton("无"); 39 40 JLabel fu_Label = new JLabel("是否有负数:"); 41 ButtonGroup bg2 = new ButtonGroup(); 42 JRadioButton fu_RB_Yes = new JRadioButton("有"); 43 JRadioButton fu_RB_No = new JRadioButton("无"); 44 45 JLabel fen_Label = new JLabel("是否有分数:"); 46 ButtonGroup bg3 = new ButtonGroup(); 47 JRadioButton fen_RB_Yes = new JRadioButton("有"); 48 JRadioButton fen_RB_No = new JRadioButton("无"); 49 50 JLabel sz_Label = new JLabel("数值范围:"); 51 JTextField tf1 = new JTextField("0"); 52 JLabel xx = new JLabel("~"); 53 JTextField tf2 = new JTextField("100"); 54 55 JLabel num_JLabel = new JLabel("打印数量:"); 56 JTextField num_tf = new JTextField("10"); 57 JLabel plan_JLabel = new JLabel("打印方式"); 58 public String[] plan_choice = {"1","2","3"}; 59 JComboBox plan_cb = new JComboBox(plan_choice); 60 ; 61 Container con = getContentPane(); 62 JButton ok_button = new JButton("生成题目"); 63 64 // 出题区域 65 JTextArea question_area = new JTextArea(); 66 JScrollPane sp = new JScrollPane(); 67 68 // 申请数值变量 69 public int num_s = 0,num_b = 0,num_print = 0; // 数值范围和打印数量 70 public int leftNumber = 0,rightNumber = 0; // 生成题目左右的两个数 71 public boolean cc_flag = false,fu_flag = false,fen_flag = false; // 对于条件的判断 72 public int flag = 0; // 用来随机计算运用+ - × ÷ 73 public String qt[][] = new String[10000][3]; 74 public String leftNumber_string = "",rightNumber_string = "",sign_string = ""; // 将生成题目的数转换为String类型 75 76 // 更新数值范围和打印数量 77 public void Update(){ 78 num_s = Integer.parseInt(tf1.getText()); 79 num_b = Integer.parseInt(tf2.getText()); 80 num_print = Integer.parseInt(num_tf.getText()); 81 cc_flag = cc_RB_Yes.isSelected(); 82 fu_flag = fu_RB_Yes.isSelected(); 83 fen_flag = fen_RB_Yes.isSelected(); 84 } 85 86 public void DrawMenu(){ 87 88 // 添加是否有乘除法内容 89 cc_Label.setBounds(10, 10, 100, 20); 90 cc_RB_Yes.setBounds(100, 10, 40, 20); 91 cc_RB_No.setSelected(true); 92 cc_RB_No.setBounds(140,10,40,20); 93 bg1.add(cc_RB_No); 94 bg1.add(cc_RB_Yes); 95 con.add(cc_Label); 96 con.add(cc_RB_No); 97 con.add(cc_RB_Yes); 98 99 // 添加是否有负数法内容 100 fu_Label.setBounds(10, 50, 100, 20); 101 fu_RB_Yes.setBounds(100, 50, 40, 20); 102 fu_RB_No.setSelected(true); 103 fu_RB_No.setBounds(140,50,40,20); 104 bg2.add(fu_RB_No); 105 bg2.add(fu_RB_Yes); 106 con.add(fu_Label); 107 con.add(fu_RB_No); 108 con.add(fu_RB_Yes); 109 110 // 是否支持分数内容 111 fen_Label.setBounds(10, 90, 100, 20); 112 fen_RB_Yes.setBounds(100, 90, 40, 20); 113 fen_RB_No.setSelected(true); 114 fen_RB_No.setBounds(140,90,40,20); 115 bg3.add(fen_RB_No); 116 bg3.add(fen_RB_Yes); 117 con.add(fen_Label); 118 con.add(fen_RB_No); 119 con.add(fen_RB_Yes); 120 121 // 数值范围 122 sz_Label.setBounds(10, 130, 100, 20); 123 con.add(sz_Label); 124 tf1.setBounds(100, 130, 30, 20); 125 con.add(tf1); 126 xx.setBounds(140, 130, 20, 20); 127 con.add(xx); 128 tf2.setBounds(160, 130, 30, 20); 129 con.add(tf2); 130 131 // 打印数量 132 num_JLabel.setBounds(10, 170, 100, 20); 133 con.add(num_JLabel); 134 num_tf.setBounds(100, 170, 30, 20); 135 con.add(num_tf); 136 137 // 打印方式 138 plan_JLabel.setBounds(10, 210, 100, 20); 139 plan_cb.setBounds(100,210,100,20); 140 con.add(plan_JLabel); 141 con.add(plan_cb); 142 143 // 生成题目 144 ok_button.setBounds(10, 280, 100, 30); 145 ok_button.addActionListener(new ok_click()); 146 con.add(ok_button); 147 148 // 出题区域 149 question_area.setEditable(false); 150 question_area.setLineWrap(true); 151 sp.setViewportView(question_area); 152 sp.setBounds(220, 10, 250, 350); 153 // 设置显示字体 154 Font font=new Font("宋体",Font.PLAIN,18); 155 question_area.setFont(font); 156 con.add(sp); 157 } 158 159 public void Output(){ 160 int f0 = 0,f1 = 0; // 判断两个值是否是负数 161 for(int i = 1;i <= num_print;i++){ 162 leftNumber_string = ""; 163 rightNumber_string = ""; 164 165 leftNumber = num_s + (int)(Math.random() * (num_b + 1 - num_s)); 166 rightNumber = num_s + (int)(Math.random()*(num_b + 1 - num_s)); 167 168 if(fu_flag){ // 如果支持负数,随机生成原来数的负数 169 f0 = (int)(Math.random()*5); 170 if(f0 % 2 == 0) 171 leftNumber_string = "(-"; 172 f1 = (int)(Math.random()*5); 173 if(f1 % 2 == 0) 174 rightNumber_string = "(-"; 175 } 176 177 flag = (int)(Math.random()*100); 178 if(cc_flag) // 如果支持乘除法 179 flag = flag % 4; // 当flag = 0,1,2,3时,分别进行+,-,×,÷ 180 else 181 flag = flag % 2; 182 183 switch(flag){ 184 case 0: sign_string = "+";break; 185 case 1: sign_string = "-";break; 186 case 2: sign_string = "×";break; 187 case 3: sign_string = "÷";break; 188 } 189 190 if(fen_flag){ // 如果支持分数(注:分数的分子和分母均在取值范围之内) 191 int leftNumber_up = 0,leftNumber_down = 0,rightNumber_up = 0,rightNumber_down = 0; 192 do{ 193 leftNumber_up = num_s + (int)(Math.random()*(num_b + 1 - num_s)); 194 leftNumber_down = num_s + (int)(Math.random()*(num_b + 1- num_s)); 195 rightNumber_up = num_s + (int)(Math.random()*(num_b + 1 - num_s)); 196 rightNumber_down = num_s + (int)(Math.random()*(num_b + 1 - num_s)); 197 }while( leftNumber_down == 0 || rightNumber_down == 0 /* || leftNumber_up / leftNumber_down > num_b || 198 leftNumber_up / leftNumber_down < num_s || rightNumber_up / rightNumber_down > num_b || 199 rightNumber_up / rightNumber_down < num_s */); 200 201 // 分数约分 202 int temp_min_left = Math.min(leftNumber_up,leftNumber_down); 203 int temp_min_right= Math.min(rightNumber_up,rightNumber_down); 204 205 for(int k = temp_min_left;k >= 2;k--){ 206 if(leftNumber_up % k == 0 && leftNumber_down % k == 0){ 207 leftNumber_up = leftNumber_up / k; 208 leftNumber_down = leftNumber_down /k; 209 break; 210 } 211 } 212 if(leftNumber_down == 1) 213 leftNumber_string = leftNumber_string + Integer.toString(leftNumber_up); 214 else 215 leftNumber_string = leftNumber_string + Integer.toString(leftNumber_up) + "/" + Integer.toString(leftNumber_down); 216 217 for(int l = temp_min_right;l >= 2;l--){ 218 if(rightNumber_up % l == 0 && rightNumber_down % l == 0){ 219 rightNumber_up = rightNumber_up / l; 220 rightNumber_down = rightNumber_down / l; 221 break; 222 } 223 } 224 if(rightNumber_down == 1) 225 rightNumber_string = rightNumber_string + Integer.toString(rightNumber_up); 226 else 227 rightNumber_string = rightNumber_string + Integer.toString(rightNumber_up) + "/" + Integer.toString(rightNumber_down); 228 229 } 230 else{ // 如果不支持分数 231 // 将生成的题目记录为String类型 232 leftNumber_string = leftNumber_string + Integer.toString(leftNumber); 233 rightNumber_string = rightNumber_string + Integer.toString(rightNumber); 234 } 235 236 // 如果是负数添加括号(注:分数无负数) 237 if(f0 % 2 == 0 && fu_flag) 238 leftNumber_string = leftNumber_string + ")"; 239 if(f1 % 2 == 0 && fu_flag) 240 rightNumber_string = rightNumber_string + ")"; 241 242 243 // 判断题目是否有问题 244 boolean re = false; 245 for(int j = 1;j < i;j++){ 246 // 判断题目是否重复 247 if(leftNumber_string == qt[j][0] && rightNumber_string == qt[j][1] && sign_string == qt[j][2]){ 248 re = true; 249 } 250 // 判断除数是否为0 251 if(flag == 3 && rightNumber == 0){ 252 re = true; 253 } 254 } 255 if(re){ 256 i = i - 1; 257 } 258 else{ 259 qt[i][0] = leftNumber_string; 260 qt[i][1] = rightNumber_string; 261 qt[i][2] = sign_string; 262 } 263 264 } 265 266 } 267 268 269 public void Print(){ 270 for(int i = 1;i <= num_print;i++){ 271 question_area.append(qt[i][0] + " " + qt[i][2] + " " + qt[i][1] + " " +"="); 272 question_area.append("\n"); 273 } 274 275 } 276 277 public static void main(String args[]){ 278 new Main(); 279 } 280 281 class ok_click implements ActionListener{ 282 283 @Override 284 public void actionPerformed(ActionEvent e) { 285 // TODO 自动生成的方法存根 286 question_area.setText(""); // 重新出题,进行区域清空 287 // 对输入的值是否规范进行判断 288 boolean isInt = true; 289 for(int i = 0;i < tf1.getText().length();i++) 290 if(!Character.isDigit(tf1.getText().charAt(i))) 291 isInt = false; 292 for(int i = 0;i < tf2.getText().length();i++) 293 if(!Character.isDigit(tf2.getText().charAt(i))) 294 isInt = false; 295 for(int i = 0;i < num_tf.getText().length();i++) 296 if(!Character.isDigit(num_tf.getText().charAt(i))) 297 isInt = false; 298 // 判断值是否不是整型,是否为空值,取值是否超出范围 299 if(tf1.getText().equalsIgnoreCase("") || tf2.getText().equalsIgnoreCase("")|| 300 num_tf.getText().equalsIgnoreCase("") || isInt == false || 301 Integer.parseInt(tf1.getText()) > Integer.parseInt(tf2.getText()) || 302 Integer.parseInt(tf1.getText()) < 0){ 303 JOptionPane.showMessageDialog(null, "请进行正确输入!"); 304 } 305 else{ 306 Update(); 307 Output(); 308 Print(); 309 } 310 311 312 } 313 } 314 }
三、运行结果
运行界面:
所有条件均满足时,打印界面:
四、时间记录日志
时间 | 进度 |
3/18 13:00~14:00 | 实现初步界面 |
3/18 14:00~15:30 | 实现初步算法 |
3/18 15:30~17:00 | 算法完善 |
3/18 19:00~21:00 |
算法完善与界面优化 |
时间: 2024-10-07 04:02:07