一个自动生成小学四则运算题目的命令行程序(Python实现)
1.GitHub地址:https://github.com/enNiandai/Four-arithmetic-in-Elementary-school-
项目合作者:吴哲翰 3118004978 姜达成 3118004964
2.PSP表格
Personal Software |
Process Stages |
预估耗时 (分钟) |
实际耗时 (分钟) |
Planning |
计划 |
1370 |
1550 |
· Estimate |
· 估计这个任务需要多少时间 |
1370 |
1550 |
Development |
开发 |
1240 |
1380 |
· Analysis |
· 需求分析 (包括学习新技术) |
600 |
480 |
· Design Spec |
· 生成设计文档 |
60 |
80 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
80 |
120 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适 的规范) |
60 |
80 |
· Design |
· 具体设计 |
120 |
180 |
· Coding |
· 具体编码 |
120 |
180 |
· Code Review |
· 代码复审 |
80 |
80 |
· Test |
· 测试(自我测试,修改代码, 提交修改) |
120 |
180 |
Reporting |
报告 |
130 |
170 |
· Test Report |
· 测试报告 |
50 |
60 |
· Size Measurement |
· 计算工作量 |
40 |
60 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
40 |
50 |
合计 |
|
1370 |
1550 |
3.代码实现过程
1 def Integer_Calcu(i, r, signNum): # 整数计算
2 # i是题目编号 r是范围 signnum是字符数量
3 st = ("+", "-", "*", "/")
4 if (signNum == 3):
5 # 三运算符算式
6 num1 = Fraction(random.randint(1, r))
7 num2 = Fraction(random.randint(1, r))
8 num3 = Fraction(random.randint(1, r))
9 num4 = Fraction(random.randint(1, r))
10 sign1 = st[random.randint(0, 3)]
11 sign2 = st[random.randint(0, 3)]
12 sign3 = st[random.randint(0, 3)]
13
14 if (sign1 == '/'):
15 if (num1 > num2):
16 Integer_Calcu(i, r, signNum)
17 return 0
18 if (sign2 == '/'):
19 if (int(cal(num1, sign1, num2)) > num3):
20 Integer_Calcu(i, r, signNum)
21 return 0
22 if (sign3 == '/' and int(cal(cal(num1, sign1, num2), sign2, num3)) > num4):
23 Integer_Calcu(i, r, signNum)
24 return 0
25 if (sign3 == '-' and int(cal(cal(num1, sign1, num2), sign2, num3)) < num4):
26 Integer_Calcu(i, r, signNum)
27 return 0
28 elif (sign2 == '-'):
29 if (sign3 == '+' and int(cal(num1, sign1, num2)) < num3):
30 Integer_Calcu(i, r, signNum)
31 return 0
32 if (sign3 == '-'):
33 if (int(cal(num1, sign1, num2)) < num3):
34 Integer_Calcu(i, r, signNum)
35 return 0
36 if (int(cal(cal(num1, sign1, num2), sign2, num3)) < num4):
37 Integer_Calcu(i, r, signNum)
38 return 0
39 if (sign3 == '*'):
40 if (cal(num1, sign1, num2) < cal(num3, sign3, num4)):
41 Integer_Calcu(i, r, signNum)
42 return 0
43 if (sign3 == '/'):
44 if (num3 > num4):
45 Integer_Calcu(i, r, signNum)
46 return 0
47 if (cal(num1, sign1, num2) < cal(num3, sign3, num4)):
48 Integer_Calcu(i, r, signNum)
49 return 0
50 elif (sign2 == '+'):
51 if (sign3 == '-' and cal(cal(num1, sign1, num2), sign2, num3) < num4):
52 Integer_Calcu(i, r, signNum)
53 return 0
54 elif (sign3 == '/' and num3 > num4):
55 Integer_Calcu(i, r, signNum)
56 return 0
57 else:
58 pass
59 else:
60 if (sign3 == '-' or sign3 == '/'):
61 if (cal(cal(num1, sign1, num2), sign2, num3) < num4):
62 Integer_Calcu(i, r, signNum)
63 return 0
64 elif (sign1 == '-'):
65 if (sign2 == '-'):
66 if (sign3 == '-'):
67 if (num1 < num2 or cal(num1, sign1, num2) < num3 or (
68 cal(cal(num1, sign1, num2), sign2, num3) < num4)):
69 Integer_Calcu(i, r, signNum)
70 return 0
71 elif (sign3 == '/'):
72 if (num3 > num4):
73 Integer_Calcu(i, r, signNum)
74 return 0
75 else:
76 if (num1 < num2 or (cal(num1, sign1, num2) < num3)):
77 Integer_Calcu(i, r, signNum)
78 return 0
79 elif (sign3 == '*'):
80 if (num1 < num2 or cal(num1, sign1, num2) < cal(num3, sign3, num4)):
81 Integer_Calcu(i, r, signNum)
82 return 0
83 else:
84 if (num1 < num2 or cal(num1, sign1, num2) < num3):
85 Integer_Calcu(i, r, signNum)
86 return 0
87 elif (sign2 == '/'):
88 if (sign3 == '/'):
89 if (num2 > num3 or cal(num2, sign2, num3) > num4 or num1 < cal(cal(num2, sign2, num3), sign3,
90 num4)):
91 Integer_Calcu(i, r, signNum)
92 return 0
93 elif (sign3 == '-'):
94 if (num2 > num3 or num1 < cal(num2, sign2, num3) or cal(cal(num1, sign1, num2), sign2,
95 num3) < num4):
96 Integer_Calcu(i, r, signNum)
97 return 0
98 elif (sign3 == '+'):
99 if (num2 > num3 or num1 < cal(num2, sign2, num3)):
100 Integer_Calcu(i, r, signNum)
101 return 0
102 else:
103 if (num2 > num3 or num1 < cal(cal(num2, sign2, num3), sign3, num4)):
104 Integer_Calcu(i, r, signNum)
105 return 0
106 elif (sign2 == '+'):
107 if (sign3 == '-' and cal(cal(num1, sign1, num2), sign2, num3) < num4):
108 Integer_Calcu(i, r, signNum)
109 return 0
110 elif (sign3 == '/' and cal(cal(num1, sign1, num2), sign2, num3) > num4):
111 Integer_Calcu(i, r, signNum)
112 return 0
113 else:
114 if (num1 < num2):
115 Integer_Calcu(i, r, signNum)
116 return 0
117 else:
118 if (sign3 == '-'):
119 if (num1 < cal(num2, sign2, num3) or cal(cal(num1, sign1, num2), sign2, num3) < num4):
120 Integer_Calcu(i, r, signNum)
121 return 0
122 elif (sign3 == '/'):
123 if (num3 > num4 or num1 < cal(cal(num2, sign2, num3), sign3, num4)):
124 Integer_Calcu(i, r, signNum)
125 return 0
126 elif (sign3 == '+'):
127 if (num1 < cal(num2, sign2, num3)):
128 Integer_Calcu(i, r, signNum)
129 return 0
130 else:
131 if (num1 < cal(cal(num2, sign2, num3), sign3, num4)):
132 Integer_Calcu(i, r, signNum)
133 return 0
134 elif (sign1 == '+'):
135 if (sign2 == '+'):
136 if (sign3 == '-' and cal(cal(num1, sign1, num2), sign2, num3) < num4):
137 Integer_Calcu(i, r, signNum)
138 return 0
139 elif (sign3 == '/' and cal(cal(num1, sign1, num2), sign2, num3) > num4):
140 Integer_Calcu(i, r, signNum)
141 return 0
142 else:
143 pass
144 elif (sign2 == '-'):
145 if (sign3 == '-'):
146 if (cal(num1, sign1, num2) < num3 or cal(cal(num1, sign1, num2), sign2, num3) < num4):
147 Integer_Calcu(i, r, signNum)
148 return 0
149 elif (sign3 == '/'):
150 if (num3 > num4 or cal(num1, sign1, num2) < cal(num3, sign3, num4)):
151 Integer_Calcu(i, r, signNum)
152 return 0
153 elif (sign3 == '*'):
154 if (cal(num1, sign1, num2) < cal(num3, sign3, num4)):
155 Integer_Calcu(i, r, signNum)
156 return 0
157 else:
158 if (cal(num1, sign1, num2) < num3):
159 Integer_Calcu(i, r, signNum)
160 return 0
161 elif (sign2 == '*'):
162 if (sign3 == '-' and cal(cal(num1, sign1, num2), sign2, num3) < num4):
163 Integer_Calcu(i, r, signNum)
164 return 0
165 elif (sign3 == '/' and cal(cal(num1, sign1, num2), sign2, num3) > num4):
166 Integer_Calcu(i, r, signNum)
167 return 0
168 else:
169 pass
170 else:
171 if (sign3 == '-'):
172 if (cal(num1, sign1, num2) > num3 or cal(cal(num1, sign1, num2), sign2, num3) < num4):
173 Integer_Calcu(i, r, signNum)
174 return 0
175 elif (sign3 == '/'):
176 if (cal(num1, sign1, num2) > num3 or cal(cal(num1, sign1, num2), sign2, num3) > num4):
177 Integer_Calcu(i, r, signNum)
178 return 0
179 else:
180 if (cal(num1, sign1, num2) > num3):
181 Integer_Calcu(i, r, signNum)
182 return 0
183 else:
184 if (sign2 == '+'):
185 if (sign3 == '-' and cal(cal(num1, sign1, num2), sign2, num3) < num4):
186 Integer_Calcu(i, r, signNum)
187 return 0
188 elif (sign3 == '/' and num3 < num4):
189 Integer_Calcu(i, r, signNum)
190 return 0
191 else:
192 pass
193 elif (sign2 == '-'):
194 if (sign3 == '+' and cal(num1, sign1, num2) < num3):
195 Integer_Calcu(i, r, signNum)
196 return 0
197 elif (sign3 == '-'):
198 if (cal(num1, sign1, num2) < num3 or cal(cal(num1, sign1, num2), sign2, num3) < num4):
199 Integer_Calcu(i, r, signNum)
200 return 0
201 elif (sign3 == '*' and cal(num1, sign1, num2) < cal(num3, sign3, num4)):
202 Integer_Calcu(i, r, signNum)
203 return 0
204 elif (sign3 == '/'):
205 if (num3 > num4 or cal(num1, sign1, num2) < cal(num3, sign3, num4)):
206 Integer_Calcu(i, r, signNum)
207 return 0
208 else:
209 pass
210 elif (sign2 == '*'):
211 if (sign3 == '-' and cal(cal(num1, sign1, num2), sign2, num3) < num4):
212 Integer_Calcu(i, r, signNum)
213 return 0
214 elif (sign3 == '/' and cal(cal(num1, sign1, num2), sign2, num3) > num4):
215 Integer_Calcu(i, r, signNum)
216 return 0
217 else:
218 pass
219 else:
220 if (cal(num1, sign1, num2) > num3):
221 Integer_Calcu(i, r, signNum)
222 return 0
223 if (sign3 == '-' and cal(cal(num1, sign1, num2), sign2, num3) < num4):
224 Integer_Calcu(i, r, signNum)
225 return 0
226 elif (sign3 == '/' and cal(cal(num1, sign1, num2), sign2, num3) > num4):
227 Integer_Calcu(i, r, signNum)
228 return 0
229 else:
230 pass
231
232 # 计算
233 if (sign1 == '*' or sign1 == '/'):
234 if (sign2 == '*' or sign2 == '/'):
235 answer = cal(cal(cal(num1, sign1, num2), sign2, num3), sign3, num4)
236 else:
237 if (sign3 == '*' or sign3 == '/'):
238 answer = cal(cal(num1, sign1, num2), sign2, cal(num3, sign3, num4))
239 else:
240 answer = cal(cal(cal(num1, sign1, num2), sign2, num3), sign3, num4)
241 else:
242 if (sign2 == '*' or sign2 == '/'):
243 if (sign3 == '*' or sign3 == '/'):
244 answer = cal(num1, sign1, cal(cal(num2, sign2, num3), sign3, num4))
245 else:
246 answer = cal(cal(num1, sign1, cal(num2, sign2, num3)), sign3, num3)
247 else:
248 if (sign3 == '*' or sign3 == '/'):
249 answer = cal(cal(num1, sign1, num2), sign2, cal(num3, sign3, num4))
250 else:
251 answer = cal(cal(cal(num1, sign1, num2), sign2, num3), sign3, num4)
252
253
254 print("第", i, '题: ' + str(num1) + sign1 + str(num2) + sign2 + str(num3) + sign3 + str(num4), end=" = ")
255 question = str(num1) + sign1 + str(num2) + sign2 + str(num3) + sign3 + str(num4)
256
257 elif (signNum == 2):
258 # 双运算符算式
259 num1 = Fraction(random.randint(1, r))
260 num2 = Fraction(random.randint(1, r))
261 num3 = Fraction(random.randint(1, r))
262 sign1 = st[random.randint(0, 3)]
263 sign2 = st[random.randint(0, 3)]
264
265 if(sign1 == '/'): #伪随机
266 if(num1>num2):
267 Integer_Calcu(i, r, signNum)
268 return 0
269 if(sign2 == '-' and int(cal(num1,sign1,num2))<num3):
270 Integer_Calcu(i, r, signNum)
271 return 0
272 if(sign2 == '/' and int(cal(num1,sign1,num2))>num3):
273 Integer_Calcu(i, r, signNum)
274 return 0
275 elif(sign1 == '-'):
276 if(sign2 == '+' and num1<num2):
277 Integer_Calcu(i, r, signNum)
278 return 0
279 if(sign2 == '-'):
280 if(num1<num2):
281 Integer_Calcu(i, r, signNum)
282 return 0
283 if(int(cal(num1,sign1,num2)<num3)):
284 Integer_Calcu(i, r, signNum)
285 return 0
286 if(sign2 == '*' and num1<int(cal(num2,sign2,num3))):
287 Integer_Calcu(i, r, signNum)
288 return 0
289 if(sign2 == '/'):
290 if(num2>num3):
291 Integer_Calcu(i, r, signNum)
292 return 0
293 if(num1<int(cal(num2,sign2,num3))):
294 Integer_Calcu(i, r, signNum)
295 return 0
296 elif(sign1 == '*'):
297 if(sign2 == '-' and cal(num1,sign1,num2) < num3):
298 Integer_Calcu(i, r, signNum)
299 return 0
300 if((sign2 == '/' and cal(num1,sign2,num2) > num3)):
301 Integer_Calcu(i, r, signNum)
302 return 0
303 else:
304 if (sign2 == '-' and cal(num1, sign1, num2) < num3):
305 Integer_Calcu(i, r, signNum)
306 return 0
307 if ((sign2 == '/' and num2 > num3)):
308 Integer_Calcu(i, r, signNum)
309 return 0
310
311 if (sign1 == '*' or sign1 == '/'): # 计算
312 answer = cal(cal(num1, sign1, num2), sign2, num3)
313 else:
314 if (sign2 == '*' or sign2 == '/'):
315 answer = cal(num1, sign1, cal(num2, sign2, num3))
316 else:
317 answer= cal(cal(num1, sign1, num2), sign2, num3)
318
319 question = str(num1) + sign1 + str(num2) + sign2 + str(num3)
320 print("第", i, '题: ' + str(num1) + sign1 + str(num2) + sign2 + str(num3), end=" = ")
321
322 else:
323 # 单运算符
324
325 num1 = Fraction(random.randint(1, r))
326 num2 = Fraction(random.randint(1, r))
327 sign1 = st[random.randint(0, 3)]
328
329 if (sign1 == '-' and num1 < num2): # 伪随机
330 Integer_Calcu(i, r, signNum)
331 if (sign1 == '/' and num1 > num2):
332 Integer_Calcu(i, r, signNum)
333
334 question = str(num1) + sign1 + str(num2)
335 answer = cal(num1, sign1, num2)
336 print("第", i, '题: ' + str(num1) + sign1 + str(num2), end=" = ")
337
338 # 化为带分数
339 if (answer % 1): # 判断计算结果是否是整数
340 if (answer > 1): # 正数
341 n = str(answer).index('/') # 找出 除号的位置来当分界符 得到分子和分母
342 t = 0
343 fz = 0
344 fm = 0
345 l = len(str(answer))
346 while (t < n): # 分子
347 fz = int(str(answer)[t]) + fz * 10
348 t = t + 1
349
350 t = t + 1 # 跳过 '/'
351
352 while (t < l): # 得分母
353 fm = int(str(answer)[t]) + fm * 10
354 t = t + 1
355
356 num = 0
357 if (fz > fm):
358 num = fz // fm
359 fz = fz % fm
360 answer = str(num) + '`' + str(fz) + '/' + str(fm)
361 write_in(i, question, answer)
362 print(answer)
363
364 elif (answer < -1):
365 n = str(answer).index('/') # 找出 除号的位置来当分界符 得到分子和分母
366 t = 1 # 0是负号
367 fz = 0
368 fm = 0
369 l = len(str(answer))
370 while (t < n): # 分子
371 fz = int(str(answer)[t]) + fz * 10
372 t = t + 1
373
374 t = t + 1 # 跳过 '/'
375
376 while (t < l): # 得分母
377 fm = int(str(answer)[t]) + fm * 10
378 t = t + 1
379
380 num = 0
381 if (fz > fm):
382 num = fz // fm
383 fz = fz % fm
384
385 answer = '-' + str(num) + '`' + str(fz) + '/' + str(fm)
386 write_in(i, question, answer)
387 print(answer)
388 else:
389 write_in(i, question, str(answer))
390 print(answer)
391 else:
392 write_in(i, question, str(answer))
393 print(answer)
1 def Fractional_Calcu(i, r, signNum): # faction calculate 分数计算
2 # i是题目序号 signnum是符号数量 r数的范围
3 fmRange = 10
4 Range = 1
5 st = ('+', '-', '*', '/')
6 if (signNum == 3):
7 # 三运算符算式
8 sign1 = st[random.randint(0, 3)] # 随机得符号
9 sign2 = st[random.randint(0, 3)]
10 sign3 = st[random.randint(0, 3)]
11 fm1 = random.randint(1, fmRange) # 随机分数
12 fz1 = random.randint(1, fmRange * Range)
13 fm2 = random.randint(1, fmRange)
14 fz2 = random.randint(1, fmRange * Range)
15 fm3 = random.randint(1, fmRange)
16 fz3 = random.randint(1, fmRange * Range)
17 fm4 = random.randint(1, fmRange)
18 fz4 = random.randint(1, fmRange * Range)
19
20 f1 = Fraction(fz1, fm1)
21 f2 = Fraction(fz2, fm2)
22 f3 = Fraction(fz3, fm3)
23 f4 = Fraction(fz4, fm4)
24
25 if (sign1 == '/'):
26 if (f1 > f2):
27 Fractional_Calcu(i, r, signNum)
28 return 0
29 if (sign2 == '/'):
30 if (int(cal(f1, sign1, f2)) > f3):
31 Fractional_Calcu(i, r, signNum)
32 return 0
33 if (sign3 == '/' and int(cal(cal(f1, sign1, f2), sign2, f3)) > f4):
34 Fractional_Calcu(i, r, signNum)
35 return 0
36 if (sign3 == '-' and int(cal(cal(f1, sign1, f2), sign2, f3)) < f4):
37 Fractional_Calcu(i, r, signNum)
38 return 0
39 elif (sign2 == '-'):
40 if (sign3 == '+' and int(cal(f1, sign1, f2)) < f3):
41 Fractional_Calcu(i, r, signNum)
42 return 0
43 if (sign3 == '-'):
44 if (int(cal(f1, sign1, f2)) < f3):
45 Fractional_Calcu(i, r, signNum)
46 return 0
47 if (int(cal(cal(f1, sign1, f2), sign2, f3)) < f4):
48 Fractional_Calcu(i, r, signNum)
49 return 0
50 if (sign3 == '*'):
51 if (cal(f1, sign1, f2) < cal(f3, sign3, f4)):
52 Fractional_Calcu(i, r, signNum)
53 return 0
54 if (sign3 == '/'):
55 if (f3 > f4):
56 Fractional_Calcu(i, r, signNum)
57 return 0
58 if (cal(f1, sign1, f2) < cal(f3, sign3, f4)):
59 Fractional_Calcu(i, r, signNum)
60 return 0
61 elif (sign2 == '+'):
62 if (sign3 == '-' and cal(cal(f1, sign1, f2), sign2, f3) < f4):
63 Fractional_Calcu(i, r, signNum)
64 return 0
65 elif (sign3 == '/' and f3 > f4):
66 Fractional_Calcu(i, r, signNum)
67 return 0
68 else:
69 pass
70 else:
71 if (sign3 == '-' or sign3 == '/'):
72 if (cal(cal(f1, sign1, f2), sign2, f3) < f4):
73 Fractional_Calcu(i, r, signNum)
74 return 0
75 elif (sign1 == '-'):
76 if (sign2 == '-'):
77 if (sign3 == '-'):
78 if (f1 < f2 or cal(f1, sign1, f2) < f3 or (cal(cal(f1, sign1, f2), sign2, f3) < f4)):
79 Fractional_Calcu(i, r, signNum)
80 return 0
81 elif (sign3 == '/'):
82 if (f3 > f4):
83 Fractional_Calcu(i, r, signNum)
84 return 0
85 else:
86 if (f1 < f2 or (cal(f1, sign1, f2) < f3)):
87 Fractional_Calcu(i, r, signNum)
88 return 0
89 elif (sign3 == '*'):
90 if (f1 < f2 or cal(f1, sign1, f2) < cal(f3, sign3, f4)):
91 Fractional_Calcu(i, r, signNum)
92 return 0
93 else:
94 if (f1 < f2 or cal(f1, sign1, f2) < f3):
95 Fractional_Calcu(i, r, signNum)
96 return 0
97 elif (sign2 == '/'):
98 if (sign3 == '/'):
99 if (f2 > f3 or cal(f2, sign2, f3) > f4 or f1 < cal(cal(f2, sign2, f3), sign3, f4)):
100 Fractional_Calcu(i, r, signNum)
101 return 0
102 elif (sign3 == '-'):
103 if (f2 > f3 or f1 < cal(f2, sign2, f3) or cal(cal(f1, sign1, f2), sign2, f3) < f4):
104 Fractional_Calcu(i, r, signNum)
105 return 0
106 elif (sign3 == '+'):
107 if (f2 > f3 or f1 < cal(f2, sign2, f3)):
108 Fractional_Calcu(i, r, signNum)
109 return 0
110 else:
111 if (f2 > f3 or f1 < cal(cal(f2, sign2, f3), sign3, f4)):
112 Fractional_Calcu(i, r, signNum)
113 return 0
114 elif (sign2 == '+'):
115 if (sign3 == '-' and cal(cal(f1, sign1, f2), sign2, f3) < f4):
116 Fractional_Calcu(i, r, signNum)
117 return 0
118 elif (sign3 == '/' and cal(cal(f1, sign1, f2), sign2, f3) > f4):
119 Fractional_Calcu(i, r, signNum)
120 return 0
121 else:
122 if (f1 < f2):
123 Fractional_Calcu(i, r, signNum)
124 return 0
125 else:
126 if (sign3 == '-'):
127 if (f1 < cal(f2, sign2, f3) or cal(cal(f1, sign1, f2), sign2, f3) < f4):
128 Fractional_Calcu(i, r, signNum)
129 return 0
130 elif (sign3 == '/'):
131 if (f3 > f4 or f1 < cal(cal(f2, sign2, f3), sign3, f4)):
132 Fractional_Calcu(i, r, signNum)
133 return 0
134 elif (sign3 == '+'):
135 if (f1 < cal(f2, sign2, f3)):
136 Fractional_Calcu(i, r, signNum)
137 return 0
138 else:
139 if (f1 < cal(cal(f2, sign2, f3), sign3, f4)):
140 Fractional_Calcu(i, r, signNum)
141 return 0
142 elif (sign1 == '+'):
143 if (sign2 == '+'):
144 if (sign3 == '-' and cal(cal(f1, sign1, f2), sign2, f3) < f4):
145 Fractional_Calcu(i, r, signNum)
146 return 0
147 elif (sign3 == '/' and cal(cal(f1, sign1, f2), sign2, f3) > f4):
148 Fractional_Calcu(i, r, signNum)
149 return 0
150 else:
151 pass
152 elif (sign2 == '-'):
153 if (sign3 == '-'):
154 if (cal(f1, sign1, f2) < f3 or cal(cal(f1, sign1, f2), sign2, f3) < f4):
155 Fractional_Calcu(i, r, signNum)
156 return 0
157 elif (sign3 == '/'):
158 if (f3 > f4 or cal(f1, sign1, f2) < cal(f3, sign3, f4)):
159 Fractional_Calcu(i, r, signNum)
160 return 0
161 elif (sign3 == '*'):
162 if (cal(f1, sign1, f2) < cal(f3, sign3, f4)):
163 Fractional_Calcu(i, r, signNum)
164 return 0
165 else:
166 if (cal(f1, sign1, f2) < f3):
167 Fractional_Calcu(i, r, signNum)
168 return 0
169 elif (sign2 == '*'):
170 if (sign3 == '-' and cal(cal(f1, sign1, f2), sign2, f3) < f4):
171 Fractional_Calcu(i, r, signNum)
172 return 0
173 elif (sign3 == '/' and cal(cal(f1, sign1, f2), sign2, f3) > f4):
174 Fractional_Calcu(i, r, signNum)
175 return 0
176 else:
177 pass
178 else:
179 if (sign3 == '-'):
180 if (cal(f1, sign1, f2) > f3 or cal(cal(f1, sign1, f2), sign2, f3) < f4):
181 Fractional_Calcu(i, r, signNum)
182 return 0
183 elif (sign3 == '/'):
184 if (cal(f1, sign1, f2) > f3 or cal(cal(f1, sign1, f2), sign2, f3) > f4):
185 Fractional_Calcu(i, r, signNum)
186 return 0
187 else:
188 if (cal(f1, sign1, f2) > f3):
189 Fractional_Calcu(i, r, signNum)
190 return 0
191 else:
192 if (sign2 == '+'):
193 if (sign3 == '-' and cal(cal(f1, sign1, f2), sign2, f3) < f4):
194 Fractional_Calcu(i, r, signNum)
195 return 0
196 elif (sign3 == '/' and f3 < f4):
197 Fractional_Calcu(i, r, signNum)
198 return 0
199 else:
200 pass
201 elif (sign2 == '-'):
202 if (sign3 == '+' and cal(f1, sign1, f2) < f3):
203 Fractional_Calcu(i, r, signNum)
204 return 0
205 elif (sign3 == '-'):
206 if (cal(f1, sign1, f2) < f3 or cal(cal(f1, sign1, f2), sign2, f3) < f4):
207 Fractional_Calcu(i, r, signNum)
208 return 0
209 elif (sign3 == '*' and cal(f1, sign1, f2) < cal(f3, sign3, f4)):
210 Fractional_Calcu(i, r, signNum)
211 return 0
212 elif (sign3 == '/'):
213 if (f3 > f4 or cal(f1, sign1, f2) < cal(f3, sign3, f4)):
214 Fractional_Calcu(i, r, signNum)
215 return 0
216 else:
217 pass
218 elif (sign2 == '*'):
219 if (sign3 == '-' and cal(cal(f1, sign1, f2), sign2, f3) < f4):
220 Fractional_Calcu(i, r, signNum)
221 return 0
222 elif (sign3 == '/' and cal(cal(f1, sign1, f2), sign2, f3) > f4):
223 Fractional_Calcu(i, r, signNum)
224 return 0
225 else:
226 pass
227 else:
228 if (cal(f1, sign1, f2) > f3):
229 Fractional_Calcu(i, r, signNum)
230 return 0
231 if (sign3 == '-' and cal(cal(f1, sign1, f2), sign2, f3) < f4):
232 Fractional_Calcu(i, r, signNum)
233 return 0
234 elif (sign3 == '/' and cal(cal(f1, sign1, f2), sign2, f3) > f4):
235 Fractional_Calcu(i, r, signNum)
236 return 0
237 else:
238 pass
239
240 # 按运算符优先顺序分类
241
242 # 计算
243
244 if (sign1 == '*' or sign1 == '/'):
245 if (sign2 == '*' or sign2 == '/'):
246 answer = cal(cal(cal(f1, sign1, f2), sign2, f3), sign3, f4)
247 else:
248 if (sign3 == '*' or sign3 == '/'):
249 answer = cal(cal(f1, sign1, f2), sign2, cal(f3, sign3, f4))
250 else:
251 answer = cal(cal(cal(f1, sign1, f2), sign2, f3), sign3, f4)
252 else:
253 if (sign2 == '*' or sign2 == '/'):
254 if (sign3 == '*' or sign3 == '/'):
255 answer = cal(f1, sign1, cal(cal(f2, sign2, f3), sign3, f4))
256 else:
257 answer = cal(cal(f1, sign1, cal(f2, sign2, f3)), sign3, f3)
258 else:
259 if (sign3 == '*' or sign3 == '/'):
260 answer = cal(cal(f1, sign1, f2), sign2, cal(f3, sign3, f4))
261 else:
262 answer = cal(cal(cal(f1, sign1, f2), sign2, f3), sign3, f4)
263
264 print('第', i, '题', end=": ")
265 question = '(', fz1, '/', fm1, ')', sign1, '(', fz2, '/', fm2, ')', sign2, '(', fz3, '/', fm3, ')' \
266 , sign3, '(', fz4, '/', fm4, ')'
267 question = "".join('%s' % id for id in question)
268 question = question.replace("/", "÷").replace("*", "×")
269 print(question, end=' = ')
270
271 elif (signNum == 2): # 两运算符算式
272 sign1 = st[random.randint(0, 3)] # 随机得符号
273 sign2 = st[random.randint(0, 3)]
274 fm1 = random.randint(1, fmRange) # 随机分数
275 fz1 = random.randint(1, fmRange * Range)
276 fm2 = random.randint(1, fmRange)
277 fz2 = random.randint(1, fmRange * Range)
278 fm3 = random.randint(1, fmRange)
279 fz3 = random.randint(1, fmRange * Range)
280
281 f1 = Fraction(fz1, fm1)
282 f2 = Fraction(fz2, fm2)
283 f3 = Fraction(fz3, fm3)
284
285 if (sign1 == '/'): # 伪随机
286 if (f1 > f2):
287 Fractional_Calcu(i, r, signNum)
288 return 0
289 if (sign2 == '-' and int(cal(f1, sign1, f2)) < f3):
290 Fractional_Calcu(i, r, signNum)
291 return 0
292 if (sign2 == '/' and int(cal(f1, sign1, f2)) > f3):
293 Fractional_Calcu(i, r, signNum)
294 return 0
295 elif (sign1 == '-'):
296 if (sign2 == '+' and f1 < f2):
297 Fractional_Calcu(i, r, signNum)
298 return 0
299 if (sign2 == '-'):
300 if (f1 < f2):
301 Fractional_Calcu(i, r, signNum)
302 return 0
303 if (int(cal(f1, sign1, f2) < f3)):
304 Fractional_Calcu(i, r, signNum)
305 return 0
306 if (sign2 == '*' and f1 < int(cal(f2, sign2, f3))):
307 Fractional_Calcu(i, r, signNum)
308 return 0
309 if (sign2 == '/'):
310 if (f2 > f3):
311 Fractional_Calcu(i, r, signNum)
312 return 0
313 if (f1 < int(cal(f2, sign2, f3))):
314 Fractional_Calcu(i, r, signNum)
315 return 0
316 elif(sign1 == '*'):
317 if (sign2 == '-' and cal(f1, sign1, f2) < f3):
318 Fractional_Calcu(i, r, signNum)
319 return 0
320 if ((sign2 == '/' and cal(f1, sign2, f2) > f3)):
321 Fractional_Calcu(i, r, signNum)
322 return 0
323 else:
324 if (sign2 == '-' and cal(f1, sign1, f2) < f3):
325 Fractional_Calcu(i, r, signNum)
326 return 0
327 if ((sign2 == '/' and f2 > f3)):
328 Fractional_Calcu(i, r, signNum)
329 return 0
330
331
332 if( sign1 == '*' or sign1 =='/'): #计算
333 answer = cal( cal(f1,sign1,f2) , sign2 , f3 )
334 else:
335 if(sign2 == '*' or sign2 =='/'):
336 answer = cal(f1,sign1,cal(f2,sign2,f3))
337 else:
338 answer= cal(cal(f1,sign1,f2),sign2,f3)
339
340 print('第', i, '题', end=": ")
341 question = '(', fz1, '/', fm1, ')', sign1, '(', fz2, '/', fm2, ')', sign2, '(', fz3, '/', fm3, ')'
342 question = "".join('%s' % id for id in question)
343 question = question.replace("/", "÷").replace("*", "×")
344 print(question, end=' = ')
345
346 else: # 一运算符算式
347 sign1 = st[random.randint(0, 3)] # 随机得符号
348 fm1 = random.randint(1, fmRange) # 随机分数 分母fm 分子fz
349 fz1 = random.randint(1, fmRange * Range)
350 fm2 = random.randint(1, fmRange)
351 fz2 = random.randint(1, fmRange * Range)
352
353 f1 = Fraction(fz1, fm1) # 得两分数
354 f2 = Fraction(fz2, fm2)
355
356 if (sign1 == '-' and f1 < f2): # 伪随机
357 Fractional_Calcu(i, r, signNum)
358 if (sign1 == '/' and f1 > f2):
359 Fractional_Calcu(i, r, signNum)
360
361 print('第', i, '题', end=": ")
362 answer = cal(f1, sign1, f2) # 得结果
363 question = '(', fz1, '/', fm1, ')', sign1, '(', fz2, '/', fm2, ')'
364 question = "".join('%s' % id for id in question)
365 question = question.replace("/", "÷").replace("*", "×")
366 print(question, end=' = ')
367
368 # 假分数 变 带分数
369 if (answer % 1): # 判断计算结果是否是整数
370 if (answer > 1):
371 n = str(answer).index('/') # 找出 除号的位置来当分界符 得到分子和分母
372 t = 0
373 fz = 0
374 fm = 0
375 l = len(str(answer))
376 while (t < n): # 分子
377 fz = int(str(answer)[t]) + fz * 10
378 t = t + 1
379
380 t = t + 1 # 跳过 '/'
381
382 while (t < l): # 得分母
383 fm = int(str(answer)[t]) + fm * 10
384 t = t + 1
385
386 num = 0
387 if (fz > fm):
388 num = fz // fm
389 fz = fz % fm
390 print(str(num) + '`' + str(fz) + '/' + str(fm))
391 answer = str(num) + '`' + str(fz) + '/' + str(fm)
392 write_in(i, question, answer)
393
394 else:
395 print(answer)
396 write_in(i, question, str(answer))
397
398 else:
399 print(answer)
400 write_in(i, question, str(answer))
第一次:为了能随机运算符,就第一想法去找一下有没有能识别(字符型)运算符的函数,然后就找到了eval,为了eval就需要把数和运算符都用字符型表示,为了整合成整个式子,就找到了join 把字符变成字符串,这样就能靠这两个函数完成运算。
到了分数后,发现随机一个分数比较难实现,因为随机浮点数的话又会因为精度问题不好化为分数,所以采用了分子分母分开用随机整数,再让他们相除,从而得到分数,这样的分数也好进行运算。
其中为了能三个运算符的时候能按照优先度运算,还进行了分类讨论,想整合起来发现很难归类,所以还是采取了穷举法。
第二次:完成上面后,想开始实现伪随机(减法不得负数;除法不得假分数),发现很难实现。然后通过了解得到有个Fraction,这类计算后能得到整数和分数,比较好实现运算功能和化为带分数功能,所以改为用Fraction来代表每个需要运算的数。
然后开始实现化为带分数的功能,就将结果进行求余1来判断是否为整数,然后再想怎么读取分数的分子和分母。通过查阅得到index能识别字符串中的符号,并返回所在序列号,然后想到通过配合将结果转为str型然后 识别‘/’ 来读取分子位数,通过len得到整个分数的位数,从而得到分母的位数,并进行读取得到。然后就判断分子与分母的大小即可。
1 def write_in(i,question,answer): #将题目和答案分别写入文件
2 if ( int(i)==1 ):
3 f = open('questions.txt','a')
4 f.seek(0)
5 f.truncate()
6 f.close()
7 f = open('answers.txt','a')
8 f.seek(0)
9 f.truncate()
10 f.close()
11 f1 = open('questions.txt','a')
12 f1.write("第"+str(i)+"题:")
13 f1.write(question)
14 f1.write('\n')
15 f1.close()
16
17 f2 = open('answers.txt','a')
18 f2.write("第"+str(i)+"题答案:")
19 f2.write(answer)
20 f2.write('\n')
21 f2.close()
对于写入文件部分,在每一次的第一次录入之前,将文件进行清空。
4.测试运行
经过计算,我们认为我们得到的结果是正确的。
5.项目小结
吴哲翰:
1.在情况很多的时候,利用穷举进行分类讨论,是突破的好方法;
2.为了实现某些暂时不知道方法的功能时,可通过各种途径(库函数、百度、问人)去得到可能的方法。结对项目中配合和互相理解是项目能长久实现的基础。
姜达成:
在整个过程中,我负责对程序进行展示上的修改,但是对于算法上的优化我并没有十分理解,导致在第一版的程序中做不到运行10000题,运行到600左右程序就停止了,后面哲翰进行了调整才可以运行。因此我认为结对项目相比于个人项目来说更加注重于分工、合作,毕竟两个人合作肯定是优于一个人单打独斗的。
原文地址:https://www.cnblogs.com/niandai/p/12679468.html
- 微信小程序之生物识别
- 【sklearn机器学习】——应用机器学习的建议
- BFC用途总结
- Android安装包相关知识汇总
- 【独家】手把手教线性回归分析(附R语言实例)
- 四两拨千斤:借助Spark GraphX将QQ千亿关系链计算提速20倍
- 仿微信聊天表情发送
- ASP.NET Web API对OData的支持
- 小技巧 - 简化你的泛型API
- 优化OEA中的聚合SQL
- Universal Image Loader for Android 使用实例
- 如何从 Ring Buffer 读取?
- OEA中的AutoUI重构(1) - Command自动生成
- 开源项目Universal Image Loader for Android
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Phantomjs网页前端自动化测试之利器
- Ansible自动化运维学习笔记3
- Keepalived高可用服务解决方案
- pandas与SQL的查询语句对比
- 使用tensorflow搭建线性回归模型
- Flask-Admin修改成中文显示
- 什么是需求分析呢?
- 使用Pandas处理杂乱数据
- 在flask中使用flask-migrate管理数据库
- 直播视频网站源码,实现移动端的按钮拖动
- 解决k8s集群环境内存不足导致容器被kill问题
- NLP之pyhanlp安装及其使用
- nginx 代理 web socket 报错“WebSocket is already in CLO
- IDEA为每个文件加入姓名,日期,版本号
- nginx 代理 web socket 报错“WebSocket is already in CLO