程序设计训练课程教学方法探索
2021-01-03杨晓波王勇梁燕黄宏程
杨晓波 王勇 梁燕 黄宏程
【摘要】 针对学生在程序设计训练课程的学习过程中普遍存在的问题,提出在教学过程中要强化调试能力的训练、引导学生模块化编程、规范编程习惯、训练阅读代码的能力,使学生的编程能力明显增强。
【关键词】 C语言 程序调试 模块化 规范化编程
一、程序设计训练课程简介
在 “软件定义一切”的大背景下,通信与信息大类专业涉及了信息科学、计算机、数学等交叉专业,其就业市场不仅要求学生掌握通信领域的专业知识,而且对学生通信软件编程能力也提出了更高的要求[1]。鉴于此,在第一学期的下半期,为通信与信息大类学生开设了程序设计训练这门必修课程,其先修课程是C语言程序设计。程序设计训练课程旨在学生具有C语言基础知识的基础上,加强C语言编程应用能力的训练,以助于后续更好地学习数据结构与算法等课程。
本课程以专题的形式进行内容设计,包含的5个专题都来自于生活或者通信专业涉及到的一些简化实例,以期激发学生的编程兴趣。老师授课时可选取其中2-3个专题进行训练,注重培养学生的编程思维和编程方法,提高学生用计算机解决问题的能力,为后续进一步学习编程相关类课程打下必要的理论基础。
二、存在的主要問题
该课程相对于其他应用性课程来说,实践性很强,学生普遍反映掌握起来比较难。通过对学生的观察,发现主要存在以下问题:
2.1 缺乏规范性编程习惯
很多学生在进入大学后才接触编程学习,往往注重语言本身的学习,而忽视了规范性编程习惯的培养[2],导致在编程时,变量、函数、文件等的命名随心所欲,程序段层次不清晰,缺乏注解,程序可读性不强等等。在编写小程序段时,这些不良习惯影响不大,但当程序段稍微复杂时,就会引起很大的问题。
2.2 缺乏代码调试能力
编译系统主要是语法上的检查,无法检查代码逻辑上的错误,而这些逻辑上的错误往往可以通过调试来发现。因此代码调试能力是编程能力的重要体现。“调试”功能需要在建立工程的环境下才能实现。但学生在先修课程C语言课程上,由于平时编程练习的是一个个只具有简单功能的小程序,普遍采用建立单个源文件的方式编写代码,很少采用建立“工程”的方式进行项目开发,因此无法进行代码调试。本课程中的每个专题都有较多需求,需要实现多个功能,代码量相对较大。当遇到编译通过而程序逻辑功能有问题时,不会调试代码的学生就会感觉茫然无措。
2.3 过分依赖指导书,学习自主思考不足
该课程配备的实验指导书为每个专题都附上全部源码,希望学生掌握代码分析和阅读的方法,并掌握通过修改程序实现既定目标的方法。但学生在实际的学习过程中,虽然也读懂了代码,也能画出程序框架,但往往受限于指导书而写不出自己的代码。因此需要老师采取有效的措施引导学生利用好指导书。
三、采取的措施
在程序设计训练课程的教学过程中,老师要特别注重引导学生进一步理解编程思想,培养良好的编程习惯,提高运用计算机分析问题和解决问题的能力。
3.1 强化程序调试和排错能力的训练
将第一次课程用来训练学生的程序调试和排错能力,让学生熟悉项目结构以及文件布局,掌握通过调试工具跟踪程序运行并进行代码分析、Bug排除等技能。例如,在第一次课上,老师要求学生在新建的目录下创建一个新的C代码空工程,并将老师编写好的1个C文件和两个. h文件分别拷到在该工程目录下新创建的src、include文件夹下,同时将这3个文件添加到新创建的工程中,然后进行编译。由于老师在代码中故意设置了错误,编译无法完成。这时老师就引导学生怎样通过阅读系统提示进行代码的修改。当代码调试通过后,再要求学生采用单步、断点等调试手段,配合Debug windows下的Watches和Memory Dump查看变量和内存值。
此外,在后续的编程过程中,要求学生遇到编译方面的错误,首先自己设法排除;遇到逻辑方面的问题,先自己通过单步/断点等调试手段看能不能解决。通过这一系列的训练,学生的调试能力和排错能力得到了明显提高。此外,通过这一过程,学生对怎样进行文件布局有了一个初步认识,为后续进行多文件编程打下基础。
3.2采用模块化思想,循序渐进引导学生进行项目开发
这部分是课程教学中最重要的内容,下面以“通信录的开发”专题为例进行阐述。本专题的需求是用C语言设计并开发一个简单的通讯录管理程序,要求能够实现通讯录的增加、删除、修改、查询、存储和导入等功能。
本专题涉及程序设计框架、程序模块划分、跨文件函数调用、输出/输入、文件操作、字符串操作、数组、结构体、指针等多项知识。本专题任务量较大,需要老师采取有效的引导方法,用好指导书,让学生形成良好的编程习惯,从而增强编程能力。
1.首先引导学生进行需求分析,把需求细化出来;之后指导学生进行程序代码框架的设计,建立框架的概念,引导学生进行主界面的设计。在这一阶段,只需要设计出“通信录”的框架,通过编写空壳函数(例如写一个最简单的输出语句),调试系统逻辑功能是否能实现。在这一过程中,要让学生明白,在进行代码设计时,主函数要干净,功能用子函数操作,重复的功能要用函数实现。
2.然后再对模块逐个突破、先易后难。首先设计添加和删除、查询模块,掌握数组、循环等操作;导入通信录和保存通讯录模块涉及文件的读写操作,这部分知识学生还未学习,这时可以给学生布置预习作业,自学文件相关基础内容,并完成几个基本的文件读写编程练习。回到课堂后,老师对关键内容进行讲解和分析,这时学生就具备了基本的文件读写能力,可以选择一种适合的文件读写方法完成上述模块的编写。
3.改写代码,用“多文件编程”方式实现。当学生已经把“通信录”功能基本实现后,会发现所有的代码都写在同一个源文件中,代码很长,不利于调试并发现问题。这时,老师以第一次课程中的示例文件为例,引出“模块化多文件编程”的思想,并要求学生改写代码,采用“多文件编程”方式实现。通过改写代码的过程,学生会深刻体会到通过多文件编程,程序脉络结构会更加清楚,也更易于维护,同时也利于代码的重复利用,从而提高编程效率[3]。
3.3规范编程习惯
从进入第一次课开始,老师就要给学生建立规范编程的意识。在第一次课上,给学生讲解基本的编程规范,例如怎样给变量和文件命名、怎样进行注解、怎样合理使用各种变量、怎样使用预编译方式等,并将规范编程的要求贯穿整个课程。老师可以采用案例教学的方式,参考企业编程规范,逐步培养学生良好的编程素养。例如,定义文件名、函数名和变量名时,要见其名知其意,不要用毫无意义的a、b、c之类的定义,要用英文,不要用拼音[2];尽量不要用全局变量;要注意include的路径問题;应学会函数之间传参数等。编程初学者特别要注意的一个问题是尽量不要用goto语句。在授课过程中发现很多学生喜欢用goto语句,觉得简单、方便,甚至嵌套、穿插使用,在代码中随意跳跃,整个代码逻辑非常混乱,可读性很差,甚至出现死循环。这实际体现了学生未形成良好的编程思维,不能对代码进行清晰的流程控制。老师一定要进行纠正,指导学生修改语句,例如用条件或循环语句、用break、continue或return等,来清晰地声明代码执行到此处的后续行为。老师可以在教学过程中逐步积累不规范的编程案例,通过案例分析的方式对学生的编程习惯进行指导。
3.4训练学生阅读代码的能力,然后借鉴并提高
在教学过程中,不要求学生一开始就去读代码,而是首先设计出整体框架,再对每个模块进行具体设计。同时,在进行整体框架设计和每个模块具体设计过程中,引导学生分析设计需求,建立设计思路,并引导学生尝试用已有的知识自己写出代码后再参考指导书,这样学生就能有的放矢地分析参考代码的优劣,并吸收可取之处。此外,还要注重学习借鉴优秀的程序架构设计。同时,对于借鉴的代码不是简单的搬过来,一定要消化。例如,对于借鉴的程序中一些不理解的地方,要深钻细研,最好能在调试中进行阅读,并举一反三,从而达到理解并能进一步灵活应用的目的。
四、结束语
在程序设计训练课程的教学过程中,老师注重对学生编程思想、编程习惯的培养,训练学生模块化的设计方法,培养学生利用调试工具跟踪程序的动态变化并分析程序逻辑的能力,有助于使学生具备一定的规范编程的习惯,也通过项目的实现,让学生增加成就感,提高编程学习的兴趣。同时,通过指导学生如何学生阅读代码、查询资料、参考别人的代码,培养学生的代码阅读能力和分析能力。此外,本专题中涉及的部分知识,在C语言课程中可能还未涉及或即使学习也没有进行强化练习。学生在本课程中通过大量的预习和自学,养成了一定的自主学习的习惯,这也是一个编程人员非常重要的素质。在老师的有效引导下,学生通过该课程的学习,可以明显增强C语言编程能力,并为后续的软件课程打下坚实的基础。
参 考 文 献
[1]王勇,杨晓波,杨小龙,等.浅谈新工科背景下通信软件课程教学改革[J].当代教育实践与教学研究.2020(15):337-338.
[2] 尹波.“非计算机”理工科专业C++程序设计教学研究[J].科教文汇.2020(16):89-90
[3]华玉明.51单片机C语言模块化多文件编程方法探讨[J].吉林广播电视大学学报.2014(10):11-12.
[4]曾帅,王中莹.提升通信软件基础课程学生编程创新能力的研究[J].现代计算机.2016(18):39-41.
[5]王娟,孔宇彦,黄培泉,等.程序设计基础课程混合式教学模式改革的研究与实践[J].现代计算机.2021(20):113-117
[6]匡春临,蒋胜利.引入计算思维的“C程序设计”教学研究与实践[J].教育教学论坛.2020(24):363-364.
[7]元泽怀,李丽芳.单片机工程项目C语言编程规范实践教学研究[J].肇庆学院学报.2020(2):32-36.
[8]黄晓峰.论单片机课程教学中C语言编程的规范性[J].科教导刊. 2015(23):127-128.