算法为先的C语言教学模式探讨

时间:2022-07-13 07:47:07

算法为先的C语言教学模式探讨

摘要:本文通过分析C语言教学中存在的问题,提出算法学习对学生学习语法和上机操作有着积极的作用,进而阐述算法为先的教学方法,实践证明,该教学方法从根本上调动学生学习C语言的积极性和主动性。

关键词:C语言;算法为先;教学模式

中图分类号:G642 文献标识码:B

1引言

为适应社会和经济的信息化需要,掌握计算机技术显得尤为重要。C语言以它结构化丰富、灵活性大、可移植性强、效率高等优点,被广大高校作为计算机专业基础课,以及许多非计算机专业学习程序设计的首选课。但是又由于C语言涉及的概念复杂,规则繁多,数据类型和运算符丰富等特点,使许多初学者望而生畏。很多文献致力于研究好的教学方法,帮助学生掌握C语言语法及上机技巧,这在一定程度上改善了教学效果,但是学生的学习热情仍然缺乏积极主动。本文通过分析算法在C语言教学中的重要作用,进一步探讨算法的教学方法,目的是从根本上激发学生的学习热情,降低学习难度。

2C语言教学中常见问题分析

算法设计、基本语法规则、程序调试是C语言教学的核心内容。算法注重解决某一问题采用的方法步骤,语法注重语言规范,用规范的C语言描述的算法必须通过上机调试才能实现,三个核心内容紧密联系。然而在教学环节中,教材内容基于语法体系,通常采用课堂讲语法、上机调程序的教学模式,忽视了算法在教学中的积极作用,殊不知过细的语法知识易使学生失去兴趣,灵活的编辑环境让学生望而却步,学生的学习热情很难调动起来。

2.1语法细节易使学生失去学习兴趣

通常C语言是学生接触的第一门程序设计语言,任何程序主要由数据和操作两部分组成,围绕这一特点,C语言教学内容可归纳为:算法,数据结构,程序结构三部分。算法是编程的指导思路;数据结构是数据的组织形式,可细分为基本数据类型,构造类型,指针类型、位运算;程序结构是操作语句的组织形式,具体包括预处理,函数,顺序结构,选择结构,循环结构。虽然C语言知识结构清晰,但是它是面向过程的编程语言,具有灵活的编程格式及丰富的运算符和函数,如果对语法细节不熟悉,以及相关概念混淆不清,很难编出正确的程序。教师往往投入较多课时,讲解C语言语法,而繁多的语法细则,不仅使学生难于记忆,而且容易误导学生的编程思路。例如scanf函数的应用:

scanf函数的一般使用形式为:scanf(格式控制,地址表列)。

格式控制是用双撇号括起来的字符串,它包含两种 信息:

(1)%和格式字符,如%d,%c,%s等,它的作用是按指定的格式输入数据;

(2) 普通字符,即在数据输入时,需要原样输入的 字符。

地址表列由若干个地址组成,通常是变量的地址或字符串的首地址。输入多个数据时,空格,回车键,跳格键为默认分隔符。

如:“scanf(“%d%d%d”,&a,&b,&c);”语句,运行时输入:689L,可得到变量a,b,c的值。如果输入语句变为:“scanf(“%d,%d,%d” ,&a,&b,&c);”,仅添加了两个逗号,仍按以上方式输入,则会出错。原因在于格式控制部分出现的普通字符“,”,在数据输入时要原样输入,正确的输入方式为:6,8,9L。可见C语言语法格式非常灵活。

运用scanf函数输入字符时,又出现特殊性。

如:“scanf(“%c%c%c” ,&c1,&c2,&c3);”语句,运行时输入:abcL,目的是将a赋给c1,b赋给c2,c赋给c3。用“printf(“%c,%c,%c”, c1,c2,c3);”语句输出,结果却为a,,b。出错原因在于:%c格式字符不需要空格作为输入字符的间隔。正确的输入为:abcL。

然而,用scanf函数输入多个字符串时,空格又成为有效的分隔符。

如:“scanf(“%s%s%s” ,c1,c2,c3);”语句,其中c1,c2,c3为字符数组名,若输入数据:How are you? L,则c1数组的数据是“How”; c2数组是“are”;c3数组是“you?”。若将语句改为“scanf(“%s”,c1);”,输入字符串:How are you? L,用“printf(“%s”,c1);”输出,则只显示How,与原意不同。如果一定要将带空格的字符串输入到字符数组c1,需要用到另一个输入函数,如“gets(c1) ;”。

虽然任何一个C程序输入数据,都可能用到scanf函数,但是它灵活的编程格式,往往使初学者在具体运用时举棋不定,忘却抓住编程题目的实质性要求。教材中还有许多值得注意和思考的语法细节,学生编程时,如果缺乏解题思路的引导,常因语法的困扰而失去编程兴趣。

2.2编程环境易让学生望而生畏

上机操作是学习程序设计的必备环节,学生可以验证语句的正确性,测试程序的功能,进一步增强对语法知识的理解和记忆。但是C语言编辑环境的一些特点,又让学生望而生畏。

首先,编辑环境基于DOS,不像其它可视化语言有友好的交互界面,加之初学者对语法知识不熟悉,编程时稍有不慎就会出错。如经常字母大小写不分;语句末尾忘加“;”;关系运算符“= =”误用为赋值运算符“=”等。初学者对出错提示缺乏了解,不知道错在哪里,更无从改正,经常一个小小的错误导致整个程序无法运行。

其次,C语言编译程序对语法检测不像其它高级语言那么严格,这种风格虽然给编程留下“灵活的余地”,却常导致一些非语法性和非算法性的隐型错误。比如程序:

main ( )

{

int a,b;

a = 32767;

b = a+1;

printf(“%d”,b);

}

运行结果为-32768,不正确,原因在于发生了溢出。系统运行时并不报错,程序中潜伏的隐型错误,给编程带来很多麻烦,增加了调试难度,对编程者提出更高要求,只有他们较全面地掌握了计算机知识,才可能检查出错误。然而初学者往往只懂得编程的一部分知识,这使他们感到C语言编程即抽象又复杂。如果没有浓厚的兴趣驱动,很容易在不知所措中放弃编程。

2.3算法为先,激发学习热情

“C语言”课程长期沿袭传统教学模式,以语法体系为脉络展开教学,重视语法细节和操作技巧,忽视算法对编程的指导作用,学生见木不见林,容易失去兴趣,经过一个学期的学习,除了掌握一些零星的语法外,收获甚微,面对具体的编程问题,无从下手。从事软件开发的人都知道,软件开发过程包括:可行性研究,需求分析,概要设计,详细设计,编码,测试,维护等几个阶段。重点在于先设计,后编码,并且整个开发环节需要不断查阅资料,反复调试修改,最终才能设计出可运行的软件,单靠记忆和背诵一些语法知识,根本无法适应实际需要。

在教学过程中,正确处理语法与算法的关系,是提高编程能力的关键。算法是程序设计的灵魂,没有正确的算法,计算机解决不了任何问题,语言只是实现算法的工具,要从算法实现的角度来介绍语言,而不是用语言来套用算法。程序设计课程本身是综合性较强的一门课,注重由设计算法到书写程序并进行调试的整个过程,它要求学生首先明晰结构化程序设计思路,知道怎么做,其次要求学生用扎实的语法知识实现编程,最后通过上机调试保证程序正确运行。然而,这个过程并非一帆风顺,会遇到许多意想不到的困难,需要耐心与毅力,只有具备真正的兴趣和强烈的好奇心,才容易完成。

经过研究与实践,教师在教学中如果注重算法为先,从算法实现的角度来介绍语法,那么不仅可以加深学生对语法知识的理解,增强语言应用能力,而且通过构造算法,培养了学生的逻辑思维,增强了学生分析和解决问题的实践能力。学生面对新的问题,会从程序设计思想的角度出发,先设计算法,在迫切想要实现的好奇心下,克服学习语法和调试程序的各种困难,变被动为主动。著名计算机科学家Dijkstra曾提到:“学编程是一个由新奇到熟悉循序渐进的过程”,继而又说:“在这种激进的新奇中含有愉悦的尝试”。

3算法教学建议

由上分析可知,C语言教学目标不仅仅是要求学生掌握语法规则或再现简单程序,更重要的是要求学生具备编程实践能力。传统教学方式,学生形成以语言为中心的思维模式,编程能力差。教师应引导学生逐步形成以算法为中心的思维模式,提高编程能力。但是算法的学习和掌握并不是一蹴而就,必须依靠平时训练和知识积累,以下提几点学习建议。

