论文部分内容阅读
【摘要】针对计算机程序设计教学中实际存在的问题,教学过程中把知识讲授转化为对问题求解能力的训练以及计算思维的培养,并以二维数组的为例展示了一个具体的教学设计,最后介绍了课程实践所采取的措施,取得了良好的教学效果。
【关键词】计算机程序设计 问题求解 教学案例
【中图分类号】G64 【文献标识码】A 【文章编号】2095-3089(2019)13-0243-02
计算机程序设计目前是各个高校理工科的基础课和必修课,是一门理论和实践并重的课程。但在实际教学过程中,这门课难教、难学已经成为师生的共识,传统的程序设计教学一般是以教师为中心,学生是被动的参与者,教学过程中偏重知识和理论的传授,而忽视思维和能力的培养训练。大多数学生都认为程序设计艰涩难懂、学难致用、学完即忘,遇到具体问题往往无从下手。
实际上,计算机程序设计这门课除了掌握一种高级程序设计语言之外,更加重要的是训练学生分析问题和利用计算机进行问题求解的能力,在这个过程中培养学生的计算思维[1]。计算思维是指运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等一系列思维活动,具体内容包含抽象、分解、迭代、递归、折中、并行、容错等。作为计算机类的基础课程,计算机程序设计课必须要改革教学方式,更新教学理念,树立以培养问题求解能力为核心的教学目标[2,3]。
1.教学设计
目前,我校的《计算机程序设计》课程讲授的是C语言,C语言功能强大、应用灵活,但是其语法细节特别多,所以在课堂讲授时不能面面俱到,需要抓住重点和难点进行精讲。从问题求解能力培养的角度来说:基本表达式和控制结构是基础,要求熟练掌握;函数则是课程的重点,这是进行封装和抽象的主要语言机制;数组、字符串、结构等复合数据类型则是解决实际问题经常使用的,应结合实际问题加强练习;指针是C语言的精髓,但也是传统的难点,这部分内容可以结合教学实际情况进行合理取舍。
教学过程中,笔者结合教学内容引入了丰富的教学案例[4],见表1所示。表中这些原生态的案例都有实际的工程应用背景,授课时围绕如何分析解决这些真实的问题,启发学生一步步思考,在过程中让学生体会如何把一个现实问题转成计算机求解的步骤,以此来培养学生针对实际问题的分析和求解能力,从而实现把编程知识的讲授有机植入到问题求解能力的训练中。
程序设计的经典公式是:程序=数据结构+算法。教学内容就是按照数据结构(如何表示数据)和算法(如何处理数据)两条线索进行组织的,对于每个实际问题启发学生分析出数据结构和算法。同时,在这个过程中还要强调对程序从结构和效率等方面进行持续优化,并结合工程实践经验介绍编程技巧,最后还设计合适的课堂练习进一步加强学习效果。
2.案例分析
这里以多维数组为例进行具体教学展示。多维数组是学完一维数组之后,一般以二维数组为例来学习多维数组。这一讲是以“地形导航”为教学案例实施教学。
地形导航是无人机等系统设计的关键部分,系统预先存储了任务区域的地形信息,然后根据当前所处位置和目的地,自动规划出飞行路线等。可以考虑把地面划分成网格,逐块存储各类地形信息(如海拔高度)。首先给出说明:山峰是四周海拔都低于中心点的位置(排除边界上的位置),山谷是四周海拔都高于中心点的位置(排除边界上的位置)。如图1所示,可以把地形网格中的海拔高度用一个二维数组进行表示,图1(b)中椭圆框标出的就是符合条件的山峰节点。这一讲的任务是编写一个地形导航分析程序,分析输出地形网格中山峰、山谷的位置和数量等信息。
1)数据结构
首先提出问题:程序中如何表示地形网格?因为地形网格有多行多列,可以用多个一维数组,但地形网格大小不确定,所以多个一维数组并不合适。由此自然过渡到用矩阵来表示,然后引出C语言是用二维数组来表示矩阵。在给出二维数组的概念和声明形式之后,得出求解“地形导航”问题所使用的数据结构:用二维浮点数组来表示地形网格。
接下来的问题是如何给地形网格存入数据,首先介绍初始化二维数据的语法和示例代码,重点强调初始化二维数组时只能省略第一维,然后示范初始化地形网格的代码。
2)算法设计
“地形导航”重点要解決的问题如何找到所有山峰?启发学生进行算法设计:遍历二维地形网格数组中的所有节点(但要排除边界上的节点,如图(b)虚线框所示),依次与四周节点(上、下、左、右四个节点)进行比较,判断是否满足山峰的条件。其中的关键如何遍历地形网格以及如何与四周节点进行比较,这里需要学会使用二维数组。二维数组的遍历一般是通过两层的嵌套循环实现,对二维数组元素的访问关键在于设置正确的行列下标。然后启发学生分析四周节点的具体行列下标,最后给出查找山峰节点的示例代码。
查找山谷节点的过程则可以作为课堂练习,由学生模仿查找山峰节点代码自行完成。
3)程序优化
在完成查找山峰和山谷的代码之后,发现两部分的代码非常类似,提出新的问题:能否用函数对上述代码进行优化,从而引入二维数组如何作为函数的参数?在这一部分,重点需要指出C语言中二维数组作为函数参数时不能省略第二维的大小。在此基础上,定义一个查找地形网格节点的函数,函数参数包含一个表示地形网格的二维数组,以及查找山峰或山谷的标志参数。
4)课堂练习
在之前的基础上,这一讲设计的课堂练习是查找地形网格中的鞍点,所谓鞍点是指节点在所在行最大,并且在所在列中最小。这个问题与之前的教学内容一脉相承,主要目的也是练习如何使用二维数组,但比查找山峰和山谷要略微复杂。具体实现时,可以先假设的每个网格节点都是鞍点,然后把当前节点与所在行(和列)的其它节点进行比较,如果存在反例则不是鞍点。
最后,这一讲通过“地形导航”这个案例,把二维数组的定义、初始化、应用、函数参数等主要知识贯穿于问题求解能力的训练中,这个过程中注重启发学生思考如何设计数据结构和算法,并配合恰当的课堂练习以加强教学效果。 3.课程实践
计算机程序设计是一门实践性非常强的课程,而问题求解是一个复杂且综合的过程,真正的求解能力只有在编程实践中锻炼、体会出来的。基于我校开发的Trustie[5]和Educoder[6]两个网络平台,课程开展了以下三个方面实践活动。
1)Trustie网络教学平台
Trustie网络教学平台除了可以管理课程资源外,一种很重要的功能就是可以在上面布置程序设计题,学生提交代码后,平台可以按之前设计好的测试用例对学生提交程序进行自动测试,只有所有的测试用例都通过才能分。除了课堂练习外,课后要在Trustie布置一些编程实践题目,内容是与本次上课密切相关,除了起巩固教学效果的基础题目,还有部分难度较大的拓展题。
2)Educoder编程实训平台
Educoder编程实训平台可以实现对于单元知识点的检测和训练。该平台是一个游戏闯关式的实训环境,只有测试用例都通过才能过关得经验值。网站上还提供很多与本单元相关的背景知识,便于学生自学。该平台的实践完成时间比较宽松,一般是每个单元开始上课就布置下去,学生自主选择时间完成。
3)综合实践
在课程后期会布置一个综合性的实践环节,要求1~2人一组编写一个有一定规模的实用程序。从最后完成情况看,选题多为扫雷、俄罗斯方块等小游戏,以及跟学习生活相关的小应用,作品的平均代码在400行以上。
这些教学实践极大程度地调动了学生自主学习的积极性和学习兴趣,激发了学生的编程潜能,学生的问题求解能力得到了全面提高。
4.结语
实施教学改革几年以来,教学效果显著。近几年笔者所负责教学班的期末考试成绩在全校都是名列前茅,在课程完结之后,班上有多个学生还积极参加了ACM等程序设计竞赛,获得了多项国家级奖励。在这些工作的基础上,以问题求解能力的培养为中心的计算机程序设计的评价和反馈机制仍需进一步研究。
参考文献:
[1]Jeannette M. Wing.Computational Thinking[J].Communica
tions of the ACM,2006(3):33-35.
[2]謝志英,王静,陈静.C语言课程中学生问题求解能力的培养[J].计算机教育,2011,(3):56-61.
[3]裘宗燕.今天的C程序设计课教什么, 怎么教——兼议《从问题到程序》的修订[J].计算机教育,2012, (13):24-32.
[4]Delores,M. Etter.宫晓利等译.工程问题C语言求解[M].北京:清华大学出版社,2005.
[5]https://www.trustie.net/
[6]https://www.educoder.net/
【关键词】计算机程序设计 问题求解 教学案例
【中图分类号】G64 【文献标识码】A 【文章编号】2095-3089(2019)13-0243-02
计算机程序设计目前是各个高校理工科的基础课和必修课,是一门理论和实践并重的课程。但在实际教学过程中,这门课难教、难学已经成为师生的共识,传统的程序设计教学一般是以教师为中心,学生是被动的参与者,教学过程中偏重知识和理论的传授,而忽视思维和能力的培养训练。大多数学生都认为程序设计艰涩难懂、学难致用、学完即忘,遇到具体问题往往无从下手。
实际上,计算机程序设计这门课除了掌握一种高级程序设计语言之外,更加重要的是训练学生分析问题和利用计算机进行问题求解的能力,在这个过程中培养学生的计算思维[1]。计算思维是指运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等一系列思维活动,具体内容包含抽象、分解、迭代、递归、折中、并行、容错等。作为计算机类的基础课程,计算机程序设计课必须要改革教学方式,更新教学理念,树立以培养问题求解能力为核心的教学目标[2,3]。
1.教学设计
目前,我校的《计算机程序设计》课程讲授的是C语言,C语言功能强大、应用灵活,但是其语法细节特别多,所以在课堂讲授时不能面面俱到,需要抓住重点和难点进行精讲。从问题求解能力培养的角度来说:基本表达式和控制结构是基础,要求熟练掌握;函数则是课程的重点,这是进行封装和抽象的主要语言机制;数组、字符串、结构等复合数据类型则是解决实际问题经常使用的,应结合实际问题加强练习;指针是C语言的精髓,但也是传统的难点,这部分内容可以结合教学实际情况进行合理取舍。
教学过程中,笔者结合教学内容引入了丰富的教学案例[4],见表1所示。表中这些原生态的案例都有实际的工程应用背景,授课时围绕如何分析解决这些真实的问题,启发学生一步步思考,在过程中让学生体会如何把一个现实问题转成计算机求解的步骤,以此来培养学生针对实际问题的分析和求解能力,从而实现把编程知识的讲授有机植入到问题求解能力的训练中。
程序设计的经典公式是:程序=数据结构+算法。教学内容就是按照数据结构(如何表示数据)和算法(如何处理数据)两条线索进行组织的,对于每个实际问题启发学生分析出数据结构和算法。同时,在这个过程中还要强调对程序从结构和效率等方面进行持续优化,并结合工程实践经验介绍编程技巧,最后还设计合适的课堂练习进一步加强学习效果。
2.案例分析
这里以多维数组为例进行具体教学展示。多维数组是学完一维数组之后,一般以二维数组为例来学习多维数组。这一讲是以“地形导航”为教学案例实施教学。
地形导航是无人机等系统设计的关键部分,系统预先存储了任务区域的地形信息,然后根据当前所处位置和目的地,自动规划出飞行路线等。可以考虑把地面划分成网格,逐块存储各类地形信息(如海拔高度)。首先给出说明:山峰是四周海拔都低于中心点的位置(排除边界上的位置),山谷是四周海拔都高于中心点的位置(排除边界上的位置)。如图1所示,可以把地形网格中的海拔高度用一个二维数组进行表示,图1(b)中椭圆框标出的就是符合条件的山峰节点。这一讲的任务是编写一个地形导航分析程序,分析输出地形网格中山峰、山谷的位置和数量等信息。
1)数据结构
首先提出问题:程序中如何表示地形网格?因为地形网格有多行多列,可以用多个一维数组,但地形网格大小不确定,所以多个一维数组并不合适。由此自然过渡到用矩阵来表示,然后引出C语言是用二维数组来表示矩阵。在给出二维数组的概念和声明形式之后,得出求解“地形导航”问题所使用的数据结构:用二维浮点数组来表示地形网格。
接下来的问题是如何给地形网格存入数据,首先介绍初始化二维数据的语法和示例代码,重点强调初始化二维数组时只能省略第一维,然后示范初始化地形网格的代码。
2)算法设计
“地形导航”重点要解決的问题如何找到所有山峰?启发学生进行算法设计:遍历二维地形网格数组中的所有节点(但要排除边界上的节点,如图(b)虚线框所示),依次与四周节点(上、下、左、右四个节点)进行比较,判断是否满足山峰的条件。其中的关键如何遍历地形网格以及如何与四周节点进行比较,这里需要学会使用二维数组。二维数组的遍历一般是通过两层的嵌套循环实现,对二维数组元素的访问关键在于设置正确的行列下标。然后启发学生分析四周节点的具体行列下标,最后给出查找山峰节点的示例代码。
查找山谷节点的过程则可以作为课堂练习,由学生模仿查找山峰节点代码自行完成。
3)程序优化
在完成查找山峰和山谷的代码之后,发现两部分的代码非常类似,提出新的问题:能否用函数对上述代码进行优化,从而引入二维数组如何作为函数的参数?在这一部分,重点需要指出C语言中二维数组作为函数参数时不能省略第二维的大小。在此基础上,定义一个查找地形网格节点的函数,函数参数包含一个表示地形网格的二维数组,以及查找山峰或山谷的标志参数。
4)课堂练习
在之前的基础上,这一讲设计的课堂练习是查找地形网格中的鞍点,所谓鞍点是指节点在所在行最大,并且在所在列中最小。这个问题与之前的教学内容一脉相承,主要目的也是练习如何使用二维数组,但比查找山峰和山谷要略微复杂。具体实现时,可以先假设的每个网格节点都是鞍点,然后把当前节点与所在行(和列)的其它节点进行比较,如果存在反例则不是鞍点。
最后,这一讲通过“地形导航”这个案例,把二维数组的定义、初始化、应用、函数参数等主要知识贯穿于问题求解能力的训练中,这个过程中注重启发学生思考如何设计数据结构和算法,并配合恰当的课堂练习以加强教学效果。 3.课程实践
计算机程序设计是一门实践性非常强的课程,而问题求解是一个复杂且综合的过程,真正的求解能力只有在编程实践中锻炼、体会出来的。基于我校开发的Trustie[5]和Educoder[6]两个网络平台,课程开展了以下三个方面实践活动。
1)Trustie网络教学平台
Trustie网络教学平台除了可以管理课程资源外,一种很重要的功能就是可以在上面布置程序设计题,学生提交代码后,平台可以按之前设计好的测试用例对学生提交程序进行自动测试,只有所有的测试用例都通过才能分。除了课堂练习外,课后要在Trustie布置一些编程实践题目,内容是与本次上课密切相关,除了起巩固教学效果的基础题目,还有部分难度较大的拓展题。
2)Educoder编程实训平台
Educoder编程实训平台可以实现对于单元知识点的检测和训练。该平台是一个游戏闯关式的实训环境,只有测试用例都通过才能过关得经验值。网站上还提供很多与本单元相关的背景知识,便于学生自学。该平台的实践完成时间比较宽松,一般是每个单元开始上课就布置下去,学生自主选择时间完成。
3)综合实践
在课程后期会布置一个综合性的实践环节,要求1~2人一组编写一个有一定规模的实用程序。从最后完成情况看,选题多为扫雷、俄罗斯方块等小游戏,以及跟学习生活相关的小应用,作品的平均代码在400行以上。
这些教学实践极大程度地调动了学生自主学习的积极性和学习兴趣,激发了学生的编程潜能,学生的问题求解能力得到了全面提高。
4.结语
实施教学改革几年以来,教学效果显著。近几年笔者所负责教学班的期末考试成绩在全校都是名列前茅,在课程完结之后,班上有多个学生还积极参加了ACM等程序设计竞赛,获得了多项国家级奖励。在这些工作的基础上,以问题求解能力的培养为中心的计算机程序设计的评价和反馈机制仍需进一步研究。
参考文献:
[1]Jeannette M. Wing.Computational Thinking[J].Communica
tions of the ACM,2006(3):33-35.
[2]謝志英,王静,陈静.C语言课程中学生问题求解能力的培养[J].计算机教育,2011,(3):56-61.
[3]裘宗燕.今天的C程序设计课教什么, 怎么教——兼议《从问题到程序》的修订[J].计算机教育,2012, (13):24-32.
[4]Delores,M. Etter.宫晓利等译.工程问题C语言求解[M].北京:清华大学出版社,2005.
[5]https://www.trustie.net/
[6]https://www.educoder.net/