四则运算的设计思想及具体实现

一、设计思想:

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

四则运算的设计思想及具体实现的相关文章

《四则运算2设计思想》

四则运算2设计思想; (1)首先使用Switch语句,让用户选择要进行运算的数字的范围,然后各个case语句里调用相应的产生数字的随机函数random(): (2)至于要进行的题目数使用宏定义,让用户自己输入要进的计算的题目个数: (3)开始定义的产生的随机数均定义整型:若用户没有特定的需求则默认在各个case语句执行的情况是这样的:用户自己选择需要进行的运行方法,即加减乘除四种方法下产生的运算方式是单一的:其中在加减法函数中加上一个判断语句,即如若判断了产生的随机数中有负数的,则为其加一括号然

软件工程课堂作业(二)——升级版随机产生四则运算题目设计思想

升级版随机产生四则运算题目要求: 1.避免题目重复: 2.可定制题目(题目数量.打印方式): 3.可以选择:是否有乘除法.是否有括号.定制数值范围.加减有无负数.除法有无余数.是否支持分数.是否支持小数.定制每行间隔等. ********************************************************************************************************* 设计思想: 1.避免重复:输出时,确定了运算符号,两个运算数都相同

四则运算2 设计思想

题目要求:随机产生30个的四则运算 题目避免重复: 可定制(数量/打印方式): 可以控制下列参数:    是否有乘除法.数值范围.加减有无负数.除法有无余数.是否支持分数(真分数,假分数,...)五选四: 设计思想: 1. 设定打印题目的数量,以及打印方式.(设置两个变量确定打印的数量和打印方式) 2. 确定有无乘除法,如果有:if条件语句 首先确定数值范围: 确定加减法有无负数:(if条件语句在这个里面如果产生了bug算法,则不记录本次算法,另循环的值i减一,来保持产生的题目够量) 再次确定除

四则运算2设计思想

四则元算2--设计思想要求1:题目避免重复 (1)通过srand(time(NULL));来控制.要求2:可以定制(数量/打印方式) (1)定义一个参数,利用用户输入的数量来控制数量: (2)输出格式可以目前可以设置两个方式,一个方式是纵向X道,另一个是X*Y格式输出,其中X.Y可以由用户选择来控制.要求3:控制参数 (1)所有的参数控制都要通过用户来选择,控制实现在主函数里,打印函数另行设计 (2)数值范围可以设置几个输出函数,用户进行选择 (3)是否有乘除法,可以在输出函数里控制,用户进行选

关于四则运算的设计思想

1.题目避免重复:四则运算中包括两个数字和一个符号,利用随机数可以随机产生数字,随机产生两个数可以定义两个参数,只需要比较其中一个数字就可以了,另外一个数不用比较. 2.可定制(数量/打印方式):每张电子纸都有自己的大小,四则运算题目的数量和字母的大小以及每道题每行之间的间隔都要针对大小做一个比较. 3.可以控制参数:利用一个可以控制符号的算法可以用数字1.2.3分别表示加法.减法之类. 4.关于余数:取余数,等于0的话就有余数,不等于0就没有余数.

四则运算2的设计思想

问题:四则运算2的设计思想 设计思路: 1.将自动生成的数与原有生成的数进行比较,若重复,再次判断运算符是否重复,若重复终止此次行为,重新进行此次操作,再次生成两个随机数,继续原有操作:若不重复继续此次行为: 2.添加定制(包括数量和打印方式): 3.确定数值范围: 4.添加条件选择项 加减运算.加减乘除运算.加减有无负数.除法有无余数.是否支持分数 代码: 反思:

四则运算进化版设计思想

设计思想: 1.题目避免重复 (1)调用系统时间函数,将生成的运算式存储,将新的运算式与已生成式子做比较,若相同则不输出,不同则输出 2.可定制(数量/打印方式) (1)提示用户输入题目数量,打印方式,从键盘输入 3.(1)是否有乘除法 在输入之前提示用户是否有乘除法,若没有,则只输出加减法 (2)是否有括号 (3)数值范围 由用户设置数值范围,如果输入不合法,提示输入错误,请重新输入,在随机生成数中保证随机数在用户设置的数值范围 (4)加减有无负数 如果没有负数,比较生成的两个数,保证做减法时

软件工程——四则运算2部分设计思想

1.         题目避免重复 2.         可定制(数量.打印方式) 3.         可以控制下列参数:是否有乘除法.是否有括号.数值范围.加减有无负数.除法有无余数.是否支持分数(真分数.假分数...).是否支持小数(精确到多少位).打印中每行的间隔可调整: “避免重复”将生成的表达式存入数组中,下面的表达式再与数组中已有的比较 “可定制“可以用户输入for循环的控制变量 设计思想: 分步实现:是否有乘除法 分两个函数写,用户输入0选择有乘除,1选择无乘除

小学生四则运算C/C++编程设计思想

题目: 1.题目避免重复:        2.可定制(数量(打印方式)):        3.可控制下列参数:是否有乘除法.是否有括号.数值范围.加减有无负数.        除法有无余数.是否支持分数(真分数.假分数....).是否支持小数       (精确到多少位).打印中每行间隔可调整. 设计思想:   1.题目避免重复:将每道题目存储后,新生成的题目进行对比,排除重复相同的题目:   2.可定制(数量/打印方式):主函数负责数量和打印方式:   3.控制变量参数:将各种参数变量组成参数