1. 程式人生 > 實用技巧 >Collection集合、Iterator介面(迭代器)、泛型

Collection集合、Iterator介面(迭代器)、泛型

題目:

  小學老師要每週給同學出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

執行結果: