魏蕾 耿楠 冯妍
摘 要:“C语言程序设计”课程在计算机教学领域,既是程序设计的基础课,也是数据结构与算法及后续学习的核心基础课程。对于这门课程的学习有重要的现实意义,如考研深造、就业面试,凡是计算机专业领域内从事软件开发、系统架构等多项工作,都离不开对“C语言程序设计”思想的理解和应用。文章结合笔者教学实践,提出基于函数的课程教学设计,探讨课程的教学方法及改进。
关键词:C语言;函数;教学设计
中图分类号:G642.3 文献标识码:A 文章编号:1002-4107(2019)08-0068-02
一、引言
函数是结构化程序设计的基本单元。在“C语言程序设计”课程中,函数的概念贯穿了教学的始终。从第一个C语言程序开始,包括输入输出等,学生一直在接触函数的思想。然而,教材中对于函数概念的正式引入比较晚,往往安排在后几章。笔者在当当网的书城上查询“C语言程序设计教程”,相关的书籍有2444本。按好评度优先排序,排除C++、数据结构、单片机、二级教程等干扰,其中,91.3%都是在讲授完程序控制结构后,再介绍函数及指针的概念。其中包括广泛使用的譚浩强多版C语言教材,也是采用这样的顺序。导致学生学习了很多语法概念,还无法完整地独立编程;没来得及深刻理解程序设计的思想,课程已近尾声;虽然一直都学习和使用函数,却缺乏对函数整体认知,遑论建立模块化的思想;有学生在main( )函数中写出上千行代码,以致难以跟踪调试代码错误;甚至有学生以高分修完课程,仍不会以多文件结构的形式来编写程序,不利于日后合作项目的参与。
因此,函数内容不适宜集中滞后讲解。本文提出基于函数的课程教学设计:(1)探讨函数的本质及作用;(2)调整函数部分的讲授顺序,并根据学习行为理论的指导,将函数内容的讲授分为三个阶段;(3)针对函数部分的知识点,设计教学案例及教学方法;(4)根据笔者的教学经验,提出几点教学过程中的体会。
二、函数的本质
程序设计过程中,随着现实问题的复杂化,解决问题的代码也会越来越长。长程序开发比较困难,不易阅读和修改,对于同类型问题重复写代码,增大了工作量。依照结构化程序设计思想,处理问题的原则是自顶向下设计,逐步求精;按功能把程序划分为多个相对简单的模块;模块之间的关系尽可能简单,功能上相对独立。这里的模块就是函数,通常是指抽取并封装具有独立功能的代码段,形成程序中可以被反复调用的独立实体。
函数是结构化程序设计的实现工具,是C语言源程序的基本单位,也是代码复用的重要方法。基于“高内聚,低耦合”的设计原则,应用程序在开发过程中通常会进行模块划分,在设计好模块间接口的情况下可以将模块分配给多个人员实现。常用的基础功能模块可以封装为函数,集成到相应函数库,项目成员共享。正确有效地利用函数能够使复杂问题更容易理解,增强代码的重用性,有利于提升代码质量并提高开发效率,促进了代码的标准化。
三、教学设计
函数部分的传统教学,往往围绕着函数概念,函数定义及调用,函数参数传递,函数返回值等几方面展开[1],最后再给出应用实例。这种安排,由简入繁的讲解循序渐进,但如前所述,过多过早灌输语法概念,学生对于算法设计和编程思路,缺乏整体认知,难窥全貌。因此,调整函数的授课顺序:学生初步理解数据类型概念并掌握运算符用法后,开展函数部分教学,即把函数内容提前至程序控制结构前讲授,之后,再将函数思想融入后续章节中,达到融会贯通。这样,函数设计的思想可以贯穿在教学整个过程的始终,也符合学习过程的螺旋式结构,便于学生对知识的进一步理解、应用及升华。
美国教育心理学家布鲁纳关于学习行为的理论,把学习新知识的行为分为三个过程,包括知识的获取、转换及评估[2]。据此,笔者把函数部分的教学也分为三个过程:函数概念的引入、函数思想的理解和运用、函数知识的渗透。
(一)函数概念的引入
函数部分,理论性和实践性较强。如果一开始就讲解语法概念,易降低学生的求知欲。新知识的获取,是对先验知识的凝练。学生接触到新的知识范畴,会按自己经验,去匹配和对照,在头脑里组成有规律的结构。笔者首先用启发法,引导学生联想到熟悉的数学函数,如sin( )、cos( )函数,从而引入C语言中的函数。再用类比法,加以区别:数学函数强调自变量x和因变量y之间的映射关系,而程序中的函数强调按功能划分模块。此处,就函数名称,输入,输出,功能独立,代码封装展开论述,使学生对函数有初步印象。
按照模块化程序设计的思想,具体问题具体分析,帮助学生树立函数设计的思想。
1.提出问题。设计一个综合引例。笔者选用简易学生成绩管理系统。讲解时尽量避免涉及具体语法,单纯从功能划分的角度来引入。
2.分析问题。按照结构化程序设计思想,把大任务分解成为多个功能独立的小模块。学生成绩管理系统按照计算机处理数据的过程可以分为三步:获取数据、数据处理、数据输出。在这里,可以借助程序结构图来厘清思路。初步根据问题规模,估计程序大小,并根据功能划分模块。结合数据的特性,再对模块进行细化,完成函数设计。通过引例,学生初步了解函数的作用:封装及代码重用。
3.解决问题。搭建程序框架,再设计算法并优化。在该阶段,要求学生模仿函数框架写代码。通过引例,学生直观感受模块化程序设计的流程,体会函数的重要性,并重新发现自己的知识状况,促进、改造现有的知识结构,并且在此基础上修正和发现新的学习,同时还能增强学习的兴趣和信心。
(二)函数思想的理解及运用
学习知识的目的不仅是学习具体内容,而是通过学习过程,掌握学习方法和技巧,并灵活运用新知识。即学习行为的第二过程,知识的转换和迁移。学生对函数思想的理解和运用是按照先验及对现有知识的理解,掌握新知识使之适应新任务的过程。
继而,通过一些简单问题,启发学生积极思考。由学生设计函数,逐步导出函数的名称、返回值,参数传递,原型等语法基础知识,如表1。
(三)函数知识的渗透
学习行为的第三过程,知识评估。掌握函数概念和语法后,核实所学函数知识能否解决现有问题,还欠缺哪些知识。对照引例,在后续章节如指针、数组、文件等内容的教学中,逐步渗透函数思想和应用。使学生明确函数与其他部分间的联系,并进行深入研究和探讨。通过教学,学生了解并接受模块化程序设计流程:根据实际应用问题,确定程序框架,自顶向下,逐步细化;能够综合运用所学知识,编写出有实际应用价值的程序。学生对所学内容的结构感越强,就能够高密度長时间地学习而不觉得倦怠。这样的教学设计不仅能够提高学生的积极性,更能有效引导学生学习知识并掌握学习的方法。
学生学习知识,掌握技能的过程不可能一蹴而就,需要日积月累,循序渐进。在整个教学过程中,教师应考虑学生的认识水平和学习基础,激发学生的认知行为和潜能,引导学生积极思考,发散思维。
四、教学实践中的几点体会
1.适当使用程序结构图,有助于学生理解程序的结构。程序结构图PSD(Program Structure Diagram),是描述程序结构的图示,一般由构成程序的要素和表达各要素之间关系的连线或方向箭头构成[3]。传统程序流程图动态反映一个模块内部程序的执行顺序和具体实现细节,PSD则能静态地体现程序的整体思路,弥补了前者程序结构不清晰的不足,更好体现模块化思想,模块间调用关系。
2.充分利用 Debug分析跟踪技术,有助于学生深入观察变量的存储,程序的流程控制,数组及函数的调用及指针的指向。学生学会使用调试工具后,就能通过单步运行、跟踪和跳出;设置断点、增加监视、查看变量及表达式的值等有效手段逐步发现程序中的逻辑错误和运行错误,独立分析和解决问题,增强了调试程序的信心及编程的兴趣。
3.课程考核,不仅仅片面考查学生知识点的掌握,还需考核学生理解并综合运用程序设计思想,独立、创新解决问题的能力。笔者所在教学课组,采用了“平时成绩+实验技能+创新思维+期末机试”的多元化考核方式。在机试考核中,摒弃了学生强识硬记就能得分的客观题,全部采用编程题来测试,大大改善了教与学,学生的编程能力及计算思维能力有显著提高。
总之,笔者结合“C语言程序设计”课程教学中的经验,以学习行为理论为指导,提出了基于函数的教学设计,并探讨了教学方法的改进。实践证明,本文给出的教学设计和教学改革是可行的,对于提高学生的理论认知、培养学生的创新意识和编程实践能力,具有十分深远的意义。
参考文献:
[1]朱安平.一种C语言函数教学的设计与实践[J].计算机工程与科学,2014,(S1).
[2] [美]杰罗姆·布鲁纳.布鲁纳教育文化观[M].宋文里,黄小鹏,译.北京:首都师范大学出版社,2011:54-57.
[3]徐漫江,姚放吾.一种基于程序结构图的入侵检测方法研究[J].雷达与对抗,2008,(2).