题目:
小学老师要每周给同学出300道四则运算练习题。
要求:
1、两个运算符,100内数字
2、打印方式为,不需要写出答案,或者需要写出答案,并且保证答案在0...100之间
更多细节:
1、是否有乘除法,是否有括号,数值范围,加减有无负数
2、除法有无余数,是否支持分数,打印中每行的间距可调整
实现:
1、根据给定的数值范围,随机生成3个运算数。
2、先判断是否需要乘除法,在符号列表中随机选取“加减乘除”符号。
3、判断是否需要括号,若需要括号,则生成有效括号:同级运算在前一项加括号,非同级运算在低级运算加括号。
4、生成算式后,根据运算顺序判断,减法与除法是否符合要求。保证加减无负数,只需保证所有减法都无负数出现即可。
5、判断计算结果是否在0到100之间。
6、若上述要求都符合,则生成的算式符合要求。
7、将生成的算式,按照要求输出。
1 import random
2 import re
3 # is_mul表示是否有乘除法,0表示无(加减法),1表示有乘除法
4 is_mul = 1
5 # is_brackets表示是否有括号,0表示无,1表示有括号
6 is_brackets = 1
7 # num_min表示随机数的最小值,num_max表示随机数的最大值
8 num_min = 0
9 num_max = 100
10 # is_positive表示结果(包括中间计算过程)是否是正数,0表示可以不为正数,1表示结果为正数,默认为1结果为正数
11 is_positive = 1
12 # is_divide表示是否是整除,0表示可以不为整除,1表示是整除,默认为整除
13 is_divide = 1
14 # list_sign符号列表
15 list_sigh = ['+', '-', '*', '/']
16 # 所需算式的数量,默认为100
17 amount = 5
18 # 是否保证结果在100以内,0表示不需在100以内,1表示结果保证在100以内
19 is_within = 0
20 # 打印方式,0表示只打印题目,1表示打印题目加答案
21 print_type = 0
22 # 一行打印几道题
23 print_num = 3
24
25
26 # 添加括号函数,当在第二项添加括号时,返回值为2
27 def add_brackets(num1, num2, num3, sign1, sign2):
28 # print(str(num1)+list_sigh[sign1]+str(num2)+list_sigh[sign2]+str(num3))
29 # 如果都为加减法
30 if (sign1 < 2 and sign2 < 2) or (sign1 > 2 and sign2 > 2):
31 # print("同号")
32 s = str(num1)+list_sigh[sign1]+'('+str(num2)+list_sigh[sign2]+str(num3)+')'
33 else:
34 # print("异号")
35 # 异号时在+-时加括号
36 if sign1 < 2:
37 s = '('+str(num1)+list_sigh[sign1]+str(num2)+')'+list_sigh[sign2]+str(num3)
38 else:
39 s = str(num1)+list_sigh[sign1]+'('+str(num2)+list_sigh[sign2]+str(num3)+')'
40 return s
41
42
43 # 判断减法
44 def judge_subtraction(num1, num2):
45 if is_positive == 0: # 当结果可以为负数时,不需要判断直接返回True
46 return True
47 else:
48 r = num1 - num2
49 if r < 0:
50 # print('减法出现负数')
51 return False
52 else:
53 # print('减法为正数')
54 return True
55
56
57 # 判断除法
58 def judge_division(num1, num2):
59 if num2 == 0:
60 # print('除数为0')
61 return False
62 if is_divide == 0: # 表示除法可以不为整除,直接返回True
63 return True
64 else:
65 r = num1 % num2
66 if r == 0:
67 # print('整除')
68 return True
69 else:
70 # print('有余数')
71 return False
72
73
74 # 含单个运算符的运算
75 def calculate_single(num1, num2, sign):
76 if sign == '-':
77 return judge_subtraction(num1, num2)
78 elif sign == '/':
79 return judge_division(num1, num2)
80 else:
81 return True
82
83
84 # 按顺序从前向后算
85 def calculate_order(num_list, sign_list):
86 if calculate_single(num_list[0], num_list[1], sign_list[0]):
87
88 t = eval(str(num_list[0]) + sign_list[0] + str(num_list[1]))
89 if calculate_single(t, num_list[2], sign_list[1]):
90 return True
91 else:
92 return False
93 else:
94 return False
95
96
97 # 先算后项,在算前项
98 def calculate_exchange(num_list, sign_list):
99 if calculate_single(num_list[1], num_list[2], sign_list[1]):
100 t = eval(str(num_list[1]) + sign_list[1] + str(num_list[2]))
101 # print(t)
102 if calculate_single(num_list[0], t, sign_list[0]):
103 return True
104 else:
105 return False
106 else:
107 return False
108
109
110 # 判断生成的算式是否符合要求
111 def judge_function(ss):
112 # 提取算式中的数字
113 num_list = re.findall(r'\d+', ss)
114 num_list = [int(x) for x in num_list]
115 # 提取算式中的+-*/符号
116 sign_list = re.findall(r"[\-\*\+\/]", ss)
117 if is_positive == 0 and is_divide == 0:
118 # 当结果可以不为正数,除法可以不为整除时,直接返回true
119 return True
120 else:
121 # 当需要判断时,进行判断,先判断是否含有减法以及除法,再根据计算顺序进行判断
122 if (ss.find('-') == -1) and (ss.find('/') == -1):
123 # 算式中不包含除法和减法时,直接返回true
124 # print('不需判断')
125 return True
126 else:
127 # 当要进行减法,除法判断时,分带不带括号,以及运算级来判断先算前项还是先算后项
128 # print('需判断')
129 if ss.endswith(')'):
130 # print('括号在后')
131 return calculate_exchange(num_list, sign_list)
132 elif ss.startswith('('):
133 # print('括号在前')
134 return calculate_order(num_list, sign_list)
135 elif (sign_list[0] == '-' or sign_list[0] == '+') and (sign_list[1] == '*' or sign_list[1] == '/'):
136 # print('先计算二')
137 return calculate_exchange(num_list, sign_list)
138 else:
139 # print('先计算一')
140 return calculate_order(num_list, sign_list)
141
142
143 # 打印输出函数
144 def print_function(question_list, answer_list):
145 if print_type == 0:
146 for i in range(amount):
147 print(question_list[i], end=" ")
148 if (i + 1) % print_num == 0:
149 print('\n')
150 else:
151 for i in range(amount):
152 print(question_list[i], "=", answer_list[i], end=" ")
153 if (i + 1) % print_num == 0:
154 print('\n')
155
156
157 # num1,num2,num3表示生成的三个随机数
158 def main():
159 i = 0
160 question_list = []
161 answer_list = []
162 global is_mul, is_brackets, num_min, num_max, is_positive, is_divide, amount, is_within, print_type, print_num
163 is_mul = int(input("是否需要乘除法?0表示不需要,1表示需要:"))
164 is_brackets = int(input("是否需要括号?0表示不需要,1表示有括号:"))
165 num_min = int(input("请输入运算数的最小值:"))
166 num_max = int(input("请输入运算数的最大值:"))
167 amount = int(input("请输入需要运算式的数量:"))
168 is_within = int(input("结果是否需要保证在100以内?0表示不需要,1表示需要:"))
169 is_positive = int(input("结果(包括中间运算结果)是否都>=0?0表示可以为负数,1表示都为>=0:"))
170 is_divide = int(input("是否都为整除?0表示可以不为整除,1表示都为整除:"))
171 print_type = int(input("打印方式?0表示只打印题目,1表示打印题目和结果:"))
172 print_num = int(input("一行打印几道题?"))
173
174 while i < amount:
175 num1 = random.randint(num_min, num_max)
176 num2 = random.randint(num_min, num_max)
177 num3 = random.randint(num_min, num_max)
178 # 判断是否有乘除法,无乘除法在list_sign下标0-2中选择,有乘除法在list_sign下标0-3之间选
179 if is_mul == 0:
180 sign1 = random.randint(0, 1)
181 sign2 = random.randint(0, 1)
182 else:
183 sign1 = random.randint(0, 3)
184 sign2 = random.randint(0, 3)
185 # print(list_sigh[sign1],list[sign2])
186 # 判断是否加括号:条件is_brackets为1表示有括号,1/3的概率随机生成括号
187 if is_brackets == 1 and (random.randint(0, 3) % 3) == 0:
188 str_form = add_brackets(num1, num2, num3, sign1, sign2)
189 else:
190 str_form = str(num1)+list_sigh[sign1]+str(num2)+list_sigh[sign2]+str(num3)
191 # print(str_form)
192 # print(judge_function(str_form))
193 if judge_function(str_form):
194 result = eval(str_form)
195 # 当需要保证结果在100以内且结果在0-100以内,或者不需结果在100以内时,将结果加入列表中
196 if (is_within == 1 and 100 >= result >= 0) or is_within == 0:
197 question_list.append(str_form)
198 answer_list.append(result)
199 i = i+1
200 print_function(question_list, answer_list)
201
202
203 if __name__ == '__main__':
204 main()
View Code
运行结果: