APP下载

非计算机专业C语言程序设计的课堂教学实践与改进

2009-02-24陈洪涛顾沈明

计算机教育 2009年2期
关键词:计算机教育C语言程序设计

陈洪涛 顾沈明 刘 军

文章编号:1672-5913(2009)02-0125-02

摘要:本文针对高校非计算机专业C语言程序设计在课堂教学方法方面的一些问题,提出在教学活动中,通过让学生建立一个最简单的计算模型等方法,培养学生用计算机程序解决实际问题的能力,强调在课堂教学中要特别重视分析程序运行和内存变量的关系,并阐述了面向技能形成的习题训练的观点。

关键词:计算机教育;程序设计;C语言

中图分类号:G642

文献标识码:B

1引言

高校计算机基础教学“主要讲授程序设计语言的基本知识和程序设计的方法与技术,其内容以程序设计语言的语法知识和程序设计技术的基本方法为主,同时包括程序设计方法学、数据结构与算法基础等方面的初步内容,应使学生掌握计算机程序设计的思想和方法,初步具有在各领域应用计算机的能力,并为后续课程的学习创造条件。”[1]

在许多高校,C语言程序设计是理工类必修的计算机基础教学课程,但是在实际教学过程中,学生对这门课的掌握程度不能令人满意。这一方面是由于高等教育大众化,学生的学习能力和学习愿望不如从前;另一方面,C语言教学实践中,在诸如课堂教学方法、平时训练等方面也存在着不能适应大众化教育形势的一些问题。

C语言的教学一直以来比较偏重语法,但学生普遍反映听的时候好像都听懂了,但是当一个问题放在自己的面前,就不知道如何用所学的知识去解决。教师在教学活动中如果没有主动意识到这一点,就可能会把C语言的教学活动看做是语法的讲解,不注重在教学活动中引导学生用程序的思维方式分析问题解决问题。而后者才是程序设计这门课程的真正目的。

2培养学生用计算机程序解决问题的能力

培养学生用计算机程序解决问题的能力,需要通过课堂教学注重几个方面的问题:

(1) 理解计算机处理问题的“过程”方式

人们对现实问题的分析,有些并不需要像计算机一样用“过程”的方式来给出解决方案,例如数组元素的排序,人类解决这个问题的思考过程没有明显的循环过程,或者我们并不会很在意循环过程,但是计算机则不同,它要求程序员必须明确地设定循环的“过程”。程序设计课程正是要培养学生用和我们平常的思考方法不同的“过程”方式来描述算法,但这是思维方法上的一个跳跃,这种跳跃过去一直是通过大量的练习,由学生自己自然而然感悟到的,当然,有些感悟能力强的同学对这一问题的理解很快,但是在教学实践中发现,对很多非计算机专业的学生而言,由于练习的机会比较少,感悟到这一点常常比较费时间。例如求一个圆的表面积,常见到初学者写出如下的代码,以为只要告诉计算机“s=3.14*r*r”这样一个计算公式,再给出r的数值,计算机就可以给出结果,而不知道还需要告诉计算机执行的“过程”。

01 #include

02 int main(){

03 int r,s;

04 s=3.14*r*r;/*顺序出错*/

05 scanf("%d",&r);

06 printf("The area is %d",r);

07 return 0;

08 }

如果教学过程中能够有意识地引导学生,无疑可以降低学生学习的难度。

(2) 在头脑中建立一个最简单的计算模型

用和我们平常的思考方法不同“过程”的方式来描述算法,需要明白计算机和人类的思维方法不同的“过程”特点,这就需要在学生的头脑中建立一个最简单的计算模型。事实上冯·诺依曼计算机体系结构是以存储器为中心的,对编程的初学者就需要解决如何在这一体系结构的基础上来设计解决问题的步骤。

程序的执行过程是围绕着存储单元进行,存储单元既可能存放输入数据,也可能存放程序执行的结果,很多学生就是因为不能建立这样一个计算模型,按照平常地思维习惯,在设计算法时把一些中间计算结果记在心里,导致无法用程序语言描述解决问题的思路。

当学生在头脑中建立一个最简单的面向存储器的计算模型后,就能较好地理解计算机解决问题的方法,可以把求解问题的算法转为利用存储单元进行的“取”→“计算”→“存”的过程,然后将这种自然语言描述的算法翻译成为C语言。例如交换两个变量的值,可以用自然语言描述成下面的步骤,对初学者而言这样就很容易理解。

1. 先指定两个盒子,命名为a,b;

2. 命名一个存放临时数据的盒子c;

3. 在两个盒子a,b中分别存入两个数值;

4. 取a的数值存入c;

5. 取b的数值存入a;

6. 取c的数值存入b;

同时基于存储器的计算模型,对一些让初学的同学比较容易出错的东西也可以解释得比较清楚,比如“变量使用前须定义,引用前须赋值”,学生就会想到:变量的定义只是给某存储单元取了一个名字,在没有向里面放入有效值之前去引用它,自然得不到想要的东西。

在循环程序设计中,利用上面的简单的基于存储器的计算模型也能帮助初学者找到形式上一致而内容变化的循环体语句,从而比较顺利地设计出循环结构。

