陈 光,邱 天,吴小润

(南昌航空大学信息工程学院 江西 南昌 330063)

1 C 语言课程特点

C 语言具有面向过程、性能优异、跨平台等特点,是工科类专业的一门基础课,是许多高级编程语言的基础,也是大学生进行软件课程设计的高级编程语言之一[1-3]。因此,掌握好C 语言对于工科类专业的学生具有重要意义。

一方面,C 语言中的许多知识点是其他一些高级语言的基础。例如,数据类型、运算符和表达式、关系运算和逻辑运算、程序结构如分支结构和循环结构等,这些重要的概念在如Matlab、Python 等语言当中都是类似的。另一方面,C 语言中的结构化编程方式为学习其他高级语言也奠定着非常重要的基础。例如,在C 语言当中,使用函数将程序模块化,能够使程序清晰明了,便于调试。其中,涉及局部变量、全局变量、参数传递等概念。而这些概念和编程方式在其他许多高级语言当中也是通用的。掌握好C语言,学生学习其他高级语言就会容易许多。此外,C 语言也是开发基于单片机、STM32、ARM等的嵌入式系统的常用编程语言。因此,C 语言课程通常被安排在大学一年级开课,培养学生的计算机编程思维,教会他们如何设计和实现程序,为学生后续学习其他高级语言和相关的软硬件课程奠定基础。

2 工程教育认证背景下的C 语言教学要求

工程教育认证倡导的是以学生为中心的成果导向的教学理念,强调的是学生学到了什幺,而非教师教了什幺[4]。对于课程教学而言,特别是软件类课程,要求学生学习完成后,能够运用该软件或编程语言,来解决实际的工程问题[5-8]。这对于传统的以传授知识的教学方式是一种重大的转变。C 语言是工程领域的核心编程语言之一,通过对C语言的学习,能够让学生建立坚实的编程基础、掌握实际的应用技能,培养学生对于工程问题的兴趣,为将来在工程领域的发展奠定基础。因此,C 语言的教学方式对学生将来从事实际工程项目的能力有着重要的影响。

对于C 语言课程而言,则需要改变以往的仅以知识点进行授课的方式,而需要以提高学生解决实际工程问题的能力为目标,进行课程教学的调整。特别是,C 语言课程的知识点较为零散细碎,学习起来比较枯燥。而C 语言课程作为工科类专业的基础课,往往开在大学一年级。对于低年级的学生来说,本身对编程语言就很陌生,容易产生畏难情绪,影响学习效果。因此,如何将这些知识点进行融合贯穿的讲解,是一个值得思考的问题。

实际上,在C 语言课程教学中的许多知识点,都能够体现工程教育的特点。单一的教授语法,学生很难领会其中的工程意义。但是,如果在教学过程中,教师能够将知识点的讲解联系到实际的工程问题,这不仅能提高学生的学习兴趣,还对于学生理解如何使用编程语言解决工程问题有很大的帮助。

在学习分支结构这个知识点时,教师可以通过一个分支结构在解决实际的工资支付的案例中的应用来进行讲解。例如可以首先提出这样一个问题:“公司对于员工工资的发放需要根据员工的日常表现来进行定量发放。对勤奋努力的员工将给予激励,而对于懈怠的员工,在工资方面将进行一定的扣除。某公司员工的工资计算方式如下:每月的工资按照工作时间发放,每月工作时间正常在120 和160 个小时之间。正常的工作时数,按每小时80 元发放。工作时间超过160 个小时的,超过部分每小时增发20%,工作时间低于120 个小时的,每小时扣发10%。请编写一个程序,根据员工的工作时间,计算应发工资。”围绕着这个问题,学生既能知道学习分支结构有什幺意义,提高了学习兴趣,掌握了C语言中分支结构这个知识点,还能够让学生理解到这个问题中所包含的经济学内涵,对于学生提高经济决策和项目管理的能力都有所裨益。

