方星星 史国川 施宁 陆军炮兵防空兵学院
C语言作为一种面向过程的高级语言,能够使学习者更好地建立起程序设计的基本概念,掌握程序设计的基本理论和常用算法,形成用计算机分析问题、处理问题的能力和科学的思维方法。因此,很多高校至今仍将C语言作为程序设计基础类课程的教学语言。
由于C语言知识点很广且分散,在教学过程中笔者发现,不少学生对C语言的概念、程序执行过程一知半解,不能有效区分数据类型、三种循环语句、数组排序、指针概念等,不能全面深入理解字符串处理、递归调用、指针引用等难点内容,导致不能熟练掌握它们的应用。同时,C程序设计的学习是循序渐进的过程,章节内容之间是层层递进的关系,如果学生前期的基础知识掌握不牢固,会导致后期学习难度加大,从而降低学生的学习兴趣。
“听、说、读、写”广泛应用在语文、外语类课程的教学中,是语言学习必须掌握的四项基本技能,也是语言学习必须遵循的路径。其实,利用作为一种“语言”的C语言,教师同样可以培养学生的“听、说、读、写”四种能力,让学生能听懂知识点、说得出含义及执行过程,会分析阅读程序,能熟练编写程序,以切实打牢学生的编程语言基础,提高其编程应用能力,从而更好地调动学生学习积极性以及提升课堂教学效率。接下来,笔者分别阐述C语言教学中“听”“说”“读”“写””的含义及实施过程。
在C语言教学中,“听”是指听懂知识结构,听透彻知识点之间的内在联系,明白基本概念、基本语法、语句执行流程、算法设计等,所以听懂是学好C语言的前提。为使学生听懂听透,首先要求教师会“说”:①要结合初学者的认知规律,遵循“化复杂为简单、化抽象为具体”的教学原则,优化教学内容,揭示教学主线;②要提炼重难点,对重难点知识一定要讲深讲透;③要讲清章节内容的内在联系,不仅要告诉学生知识点是什么,而且要介绍C语言中为什么有这些知识,以及如何应用;④要灵活运用案例式、类比式、互动式等教学方法,以提升教学内容的实用性和趣味性;⑤要精简教学用语,要求学生必须认真倾听,时刻关注学生课堂听课效果。
例如,“数据类型及运算”章节中的知识点较多,涉及标识符、常量与变量、数据类型、类型转换、运算符及表达式等,这些知识点之间内在联系不紧密。在教学过程中,教师首先要优化内容设计,补充内存结构的内容,并将其提炼为教学主线,通过层层递进来讲解章节内容之间的联系,重点介绍数据类型及字符常量表示。
“说”指的是让学生说出C语言的基本概念、执行过程、算法设计过程等,以强化学生对C语言语法、语义的理解。在教学中,笔者发现不少学生课堂中能听懂知识点,但课后容易忘记,编程时不知从何处下手,更不会灵活应用。通过了解学生会不会“说”,能“说”多少,教师可以从中判断出学生对知识的理解和掌握情况、学习的成效等,以便及时调整教学策略。在课堂教学实施中,应多强调一些概念,总结一些知识规律,鼓励学生开口“说”,让学生加深对知识点的记忆和理解。
例如,在函数教学中,在介绍完参数传递的特点后,让学生“说”出函数调用前、函数调用时、函数调用结束后参数的变化,并结合内存描述出变量的分配过程,以使学生强化对参数种类及参数传递的理解。
另外,教师要发挥学生学习主体地位,要求学生在线下定期开展研讨交流,鼓励学生开口“说”出对内容的理解和“说”出自己的学习体会。需要注意的是,C语言中的“说”不等同于背,教师要正确引导学生,切不可让学生死记硬背语法知识,否则会使课程的教学枯燥无味。
“读”不同于“说”,“读”指的是分析程序的能力,需要综合运用语法知识和程序结构来分析程序,搞清楚程序的结构、程序的输出以及程序涉及的算法等,其最终目的是深化学生对概念原理的理解和掌握。程序设计过程是问题求解的过程,C语言作为一种面向过程的高级语言,能够很好地训练学生的编程思维,因此课程教学目标中需要强调培养学生具备较强的分析问题、解决问题的能力。
因此,在课程教学中,一是要打牢学生在程序结构、语法等方面的基础,使其具备阅读程序的能力;二是要让学生主动思考,能正确分析出程序的运行结果,厘清问题求解的思路和程序本身涉及的算法等,并能创新设计思路;三是要让学生大量阅读课外参考书以拓宽知识面,明白知识的由来;四是要鼓励学生相互阅读、分析各自编写的程序,在分享设计思路的过程中提升思维能力,并让学生多读经典程序,大量调试程序,要理解他人的解题思路并借鉴吸收。
要强化学生对程序结构和执行过程的认识,使其能快速识别出语句类别和结构,如复合语句、循环嵌套、函数模块等,便于学生准确、快速阅读程序。例如,选择结构中if语句有if、if-else、if-else-if三种形式,在学生理解了语法基础和执行流程基础上,引导学生分析三种形式能解决哪些问题,用if-else替代if-else-if会有什么结果,再通过单步调试让学生直观感受到冗余的判断,从而让学生更好地理解选择结构的作用,尤其是嵌套if语句结构及执行过程。
同时,程序设计的本质是对内存的分配、输入、求解和输出操作。要让学生结合程序设计的本质,重点分析程序设计的每一个过程,养成画内存结构图的习惯,从而形成正确的分析程序方法。例如,在数组学习章节中,通过分步画出内存结构图来理解元素在内存中的存储情况,以及元素的插入、删除和排序等动态操作。在指针学习章节中,通过不断分析内存结构图,来深刻理解变量值和地址的区别,以及指针变量如何间接引用其他变量等,从而加深对指针本质的理解。
另外,要让学生注重思维层次的训练,在阅读程序中逐步提升算法设计能力,理解问题求解的每一个过程。例如,素数的判断存在多种解法,通过对比分析这些解法,总结出素数判断的求解思路,加深对for、if、break语句执行流程的理解,提升自身的逻辑思维和计算思维能力。又如,数组的排序有冒泡、选择、插入等各种排序算法,要求学生理解每一种排序的过程并编程调试,以便深入、全面掌握知识点的应用、程序执行过程和算法的设计,提升自身的计算思维。
“写”指的是编写程序,通过编写程序来解决实际问题。通过学生的作业及课后反馈可以看出,学生能看懂教材内容,也能听懂课堂教学内容,但不能熟练编写程序。归结其原因,是学生没有充分重视平时的编程训练,程序编写量过少。编写程序的能力能直接体现学习效果,教师可根据学生写程序能力的高低,及时对学生进行帮扶指导,给出针对性的学习建议,切实提高其编写程序能力。
实践教学要围绕理论知识点展开,并要及时开展课内、课外的编程实践,以巩固理论知识点的学习。在课内教学中,教师可采取任务驱动式教学法开展实践教学,结合在线实践教学平台设置5~7道编程实践题,设计好教学环节,安排好每一个实践任务时间,再让学生动手编程实践和分组讨论学习。教师还要及时解决学生在调试程序中遇到的各类问题,要对每一个实践任务进行总结点评,指出存在的共性问题,总结出问题求解的不同思路。例如,在循环嵌套和辅助控制语句课内实践教学中,针对性布置九九乘法表、图形输出、素数判断、求区间内素数累加、求十个正数平均值等实践任务,要求学生编程解决并提交程序源码。
另外,在教学过程中,教师要提炼各类编写技巧,总结程序设计的四大步骤——定义、输入、求解(函数调用)、输出,要求学生必须按I-P-O过程编写程序。在教学环节中设置课前测,让每一名学生都参与程序编写,以检验编写程序的能力。加强学生平时的训练,增加编程题的题量,每一章安排5~8道编程题,让学生课后编程调试,并在OJ平台(或在线实践教学平台)提交运行情况。教师及时在线指导学生,指出程序编写中的各类问题及注意事项,增强学生写好程序的信心,使其养成良好的程序设计风格,提升动手实践能力和创新设计能力。
程序设计基础课程作为一种“语言”类课程,在教学过程中同样可以采用“听、说、读、写”教学法。“听、说”是为了打牢学生C语言基础,强化对C语言语法、语义的记忆和理解。“读”是为了拓宽学生的知识面和思维,提高分析问题的能力。“写”是为了灵活运用知识结构,进一步提高分析、解决问题的能力。在教学过程中,教师可采取优化教学设计,让学生研讨交流,让学生大量分析调试程序、阅读源代码和参考书,强化编程实践等措施来实施“听、说、读、写”教学法,并将其贯穿于教学全过程。