1. 程式人生 > 其它 >演算法實驗1(三門全及格)

演算法實驗1(三門全及格)

1.      利用陣列實現原始資訊與處理結果的對應儲存。

一次考試共考了語文、代數和外語三科。某小組共有九人,考後各科及格名單如下表,請編寫演算法找出三科全及格的學生的名單(學號)。各科及格學生的學號如下表,編寫程式依次輸入及格學生的學號,輸出3科全部及格的學生學號。

 

思考:

(1)怎樣用更方便的儲存方式提高演算法的效率?

(2)分析設計的演算法的時間複雜度。

 

思路1:列舉法

 拿語文學號和代數依次比較,如果相同,則執行下一層迴圈,和外語作比較,找到相同的進行輸出

 1 a = []
 2 yw = int(input('請輸入語文及格學生的學號,輸入-1結束:'))
 3 while
yw != -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:跳過此次迴圈