演算法實驗1(三門全及格)
阿新 • • 發佈:2022-04-14
1. 利用陣列實現原始資訊與處理結果的對應儲存。
一次考試共考了語文、代數和外語三科。某小組共有九人,考後各科及格名單如下表,請編寫演算法找出三科全及格的學生的名單(學號)。各科及格學生的學號如下表,編寫程式依次輸入及格學生的學號,輸出3科全部及格的學生學號。
思考:
(1)怎樣用更方便的儲存方式提高演算法的效率?
(2)分析設計的演算法的時間複雜度。
思路1:列舉法
拿語文學號和代數依次比較,如果相同,則執行下一層迴圈,和外語作比較,找到相同的進行輸出
1 a = [] 2 yw = int(input('請輸入語文及格學生的學號,輸入-1結束:')) 3 whileyw != -1: 4 a.append(yw) 5 yw = int(input('請輸入語文及格學生的學號,輸入-1結束:')) 6 7 b = [] 8 ds = int(input('請輸入代數及格學生的學號,輸入-1結束:')) 9 while ds != -1: 10 b.append(ds) 11 ds = int(input('請輸入代數及格學生的學號,輸入-1結束:')) 12 13 c = [] 14 wy = int(input('請輸入外語及格學生的學號,輸入-1結束:')) 15 while wy != -1:16 c.append(wy) 17 wy = int(input('請輸入外語及格學生的學號,輸入-1結束:')) 18 print('三科全及格學生學號:',end = '') 19 for i in range(0,len(a)): 20 key = a[i] 21 for j in range(0,len(b)): 22 if b[j] != key: 23 continue 24 for k in range(0,len(c)): 25 if key==c[k]: 26 print(key,end = ' ') 27 break
錯誤點:
1、第一次測試時候, 程式碼的while迴圈裡沒有這個語句,結果只能輸一次學號
yw = int(input('請輸入語文及格學生的學號,輸入-1結束:'))
2、第二次,我以為是因為沒有加end = ' '這個語句(我不知道這個語句是幹啥的),加上後,依舊沒有輸出
3、我又檢查了一遍程式碼,查了下break用法,原來這裡應該用continue而不是break。。。
for j in range(0,len(b)): if b[j] != key: continue
改進:我希望能一直執行這些程式碼,而不是一輪就結束了,而且當輸入負數時會報錯,讓重新輸入
1 while True: 2 a = [] 3 yw = int(input('請輸入語文及格學生的學號,輸入-1結束:')) 4 while yw !=-1: 5 if yw > -1: 6 a.append(yw) 7 yw = int(input('請輸入語文及格學生的學號,輸入-1結束:')) 8 else: 9 yw = int(input('請重新輸入大於零的學號,輸入-1結束:')) 10 11 b = [] 12 ds = int(input('請輸入代數及格學生的學號,輸入-1結束:')) 13 while ds != -1: 14 if ds > -1: 15 b.append(ds) 16 ds = int(input('請輸入代數及格學生的學號,輸入-1結束:')) 17 else: 18 ds = int(input('請重新輸入大於零的學號,輸入-1結束:')) 19 20 c = [] 21 wy = int(input('請輸入外語及格學生的學號,輸入-1結束:')) 22 while wy != -1: 23 if wy > -1: 24 c.append(wy) 25 wy = int(input('請輸入外語及格學生的學號,輸入-1結束:')) 26 else: 27 wy = int(input('請重新輸入大於零的學號,輸入-1結束:')) 28 29 print('三科全及格學生學號:',end = '') 30 for i in range(len(a)): 31 key = a[i] 32 for j in range(len(b)): 33 if b[j] != key: 34 continue 35 for k in range(len(c)): 36 if key==c[k]: 37 print(key,end = ' ') 38 break 39 print('\n==================================')
改進【未來】:裡面模式都差不多,希望有種方法可以讓我壓縮程式碼
思路2:
用陣列a的九個下標分量作為各學號考生及格科目的計數器。將3科共存一個數組,當掃描完畢總及格名單後,凡計數器的值為3,就是3科全部及格的學生。否則,至少有一科未及格。
1 a = [] 2 for i in range(1,11): 3 a.append(0) 4 xh = int(input("請輸入及格學生的學號1--9,輸入-1結束:")) 5 while xh != -1: 6 a[xh] += 1 7 xh= int(input("請輸入及格學生的學號1--9,輸入-1結束:")) 8 print("三科全部及格的學生:", end="") 9 for xh in range(1,10): 10 if a[xh] == 3: #若將3改為其他數n,則求得的是n科成績及格的學生 11 print(xh,end=" ")
【參考CSDN——python小明】
學到的知識點:
1、end="" 的用處就是表示該行 print 後還沒有結束,後面還有內容,取消換行,end=‘ ’引號裡面可以加空格,進行分隔
2、break:終止當前迴圈,如果只有一層,則執行迴圈後面的程式碼,如果不止一層,跳到上一層
continue:跳過此次迴圈