李 娟,张 燕
(西北民族大学 电气工程学院,甘肃 兰州 730000)
C语言程序设计是针对大一学生开设的一门程序设计课程,是一门语法灵活、功能齐全、应用广泛的高级程序设计语言,是后续程序设计课程的重要基础。通过学习这门课程,学生主要掌握程序设计的基本方法,培养正确的程序设计思想,熟练地使用C语言编写程序并具备程序调试的能力,为后续课程的学习奠定一定的计算机基础,同时也为工程技术工作者使用计算机解决实际问题提供方法。该课程的特点是理论与实践相结合,理论教学是实践教学的基础,实践教学是理论教学的强化和应用。
在实际教学中,教师讲课采用的是传统的“纯理论”讲授方式,导致该课程出现很多弊端。第一,C语言的语法和概念比较多,现有的大部分教材是先给出某个知识点,然后阐述该知识点的语法形式和定义,最后举例说明。传统教学中,教师也是采用这样的授课思维方式,忽视了学习C语言的关键是让学生掌握程序设计的方法并解决实际问题,教出来的学生只能看懂程序却不能使用C语言编写程序解决实际的问题。“算法是程序设计的灵魂,语言是工具,编程需要采用合适的方法”[1],因此在讲解C语言的时候要重视算法的重要性。第二,C语言是一门实践性很强的课程[2],上机实践是C语言的一个关键环节。很多高校C语言的理论学时很充足,而上机实践学时较少,上机课程只是简单的程序代码输入,属于验证性的实验,设计性和综合性的实验很少,没有起到上机实验锻炼编程能力的作用,导致学生实际编写程序能力没有得到很好的提高。第三,大部分普通高校的C语言考核是笔试的方式,这导致教师在教学中就会以考试为目的,考的内容就讲,不考的内容就不讲,考的内容较多的就讲得比较详细,考的内容较少的就讲得比较浅显,却没有把握住C语言学习的真正目的是让学生学会编写程序[3],而不是应付考试。
1996年,Bohra和Jacopini提出了程序设计的3种基本结构是顺序结构程序设计、选择结构程序设计和循环结构程序设计[4],并且已经证明由这3种基本结构组成的算法结构,可以解决任何不管是简单还是复杂的问题。循环结构程序设计是C程序设计中最重要和最难掌握的程序设计结构,每一个C程序设计都少不了循环结构。C语言中提供了3种循环语句:while循环语句、do while循环语句和for循环语句,其中for循环语句是最难掌握的一种语句。在一般情况下,为了解决实际的程序设计问题,在条件确定给出循环次数时,首选的循环语句是for语句,因为for语句使用时简洁明了、4要素清楚、结构紧凑、灵活多变、执行效率高,因此完全可以取代while循环语句和do while循环语句,但是在某些情况下,也可以采用while循环语句和do while循环语句解决问题。
学生学习循环程序设计的问题主要是以下几个方面:①循环结构在哪些问题中可以使用;②哪些操作需要重复执行;③这些操作在什么情况下需要重复执行;④循环变量如何改变;⑤编写的程序容易陷入无限循环,既不报告数据有错,又不结束循环。C语言程序设计课程的教学大纲中明确指出循环结构的程序设计是C语言的重点内容,也是难点内容,为后续内容的学习提供重要的基础。对于初学者来说,教师在教学过程中采用好的教学方法,更有助于学生掌握C语言中循环结构程序设计的方法。
对于C语言程序设计这门课程中循环结构的教学,根据知识点的特点,教师可以采用渗透式的渐进案例驱动教学法以及迁移引导式的方法,使学生掌握如何运用知识解决实际问题。该教学法分别吸收渗透式教学法[5]、渐进式教学法[6]和案例驱动教学法[7]的优点,具有如下特点:①通过讲解案例渗透基本概念,达到让学生潜移默化吸收知识的目的;②案例驱动教学法的关键是选择包含相应知识点的经典案例,并且讲解案例时进行分解,采用由易到难、由浅入深、循序渐进的教学法;③采用循序渐进的教学法讲解案例,让学生发现规律和总结规则,理解C语言语法规则的定义,教师对于理论知识再做一个总结归纳,使学生进一步提高认识,达到举一反三应用的效果;④在讲解完语法规则和案例后,采用迁移式的教学法,让学生及时进行课堂练习,既巩固所学知识,又提高解决实际问题的能力,达到学以致用的目的。
案例的设计思路是厚基础、抓重点、破难点,具体需要考虑以下几方面:①所选的案例必须包含相关的知识点;②案例的选择要难易程度适中,符合学生的学习水平,并且可以提高学生的学习兴趣;③案例的选择要具有典型性,可以达到举一反三的目的;④案例的讲解要采用循序渐进的教学方式,由易到难,由浅入深。
案例的设计原则是让学生理解循环结构由4部分构成,包括循环变量初始化、循环控制条件、循环控制部分和循环体语句,并且掌握各部分的功能以及作用。
设计案例1:求1×2×n的值。
案例分析:案例1是求1到n这n个数连乘的乘积。计算过程:首先定义一个变量product保存得到的乘积值,初始化为product=1,然后依次将1, 2n累乘到product中,最后得到product的值就是所求的结果。通过观察发现,每次计算乘积的时候,除了乘数不一样,其他的过程都是一样的。因此,在编写程序时,可以设置一个变量i保存所乘的数,i的值是以1递增从1变化到n,每次执行product=producti,就得到最后的乘积值。通过分析,给出程序如下:
根据所给出的程序总结出for循环的一般形式和各部分的功能,进而把程序推广到用while和do while表示的形式,程序分别如下:
高性能在线分析计算现状与协同计算关键技 术//郭 健,周 京 阳,李 强,Yousu CHEN,罗雅迪,郎燕生//(3):149
while形式:
do while形式:
根据案例1的设计,进而让学生理解循环结构的特点,必须具备4要素且4要素可以灵活变化,出现在不同的地方;同时让学生了解for循环语句、while循环语句和do while循环语句可以互相转换。
设计案例2:求1!+2!++100!的值。
案例分析:案例2的讲解过程中,首先让学生观察,发现它与案例1有相同的部分,借助于案例1的结论分别求出1!、2!100!,然后把1!加上2!,一直加到100!,就得到最后的结果,程序设计时用内层循环求n!,外层循环求1!+2!++100!,这样构成双重循环,因此程序设计如下:
对于上面的程序,分析出该算法的时间复杂度为O(n2),这个执行效率是比较低的。对于所求解的问题,教师应进一步与学生探讨,求下一个累加数的阶乘是在前面一个阶乘的基础上,并且后面一个数是前面一个数以1递增得到的,因此对于前面的程序改进后如下:
对于上面的程序,其算法的时间复杂度为O(n),这个算法的效率就比较高,是线性的。这个过程可以培养学生算法分析的能力和提高其解决实际问题的能力。
案例分析:案例3的讲解中,借助于案例2中我们先求 sum=1!+2!++n!,当sum>10 000就结束循环,这时要有跳出循环的语句,正好可以使用C语言中的break语句。当满足条件sum>10 000为真(值为1),执行break语句,跳出循环,从而终止循环。程序设计如下:
可以看出,for循环中没有循环控制条件,缺少循环控制条件就会变成无限循环,这时就要有跳出循环的语句,即break语句,否则程序将无休止地执行下去,形成死循环。这个问题的难点是怎么使循环体满足条件后结束循环体,也是学生考虑问题的关键。
在讲解完上述3个案例后,教师应及时对用到的知识和方法做出评价和总结,并把相应的知识进行延伸,使学生形成完整的知识体系。对于案例1,点评学生完成的情况,总结出循环结构的一般形式和各部分的功能,得出for循环语句的一般形式,然后把它推广到其他形式的循环结构,如while和do while语句。对于案例2,教会学生分析复杂问题的方法,指导学生将复杂问题分解成简单的小问题来解决,从而解决复杂的问题;同时在进行程序设计时,使学生潜移默化地理解算法的优劣,懂得设计出更好程序的关键是设计执行效率高的算法。对于案例3,学生掌握在进行程序设计时怎么避免设计成死循环,当循环次数不确定时,找出可以跳出循环体的条件,然后用break语句。
在讲解完语法规则和案例后,利用迁移式的学习法,让学生进行课堂练习,进一步扩展思维,达到学以致用的目的。
循环结构程序设计是C语言程序设计中的重点和难点内容,渗透式的渐进案例驱动教学法的优点是:①培养学生分析算法的能力;②提高学生解决实际问题的能力;③加强学生编写程序的能力。综上所述,渐进式的教学法培养学生具备扎实的基本知识、良好的逻辑思维能力和演绎能力;案例式的教学法提高学生的学习兴趣,开发学生的智力,具有启发性和实践性;而渗透式的教学法培养学生独立工作的能力,令学生具备较强的创造性和开拓性,这几种方法结合在一起能够发挥各自的优势。
实践表明,这样的教学方法符合大一新生学习的特点,由易到难、由浅入深、逐步分解、环环相扣、潜移默化,并且也能很好地提高学生的学习兴趣和积极主动性。学生只有自己发自内心想学,才会积极主动地思考问题,才会达到更好的学习效果。
参考文献:
[1]王平勤, 董付国, 原达. 在C语言教学中注重培养学生算法分析的能力[J].微型机与应用, 2007(增刊1): 211-213.
[2]裘宗燕. 从问题到程序: 程序设计与C语言引论[M]. 2版. 北京: 机械工业出版社, 2011: 68-102.
[3]李向阳, 方娇莉. C语言程序设计(基于CDIO思想)[M]. 北京: 清华大学出版社, 2012: 62-87.
[4]谭浩强. C程序设计[M]. 4版. 北京: 清华大学出版社, 2012: 24-26.
[5]杨秀娟, 裴金萍, 刘惹梅. 渗透式教学法在工程制图教学中的应用[J]. 中国电力教育, 2014(15): 82-83.
[6]崔松健. 渐进式与项目式教学方法在“网页设计技术”教学中的融合[J]. 电脑知识与技术, 2010, 6(33): 9375-9376.
[7]曹风华. 案例驱动教学法在“计算机应用基础”课程中的应用[J]. 现代计算机, 2012(12): 41-43.