當前快播:“趣味運動會項目”教學思路
2022-10-25 07:00:58 來源:程序員客棧
說在前面浙教版《選擇性必修一數據和數據結構》第一章是全書的導論,起到了提綱挈領的作用。其中“1.2.3 數據結構的作用”,通過兩個案例來說明對同一問題的解決,可以依據不同數據結構來設計算法,其效率是不一樣的。兩個案例較為典型,且有一定難度,教師應根據學生實際,采用算法分析、代碼講解或過程演示等不同方法授課。教材文本教材處理表1.2.1只顯示了部分學生的信息,雖然對于分析算法來說已經足夠了,但落實到具體的編程則稍顯不夠。為了便于編程,筆者把學生人數增加到6個,并修改班級編號為1-3,如下圖所示。學生任務單閱讀教材中“趣味運動會項目”材料,思考如何存儲和組織如上表格中的數據,并統計每位選手的總分和各班級的總分。(1)回顧數據元素和數據類型的概念,分析如上表格中有幾個數據元素?每個數據元素包含幾個數據項?各數據項的名稱是什么?屬于何種數據類型?(2)能否使用一維數組來存儲某條記錄,分別把該條記錄的各數據項依次作為數組元素?例如stu1= ["陳濤", 1,3,0,2,0,0,0,0],能把stu1稱之為數組嗎?為什么?(3)若使用一維數組來組織數據,想要把如上表格中的數據都存儲起來,需要幾個一維數組?每個數組分別存儲哪些數據?其元素屬于何種數據類型?編程輸出如下內容:(4)要在第(3)問基礎上編程統計每位選手的總分和各班級的總分,還需要創建幾個一維數組?其數據類型分別是什么?編程計算總分,并輸出如下內容:(5)二維數組有行優先和列優先存儲兩種方式,請分別用這兩種方式組織數據,實現程序功能,并分析與一維數組相比,它有何優缺點?(6)如下程序能夠存儲上述數據,并統計每位選手的總分和各班級的總分(輸出效果如下圖所示)。請仔細閱讀代碼,回答注釋中的提問,并將代碼補充完整。
xm = ["陳濤", "楊瓊", "金凱","吳敏", "朱剛強", "李海濤"]a = [[1,3,0,2,0,0,0,0],[3,0,0,0,0,5,1,0],[2,0,4,5,0,0,0,0], # a[0][1]、a[1][0]和a[2]的值分別是多少?[1,6,1,0,3,0,0,0],[2,5,0,1,0,7,0,0],[3,0,3,0,5,0,6,0]] # 這樣存儲數據有什么缺陷?# 輸出比賽得分信息print("姓名","班級","滾鐵圈","打彈子","拍紙板","竹蜻蜓","跳繩","踢毽子",sep="\t")for i in range(0,len(xm)):pass # 請編寫代碼,輸出如上圖所示的比賽得分信息# 計算個人總分和班級團體總分bjdf = [0] * 4 # 3個班為什么要分配4個元素空間?for i in range(0,len(xm)):for j in range(1, 7):a[i][7] = 填空1 # a[i][7]的值是什么?bjdf[a[i][0]] = 填空2 # a[i][0]的值是什么?bjdf[a[i][0]]的值是什么?print(a[i][7], end=", ")print() # 本條語句的功能是什么?若刪除它有何后果?print(bjdf)
(資料圖片僅供參考)
xm = ["陳濤", "楊瓊", "金凱", "吳敏", "朱剛強", "李海濤"]bj = [1, 3, 2, 1, 2, 3]d1 = [3, 0, 0, 6, 5, 0]d2 = [0, 0, 4, 1, 0, 3]d3 = [2, 0, 5, 0, 1, 0]d4 = [0, 0, 0, 3, 0, 5]d5 = [0, 5, 0, 0, 7, 0]d6 = [0, 1, 0, 0, 0, 6]# 輸出比賽信息print("姓名","班級","滾鐵圈","打彈子","拍紙板","竹蜻蜓","跳繩","踢毽子",sep="\t")for i in range(0, len(xm)):print(xm[i],bj[i],d1[i],d2[i],d3[i],d4[i],d5[i],d6[i],sep="\t")(4)可以創建一維數組tot用來存儲所有學生的總分,其中tot[i]表示編號為i的學生的總分;可以創建一維數組bjdf用來存儲所有學生的總分,其中bjdf[i]表示第i班的總分。它們的數據類型均為整型。編程計算總分,代碼如下:
# 計算個人總分和班級團體總分tot = [0] * 6bjdf = [0] * 4 # 3個班為什么要分配4個元素空間?for i in range(0, len(xm)):tot[i] = d1[i]+d2[i]+d3[i]+d4[i]+d5[i]+d6[i] # tot[i]的值是什么?bjdf[bj[i]] += tot[i] # bj[i]的值是什么?bjdf[bj[i]]的值是什么?# 輸出各選手總得分print("各選手總得分:")print("姓名","總分",sep="\t")for i in range(0, len(xm)):print(xm[i],tot[i],sep="\t")print("各班級總得分:")print("班級","總分",sep="\t")for i in range(1, max(bj)+1):print(i,bjdf[i],sep="\t")(5)使用二維數組按行優先存儲數據時,因為班級名稱也是用整數表示,可以把它和各項目得分一起存儲到數組中;但姓名是字符串,必須單獨處理。參考代碼如下:
xm = ["陳濤", "楊瓊", "金凱","吳敏", "朱剛強", "李海濤"]a =[[1,3,0,2,0,0,0,0],[3,0,0,0,0,5,1,0],[2,0,4,5,0,0,0,0],[1,6,1,0,3,0,0,0],[2,5,0,1,0,7,0,0],[3,0,3,0,5,0,6,0]]#按行優先存儲上述代碼中a[i]表示編號為i的學生的班級和各項目得分數據,符合人類的視覺感受,但畢竟班級名稱不是數值,不能參與算術運算,與項目得分還是有本質區別,故把它們放在一起不夠妥當??梢詫ΧS數組按列優先存儲數據,即把每一列的內容放在一維數組中。參考代碼如下:
xm = ["陳濤", "楊瓊", "金凱","吳敏", "朱剛強", "李海濤"]a = [[1, 3, 2, 1, 2, 3],[3, 0, 0, 6, 5,0],[0, 0, 4, 1, 0, 3],[2, 0, 5, 0, 1, 0],[0,0,0,3,0,5],[0,5,0,0,7,0],[0,1,0,0,0,6],[0]*len(xm)]#按列優先存儲(6)如題程序是使用按行優先存儲數據的,a[0][1]和a[1][0]的值均為3,但含義不一樣,a[0][1]=3表示陳濤同學的滾鐵圈成績為3分,a[1][0]=3表示楊瓊同學的班級號為3,a[2]的值為[2,0,4,5,0,0,0,0],存儲了金凱同學的班級號和各項目得分。語句bjdf = [0]* 4為數組bjdf分配了4個元素空間,原因是bjdf以班級號為下標,最大班級號為3。為避免下標越界,需要為數組分配4個元素空間,這樣雖然浪費了bjdf[0]的空間,但是可以直接使用bjdf[i]表示班級i的總分,給編程帶來了方便。a[i][7]表示第i個同學的總得分,例如a[0][7]表示陳濤同學的總得分;a[i][0]表示第i個同學所在班級的編號,例如a[0][0]表示陳濤同學的班級號;bjdf[a[i][0]]表示班級a[i][0]的總分,例如bjdf[a[0][0]],即bjdf[1],表示1班的總分。完整代碼如下所示:
xm = ["陳濤", "楊瓊", "金凱","吳敏", "朱剛強", "李海濤"]a =[[1,3,0,2,0,0,0,0],[3,0,0,0,0,5,1,0],[2,0,4,5,0,0,0,0],[1,6,1,0,3,0,0,0],[2,5,0,1,0,7,0,0],[3,0,3,0,5,0,6,0]] # 這樣存儲數據有什么缺陷?# 輸出比賽信息print("姓名","班級","滾鐵圈","打彈子","拍紙板","竹蜻蜓","跳繩","踢毽子",sep="\t")for i in range(0,len(xm)):print(xm[i],end="\t")for j in range(0, 7):print(a[i][j],end="\t")print()# 計算個人總分和班級團體總分bjdf = [0] * 4 # 3個班為什么要分配4個元素空間?for i in range(0,len(xm)):for j in range(1, 7):a[i][7] += a[i][j] # a[i][7]的值是什么?bjdf[a[i][0]] += a[i][7] # a[i][0]的值是什么?bjdf[a[i][0]]的值是什么?print(a[i][7], end=", ")print()print(bjdf)(7)可以使用字典來存儲多個一維數組,也可以把字典轉換成DataFrame對象,或者直接讀取Excel文件存儲到DataFrame對象中,從而調用pandas模塊的方法來編程,快速實現程序功能。代碼詳見“Python算法之旅”知識星球??偨Y:使用多個一維數組存儲數據,需要分別操作各個數組,實現協同工作的效果,對程序員要求較高,編程較為繁瑣,容易出錯。二維數組使用一個變量a,結合行、列下標來組織管理數據,能實現多個一維數組協同工作的效果,集中管理,組織效率更高,編程也更方便。使用字典來統一管理多個一維數組,也可以提高組織效率,增強代碼的可讀性。將字典轉換成DataFrame對象,或直接從Excel文件中讀取數據到DataFrame對象,可以利用現成的模塊方法,大大提高編程效率。
需要本文word文檔、源代碼和課后思考答案的,可以加入“Python算法之旅”知識星球參與討論和下載文件,“Python算法之旅”知識星球匯集了數量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注Python算法,感興趣就一起來!
相關優秀文章:
閱讀代碼和寫更好的代碼
最有效的學習方式
Python算法之旅文章分類
相關閱讀
-
當前快播:“趣味運動會項目”教學思路
說在前面浙教版《選擇性必修一數據和數據結構》第一章是全書的導論... -
環球實時:“數據合并”教學思路
說在前面浙教版《選擇性必修一數據和數據結構》第一章是全書的導論... -
環球速訊:因為一篇文章,發生了一大堆...
前段時間寫了一篇文章,給ShardingSphere提了個PR,不知道是不是嫌... -
快報:用 UE 虛幻引擎做個捏臉小功能~~
最近在學習UE相關的使用,正好看到一篇文章講解用ControlRig實現簡... -
世界觀察:寫文案,能細則細!
有2條文案:文案一:我們從鐵觀音故鄉的深山里采摘新鮮茶葉,挑選上... -
【新視野】【關于 OCR 光學字符識別】...
作者簡介作者:楊夕推薦系統百面百搭地址:https: github com ...