因此,对C 语言实施教学方法改革,在C 语言教学中运用问题驱动的方式培养学生的实际编程技能和解决问题的能力,围绕着问题来进行知识点讲解和对学生能力的培养,具有非常实际的教学意义。

3 问题驱动的C 语言课程教学改革方法

C 语言课程的教学改革有多种方法,比如基于课程设计的教学方法、提高互动性的教学方法、利用网络资源的教学方法等。根据对当前工程教育认证的理解,本文提出了一种以问题驱动的C 语言课程教学改革方法。其中,教学改革的重点在于以解决实际问题为导向,整个教学过程都是围绕着解决一个实际问题而进行的。首先,教师通过布置一个问题案例,布置预习问题时,会将该问题中将涉及本节课程中的主要知识点列出,让学生进行预习并查阅资料。然后,在课程中,首先随机抽取学生进行提问,让学生回答有关案例知识的预习情况,发现其中的主要误区。再进行知识点和问题的讲解,并重点解释学生所存在的主要误区。课程结束后,由学生撰写最终的解决方案,提交完整的程序代码。然后,教师对学生的作业或报告进行批阅,并给出反馈意见。在整个教学过程中,贯穿着不同层次的教学评价方式。在每一个小章节的课程教学结束后,通过一些小的选择题或者填空题来进行知识点测试,通过编程题进行应用能力测试。而在学期末,将通过期末考核对学生的学习情况进行综合考查,根据考核结果可以知道本课程目标的达成情况,并根据课程目标达成情况来进行后续的教学改进。整个教学改革的设计框架如图1 所示。

图1 C 语言课程教学流程图

为了更好地阐述教学改革方法,以下将说明教学流程。在循环结构中,涉及几种循环控制结构,包括for 循环、while 循环和do while 循环。教师针对循环结构这个知识点,提出如下问题:“电子商务如淘宝、京东等电子商务平台在销售市场中占据了重要的比例,其中一个重要的环节就是快递运输问题。如何进行交通运输优化,对于成本核算具有重要意义。现假定有三种不同车型,其中,A 型车载重量为18 吨,B型车载重量为25 吨,C型车载重量为31吨。现有100 辆车,需载货500 吨,请问,需A、B、C 型货车各多少辆?”

这个问题是一个在快递业中非常实际的成本优化问题,对于学生认识如何使用软件编程语言来解决工程问题有很好的帮助,整个课程教学将围绕该问题进行。课程教学的流程如图2 所示。

图2 课堂教学示意图

第一步:布置预习练习。

教师在上一次课的末尾布置下一次课的预习任务。布置预习任务时,先大概跟学生讲解一下该问题的意思,并列出该问题所涉及的主要知识点,让学生对该问题进行资料查阅。对于上述例子,所涉及的主要知识点为循环控制,C 语言中循环结构包括for 循环、while 循环和do while 循环。之后,教师提出几个问题让学生进行思考。在该问题中,需要学生思考的问题有:①循环控制有哪几种方式?②该问题应当如何进行数学建模?③该数学建模可以采用哪几种循环方式来进行编程实现?学生则根据教师提出的问题进行调研,并做好预习报告。

第二步:课堂中讲解。

由于在上一次课程的末尾已经将本次课的知识点和问题提出,因此,在本次课程上课之前,需要对学生的预习情况做一个大概的检查。教师通过提问的方式,随机抽取几位同学,针对提出的几个问题,检查学生的预习情况,同时也便于发现学生在预习过程中,对问题的理解误区。接下来,教师将围绕着上述问题来展开知识点的讲解。讲解完后,将知识点应用于问题的解决上,使学生能够充分理解如何运用知识点来解决工程问题,以及在工程问题中所包含的项目管理和经济决策的内涵。

