“趣味运动会项目”教学思路

Python算法之旅

共 4888字,需浏览 10分钟

 · 2022-10-25

说在前面
浙教版《选择性必修一数据和数据结构》第一章是全书的导论,起到了提纲挈领的作用。其中“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],[050070],[010006],[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算法之旅文章分类

浏览 31
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报