3.1以结构化程序设计思想为核心,开拓算法设计思路

学习的认知规律是将复杂问题简单化,以便于初学者理解和接收。C语言程序设计遵循结构化程序设计方法,该方法提高了程序的可读性,方便了程序的调试和维护,最重要的是该方法不拘泥于算法多变的外观形式,总结出算法结构的内在规律。学生掌握了这种规律,面对新的问题,很容易进行知识结构的迁移,复杂的编程问题将变得简单。

结构化程序设计包括结构化算法设计和结构化编程。由顺序、选择、循环三种基本结构(或基本结构的简单变形),按由上到下的顺序排列,组成的算法称为结构化算法。已经证明,结构化算法可以解决任何问题。对于特别复杂的编程项目,可以先采用自顶向下、逐步细化的分析方法,或采用模块化设计方法,把大任务分解为容易求解的若干子任务,分而治之。对于非结构化算法,还可以用等价的结构化算法替换。在设计好一个结构化算法之后,就可以进行结构化编程,C语言提供了与三种基本结构相对应的语句,进行结构化编程也并非难事。

由上可知,既然基本结构的顺序组合,可以表示任何复杂的算法结构,并且基本结构易于用C语句实现,那么学生只要深刻理解并熟练掌握这三种基本结构,就会提高设计算法和编写程序的能力。表1对算法的三种基本结构进行了总结。

说明:算法的表示方法很多,其中N-S流程图最适于表示结构化算法。表1列出了算法的三种基本结构以及相应的N-S流程图和语句的主要表示形式,学生通过该表很容易理解算法,N-S图,编程三者之间的关系。

教师要向学生说明,任何复杂算法都是由这三种基本结构构成,构造算法其实很容易,大家之所以觉得困难,是因为没有深刻理解A、B代表的含义。正如表中提到:A、B较灵活,既可以代表选择结构也可以代表循环结构,选择结构中还可以再套用一个循环,循环结构中还可以再嵌套循环或选择……由于A、B代表含义不同,可能构造出各种各样不同的N-S图,教师边阐述,边在黑板上绘制,开拓学生的思维空间。最后总结:能构造多少N-S图,就可能存在多少算法;顺序、选择、循环是三块基本的积木,形式多样的算法是由它们搭建而成,用于解决实际问题。这种教学方式,以简单的N-S图为切入点,学生很容易发现N-S图的多样性,算法的多样性,实际问题的多样性之间的联系,从而激发设计算法的浓厚兴趣。

正确的解题算法将减少程序的逻辑错误,算法用N-S图描述出来后,利用相应的C语句,学生很容易编写出程序的主体代码,至于其它编程细节,可以引导学生查阅资料。这样,学生对语法的学习由被动变为主动。精心培植的幼苗,一定期盼开花结果,学生经过一番努力,编写出的程序代码,也一定希望能用计算机实现,于是上机调试也变得既有目的性,挑战性又有趣味性。

3.2案例式教学,一题多解,培养设计算法的逻辑思维

C语言是实践性很强的一门课程,学生除了掌握结构化程序设计方法外,还必须进行大量编程训练。通常情况下,一个程序是用哪种语言实现的并不重要,关键在于算法设计的优劣。计算机科学家N. Wirth教授提出了一个著名公式:算法+数据结构=程序,由此可见程序设计的本质在于先设计出解决问题的算法。

教学初期,学生对语法知识了解甚少,教师可以根据每节课的教学目标和内容,精选程序例题,将重点放在算法的设计思路和方法上,逐步培养学生建立正确的思维模式。学生设计算法时,常犯的错误是,不会从计算机角度出发,分析实际问题内在的逻辑关系,而习惯于按照人的思维方式设计求解过程,算法往往无法用计算机操作实现。因此改变学生思维习惯,培养逻辑分析能力,尤为重要。

实践证明,对同一问题,设计多种有效算法,并对算法进行优化选择,有利于培养学生逻辑思维。通过一题多解,既拓展了学生的解题思路,增强了学生对同类问题求解的熟练程度,同时又潜移默化地培养了学生思维的科学性、严谨性。通常,不同问题间存在某种共性,一些基本算法掌握熟练后,学生很容易举一反三解决不同问题,树立起编程的信心。