例如:求1+2+3+4+…+100的值,如果明白计算机求解问题的都需要基于存储器,累加实际上是在现在存储单元中已有数据的基础上再加入新的数,就会自然想到如图1的方法:

给存储单元命名为sum,逐次加入的数先放在x中,就比较容易想到“形式上一样的循环语句”应该是sum=sum+x,并且x的变化范围是1~100。

当学生建立起基于存储器的计算模型后,对其他的C语言程序设计的难点问题,例如函数参数传递,数组、指针、结构、链表的理解也会变得比较容易。

(3) 在课堂教学中要特别重视分析程序运行和内存变量的关系

在学生头脑中建立了基于存储器的计算模型后,还需要不断练习才能加深这种印象,除了学生自己练习以外,在课堂讲解例题时可以有意识分析每一步程序运行所导致的内存变量的变化,通过不断练习提高学生阅读程序的能力。

(4) 在C语言的教学活动中,以面向问题分析、算法设计、程序编码的方式组织知识

现有的C语言教材一般是按语法的难易程度次序编写的,这当然是符合人的认知规律的,但是同时也需要教师在讲授的过程中,突出以面向问题分析、设计、编码的方式组织知识的讲解,只有这样才能使学生在形成用程序的思维方式分析问题、解决问题的能力的过程中少走弯路。

教材的知识组织方法是语法→例题→程序→解释,这种沿用已久的方法,在培养学生用计算机的方式思考问题方面,作用不够充分。

事实上,算法在人们的头脑中首先是一种用自然语言描述的“过程”,再通过逐步细化,然后再把它从自然语言转换成为C语言。在教学的实践过程中,可以以这样的方法组织知识:问题→自然语言的过程描述→程序。教师在课堂上,可以在集成开发环境中,以注释的方式用自然语言进行过程描述,然后逐步求精,最后转换成程序代码的方法。

例如:取得一个整数的个位、十位、百位,从问题的描述到问题的解决。可以先用自然语言来解决问题,然后逐步过渡到C语言。

/*例如有个数5693放到存储单元x */

/*目标:取得个位数,方法:x模10的结果是个位数 */

/*目标:取得十位数,方法:1. x除以10的结果放入存储单元x, 2. x模10的结果是十位数*/

/*目标:取得百位数,方法:1. x除以10的结果放入存储单元x, 2. x模10的结果是百位数*/

/*目标:取得千位数,方法:1. x除以10的结果放入存储单元x, 2. x模10的结果是千位数*/

/* 当x除以10的结果是0时,程序不必继续下去*/

通过自然语言分析,既找到了循环体语句“1. x除以10的结果放入存储单元x, 2. x模10”,又找到了循环控制条件,再翻译成C语言应该也不再是一件难事。

3面向学生技能形成的训练

程序设计这门课程需要大量的训练才能真正形成技能,但是现在一些教材习题所存在的一些问题可能传递不正确的信息,妨碍技能形成。这些问题包括:

1) 很多习题结果的正确性是和特定的编译器相关的,例如:函数中的多个参数的计算顺序,printf(”%d,%d,%d”,a+b,a++,++a);在一个表达式中多次出现++、--运算符。这类习题只是训练了某一个编译器的使用技巧,而这种技巧在实际的编程实践中要尽可能地避免使用。

2) 习题包含较多的数学知识可能妨碍初学者,例如用碾转相除法求最大公约数,以及对不同三角形的判断等习题,对培养严密的逻辑思维很有好处,但是在教学实践中的情况看,这些习题反而使得初学者无从下手,所以需要在实践中平衡利弊。

3) 过分注重技巧,不利于技能的形成。现代软件工程的实践比较排斥在编程时过于注重技巧,这会导致程序难以维护,所以应该避免过于注重技巧习题。

面向技能形成的训练另一个问题是需要保证习题的量,这一点对作为非计算机专业的学生要求起来比较难。

4总结

在现有的教学大纲和教材基本定型的情况下,针对现在学生的认知特点,围绕高等学校计算机基础教学的基本要求,本文试图从课堂教学的角度,找到如何让学生在头脑中建立一个最简单的基于存储器的计算模型,并在此基础上结合具体的例子,阐述了培养学生形成用计算机分析、解决问题能力的具体做法。本文的方法已在课堂教学实践中采用,收到了一定的效果,当然在课堂教学过程中还需不断改进。

参考文献

[1] 教育部高教司. 关于进一步加强高等学校计算机基础教学的意见[R]. 2006.

猜你喜欢

计算机教育C语言程序设计
基于OBE的Java程序设计个性化教学研究
项目化教学在Python程序设计课程中的应用
C++程序设计课程教学改革研究
医学专业“Python程序设计”课程教学改革总结与思考
“C语言程序设计”课程混合教学探索
基于C语言的计算机软件编程技术探究
中职C语言单片机课堂教学中的趣味性探讨
计算机原理中C语言的应用价值
公安院校计算机课堂教学改革研究初探
构建具有专业美术院校特色的计算机课程教育