第3次作業-四則運算
要求0
作業要求部落格:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2266
要求1
git倉庫地址:https://git.coding.net/neneee/f4.git
百度網盤連結:https://pan.baidu.com/s/1xdEPIGrmMGWihGihMwPEVg
exe過大存放至網盤
要求2
- 結對程式設計同學
潘樂冰:https://www.cnblogs.com/panlb/
- 介紹解題思路:
功能一要接受輸入,生成n次4個隨機整數和3個隨機運算子,進行+、-、*、/四則運算。
對於除法要額外考慮將分母通分以避免出現精度錯誤,並且不能除0;
對於小數位數要做相應處理;判斷使用者答案並計數
功能二在功能一的基礎上要隨機生成小數,隨機出現(),
功能三在功能二的基礎上要對錶達式除重,生成指定路徑檔案,保證格式正確
- 每個功能的重點/難點:
功能一:重點生成隨機元素,除法的改進;難點除法的改進,結果是整數不能輸出小數點
功能二:重點/難點對()進行新增及運算
功能三:重點檔案讀寫;難點表示式除重,格式調整
- 程式設計結果展示:
功能一:
功能二:
功能三:
- 展示重要程式碼片斷:
判斷使用者輸入是否合法:
arg列表存放使用者輸入
1 try: 2 n = int(arg[2]) 3 if(n <= 0): 4 print("題目數量範圍為1到100之間的正整數。") 5 os._exit(0) 6 7 #此處省略處理程式碼 8 9 except: 10 print("題目數量範圍為1到100之間的正整數。") 11 os._exit(0)
生成隨機元素:
得到運算數列表num,運算子列表op
1)功能一
1 operator = ['+','-','*','/'] 2 numList = np.random.randint(1,10,4) 3 num = list(numList)
4 5 opList = np.random.randint(0,4,3) 6 op = [] 7 for i in opList: 8 op.append(operator[i])
2)功能二
1 operator = ['+', '-', '*', '/'] 2 numList = np.random.randint(1, 10, 5) 3 num = list(numList) 4 index = np.random.randint(0, 4) 5 if (np.random.random() > 0.5): 6 num[index] = round(np.random.uniform(1, 10), 2) 7 del num[4] 8 else: 9 num.remove(num[index]) 10 11 opList = np.random.randint(0, 4, 3) 12 op = [] 13 for i in opList: 14 op.append(operator[i]) 15 if (np.random.random() > 0.1): 16 index1 = np.random.randint(0, 4) 17 index2 = np.random.randint(0, 4) 18 if index1 - index2 < 2 and index1 - index2 > -2: 19 i 20 elif index1 > index2: 21 if index1 == 4: 22 op.append(')') 23 op.insert(index2, '(') 24 else: 25 op.insert(index2, '(') 26 op.insert(index1, ')') 27 else: 28 if index2 == 4: 29 op.append(')') 30 op.insert(index1, ')') 31 else: 32 op.insert(index1, '(') 33 op.insert(index2, ')')
檔案讀寫:
path為檔案儲存路徑;生成檔案的格式,控制表示式的右對齊而不是結果的左對齊
1 path = arg[4] 2 f = open(path,"w") 3 4 f.write(s.ljust(15, " ")) 5 cal_ans = eval(s) 6 ans_list = re.split('(\.)', str(cal_ans)) 7 if (len(ans_list) > 1): 8 if (len(ans_list[2]) > 5): 9 ans_list[2] = ans_list[2][0:3] 10 cal_ans = ''.join([str(x) for x in ans_list]) 11 if (ans_list[2] == '0'): 12 cal_ans = ans_list[0] 13 14 f.write("\t") 15 f.write(str(cal_ans)) 16 f.write("\n")
- 展示你感覺得意、突破、困難的地方:
帶括號表示式的連線
1 (num, op) = getEle2() 2 s="" 3 lenOp = len(op) 4 lenNum = len(num) 5 if lenOp == 3: 6 for index, i in enumerate(num): 7 s += str(i) 8 if index <= lenOp - 1: 9 s += op[index] 10 else: 11 k = 0 12 if op[0] == '(': 13 s += op[0] 14 k += 1 15 for index, i in enumerate(num): 16 s += str(i) 17 if index + k < lenOp: 18 s += op[index + k] 19 if index + k + 1 < lenOp and op[index + k + 1] == '(': 20 k += 1 21 s += op[index + k] 22 elif index + k + 1 < lenOp and op[index + k] == ')': 23 k += 1 24 s += op[index + k]
處理整數的小數點以及小數:
1 ans_list = re.split('(\.)', str(cal_ans)) 2 if (len(ans_list)>1): 3 if (len(ans_list[2]) > 5): 4 ans_list[2] = ans_list[2][0:3] 5 cal_ans = ''.join([str(x) for x in ans_list]) 6 if (ans_list[2] == '0'): 7 cal_ans = ans_list[0]
- 給出結對程式設計的體會:
1、程式設計是快樂的;
2、結對程式設計是更快樂的,思想的碰撞讓我們互相促進,互相提高;
3、分工協作非常有必要;
4、遇到困難十分需要冷靜思考;
5、簡單方法通常能有效的解決問題;
6、要儘量瞭解使用的語言,能省不少事兒。
- 在編碼、爭論等活動中花費時間較長,給你較大收穫的事件:
思想步調一致,基本沒有衝突
花費時間較長在於對於()計算的處理:重要的是理清思路,對於報錯資訊可以先預處理,以便明確出錯原因
- 結對程式設計留念:
- 題外話: python 打包成exe多數會比較大,不適用。不好搞啊不好搞。