一个自动生成小学四则运算题目的命令行程序(Python实现)

时间:2020-04-12
本文章向大家介绍一个自动生成小学四则运算题目的命令行程序(Python实现),主要包括一个自动生成小学四则运算题目的命令行程序(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