您的位置:首页 >聚焦 >

当前快播:“趣味运动会项目”教学思路

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)


(资料图片仅供参考)

(7)除了使用一维数组和二维数组组织上述数据,你还能想到其他方法吗?例如使用字典或DataFrame数据结构。问题解析(1)如上表格中每一行实际内容就是一条记录(数据元素);每个数据元素包含8个数据项,各数据项的名称依次为“姓名”、“班级”、“滚铁圈”、…、“踢毽子”;除了“姓名”是字符串类型以外,其他数据项都可以用整型数据来表示。说明:一般情况下,“班级”用字符串来表示,在本例中,为编程方便,也可以用整型数据来表示。(2)若stu1= ["陈涛", 1,3,0,2,0,0,0,0],则不能把stu1称之为数组。因为数组是一种数据结构,要求其所有元素的数据类型均相同。说明:Python语言使用列表来模拟数组,但列表本身不是数组,它比数组更灵活。(3)因为每条记录都包含8个数据项,所以需要8个数组分别存储每一列,每列表示一类数据项。编写程序如下:

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的学生的班级和各项目得分数据,符合人类的视觉感受,但毕竟班级名称不是数值,不能参与算术运算,与项目得分还是有本质区别,故把它们放在一起不够妥当。可以对二维数组按列优先存储数据,即把每一列的内容放在一维数组中。参考代码如下:

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算法之旅”知识星球。总结:使用多个一维数组存储数据,需要分别操作各个数组,实现协同工作的效果,对程序员要求较高,编程较为繁琐,容易出错。二维数组使用一个变量a,结合行、列下标来组织管理数据,能实现多个一维数组协同工作的效果,集中管理,组织效率更高,编程也更方便。使用字典来统一管理多个一维数组,也可以提高组织效率,增强代码的可读性。将字典转换成DataFrame对象,或直接从Excel文件中读取数据到DataFrame对象,可以利用现成的模块方法,大大提高编程效率。

需要本文word文档、源代码和课后思考答案的,可以加入“Python算法之旅”知识星球参与讨论和下载文件,“Python算法之旅”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注Python算法,感兴趣就一起来!

相关优秀文章:

阅读代码和写更好的代码

最有效的学习方式

Python算法之旅文章分类

关键词: 一维数组 数据类型 存储数据

相关阅读