一、教材分析
厦门**学院《C语言程序设计》是天津科技出版社出版 王志立 先生主编的教材。教材的主要内容是1、程序的三种基本结构(即顺序、选择、循环)2、数组、函数3、指针、文件4、位运算、结构体与共同体等章节。和我们二十年前在武汉水运工程学院(武汉理工大学)学习的C语言程序设计教材几乎一样。C语言是函数式语言,函数章节的内容不多也不难,但却是同学们必须熟练、灵活掌握的一个重点内容。如何运用基本结构、数组、指针等知识来写出一个健壮的函数来,是可以衡量学生对C语言的掌握程度的。这也正和现在的软件模块化设计思想合拍。
在面向对象程序设计的今天,C语言到底有多大的用处呢?
C语言的严谨的结构,严格的运算符号,灵活的语句控制能力,多样化的表现形式是其它任何语言所不能做到的。同时也奠定了C语言在计算机软件工程中的不可替代的地位。而如今,很多业内人士都把面向对象的主流设计语言Java看成是不带指针的C语言,C++就更是在C语言的基础上发展起来的。因此可以说:C语言是其它诸多程序语言的基本功,尽管在实际的工作中直接使用的地方并不多。
另外,C语言中一部分内容的功能是弱化了,比如:指针、位运算等部分。但这部分的功能恰恰是C语言对硬件进行操作的有力工具,其它语言如:Viual Basic、Java、Delphi等都无法独立完成。所以,也正是这个原因,现在很多电子(弱电)电路专业开设C语言课程。
二、学生的基本情况
我院08光电一年级学生正好就是电子类专业,他们大多认为程序设计与他们专业无多大关系,大多是抱着无所谓的态度来学习这门C语言程序设计课程的。经一提醒才恍然有所悟,这门课程和他们将要学习的单片机可编程控制器等其它课程密切相关。
三、教学目标
根据上述教材与内容分析,考虑到学生的认知结构心理特征,制定如下教学目标:
◆ 知识与技能目标
①熟练掌握程序的基本结构
②掌握指针和位运算的各项基本操作。
③掌握函数的运用方法。
四、 重点与难点
◆ 重点:
1、程序的基本结构
2、函数
◆ 难点:
指针与位运算
五、 教学方法与教材的处理
1、 教学方法
以教学大纲为依据,渗透新的教育理念,遵循教师为主导、学生为主体的原则,结合大一学生求知心理和已有的认知水平开展创新教学。在C语言的学习中,如果不进行创新探索,一定会象往届90%以上的大学毕业生抱怨的一样:“C语言太难了,我什么都没学会就毕业了。”
①十面埋伏
在讲授前面的内容时,一定要为后边的重点内容难点多留伏笔。
◆ 为了让同学们顺利突破函数这章重点内容,我们在前面讲授的时候不光是要讲到函数库中的函数,还要自制一些库中没有的函数,就算是暂时这程序不能运行,也得让学生明白函数的基本内容。
例如:程序中有交换两个变量的值的运用
t =a; a=b; b=t; 则a,b两变量的值就交换了,在学生清楚了这三个语句的基础上,我们就不再用这三个语句来写,而写成swap(a,b);的形式,却要说这是一个函数,是一个专门用来交换两变量值的函数,这个函数的内容就是上边三条语句。其实这个函数不是C语言库中的函数,还是需要用户自定义的函数。
◆ 当讲解给变量命名规则的时候,我们就得上升一层来讲。应该讲标识符的命名规则。并且说明标识符包括:变量名、常量名、数组名、函数名、文件名等,这一切命名都得遵循这个标误解符的命名规则。
◆ 当多次调用输入输出函数的时候,一定多去解释小括号中是什么(是函数的参数),为什么要用逗号隔开(因为有多个参数)。以后讲解函数就顺理多了,甚至不用多解释,一带可过,因为习惯已养成。
◆ 当定义数组的时候,如果你不强调数组名就是一个地址常量,到后来学习指针的时候很容易出错。
如错误1:int a[10] ={1,2,3} , *p=&a;因为他老是把数组当成一组变量来理解,其实,这样理解没错,只是少了一点内容而已。
错误2:int a[10] ={1,2,3};a++;出现这样的问题是不知道数组名a是个常量,不能进行自增运算。
这种错误如不在前边防止,等出现了,那就是“永远”的问题了。
②百川归海
不知道是什么原因,C语言从一开始到现在的教材中,基本没有对程序的算法进行归类的,可能是慑于谭浩强先生的大名吧!对于清华、北大的学生可能学习能力很强,不需要归类,而对于我们的高职生来说,要理清里面各种算法之间的关系可能太不容易了,为什么我们高职的教材也不进行归类呢?
在程序的三种基本结构讲解完成后,把所有的课后习题进行归类整理得出发下几条算法特征,并辅以相应的习题,讲学生举一反三,一通百通。
◆ 循环嵌套
例如: int I,k,m,a=3;
for ( I=1 ;I<=5 ; i++){
a=a+3; ……… 执行5次
for (k = 1 ; k<=6 ; k++){
a=a+3; …… 执行5*6次
for(m = 1 ; m<= 7 ; m++){
a=a+3; …… 执行5*6*7次
}}}
Printf(“%d”, a);
a的值应是738
◆ 图阵数阵
再如:输出如下星阵:
*
* * *
* * * * *
* * * * * * * (对称轴是4行,共有7列)
* * * * *
* * *
*
星阵有七行,那么第 I 行有多少列呢?不是解决这类问题的关键。
第 I 行有7 – 2 * abs( 4 – I ) 列,所以该程序如下:
int i,k,j;
for(i =1; i<= 7; i++){
for (k=1;k<=(20+abs(4-i));k++)printf(" ");
for (j=1; j<=(7-abs(4-i)*2); j++) printf("*");
printf("\n");}
◆ 数域遍历
例如:求1到100以内不能被3整除的整数的个数。
百钱百鸡
百马百担
◆ 条件循环
例如:编程产生尾数为11的4位整数,并每行5个打印输出
因符合条件的整数只有90个,个数一定,这就是一个隐含的循环条件。
◆ 规则数列
就是有规律可循的一列数值,如果还知道其初值,就很容易计算出其中的任意项。可考虑使用迭代法来解决这类问题。
迭代法(iterate):是指重复执行一组指令,在每次执行这组指令时,都从变量的原值推出它的一个新值。
例:裴波那契序列数的递归表示如下:
f0=0
f1=1
fn=fn-2+fn-1(n>=2)
对于任意给定的正整数x,判别其是否在裴波那契序列中。
◆ 数学问题
例1:求两个正整数的最大公约数。 【欧几里德算法】
例2:编程找出100~999之间的所有梅花数(也称作水仙花数:一个三位数等于它的每一位数字的立方和)
例3:输出100以内的所有完备数(其各因子之和等于其本身的正整数)
③千呼万唤
说到排序,所有学过程序设计的同学都认为难理解、难懂,为什么呢?大部分的教材在这一章节都是人云亦云,没什么特色。那么这又是什么样的特色呢?其实要求我们同学们掌握的排序算法不外乎:冒泡法,交换法,选择法几种,而所有的教材都就事论事全面细致地讲解了冒泡排序算法。再出几个交换法,选择法的练习题放在课后练习中来希望同学们巩固提高,这种教材本也没什么不好的地方,但这样的教学效果实在不尽人意。为什么不换种方法来教来学呢?
大家想:从n个数中找到最大值或者最小值,就有很多办法,以下列出三种方法:
1、相邻两数比较后,符合条件就交换,直到最后,最大或者最小数就到了最后一个位置上。按这种找最值的办法,同样也可找到剩下的n-1数的最值放到倒数第二个位置上,一直进行下去,这就是冒泡排序算法。
2、拿第一个数和后边的其它数两两比较,如果第一个数比其它的数大,则就交换,比较交换了n-1次后,则第一个位置上是这n个数的最小数,同理可在第二个位置上放置其余n-1个数中的最小数,直到最后。这就是交换法排序算法。
3、拿第一个数和后边的其它数两两比较,如果第一个数比其它的数小,则就记下这个数的位置,然后再拿这个数与它后边的数比较,符合条件就记下它的位置,直到n-1比较后,这n个数的最大值就能找到,再把它与是后的数交换位置,不也找到了这n个数中的最大值吗?照此办理,这n 个数就一定能按要求排好序,这就是典型的选择法排序。
其实这三种排序都与最值有关,且最值是同学们最熟悉,也最有办法的,那么教材中为什么不从最容易着手的地方入手呢?揭开这层面纱,“琵琶女”定会芳容显现。
六、 关于教学过程中的几点思考
★ 关于教学设计
突出以学生的“实践活动”为主线,教师应激发学生的学习积极性,向学生提供充分的实践活动的机会,帮助他们在自主探索和合作交流的过程中真正理解和掌握基本的知识与技能获得广泛的程序设计技术活动经验。
在教学过程中,通过创设问题情景,引导学生观察,类比、联想、分析引发新知识点,这样,学生充分感受了知识的产生的过程,形成良好的思维品质,发展学生的思维能力。
★ 关于多媒体教室
从我院现有的多媒体教室来看,在这种教室里边讲授C语言效果是相当的差,因为黑板被挡住了,老师只能做解说员。
★ 关于教材
这种教材内容的编排不太适合我们高职学生的需要,建议我们组织人员自编教材。