以上述问题为例,以下简要介绍围绕该问题的课程讲解流程。首先,教师随机抽取学生提问,检查学生的预习情况。然后,就该问题进行分解讲解。先讲述该问题应当如何进行数学建模,例如,在该问题中,需要满足两个条件,一个条件是A、B、C 型车的总和是100 辆,另一个条件是要载的货物总重量为500 吨。因此,要满足这两个条件,需要使用到的知识点是if 条件语句。条件语句的知识点在循环结构之前已讲解过。A、B、C 型货车各多少辆?为了回答这个问题,需要对A、B、C三种车型都进行0 到100之间的扫描,因此,要用到循环语句。根据这个问题引出本节课程要讲解的知识点——循环结构。然后据此展开对循环结构知识点的讲解。讲解完后又回到该问题,说明如何使用循环结构的知识点来解决该问题,并布置课后作业,让学生应用循环结构完成完整的程序代码。通过该问题,不仅能使学生掌握循环结构这个知识点,还能让学生领会如何使用编程语言工具对实际工程问题进行表述、建模、求解,以及最后解决这类工程问题。

第三步:课后学生完成问题,提交作业。

经过课堂讲解后,所有学生都应当根据所学习到的内容来给出解决该问题的完整方案和程序代码,并提交作业或报告,以提高学生的表达能力。而教师则需要及时批改学生的作业和报告,并根据批改情况进行反馈。在下一次课前,教师需要把该问题的完整程序答案分发给学生,并在下一次课中针对学生存在的一些共性问题进行讲解反馈。

上述过程仅以一个例子来说明如何围绕着一个知识点,运用问题驱动的方式进行讲解,从而提高学生解决工程问题的能力。而对于更复杂一些的问题,需要综合多个知识点来解决的问题,教师可以采取分组的方式,几位学生一起合作来完成一个问题。在C 语言课程的教学中,对于综合类型的问题,可以三到四名学生一组,来完成这类综合类的问题,可以模拟实际的工作环境,分配不同的角色给学生,例如项目管理者、代码编写者、功能测试者等,要求学生召开团队会议,讨论项目的进展、遇到的问题,讨论下一步的工作计划等,通过这种方法来提高学生的团队合作能力。

第四步:教学评价。

在经过一个完整的教学流程后,教师需要对教学效果进行一个教学评价。我们将采取多层次测试的方式进行评价。第一层次,也是最基本的考核层面,要强调知识点的掌握。因此,每个章节都会给出一些选择题和填空题,它们覆盖了本章节重要知识点,以达到较为全面地考核学生对知识点的掌握程度。同时,通过学生做题的情况,也能够发现学生容易出错的问题点。第二层次,要考查学生的应用能力。在掌握知识点的基础上,学生还需要能够应用这些知识点去解决一些实际问题,这也是本教改的一个初衷。因此,每个章节还会给出几道程序题。这些程序题除综合了应用相关知识点,还会结合实际应用场景。例如,如前所述,应用分支结构来解决公司的激励性工资支付问题。这样,一方面能够考核学生应用知识点的能力,另一方面,还能考查学生将其应用到解决实际问题的能力情况。第三层次,则是综合考评,主要由期末考核来体现。期末考核不仅涉及单个章节的内容,还会综合应用于多个章节的内容,特别是在编程题中,需要综合应用不同知识点才能解答。通过上述三个层面的考核,能够较为全面地考查学生掌握该课程的情况。特别是在工程教育认证的背景下,这种多层次考核的方式能够较为清晰地看出学生对于每个课程目标的达成情况,以便于对后续教学内容进行调整与改进。

4 结束语

工程教育认证所倡导的教学方式是当前大学生教育方式的重大改革,涉及所有课程的授课方式的转变,要求教师在授课过程中秉承以学生为中心,目标导向和持续改进的理念,做出授课方式的改变。C 语言教学本身也面临一些问题,比如:学生背景的差异、学生的学习动力、如何联系实际进行应用、教师教学水平的差异等。为了更好地满足学生的需求,解决这些问题也需要改进教学方法。所以在这种背景下,本文提出的以问题驱动的C 语言课程教学方法改革,通过提出一个实际的工程问题来进行课程知识点的讲解,能够让学生理解如何使用高级编程语言进行工程问题的表述、建模与求解,培养学生解决工程问题的能力,以及沟通表达、项目管理和团队合作等能力。