資源簡介 (共22張PPT)5.4 數 據 查 找——查找算法的應用冊 別:選擇性必修1學 科:高中信息技術(浙教版)學習目標:能對給定的文件中的數據進行抽象并建立模型。能合理選用數據結構,設計查找算法。能用Python語言編寫具體的查找程序。能自覺對學習生活具體問題抽象建模、設計算法并編寫程序及調試程序。閱讀教材P141-144,可根據個性學習暫停或加速播放課程。查找應用:想一想:航空公司VIP會員積分查詢部分數據(Excel數據)VIP號 姓名 飛行里程(KM) 積分600214 韓江輝 16801 519601278 蔣志來 5321 78600815 李亞東 28745 436607854 王慶生 1861 39605719 李燕 7493 138603532 王曉燕 6875 102600101 鄭煜明 14253 236600087 蔡佳寧 112703 958(一)抽象與建模問題:從表中的數據可以看出,每個會員的信息是一條記錄,包括VIP號、姓名、飛行里程、積分等數據項。實踐體驗:Excel表格中,對記錄快速查詢會員積分,查找應當如何進行?VIP號 姓名 飛行里程(KM) 積分600214 韓江輝 16801 519601278 蔣志來 5321 78600815 李亞東 28745 436607854 王慶生 1861 39605719 李燕 7493 138603532 王曉燕 6875 102600101 鄭煜明 14253 236600087 蔡佳寧 112703 958(二)設計算法與數據結構:請思考:數據組織形式有兩種,哪種更適合?數據查找算法有兩種,哪種更方便?(二)設計算法與數據結構數據組織形式有兩種,哪種更方便?方法一是采用4個一維數組按列存儲,即每個數組分別存儲每個用戶的VIP號、姓名、飛行里程(KM) 、積分等,如定義a數組存儲表中每個用戶的VIP號,其對應的值為[“600214”,” 601278 ” ,” 600815 ” ,” 607854” , ” 605719” ……];定義b數組存儲表中姓名;定義c數組存儲表中飛行里程(KM);定義d數組存儲表中積分信息。a b c dVIP號 姓名 飛行里程(KM) 積分600214 韓江輝 16801 519601278 蔣志來 5321 78600815 李亞東 28745 436607854 王慶生 1861 39605719 李燕 7493 138603532 王曉燕 6875 102600101 鄭煜明 14253 236600087 蔡佳寧 112703 958b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]d[0]d[1]d[2]d[3]d[4]d[5]d[6]d[7]a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7](二)設計算法與數據結構數據組織形式有兩種,哪種更方便?方法二是采用1個一維數組按行存儲,每個數組元素對應某個國家的一條記錄信息,如a[1]為[600214,韓江輝,16801 ,519]對應第一條記錄的相關信息。VIP號為索引值[0]的元素積分為索引值[3]的元素VIP號 姓名 飛行里程(KM) 積分600214 韓江輝 16801 519601278 蔣志來 5321 78600815 李亞東 28745 436607854 王慶生 1861 39605719 李燕 7493 138603532 王曉燕 6875 102600101 鄭煜明 14253 236600087 蔡佳寧 112703 958a[i][0] a[i][1] a[i][2] a[i][3]a[1][0] a[1][1] a[1][2] a[1][3]a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7](二)設計算法與數據結構:請思考:數據查找算法有兩種,哪種更方便?查找可采用順序查找算法或二分查找算法,對數據進行一次查找,采用順序查找算法。對數據重復查找,二分查找算法的效率高于順序查找算法,但二分查找提前:被查找的數據序列必須是有序,即在查找VIP號前要按VIP號為關鍵字進行排序。(三)編寫程序并調試#數據讀入import csv #導入csv模塊csvFile = open("vip.csv", "r") #打開vip.csv數據文件reader = csv.reader(csvFile) )#建立一個讀入數據的對象readera = [] #定義空列表afor item in reader: #每一行為a列表一個元素a.append(item) #csv通過這種樣式讀入的數據為字符串csvFile.close() #關閉vip.csv數據文件for i in range(len(a)): #輸出VIP表信息print(a[i])key=input('請輸入要查詢的VIP號:') #輸入要查詢的VIP號:key為字符串#順序查找f=False #設置沒查找標記for i in range(1,len(a)): #查詢范圍不包含第一行數據if a[i][0]==key: #逐一比較m=i #記錄找到了的位置f=True #標記查找成功break #結束查找if f==True: #標記查找成功,輸出信息print(a[m][1],"先生/女士,',您的積分為:",a[m][3])else: #查找不成功,輸出信息print('找不到VIP號對應的用戶信息!')(算法一:順序查找)待查詢文件在vip.csv中VIP號 姓名 飛行里程(KM) 積分600214 韓江輝 16801 519601278 蔣志來 5321 78600815 李亞東 28745 436607854 王慶生 1861 39VIP號 姓名 飛行里程(KM) 積分(三)編寫程序并調試#數據讀入import csv #導入csv模塊csvFile = open("vip.csv", "r") #打開vip.csv數據文件reader = csv.reader(csvFile) )#建立一個讀入數據的對象readera = [] #定義空列表afor item in reader: #每一行為a列表一個元素,此元素為字符串a.append(item) #csv通過這種樣式讀入的數據為字符串csvFile.close() #關閉vip.csv數據文件for i in range(len(a)): #輸出VIP表信息print(a[i])key=input('請輸入要查詢的VIP號:') #輸入要查詢的VIP號:key為字符串#順序查找f=False #設置沒查找標記for i in range(1,len(a)): #查詢范圍不包含第1行數據if a[i][0]==key: #逐一比較m=i #記錄找到了的位置f=True #標記查找成功break #結束查找if f==True: #標記查找成功,輸出信息print(a[m][1],"先生/女士,',您的積分為:",a[m][3])else: #查找不成功,輸出信息print('找不到VIP號對應的用戶信息!')(算法一:順序查找)#數據讀入import csv #導入csv模塊csvFile = open("vip.csv", "r") #打開vip.csv數據文件reader = csv.reader(csvFile) #建立一個讀入數據的對象readera = [] #定義空列表afor item in reader: #每一行為a列表一個元素,此元素為字符串a.append(item) #csv通過這種樣式讀入的數據為字符串csvFile.close() #關閉vip.csv數據文件for i in range(len(a)): #輸出VIP表信息print(a[i])key=input('請輸入要查詢的VIP號:') #輸入要查詢的VIP號:key為字符#順序查找def seq_search(a,key):global m #定義全局變量mf=False #設置沒查找標記for i in range(1,len(a)): #查詢范圍不包含第一行數據if a[i][0] ==key: #逐一比較f=True #標記查找成功m=i #記錄找到了的位置break #結束查找return f #返回ff=seq_search(a,key)if f==True: #標記查找成功,輸出信息print(a[m][1],"先生/女士,',您的積分為:",a[m][3])else: #查找不成功,輸出信息print('找不到VIP號對應的用戶信息!')(三)編寫程序并調試(算法一:順序查找)#數據讀入import csv #導入csv模塊csvFile = open("vip.csv", "r") #打開vip.csv數據文件reader = csv.reader(csvFile) #建立一個讀入數據的對象readera = [] #定義空列表afor item in reader: #每一行為a列表一個元素,此元素為字符串a.append(item) #csv通過這種樣式讀入的數據為字符串csvFile.close() #關閉vip.csv數據文件for i in range(len(a)): #輸出VIP表信息print(a[i])key=input('請輸入要查詢的VIP號:') #輸入要查詢的VIP號:key為字符#順序查找def seq_search(a,key):global m #定義全局變量mf=False #設置沒查找標記for i in range(1,len(a)): #查詢范圍不包含第一行數據if a[i][0] ==key: #逐一比較f=True #標記查找成功m=i #記錄找到了的位置break #結束查找return f #返回ff=seq_search(a,key)if f==True: #標記查找成功,輸出信息print(a[m][1],"先生/女士,',您的積分為:",a[m][3])else: #查找不成功,輸出信息print('找不到VIP號對應的用戶信息!')(三)編寫程序并調試(算法二:二分查找)import csv #導入csv模塊#數據讀入csvFile = open("vip.csv", "r") #打開vip.csv數據文件reader = csv.reader(csvFile)#建立一個讀入數據的對象readera = [] #定義空列表afor item in reader:#每一行為a列表一個元素,此元素為字符串a.append(item) #csv通過這種樣式讀入的數據為字符串csvFile.close() #關閉vip.csv數據文件#冒泡排序for i in range(1,len(a)):for j in range(1,len(a)-i):if int(a[j][0])>int(a[j+1][0]): #升序排序a[j],a[j+1]=a[j+1],a[j]print('排序后:')for i in range(len(a)):#輸出排序后的VIP表信息print(a[i])key=int(input('請輸入要查詢的VIP號:'))#二分查找i = 1 #查找范圍不包含第一行數據,左端點初值1j = len(a)-1 #右端點初值為最后一個元素索引值f=False #設置查找標記while i <= j:m = (i+j) //2 #確定中點if int(a[m][0]) ==key:#key與中點VIP號相等f=True #標記查找成功break #結束查找if key < int(a[m][0]): #key<中點VIP號j = m-1 #到左半區間找else: #key>中點VIP號i = m+1 #到右邊區間找if f==True: #標記查找成功,輸出信息print(a[m][1],"先生/女士,您的積分為:",a[m][3])else:print('找不到VIP號對應的用戶信息!')(三)編寫程序并調試(算法二:二分查找)import csv #導入csv模塊#數據讀入csvFile = open("vip.csv", "r") #打開vip.csv數據文件reader = csv.reader(csvFile)#建立一個讀入數據的對象readera = [] #定義空列表afor item in reader:#每一行為a列表一個元素,此元素為字符串a.append(item) #csv通過這種樣式讀入的數據為字符串csvFile.close() #關閉vip.csv數據文件#冒泡排序for i in range(1,len(a)):for j in range(1,len(a)-i):if int(a[j][0])>int(a[j+1][0]): #升序排序a[j],a[j+1]=a[j+1],a[j]print('排序后:')for i in range(len(a)):#輸出排序后的VIP表信息print(a[i])key=int(input('請輸入要查詢的VIP號:'))#二分查找i = 1 #查找范圍不包含第一行數據,左端點初值1j = len(a)-1 #右端點初值為最后一個元素索引值f=False #設置查找標記while i <= j:m = (i+j) //2 #確定中點if int(a[m][0]) ==key:#key與中點VIP號相等f=True #標記查找成功break #結束查找if key < int(a[m][0]): #key<中點VIP號j = m-1 #到左半區間找else: #key>中點VIP號i = m+1 #到右邊區間找if f==True: #標記查找成功,輸出信息print(a[m][1],"先生/女士,您的積分為:",a[m][3])else:print('找不到VIP號對應的用戶信息!')(三)編寫程序并調試(算法二:二分查找)import csv #導入csv模塊#數據讀入csvFile = open("vip.csv", "r") #打開vip.csv數據文件reader = csv.reader(csvFile)#建立一個讀入數據的對象readera = [] #定義空列表afor item in reader:#每一行為a列表一個元素,此元素為字符串a.append(item) #csv通過這種樣式讀入的數據為字符串csvFile.close() #關閉vip.csv數據文件#冒泡排序函數def bubble_sort(d):for i in range(1,len(d)):for j in range(1,len(d)-i):if int(d[j][0])>int(d[j+1][0]):#升序排序d[j],d[j+1]=d[j+1],d[j]#二分查找函數def bsearch(s,array):i = 1 #查找范圍不包含第一行數據,左端點初值1j = len(array)-1#右端點初值為最后一個元素索引值f=False #設置查找標記while i <= j:m = (i+j) //2 #確定中點if int(array[m][0]) ==s:#s與中點VIP號相等return m #找到就結束查找,返回中點mif s < int(array[m][0]):#s<中點VIP號j = m-1 #到左邊區間找else: #s>中點VIP號i = m + 1 #到右邊區間找return -1 #未找到返回-1#主程序bubble_sort(a) #調用冒泡排序print('排序后:')for i in range(len(a)):#輸出排序后的VIP表信息print(a[i])key=int(input('請輸入要查詢的VIP號:'))m=bsearch(key,a) #調用二分查找函數if m !=-1: #標記查找成功,輸出信息print(a[m][1],"先生/女士,',您的積分為:",a[m][3])else: #未找到print('找不到VIP號對應的用戶信息!')(三)編寫程序并調試(算法二:二分查找)import csv #導入csv模塊#數據讀入csvFile = open("vip.csv", "r") #打開vip.csv數據文件reader = csv.reader(csvFile)#建立一個讀入數據的對象readera = [] #定義空列表afor item in reader:#每一行為a列表一個元素,此元素為字符串a.append(item) #csv通過這種樣式讀入的數據為字符串csvFile.close() #關閉vip.csv數據文件#冒泡排序函數def bsort(d):for i in range(1,len(d)):for j in range(1,len(d)-i):if int(d[j][0])>int(d[j+1][0]):#升序排序d[j],d[j+1]=d[j+1],d[j]#二分查找函數def bsearch(s,array):i = 1 #查找范圍不包含第一行數據,左端點初值1j = len(array)-1#右端點初值為最后一個元素索引值f=False #設置查找標記while i <= j:m = (i+j) //2 #確定中點if int(array[m][0]) ==s:#s與中點VIP號相等return m #找到就結束查找,返回中點mif s < int(array[m][0]):#s<中點VIP號j = m-1 #到左邊區間找else: #s>中點VIP號i = m + 1 #到右邊區間找return -1 #未找到返回-1#主程序bsort(a) #調用冒泡排序print('排序后:')for i in range(len(a)):#輸出排序后的VIP表信息print(a[i])key=int(input('請輸入要查詢的VIP號:'))m=bsearch(key,a) #調用二分查找函數if m !=-1: #標記查找成功,輸出信息print(a[m][1],"先生/女士,',您的積分為:",a[m][3])else: #未找到print('找不到VIP號對應的用戶信息!')學習生活中的應用實踐:校園一卡通號碼查詢。某校共n名學生,嚴老師編寫了一個校園一卡通號碼查詢程序,輸入號碼就能查詢該號碼所屬的班級和學生姓名。如右圖所示所有學生數據存儲在“校園一卡通.csv”表格中,該表格分別保存了本校所有學生的號碼、所在班級和姓名的信息,號碼的編碼規則為入學年份+班級加身份證號后三位。第i個學生的號碼保存在第1列中,對應的班級和姓名保存在第2列和第3列中。輸入號碼,電腦開始查找該號碼的信息,如果找到對應的信息,就顯示所屬班級和姓名,如果沒有找到,則顯示“沒有查詢到該號碼信息!”。學習生活中的應用實踐:相應程序如下,請在程序劃線①②③處填入相應的代碼,把程序補充完整。import csvflie1=open('校園一卡通.csv','r')reader=csv.reader(flie1)st=[]for it in reader:①flie1.close()# 冒泡排序for i in range(1,len(st)-1):for j in range(len(st)-1,i,-1):if ② :st[j],st[j-1]=st[j-1],st[j]for i in range(len(st)):print(st[i])# 二分查找key=input(‘請輸入需要查找的卡號:')i=1;j=len(st)-1while i<=j:m=(i+j)//2if ③ :i=m+1else:j=m-1if st[i][0]==key:print(st[0])print(st[i])else:print("沒有該號碼信息!")st.append(it)st[j][0]st[m][0]讀取csv文件數據st[m][0]>=key課堂小結抽象與建模編寫程序并調試查找算法的應用設計算法與數據結構學習評價對自己的表現進行客觀的評價,并思考后續完善的方向。(3=優秀,2=一般,1=仍需加油)評分項 自我評價能對vip.csv文件中的數據進行抽象并建立模型 3 2 1能對vip.csv數據選用合適的數據結構,設計查找算法 3 2 1能用Python語言編寫具體的查找程序。 3 2 1能自覺對學習生活具體問題抽象建模、設計算法并編寫程序及調試程序,如:查找姓名、查找校園卡號等實際應用。 3 2 1課后作業:2.用二分查找實現開平方根函數squareroot(x,p)。x是被開方的數,假定輸入的數都為非負數整數,p是誤差上限,輸出一個浮點數結果。程序代碼如下,請在劃線處填入合適的代碼。def ① :if x<0:return -1a=0b=xwhile a<=b:②if abs(m**2-x)return melif m**2>x:③else:a=mprint(square(2,0.01))print(square(1,0.01))print(square(9,0.01))print(square(100,0.01))1.D2.①square(x,p) ②m=(a+b)/2③b=m1.已知輸入a[0]至a[7]的值依次為“88,79,62,55,46,31,20,1”,查找某key值的程序段如下:i=0;j=7;n=0key=int(input())while i<=j:m=(i+j)//2if key==a[m]:breakelif key>a[m]:j=m-1;n-=1else:i=m+1;n+=1print(n)當輸入不同的key值,運行該程序后,輸出的不同結果共有:A.5種 B.6種C.7種 D.8種課后作業:3.某超市商品銷售表結構如下圖所示,為了模擬超市銷售系統的部分功能,某程序具有功能如下:1)程序運行后自動從shangpin.xlsx表中讀取商品信息,2)并按照“商品編號”從小到大的順序將所有商品信息排序。3)用戶輸入一個商品編號 ,程序自動查找是否存在該商品,若找到該商品,將該商品的銷量加1,并返回“操作已成功”的提示信息,若找不到該商品,則提示“不存在該商品”的提示信息。程序代碼如下,請在劃線處填入合適的代碼。import pandas as pddef check(x,y):i=xj=yflag=Falsewhile ① :m=(i+j)//2if int(a[m][0])==key:flag=Trueelif int(a[m][0])>key:j=m-1else:②if flag:a[m][3]=int(a[m][3])+1return flagif __name__=='__main__':df=pd.read_excel('shangpin.xlsx') #讀取文件a=df.values.tolist() #將Excel表中的數據轉換成列表#排序n=len(a)for i in range(1,n):for j in range(n-i):if int(a[j][0])>int(a[j+1][0]):a[j],a[j+1]= a[j+1],a[j]key=int(input("請輸入商品編號:"))if ③ :df=pd.DataFrame(a,columns=['商品編號','商品名稱','單價','銷售量'])④ #存入shangpin2.xlsx文件中print("恭喜,操作已完成!")else:print("對不起,不存在該商品,請重新輸入!")①i<=j and not flag②i=m+1③check(0,n-1)④df.to_excel("shangpin2.xlsx",index=False) 展開更多...... 收起↑ 資源預覽 縮略圖、資源來源于二一教育資源庫