例如通过一题多解,让学生熟练三个数由大到小排序的算法,进而引导学生对一组无序数据进行排列,用N-S图描述算法,更能反映出不同问题之间的联系和区别。

再如典型例题:用100元钱买100只鸡,每只公鸡5元,每只母鸡3元,每3只小鸡1元,要求每种鸡至少买一只,而且必须是整只,问各种鸡各买多少只?

对该问题设计多种算法,既帮助学生熟悉了循环语句,同时通过对各种算法进行评价,学生又深刻体会到算法设计的优劣对程序执行效率的影响。经过这种长期训练,学生求解问题时,不仅会注意算法的正确性,也会注重思维的严谨性。一题多解既培养了学生创造性思维,又训练了逻辑思维,是提高算法设计能力的有效方法。

3.3算法带动语法学习,全面提高编程能力

在编程训练过程中,学生不仅要积累设计正确,高效算法的经验,而且随着课程内容的不断丰富,还要能将各种算法转化为可执行程序,完成整个结构化程序设计过程。

以往教学模式过多重视语句命令格式,教学内容繁琐,学生需要识记的知识多,并且不易体会其用途,容易失去学习兴趣。如果在教学过程中,教师采用一些方法,充分利用学生对算法的理解和掌握,激发学习语法的兴趣,将取得好的教学效果。

首先,面对编程问题,如果学生明晰解题思路,在结构化程序设计思想的指导下,会很快设计出算法的N-S图。由前可知,算法是由顺序、选择、循环三种基本结构构成,表1只是简单地列出了三种基本结构的C语句实现,教师应广泛搜集并认真挑选典型例题,帮助学生全面掌握三种基本结构的各种语法表示。这样,学生根据算法的N-S图,就会很容易编写出程序的主体代码。

其次,教学初期,采用案例式教学,注重培养学生的算法设计能力,学生的语法知识比较薄弱,若要求他们将算法的N-S图完全转换成计算机语言,会遇到较多困难。如果教师能认真解析C语言知识,将教学内容有机组织起来(见2.1所述),再现在学生面前,那么学生在迫切想要实现算法的心理之下,借助脑海中的知识体系,会很容易寻找到相关章节,查阅还未曾系统学习的语法内容,独自完成编程过程。这样既增强了学生的学习自主性,学生在解决问题的同时,又深刻体会到语句的用途和功能,从而激发出强烈的编程兴趣。

最后,建议教师按照总体教学目标组织教学,制定每节课的语法教学任务,针对教学任务挑选例题,通过对案例的分析讲解,一方面帮助学生积累设计算法的经验;另一方面,加强学生对算法所涉及语法内容的理解,掌握和应用,学生只有正确理解并熟练掌握每一个基本概念,编程时才会少犯语法错误,从而减少不必要的程序调试,逐渐树立编程的信心。

4结束语

C语言是计算机基础教育的重要组成部分,教学目标在于培养学生的编程能力。多年来,教学模式一直围绕语法体系,学生学习兴致不高,分析和解决实际问题的能力差。经过多年教学与实践,本文倡导算法为先的教学模式,以结构化程序设计思想为指导,通过案例式教学,提高学生算法设计能力;利用学生对算法的理解和掌握促进语法学习,进而提高学生将算法转换为计算机语言的能力;算法和编程能力的提高,将有效减少程序中的逻辑错误和语法错误,降低调试难度。由此可见,算法为先的教学模式,有利于提高学生的程序设计水平。

参考文献:

[1] 谭浩强. C语言程序设计[M]. 北京:清华大学出版社,2000.

[2] Edsger W. Dijkstra. On the Cruelty of Really Teaching Computing Science[J]. Comm.ACM,1989(32):1398-1404.

[3] 钟频. 高级语言程序设计的精髓―算法设计[J]. 株洲师范高等专科学校学报,2005(5):51-53.

[4] 陈元琰. 程序设计过程中“循环结构”一节的教学方法[J]. 高教论坛,2004(1):76-78.

上一篇:“微机原理与接口技术”课程的案例教学探讨 下一篇:美国计算机专业博士生教育的特点和启示