时间:2023-07-18 17:24:47
开篇:写作不仅是一种记录,更是一种创造,它让我们能够捕捉那些稍纵即逝的灵感,将它们永久地定格在纸上。下面是小编精心整理的12篇程序设计基本结构,希望这些内容能成为您创作过程中的良师益友,陪伴您不断探索和进步。
关键词:程序设计;数据结构;算法;编码;调试
中图分类号:G642文献标识码:A文章编号:1009-3044(2009)33-9490-02
The Effective Strategy of Raises the Student Programming Ability
XIAO Han-peng
(The Secondary School of Nanyang, Nanyang 473000, China)
Abstract: This paper analyzes the design disciplines in the computer programming of the status and the knowledge and ability, combined with their many years of computer science teaching practice of teaching computer programming students an effective strategy.
Key words: program design; data structure; algorithm; coding; debugging
计算机科学是一种创造性思维活动,其教育必须面向设计。计算机的本质是“程序的机器”, 只有懂得程序设计,才能懂得计算机,真正了解计算机是怎样工作的。培养学生程序设计能力对计算机专业的学生来说不仅是培养职业技能的需要,也是培养大学生创造性思维的重要途径。学习程序设计语言可以培养学生运用算法来解决实际问题的能力,这种解决问题的方式是计算机所独有的,也只有通过对计算机的程序设计语言和程序设计方法的学习才有可能获得这种解决问题的能力。
1 程序设计在计算机学科中的地位
程序设计是利用某种计算机语言,编制完成某一特定功能的程序的过程,是涉及描述、开发及有效实现求解的一系列活动,是利用计算机实现自动化的重要手段。
计算机学科主要是系统地研究信息描述和变换的算法过程,包括它们的理论、分析、设计、效率、实现和应用。可以这样说,一切算法的基本问题是“什么能被自动化”以及“如何有效地自动化”。这个自动化的过程就是程序设计的过程。
程序设计语言是人们学习计算机的最基本的工具,也是人们学习计算机基础与应用知识的基本课程。通过学习,使学生掌握程序设计的基本概念、基本知识和基本方法,养成良好的程序设计风格,得到一定的程序设计训练,具备初步编写程序解决实际问题的能力。程序设计也正是有形表达抽象思维的方法,在程序设计过程中贯穿阅读判断、分析思考、工具利用、抽象表达、综合创造等多项技能,是理论、抽象、设计和应用的综合能力培养过程。因此程序设计是计算机学科教学的重要内容之一,对计算机专业人才素质的培养至关重要。
2 程序设计的知识和能力构成
根据循序渐进的原则,与程序设计有关的教学内容主要有:计算机基础知识和操作、程序设计语言和基本的程序设计方法、最基本的数据结构及其基本算法、常用的算法设计方法等。在学习这些知识的同时,必须与能力的训练有机地结合起来。程序设计能力表现在以下几个方面:
1)自然语言能力。要有较强的运用自然语言描述现实事物的能力,只有运用背景知识正确且清晰地陈述问题及其求解目标,才能确定程序的功能。
2)数学描述能力。程序设计是为了告诉计算机做什么和如何做。这就需要利用定义、定理、公式、函数等数学工具把问题形式化,建立数学模型。
3)数据结构设计能力。选择合理的存储结构,在计算机中表示数学模型,是程序设计的一个重要方面。
4)算法构造能力。好的程序由精心构造的、好的算法构成。给出问题求解的离散化计算过程,是程序设计中最具有创造性的工作。
5)程序编码能力。用某种程序设计语言表达算法,尽管这种能力往往被认为技术含量不高,但也需要对程序设计语言的熟练掌握和对算法设计的深刻理解。
6)程序调试能力。程序调试能力是一种专业综合技能,需要对程序设计语言和程序结构有深刻的理解,需要熟练的操作技能,需要会设置测试数据和设置程序断点,这些都有待于学生在实践中逐步积累经验。
可以说,程序设计能力的高低很大程度上反映在驾驭自然语言、数学语言和计算机语言的能力上。这3种语言是人们毕生有用的3种通用智能工具。前两者是后者的基础,良好的英语和数学训练是学好程序设计语言和培养程序设计能力的重要基础。
3 培养程序设计能力的有效策略
知识的价值在于运用,知识的运用需要技能,而技能的形成则依赖训练。程序设计知识的学习和能力的培养需要各方面的知识基础,它是一个系统的教育训练过程,需要多个教学环节的紧密配合才能完成。
1)明确教学要求
程序设计语言课程一般是为应用性教学而设置的,因此,课程的教学不仅仅是传授知识,而且应该强调应用性,应该以培养学生的能力为主。程序设计语言的内容比较丰富,在教学中如果面面俱到,必会耗费较多课时,而且教学效果不一定好。因为过分强调程序设计语言的系统性和完整性就可能会转移学生对课程重点的注意力,关键在于教会学生如何正确运用程序设计语言编写程序,训练实用编程能力。所以必须突出重点,突出应用性,侧重教思想,即把程序设计语言的基本思想、基本环境、基本概念、基本知识和基本方法教给学生,使他们在学习中对硬件、软件环境、程序设计的基本思想和基本技巧,所学程序设计语言的基本概念和使用方法以及编程技术有一个比较全面的感性认识,从而提高解决实际问题的能力。
2)打好数学基础。严格的数学训练是程序设计能力的基础,学习和加强排列与组合、数列、数学归纳法等离散系统的数学方法对提高程序设计能力尤为重要。问题描述和建立数学模型是程序设计的前奏,数学归纳法、穷举法、构造证明法等证明技巧是算法设计方法的基础。
3)强化英语水平。程序设计语言的符号系统以英语为基础,程序设计文档语言首选英语。英文资料是计算机最新和最大的技术资料来源,英语水平是我国软件产业发展和参与国际竞争的制约因素。
4)重视阅读训练。从某种意义上来说,程序设计是用程序设计语言和方法进行的一种写作。可以想象,如果学生没有阅读过一份完整、规范、有实用价值的标准程序,即使记住了有关语言的语法规则,也不可能写出像样的程序。所以,大量阅读、分析、修改和扩充典型的算法和程序,是提高程序写作能力的有效途径。而这个重要学习环节往往未得到应有的重视,缺乏配套的程序设计阅读分析教材。教师应经常指导学生阅读程序,理解程序,提高学生分析程序的能力。
5)注重算法设计,突出数据结构内容。瑞士科学家、PASCAL语言和MODULA-2语言的发明者沃思(Wirth)教授提出了著名的公式:程序=算法+数据结构。这个公式表达了程序的实质,说明对于一个程序设计问题来讲,算法与程序设计是紧密联系的,绝不能脱离数据结构去讲解算法设计。程序设计语言的教学应该结合数据结构的基本内容。对于同一个计算问题,选用不同的数据结构,其算法大不一样,算法的优劣程度也不同。因此,要教会学生对不同的问题选择合适的数据结构。在整个程序设计课程中,必须强调算法设计方法,通过不断的算法设计训练,使学生切实掌握迭代、枚举、递归、分类等常用算法设计方法。
6)更新教学内容。计算机学科是一门综合性学科,而且程序设计语言的应用领域在不断扩大和发展。因此,在教学中应结合专业的特点和教学的要求,将软件工程的思想方法贯穿于整个教学过程,介绍程序设计语言的最新发展和应用,重视面向对象程序设计方法的引入,搞好教材内容的更新。如图形程序设计、下拉式或弹出式菜单、计算机病毒防治等等。这样不仅能把最新的知识和最新发展动态充实到教学上来,大大丰富了教学内容,而且使学生加深对程序设计语言的理解和掌握,保持对信息技术和专业的兴趣,及时跟上信息技术日新月异的发展趋势,在今后工作中保持领先地位。
7)采用先进教学手段。用传统的课堂教学方法讲授动态的算法和数据结构是十分低效的,像排序、递归等抽象动态的内容讲解就常常是费力不讨好。应该根据课程特点,采用先进的现代教学方法,如直观教学方法:利用挂图、教具等讲解,以及计算机辅助教学(CAI)和计算机辅助学习(Computer Aided Learning,简称CAL)进行教学,通常开发利用与课程内容与教学特点相适应的多媒体课件进行教学。它们是讲解算法和进行程序设计训练的最佳教学平台,既能增加学习的趣味性,又可利用图形的直观性帮助抽象和动态过程的理解。
8)加强实践环节,强化创造性思维能力培养。在教学中,常常听到学生提出这样的问题:“程序设计语言有什么用?”,有的学生还反映:“程序设计语言并不难学,就是不知道如何应用?”一些学生学到了一定的科学知识,但上机动手水平低。这种现象与普遍忽视实践环节有关。为了扭转这一局面,在整个教学过程中,必须强调实践环节的重要性,充分安排上机实践时间,加强系统训练和实践能力的培养,强化创造性思维能力培养。根据课程特点,在教学中,采用案例驱动教学,进行兴趣引导;在实践中,可以精心组织一系列由易到难、由浅入深、配套衔接、结合学科学习、有一定设计技巧的程序设计作业,最后再安排一次综合性强、有一定难度的课程设计实践,对学生进行项目训练,提高学生应用能力。通过上机作业和课程设计的完成,使学生独立思考,各显才干,总结经验,培养他们的动手能力和编程能力,以及分析问题和解决问题的能力。
4 结论
总之,培养学生计算机程序设计能力的方法和途径很多,但是编程序不难,编好程序不易。作为教师,必须从培养学生编程思维的角度出发,按照以上策略认真进行编程知识的教学和技能的培养,加强实践,提高学生科学思维的能力,真正学会程序设计的真本领。
参考文献:
[1] ,王楠.浅谈程序设计语言课程教学方法[J].吉林大学学报(信息科学版),2005(S2).
[2] 徐进华.提高学生程序设计能力的几个措施[J].计算机时代,2005(11).
[3] 李凌.浅谈高级语言程序设计课堂教学方法[J].淮北职业技术学院学报,2005(04).
摘要:本文根据高职学生特点,从实际教学经验出发,分析了高职院校C 语言程序设计教学现状,并简单讲述了C 语言主要知识点,并提出适合高职学生学习的方法。
关键词 :C 程序高职院校
《C 语言程序设计》是高职院校计算机及电子信息相关专业的重要专业基础课。该课程主要培养学生模块化程序设计的逻辑思维能力,使学生掌握程序设计的一般方法和技巧,并锻炼学生的思维能力和创新意识。
1 C 语言程序设计教学现状
C 语言是理想的结构化语言,描述能力强。C 语言的教学要求教师具备良好的教学能力和清晰的程序设计思想,也要求学生有一定的逻辑设计能力。一般高职院校的C 语言设置在一年级开设,学生刚刚进入大学,还没有从高中生的身份完全转变过来。虽然在高中阶段学习了计算机应用基础课程,但是他们完全没有程序设计的概念,经过一段时间的学习,觉得这门课很难学、学不会。经过两个学期的C 语言教学,从实际教学经历来看,主要的制约因素有以下四个:第一、学生刚进入大学,刚接触编程语言,对计算机原理理解不深,对编程更是不了解,不具备语言编写能力。第二、高职学生文化基础比较差,尤其是数学基础差,导致学生逻辑思维能力差,而C 语言的学习对这方面能力又有较高的要求,所以对于稍微复杂一点的程序学生就觉得难以理解。第三、英语基础差,很多高职学生对英语望而生畏,而计算机语言基本都是用英语来实现的,C语言亦是。很多学生看到程序中的英语单词就头疼,从心理上就觉得自己学不会C 语言,也就放弃了。第四、很多学生,在上课的时候能听懂了,但是上机的时候头脑一片空白,不知从哪里入手编写程序。部分能够写出程序的,也是按照教材或老师所讲的例子进行编写,一旦题目要求有变化,便不会做了。
2 C 语言教学规范
有一简单C 程序如下:
int main()
{
int a,b,m;
int max(int x,int y);
printf(" 请输入两个数值:\n");
scanf("%d,%d",&a,&b);
m=max(a,b);
printf(" 两个数中较大的为%d\n",m);
return 0;
}
int max(int x,int y)
{
int z;
if(x>y)
z=x;
else
z=y;
return z;
}
该程序的功能是通过键盘输入两个数值,经过程序的运行,将其中较大的数值进行输出。该程序简单,易于理解,但是包含C 语言中很多必须掌握的知识点。简单介绍如下:
2.1 C 语言程序的结构通过上面简单例子可以看出,一个C 语言程序的结构有以下特点:①一个程序由一个或多个源程序文件组成。②函数是C 程序的主要组成部分。程序的全部工作几乎都是由各个函数分别完成的,函数是C 程序的基本单位。在设计良好的程序中,每个函数都用来实现一个或几个特定的功能。③一个函数包含两个部分。函数首部和函数体两个部分构成。基本形式如下:函数类型和函数名(参数类型、参数名称……)。函数体包含声明部分和执行部分。声明部分,定义本函数中所用到的变量。执行部分,指定函数中所进行的操作。④程序总是从main 函数开始执行的。⑤C 程序中对计算机的操作是由函数总的语句完成的。C 程序的书写格式比较自由,一条语句可以分写在多行,也可以将多条语句写在一行。但一般习惯每行只写一条语句。⑥所有的C 语句的最后必须要有一个分号。⑦C 语言本身不提供输入输出语句。输入和输出操作是由库函数scanf 和printf 等函数来完成的。
2.2 掌握C 语言的基本结构大部分的语言都是由顺序结构、选择结构和循环结构三种基本结构构成的,而C语言也不例外。
2.2.1 顺序结构。在顺序结构中,各语句是按自上而下的顺序执行的,执行完上一个语句就自动执行下一个语句,是无条件的,不必做任何判断,是最简单的程序结构。
2.2.2 选择结构。在现实生活中需要进行判断和选择的情况很多。比如,从A 城市出发上高速公路,到一个岔口,有两个方向,一个去B 城市方向,一个去C 城市方向。
驾车者到此需要自己根据自己的目的地进行判断,选择其中一个路径。在日常生活或工作中,类似这样需要判断的情况很多。比如:如果考试不及格,要补考;70 岁以上的老人,乘公交免票等等。
程序中,选择结构是一种重要的程序结构。本文前面的例子中就用到了选择结构,如果x>y,较大值为x,否则为y。该函数中,采用了if 语句中,双分支选择结构。在C语言中有两种选择语句:①if 语句;②switch 语句。
①if 语句形式有三种形式
·if(表达式)语句
·if(表达式)语句1
else 语句2
·if(表达式) 语句1
else if(表达式2)语句2
else if(表达式3) 语句3
:
else if(表达式m) 语句m
else 语句m+1
②switch 语句一般形式
switch(表达式)
{
case:常量表达式1:语句1
case:常量表达式2:语句2
: : :
case:常量表达式n:语句n
default:语句n+1
}
2.2.3 循环结构。在日常生活中或是在程序所处理的问题中常常遇到需要重复处理的问题。比如:要向计算机输入全班50 个学生的成绩等。在C 语言中,需要多次重复执行一个或多个任务的问题可以用循环来处理。循环结构有while、do…while 和for 语句来实现。
while 语句:
while(表达式)语句
do…while 语句:
do 语句while(表达式);
for 语句:
for(表达式1;表达式2;表达式3)语句
3 怎样学习C 程序设计
根据C 语言程序设计课程特点,结合今年来的从教经验,综合高职学生特点,C 语言程序设计教学应注意以下几个方面:
①要着眼于培养能力。C 语言程序设计是一门操作性很强的课程,在教学过程中应该注意培养学生分析问题、构造算法、编程和调试程序的能力。②要把重点放在解题的思路上。初学者不要在语法细节上死记硬背。一开始学习只要能看懂程序,能够编写简单的程序,然后逐步深入。
语法细节可以在后续的学习及长期的时间中掌握。③掌握基本要求,注意打好基础。在学校学习程序设计,主要学习程序设计的方法,进行程序设计的基本训练,为进一步学习打下良好的基础。④重视上机实践环节。该类课程学的好与坏,不是看你“知不知道”,而是“会不会做”。对程序而言,光靠听课和看书是学不好的,除了学习本课程要掌握的概念,还要动手编写程序,上机调试程序。⑤要学会举一反三。学习程序设计,关键是学习程序设计的思路和方法。
学会一种计算机编程语言,在学习另外一种编程语言时应该不会太困难。各种计算机编程语言,其基本规律是一样的,在学习时一定要学活用活,举一反三,掌握规律,在后期学习时就:
[1]曹莎莎.C 语言教学研究与思考[J].价值工程,2012(01).
[2]雍全明.C 语言教学改革探索与实践[J].新余高专学报,2005(02).
摘 要 循环结构是结构化程序设计中的三种基本结构之一,也是程序设计的基础。但是,对于初学者来说,循环结构与人类日常的思维习惯不同,较难掌握。本文用几个例子阐述了在《c语言程序设计》课程中循环结构的教学方法,这些方法在日常授课中取得了较好的效果。 关键词 c语言;结构化程序设计;循环结构;效率 1 引言 顺序、分支、循环是结构化程序设计的三种基本结构,所以在高级语言程序设计课程中,掌握这三种结构是学好程序设计的基础。而循环结构是这三者中最复杂的一种结构,几乎所有的程序都离不开循环结构。在c语言中,循环结构主要是由for和while、do-while语句实现的,其中for语句的应用更为普遍一些。for语句的用法对于有程序设计经验的学生来说轻而易举,但是对于那些没有经验的初学者来说,难度却不小。本文从初学者的角度,阐述了c语言中循环结构几种典型应用的实现方法。 2 用循环结构输出几何图形 输出简单的几何图形(如图1),是循环结构的典型应用之一。对于这一类型的题目,初学者往往直接采用一条或若干条输出语句printf完成,这样虽然可以完成题目要求,但是很显然缺乏灵活性,不符合程序设计的思想。按照正常的程序设计思想,应该先分析图形的构成,找出其中的规律:如图1(a)中的实心三角形,每一行由若干个空格、星号和一个回车换行符构成,将行号、空格数和星号数分别设为i、m和n,则可以形成下表:
表1 实心三角形的构成表
行号i 空格数m 星号数n 1 4 1 2 3 3 3 2 5 4 1 7 5 0 9 分析表1,可以得出行号i与空格数m、星号数n如下的数学关系: m=5-i,n=2×i-1 则实心三角形的构成规律可以描述为:第i行由(5-i)个空格和(2×i-1)个星号和一个回车符构成。把行号i作为for语句的循环变量,输出图形程序的主要部分见程序段1。 采用上面的方法,可以使学生很容易编写出类似的程序,其中的关键在于让学生找出图形中行号与每一行的空格数以及星号数的关系(对于图1(b)、(c)需要把图形分成几个部分,再分析其中的构成规律),这需要学生数学方面的知识,非编程本身的范畴了。 for(i=1;i<=5;i++) { /*输出(5-i)个空格;*/ for(m=1;m<=5-i;m++) printf(“ ”); /*输出(2*i-1)个星号;*/ for(n=1;n<=2*i-1;n++) printf(“*”); /*输出回车符;*/ printf(“\n”); } 程序段1 实心三角形的主要程序
3 数组中循环结构的应用
在c语言中,for语句经常与数组相结合,用于实现数组元素的赋值、输入与输出。对于初学者来说,更习惯于用顺序结构的语句来实现(如图2左)。我们将图2左的几条语句作比较,可以看出在这5条语句中,不同的只有数组下标,那么就可以将这5条语句合并成一条for语句,将数组下标换成for语句的循环变量i,而i的值从0增加到4。按照for语句的基本语法规则可以很容易的写出图2右的for语句。
同样,对于下面这个输出二维数组元素的例子,也可以用上述办法实现,不过转换过程比上例要复杂一些:经过对比图3左侧方框中顺序结构的12条语句,可以发现也是只有数组下标在变化,但是由于是二维数组,行下标和列下标同时都在变化,很显然不能直接用一条简单的for语句来实现(不是绝对不可以实现,后面将会看到)。但是我们可以把这12条语句细分一下,3条语句为一组,而在同一组中的语句只有列下标在变化,这时可以采用上例中的方法,将列下标都用循环变量j来代替,得到图3右上的形式。再次对比图3右上的4条for语句,不同的是行下标,同样用新的循环变量i来代替,合并后得到图3右下最终二重for循环的语句。
在上例中,常规的思路都采用二重for循环与二维数组相结合来实现对数组元素的访问,实际上也可以使用一重for循环来实现:无论如何变化,我们可以先确定的是,输出语句printf肯定要执行12次,如果用一重for循环,那么循环变量i的值就要从0递增到11。再分析数组行下标m和列下标n与循环变量i之间的关系,很显然:i=m*3+n,按照整数除法的思想,行下标m恰好是循环变量i整除3后的商,而列下标n恰好是循环变量i整除3后的余数,即:
m=i/3,n=i%3 从而可以写出下面的for语句: for(i=0;i<12;i++) printf(“%d”,a[i/3][i%3]); 4 循环结构中的效率问题 对于程序设计的初学者来说,往往以完成题目要求的功能为目的,程序的执行效率是最容易忽略的一个问题。在循环结构中,具体表现为循环体的执行次数。例如,一个经典的素数判定问题。在数学中素数如下定义:素数即指那些大于1,且除了1和它本身外,不能被其它任何数整除的数。根据这一定义,初学者很容易编写出如下程序段2的程序: int isprime(int n) { int i; for(i=2;i<n;i++) if(n%i==0) return 0; return 1; } 程序段2 判断素数的程序段 上面的程序,完全可以实现题目要求的功能,初学者往往满足于此。但是当对for循环的执行次数进行分析时,我们发现:当n不是素数时,没有任何问题;而当n是素数时,循环体就要执行(n-2)次,而实际上是不需要这么多次的。根据数学的知识,可以将次数降为n/2或n的算术平方根,这样可以大大减少循环体的执行次数,提高程序的效率。
程序的执行效率是编程中时刻需要考虑的问题,也是程序设计中的基本要求。这需要许多算法方面的知识,对于初学者来说,要求可能过高,但是我们在讲授过程中要注意向学生灌输这种思想,从学习之初就要打下良好的基础,尤其是类似上面例子中这样显而易见的情况,可以提醒学生在编制完一道程序以后,检验一下,是否还有可优化的地方,这对以后进一步高级编程的学习都是必要的。 5 结束语 以上这些,都是本人在授课过程中的一些体会,可能比较肤浅,但是从初学者的角度来看,却是必要的。如何让一名初学者尽快摆脱日常的思维定式,更加透彻地理解和掌握程序设计中的基本思想,领会程序设计的精髓,是高级语言程序设计这门课程在讲授过程中,应该时刻注意的问题。希望本文能在这方面起到一点作用,同时望广大同仁多多指教。 参考文献 [1] 谭浩强. c 语言程序设计(第二版)[m]. 北京:清华大学出版社,1999 [2] 苏运霖译. 计算机程序设计艺术第1 卷 基本算法[m]. 北京:国防工业出版社,2002
关键词:计算思维;Visual Basic 程序设计;教学
中图分类号:TP393文献标识码:A文章编号:1009-3044(2011)25-6266-03
The Application of Computational Thinking in Visual Basic Programming Teaching
JIA Ru, HAO Chang-sheng, PEI Yi-fei
(The Engineering and Training Center, Inner Mongolia University of Science & Technology,Baotou 014010, China)
Abstract: Computational thinking is widely becoming a hot spot in computer education nowaday.In order to cultivate and train the college students' ability of computational thinking & the computational ability better, computational thinking is applied in Visual Basic Programming Teaching.It is a new teaching reform which will provide a good example for the teaching of other computer education.
Key words: computational thinking; visual basic programming; teaching
目前,计算思维的培养成为国际和国内计算机教育界关注的热点。在我国,2010年《九校联盟(C9)计算机基础教学发展战略联合声明》的核心要点也强调“需要把培养学生的‘计算思维’能力作为计算机基础教学的核心任务”。而且从国家层面上讲,大学计算机基础教育这门课程的定位就是基础课程,也就是与数学、物理同地位的基础课程[1]。既然它是基础课程,课程的教学方法和教学理念就应该像数学与物理一样,将学科的基本理论、基本思维讲给学生。计算和计算思维是计算机基础课程的基本理论和基本思维,科学家已将计算思维和理论思维、实验思维并列为人类三大科学思维[2] ,为此,就应该将计算思维的基本概念和基本理论讲授给学生。因此,在大学计算机基础教育中强调和深化“计算思维”的培养,既有助于计算机基础教育学科的健康、持续发展,又有助于国家战略型人才的培养。
“Visual Basic程序设计”是大学计算机基础课程的重要分支,也是许多高校非计算机专业进行计算机基础教育的重要课程之一,该课程的目标:学习问题求解的思路和方法即算法,理解计算机是如何具体实现算法即如何有效利用计算机编程,最终通过该课程的学习提高广大学生的计算机操作使用能力、应用开发能力、研究创新能力以及计算思维和计算能力。也就是说,培养和训练大学生计算思维不仅是计算机基础教育的现实要求,更是Visual Basic程序设计的课程要求。
1 计算思维
国际上广泛认同计算思维的定义来自美国卡内基・梅隆大学周以真(Jeannette Wing)教授。周教授认为,计算思维(Computational Thinking)是运用计算机科学的基础概念(即思想和方法)进行问题求解、系统设计,以及人类行为理解的涵盖计算机科学之广度的一系列思维活动,它不仅属于计算机科学家,它应当是每一个人的基本技能[3]。计算思维是建立在计算过程的能力和限制之上,由人由机器执行。计算方法和模型使我们敢于去处理那些原本无法由个人独立完成的问题求解和系统设计[4]。计算思维的本质就是抽象和自动化,即如何按照计算机求解问题的基本方法去考虑问题的求解,以便构建出相应的算法和基本程序。
计算思维是一种具有普遍性的科学思维方法,依据周教授的观点,它包含如下主要内容:
1) 通过简约、嵌入、转化和仿真等方法,把一个看来困难的问题重新阐述成一个我们知道问题怎样解决的思维方法;
2) 是一种递归思维,是一种并行处理,是一种把代码译成数据又能把数据译成代码,是一种基于多维推广的类型检查方法;
3) 是一种采用抽象和分解来控制庞杂的任务或进行巨大的任务系统设计的方法,是一种基于关注点分解的方法(Seperation of Concerns,简称SoC方法);
4) 是一种选择合适的方法陈述一个问题,或对一个问题的相关方面建模使其易于处理的思维方法;
5) 是按照预防、保护及通过冗余、容错、纠错的方式,并从最坏情况进行系统恢复的一种思维方法;
6) 是利用启发式推理寻求解答,也即在不确定情况下的规划、学习和调度的思维方法;
7) 是利用海量数据来加快计算,在时间和空间之间,在处理能力和存储容量之间进行折衷的思维方法。
2 以“计算思维”为线索展开“Visual Basic程序设计”教学
思维方法比知识本身更重要。既然计算思维是一种问题求解的基本思维方法,作为从事计算机基础教学的一线教师就应该切实地在日常教学中潜移默化地训练和培养学生的计算思维能力,提高他们的计算思维素养,进而培养和锻炼他们的创新能力。
2.1 以“计算思维”为线索展开“Visual Basic程序设计基础”教学
Visual Basic程序设计基础就是Visual Basic语言。正像自然语言的产生是人类社会活动发展的客观要求和必然结果,同样,计算机语言的产生和发展则是人类使用计算机的客观要求和必然结果。从计算机语言的基本语法到其整体结构,都渗透着许多计算思维。因此,以“计算思维”为线索展开“Visual Basic程序设计基础”教学就是:在讲解相关知识点的同时也要讲授其中所反映的计算思维,通过思维强化知识,通过知识培养思维;这样,既有利于语言本身的学习,又有助于学生计算思维能力的培养。
例如,人们利用计算机就是为了处理信息数据,而不同类型的信息数据,其表达方式不尽相同,其处理方式也会有所不同,那么,计算机是如何实现信息数据的表示、存储和处理?这其中蕴含的计算思维又是什么?首先,根据冯・诺依曼计算机体系结构:从软件方面考虑,可通过声明或定义不同类型数据以表示不同类型的信息;从硬件方面考虑,可通过存储元件可实现信息数据的存储,不同类型的数据占用不同长度的存储单元。可仅仅完成信息数据的表示和存储是远远不够的,如何真正实现数据处理?由此便产生了计算机语言,即利用计算机语言编写的数据处理程序指挥CPU(中央处理器)完成相应的数据处理。这个通过人、机共同努力完成的“问题求解”过程,就是一个计算思维的实现过程,如图1所示。
显然,实现这样一个信息处理的计算思维,是需要计算机语言的技术支持:即数据表示(数据类型)、数据存储(变(常)量)和数据处理(表达式和控制结构),并由此引出Visual Basic语言基础知识的学习。
2.1.1 数据表达
数据表示――数据类型
例如,根据现实生活中不同的信息数据如文本型、数值型、逻辑型、日期型、货币型等,Visual Basic语言便提供了相应的数据类型:String型(字符型)用于表示文字信息,所占用的内存空间最多可达20亿字节;Numeric型(数值型)用于表示数值信息,表示范围越大、精度越高的数据类型所占用的存储空间也越大,如Byte型(字节型)、Integer型(整型)、Long型(长整型)、Single型(单精度型)和Double型(双精度型)、Currency型(货币型)6种基本类型,它们所表示的数据范围和精度依次增大;Boolean型(逻辑型)用于表示逻辑判断的信息,如对/错、是/否、真/假等,占用2个字节的存储空间;Date型(日期型)用于表示日期、时间信息,一般占用8个字节的存储空间;Variant型(变体型)是一种特殊的数据类型,可用于表示任何信息,占用的存储空间灵活;Object型(对象型)用于表示任何类型的对象,一般占用4个字节的存储空间。
数据存储――变(常)量
这些不同类型的数据在计算机具体处理时,一般都被放在一定的内存单元中,但为了进一步高效地使用系统资源快捷地处理这些数据,用户需要指定这些内存单元,于是Visual Basic给我们提供了变(常)量,即用户通过声明或定义相应数据类型的内存单元的符号地址,CPU就可根据这些符号地址准确地存取数据,进而进行相应的运算。
2.1.2 数据处理
简单的数据处理――表达式
Visual Basic在充分利用CPU运算功能的基础上,提供了针对不同类型数据采用不同的计算方式――表达式,它是一种最基本的数据计算方法,主要有算术表达式(完成数值型数据的计算)、字符串表达式(完成字符型数据的计算)、关系表达式(完成数据的比较计算)、逻辑表达式(完成逻辑型数据的计算),并由此实现对数据的初级、简单处理。
复杂的数据处理――控制表达
在日常的信息数据处理过程中,常常需要根据不同条件,实现对数据灵活多样的处理,显然,基本表达式难以直接实现,于是基于这一客观需要,计算机语言便产生了控制表达,即根据条件完成相应的计算,如语句级控制(如分支、循环)和模块级控制(如函数)[5]。
语句级控制的结构有条件语句控制和循环语句控制。条件语句控制结构主要有:If条件分支和Select条件分支,循环语句控制结构主要有:For条件循环和Do条件循环。
模块级控制,对于Visual Basic语言而言,就是过程级控制。Visual Basic将一个工程分为多个模块(也称文件),每个模块中的代码又分为相互独立的多个过程(Procedure)。过程就是具有一定语法格式、完成一个相对独立任务的语句段。在同一个工程中的各过程在代码上相互独立,但功能上相互联系。过程级控制的结构主要有两种:系统内部过程(内部函数过程、事件过程)和自定义过程(用户根据自己需求设计的过程)。
2.2 以“计算思维”为线索展开“Visual Basic程序设计”教学
简单的计算机语言支持,可以完成简单的数据处理,但对于复杂、大量的数据处理,则需要一定的处理方法,这便是程序设计方法。当前,影响最大、使用最广泛的程序设计方法主要有两种:面向过程程序设计方法也称结构化的程序设计方法(Structured Programming)和面向对象程序设计方法(Object Oriented Programming)。Visual Basic语言既可以实现面向对象也可以实现面向过程的程序设计。面向过程程序设计是一种传统的程序设计方法,面向对象程序设计方法是一种全新的、当前比较流行的程序设计方法,但不管是哪种程序设计方法都是值得学习和借鉴、并能有效解决实际问题的计算思维方式。以“计算思维”为线索展开这部分内容的教学就是将程序设计实现问题求解所体现的计算思维讲授给学生,即“方法”随着“思维”的讲解而展开,“思维”随着“方法”的贯通而形成,“能力”随着“思维”的理解和训练而提高,最终使学生真正掌握基于计算技术/计算机的问题求解思路和方法,并逐步培养他们相应的计算思维和计算素养,提高他们的计算能力,进而为他们日后所从事的研究和工作开拓思路、大胆创新奠定基础。
2.2.1 面向过程的设计方法
面向过程的设计方法所强调的计算思维:程序功能的实现主要由过程(或函数)完成实现。在程序中接收或者定义各种数据,然后通过过程(或函数)对数据进行操作,最后将结果输出或返回。面向过程设计方法的特点是将数据结构和过程(或函数)作为两个实体对待,程序设计范型的主要特征:
程序=数据结构+算法
程序中数据结构和过程的分离,造成了程序的可重用性差,程序维护代价高,因此,面向过程的设计方法更适用于功能和数据结构及其关系都不复杂的问题求解。
Visual Basic系统提供了丰富的内部函数、事件过程,而且用户还可根据需要自定义实现一定功能的过程(也称子过程或函数)。无论是系统提供的还是用户自定义的各子程序之间可以彼此独立,亦可相互联系、相互调用,形成了结构化明显的程序结构,其中充分体现了结构化的计算思想:
1) 自顶向下、逐步求精
在进行程序设计时,先把对问题的处理(算法)粗分成几个步骤,叫模块。然后对每个模块再细化为几个小模块,每个小模块再细分为若干个更小的子模块,直到每个小模块功能直接用语言来实现为止。这种逐步细化的计算思维方式,使得程序结构清晰,便于日后维护和修改。
2) 模块化
整个程序就是由几个大模块构成,各个大模块又是由功能相对独立的模块组成,每个模块只能有一个入口和一个出口与外界联系。这种清晰的程序结构,既便于机器实现功能,又便于设计者的设计,同时还便于程序的调试、修改和维护。
3) 三种基本结构
整个程序中的大小模块仅由顺序、选择和循环三种基本控制结构组成。这三种基本控制结构都是单入口和单出口,它们可以任意组合、嵌套,可构造各种功能复杂的大结构,且又能保证每个模块结构清晰、层次分明,致使整个程序结构也很清晰。清晰的结构提供了清晰的问题求解方案。
2.2.2 面向对象程序设计方法
面向对象程序设计方法体现的计算思维:通过操作对象完成需要的功能,对象包括各种数据和方法,方法就是对数据进行操作,然后将得到的结果输出或返回。面向对象程序设计是一种围绕真实世界的概念来组织模型,它采用对象来描述问题空间的实体,强调从问题域的概念到软件程序和界面的直接映射,因此,它更接近于人的自然思维[6]。面向对象程序设计这种新型程序设计范型的主要特征是:
程序=对象+消息
其中,对象是程序的基本元素,传递消息是基本操作。具体体现在这些方面:程序一般由类的定义和类的使用两部分组成,在主程序中定义各对象并规定它们之间传递消息的规律;程序中的一切操作都是通过向对象发送消息来实现,对象接收到消息后,启动有关方法完成相应操作;类由继承关系产生相互间联系。一个程序中涉及到的类,可由程序设计者自己定义,也可使用现成的类(包括类库中的类或他人已建好的类),尽量使用现成的类是面向对象程序设计范型所倡导的思维方式。
面向对象程序设计方法一般包含如下四个基本步骤:
1) 系统调查和需求分析
2) 面向对象分析OOA(Object Oriented Analyzing)
3) 面向对象设计OOD(Object Oriented Designing)
4) 面向对象实现OOP(Object Oriented Programming)
在这样的理论框架[7]指导下,在具体教学中,将面向对象程序设计的计算思维的核心概括为:一个中心即以对象为中心、两个基本点即前台设计和后台设计,这里的前台主要指用户界面,后台主要是程序代码,但无论是前台还是后台都是围绕对象展开,并由此帮助学生逐步构建面向对象程序设计方法的计算思维,进而用之解决具体实际问题,尤其是在开发功能较为复杂的大型系统,面向对象程序设计方法将是一种简洁方便、高效的求解方案,不仅如此,还应启发和鼓励学生并创造性地运用这种面向对象的计算思维解决现实生活中的多种问题。
3 总结
以“计算思维”为线索展开“Visual Basic程序设计”教学,就是将程序设计中所体现和涉及的计算思维,通过日常教学予以精讲、明讲、透讲,然后再启发学生利用这些计算思维自主解决实际问题,帮助他们从中领悟“什么是计算思维?如何应用计算思维解决问题”,并在解决问题中自主建构自己的计算思维、锻炼自己的计算能力,进而为他们将来的研究、工作和学习中具有创新思维和创新能力夯实基础。
当然,以“计算思维”为线索展开“Visual Basic程序设计”教学,作为一种教学改革和教学尝试,需要进一步完善,特别是,随着对“计算思维”理论知识与实践知识认识的深化,将会更好地指导教学实践,真正培养学生的计算思维和计算素养,提高他们的计算能力。
参考文献:
[1] 陈国良, 董荣胜. 计算思维与大学计算机基础[J]. 中国大学教学, 2011(1):7-11.
[2] 朱亚宗. 论计算思维[J]. 计算机科学, 2009,36(4):53-55.
[3] Jeannette putational Thinking[J]. Comminications of the ACM,2006,49(3):35.
[4] 董荣胜. 计算思维与计算机导论[J]. 计算机科学, 2009,36(4):50-52.
[5] 何钦铭, 颜晖, 等. “程序设计基础”课程教学实施方案[J]. 中国大学教学, 2010(5):62-65.
2010年,四川省正式实施新课程改革。高中信息技术课程分为必修和选修两个部分,选修模块有三个。由于刚开始实施新课改,许多学校对于选修模块还不熟悉,笔者在查阅大量资料,并借鉴其他省市的课改经验后,发现有很多学校选修《算法与程序设计》,于是对此模块进行了深入学习,认真分析教材,从多方面了解教材。《算法与程序设计》内容枯燥、严谨,学生又缺乏相关的知识背景,在高中阶段开展难度大,教学课时不够,学生易产生畏维情绪,笔者认为可从知识结构上重组教材、分散难点,从激发学生学习兴趣出发,以有趣的实例结合理论,讲练结合。经过一年的实践,教学效果显著,所任教班级均取得了优异的成绩。
笔者选用的是广东教育出版社出版的《算法与程序设计》,下面将与大家一起探讨对开展本模块的认识以及对教材内容的研究。
一、本模块学习目的
1.1使学生在原有基础上进一步体验算法思想,了解算法和程序设计在解决问题过程中的地位和作用;
1.2能从简单问题出发,设计解决问题的算法;
1.3能初步使用一种程序设计语言编制程序实现算法解决问题。
二、本模块设计思路
“算法与程序设计” 以“问题解决和程序设计”为主线,对“3个主题”内容重新建构,以“分析问题-确定算法-编写程序-调试程序”的逻辑线索呈现学习内容。学习算法与程序设计是为了让学生理解问题解决过程中采用的思想和方法,掌握常用的算法,建构问题与算法之间的关系,归纳算法思想与程序设计方法的一般规律。
三、本模块开设的意义
新课改关注的是技术能力与人文素养的双重建构,既是信息素养培养的继续,又是支持个性发展的平台。对于《算法与程序设计》选修课程,个人认为是非常重要的选修课程。印度软件产业成功的秘密就在于印度的IT职业教育培养了大批高质量软件人才。振兴中国软件产业需要培养大量的IT人才,程序设计教学就是为培养这样的人才打下良好的基础,也是学生创新能力培养的重要途径之一。
四、本模块的优势与劣势
优势:对机器和软硬件的要求不高,知识体系比较系统成熟,教学和考核目标比较明确。
劣势:对学生信息素养和信息技术的基础知识的要求较高,对学生的数学素养和逻辑思维能力要求也较高,容易使学生产生畏难和恐惧心理,对教师的要求也相应较高。由于算法及编程知识相对枯燥且学生接受能力有差别,不易引发其学习兴趣,这就对教学的推进产生一定困难。
五、本模块的教学把握
在高中阶段学习程序设计毕竟不同于专业训练,并且程序设计语言的变化也非常快,因此我们只要掌握程序设计的基本知识与一般规律。在教学中要注意持续保持学生的学习兴趣和积极性,教学设计和举例都尽可能结合学生学习和生活中遇到的和熟悉的问题,也可以多联系一些数学和其它学科方面的知识,培养学生理论结合实践的能力和综合应用能力。
当然,我们更要注意发现和培养对程序设计有特殊才能的学生,给他们提供充分的发展空间。
六、本模块的知识结构及教学过程
本模块由3个主题组成,结构如下:
6.1计算机解决问题的基本过程
6.1.1 内容标准
(1) 结合实例,经历分析问题、确定算法、编程求解等用计算机解决问题的基本过程,认识算法和程序设计在其中的地位和作用。 (2) 经历用自然语言、流程图或伪代码等方法描述算法的过程。(3) 在使用计算机解决实际问题的过程中,通过观看演示、模仿、探究、实践等环节,了解顺序、选择、循环三种基本结构及其重要作用,掌握计算机程序的基本概念,能解释计算机程序执行的基本过程。(4)了解程序设计语言、编辑程序、编译程序、连接程序以及程序开发环境等基本知识。
6.1.2 课时安排
6.1.3 教学建议
教材第一章算法概念抽象难懂,过多的课堂讲解会起反作用,因为学生一旦听不懂或觉得太枯燥,就可能抑制他们对这门课的学习兴趣。在教学中可采用“游戏导入”方法,可以选“猜数游戏”作为切入点,对游戏与教学进行有益的尝试。以教电脑玩“猜数游戏”作为主线,通过生生之间、人机之间相互玩猜数游戏的活动,将计算机拟人化,激发学生学习程序设计的兴趣。
6.3 算法例举
6.3.1 内容标准
(1)解析法与问题解决
(2)穷举法与问题解决
(3)查找、排序与问题解决
关键词: 《C语言程序设计》 程序案例 计算思维 流程图
1.引言
《C语言程序设计》课程的实践性是很强的,理论联系实际是这门课的特点,怎样利用所学理论知识解决实际问题是学习这门课的重点,也是难点。多年的教学实践表明,在教学过程中使用计算思维的方法解决问题,对培养学生的综合应用能力是有益的,通过使用流程图描述算法,学生将更好地理解和掌握结构化程序设计方法。
2.教学中充分调动学生学习的积极性
学生只有对C语言程序有浓厚的兴趣,才会积极和创造性地学习。可从以下几个方面探讨:
(1)强调学生学习C语言的重要性。突出教学重点,使学生明确学习任务。在首次课堂教学中,教师一定要向学生讲解清楚C语言课程的教学目标(为什么学习编程或程序设计)。对于C语言程序设计课程的教学目标,可有如下三方面的讲解,学习基本的编程知识、培养求解问题的能力和具备一定的创新素质。知识的传授和学习应融入问题求解中;问题求解能力是创新的基础。
(2)结合《C语言全国计算机等级考试》的试题库进行教学,学生学习起来更有动力。试题库包括笔试试题库和上机试题库。试题库按章节分类,题目类型以程序设计为主。笔试题型有单项选择、程序分析、程序填空、程序改错和程序设计,上机题型有程序改错、程序填空和程序设计。
(3)利用Visual c++6.0工具进行C语言程序教学,培养学生的学习兴趣。VC是一种基于Windows操作系统的可视化集成开发环境,是广泛使用的一种开发工具。VC程序的两种模式是WINAPI方式和MFC方式。应用这两种模式能够有效提高教学质量,激发学生的学习兴趣。
3.教学内容的设置
上课内容安排不尽合理,对于实践教学环节重视不够,难以提高学生的积极性。教师应理论联系实际,注重编程实现的示范性,让学生清楚地看到教师编写代码和程序调试的过程和运行结果。上课安排内容应包括两部分:一部分为学习基本知识,对基础知识的理解和掌握。另一部分是理论联系实际,对实际案例问题的分析引导学生,并且案例留有思考空间,使学生举一反三,培养学生创造性思考的能力。比如在第一次课告诉学生C语言的十四种语句,既让学生对C语言有全面的认识,又消除学生对C语言的畏难情绪。C语言的语句概括起来只有十四种,即定义变量语句、赋值语句、返回语句、函数声明语句、函数调用语句、分支(选择)语句(共三种分支语句)、循环语句(共三种循环语句)、break语句、Conitnue语句和复合语句。所有的C程序,都是由其中的某些语句组成的。在具体介绍这些语句的时候,一定要完整清楚地列出各种语句的语法格式。以后讲C程序的时候,会提问学生这个程序中包含哪些C语句,学生比较容易看明白C程序的语句组成,帮助学生很快读懂程序,有利于改正学生编写程序时的常见语法错误。
4.实验指导书建设
学习C语言的很多学生都认为概念易懂,程序难写,其实主要是缺乏足够的实践和练习。依据主教材结构和实际需要,上机课结合课本《C语言程序设计上机指导》进行相关和有趣的案例的程序运行。学生分析算法、画出流程图到写出程序,并亲自运行出结果,会给学生很大的成就感。要将计算思维的方法应用到程序设计,设计各种算法以实现功能,并拓宽思路,掌握C语言的概念和编程方法。
5.案例设计与计算思维相结合
学习C语言,目的不是仅仅懂得一门程序设计语言,更重要的是让学生的编程思维得到锻炼和提高。C语言学习分成以下三个循序渐进的部分:第一部分是入门,主要介绍C语言程序的基本结构、数据的表达方式、基本表达式语句、C语言程序的运行方式等。这部分可以设计由简单表达式语句组成的按顺序执行的程序。第二部分是程序的基本结构,主要介绍程序设计的简单算法表示方法,分支结构和循环结构。这部分能用计算思维的方法,设计简单的算法,根据算法编写程序,掌握思考问题和解决问题的方法。第三部分是程序设计方法和手段的提高,主要介绍程序的模块化实现方法和更多的程序设计方法。这部分能采用计算思维的方式掌握模块化的程序设计方法,对问题进行分解,灵活地使用指针、结构、文件、位运算等方法编写程序。
6.案例设计实例
编写程序计算学生年龄的递归函数:已知第一位学生年龄最小为10岁,其余学生一个比一个大2岁,求第5位学生的年龄。分析得到的递归公式如下:
age=10(n=1)age(n-1)+2(n>1)
在递归公式中,使用数字1为回归的条件,使用IFELSE语句决定是递推还是回归。
根据问题得出流程图和程序为:
只有写出递归算法的数学公式,才能编写出递归函数,从而很容易根据递归问题描述写出递归公式,进而写出递归程序。
7.结语
“基于问题求解的C语言”教学模式,随着我国计算机技术的应用和发展,为了适应社会的需求,培养学生解决问题的能力,增强学生自主能动性和动手操作能力,让学生成为社会的技能型人才,都是有益的。实践证明,借助流程图表达算法,能让学生更好地理解结构化程序设计的思想,更好地掌握C程序设计的核心方法。
参考文献:
[1]李丽娟.C语言程序设计教程实验指导与习题解答[M].北京:人民邮电出版社,2013.
[2]谭浩强.C程序设计[M].北京:清华大学出版社,1999.
[3]魏书堤,赵辉煌,邓红卫.基于计算思维的C语言教学案例设计[J].当代教育理论与实践,2014(3).
[4]但志平,汪东,王安慧,任小燕.地方高校C语言教学改革的探讨与分析[J].教育教学论坛,2014.5.
关键词:高级程序设计;专业课程;教学
中图分类号:G642 文献标识码:B
“高级程序设计”是一门重要的计算机专业课程,目的是通过对面向对象程序设计思想的把握,培养学生掌握用计算机分析问题、解决问题的思维方式。但是由于该课程内容非常抽象,且实践性特别强,对于初学者来说难度较大。同时由于课时限制,Console控制台环境下的简单实例难以体现出面向对象的优势,基于语法的讲解让人感到乏味,许多学生觉得程序设计本身枯燥、难懂,高深莫测。以至于课程结束时,大部分同学对语法实现没有问题,但面对实际问题却不知道如何下手。如何在短时间内建立学生的兴趣,培养解决实际问题的能力,是工科教学中永恒的话题。
计算机的课程体系本身是一个整体,所有课程的结合都是为了理解并充分利用计算机这一现代化工具。在教学中,将各门课程分开是为了简化,但在理解时仍应将相关概念、应用领域相结合。在教学中我们发现,学生们刚开始接触程序设计时,对变量定义、指针分配、数组访问等的理解就比较困难。他们知道用变量来存取数据,但很少关心这个数据究竟存放在内存的什么地方,为什么指针必须先初始化才能使用。这时,不妨给学生讲授一些内存访问的基本知识,让他们建立起变量、指针与地址的对应关系。现在的问题是,教师对于程序设计多是从语法上加以讲解,对于程序的运行效率、应用领域、编程风格极少涉及,许多概念都是在后续专业课的学习后才逐步理解,这给程序设计的初学者带来了很大的障碍。如果在教学中以面向对象的应用为基础,以程序设计为主线,在重点介绍程序设计方法的同时将各门专业课知识融入其中,将会使学生从程序设计应用的视角来理解这些专业概念,从而在解决实际问题时灵活应用;消除对程序设计课程的枯燥感,达到事半功倍的效果。
1 “高级程序设计”的课程定位
随着电子技术和芯片设计工艺的发展,计算机硬件一直按照摩尔定律发展,每18个月翻一番,处理速度越来越快,价格成本越来越低,从价值不菲、主要用于科学研究的大型计算机到现在人们日常工作生活中随处可见的个人PC。程序设计的目的就是为了充分利用这一现代化的工具,可靠、高效地完成任务,因此程序设计其实是一种人机交互的方式,简言之,就是用计算机能够“理解”的语言,告诉它去执行某项任务。当然,这个“理解”需要编译器的支持,将高级程序设计的语法描述进行编译、连接等,变成计算机硬件能够执行的机器码,具体编译的细节在编译原理课程中有重点的介绍。
程序设计是一种语言表达,目的是为了人与计算机之间的沟通。因此程序设计通常有两方面的特点:对于程序设计者,希望能够精练、高效地说明问题;对于计算机,希望语言描述准确,不会出现二义性。通过程序设计解决一个具体问题时,大致需要经过下列步骤:首先从具体问题中抽象出一个适当的数学模型,然后设计出解此数学模型的算法(Algorithm),该算法与数据结构密切相关,最后编写程序、进行测试、调整优化直至得到最终解答。寻求数学模型的实质是分析问题,从中提取操作的对象,并找出这些操作对象之间的关系,然后用数学的语言加以描述。
另外,用程序设计解决问题时,需要充分、高效地利用现有的计算机资源。对于汇编语言程序设计来说,通常直接编写底层的硬件驱动及管理程序访问资源;对于C+ +面向对象的程序设计来说,通常立足于计算机硬件、操作系统的基础之上,在编写用户应用程序,如常用的各类工具软件、Office系列等时,通常借助操作系统提供的API(application programming interface)函数来访问资源,如用Create Window()来创建一个窗口,用getchar()来获取键盘上的一个按键值等。操作系统的作用是管理全部的硬件资源、软件资源及数据资源,并提供相关的API函数为程序设计者调用。
2操作系统:计算机资源的管家
计算机可以管理哪些资源呢?操作系统告诉我们,总共要管理4种资源:(1)CPU资源:进程管理,处理机调度;(2)内存资源:存储管理;(3)I/O接口资源:外部设备管理;(4)文件资源:文件管理。如果需要访问计算机资源,通常利用操作系统所提供的丰富的API函数来实现,而无需写驱动程序直接对资源进行访问,应用程序对操作系统的函数调用过程如图1 所示。
箭头①表示操作系统能够管理系统资源,控制输入输出设备的工作,如文件存取、输出显示、声卡发声等;箭头②表示操作系统能够感知输入设备的状态变化,如鼠标移动、键盘按下,并且能够感知鼠标移动的方向,具体按下的键值。设计应用程序需要利用输入输出设备或其他计算机资源时,并不是由应用程序直接访问,而是借助操作系统。箭头③表示程序设计时可以通知操作系统执行某个具体的动作,如操作系统能够控制声卡发出声音,但它并不知道应该何时发出何种声音,需要通过程序设计告知操作系统。箭头④表示操作系统能够将输入设备或其他资源的变化传递给应用程序。如用户在某个程序活动时按了一下键盘,操作系统能够马上感知这一事件,但并不决定如何作出反应,而是将这一事件转交给应用程序,由应用程序决定执行何种反应。
理解了操作系统和应用程序的关系后,对于面向对象程序设计中如何调用现有计算机资源或创建新的应用,就有了十分明晰的思路。
3算法:程序设计的灵魂
在程序设计中,运行效率通常是一个决定性的指标,而程序运行是否高效,很大程度上取决于能否编写出高效的算法。比如在游戏世界中,一只妖怪盯上了目标,并且它足够聪明,会选择一条最短路径向目标杀过去。为什么这只妖怪那么聪明?这就是寻找最短路径算法的魔力。
算法是指完成某个特定任务所需要的具体步骤和方法。在程序设计领域,算法表现为一系列解决问题的清晰指令,对一定规范的输入,能够在有限时间内获得所要求的输出,中国古代的珠算口决及其执行规则就是算法的雏形。算法是计算机处理信息的本质,因为程序就是用算法告诉计算机按照确切的步骤执行指定的任务,如计算职工的薪水或打印学生的成绩单等。程序设计中的算法应用通常分成三个阶段:分析问题、设计算法和实现算法。
算法设计的基本方法有递推法、递归法、穷举法、分治法、迭代法等。目前被设计出来而且应用广泛的算法有很多,如演化算法、蚁群算法、贪婪算法、遗传算法和一些常用的排序算法等,每一种算法都对应着多种不同的应用。如在同一个动画页面中,近处的对象会挡住远处的对象,可以通过对不同的对象进行坐标排序,然后按由远到近的顺序排放而实现。常用的排序算法有四种:选择排序、插入排序、冒泡排序和快速排序。下面是N个元素的冒泡算法C++程序实现。
template < class T >
void bub_sort( T a[], int n )
{
int i,j,last;
i = n - 1;
while( i > 0 )
{
last = 0;
for( j = 0; j < i; j++ )
{
if( a[j+1] < a[j] )
{
T temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
last = j;
}
}
i = last;
}
}
算法中将每个元素想象成一个泡泡,从最底部的元素开始,将各相邻的元素进行比较,若下面的元素大于上面的元素时,则把它们的值进行交换,即较大的元素“往上冒泡”。如此循环N-1次,即可实现从大到小的排序。
当然,算法只是解决某类问题的步骤或方法,同一个算法可用不同的程序设计语言实现,而且能够根据不同的应用目标加以约束和优化。算法设计与数据结构密切相关,算法无不依附于具体的数据结构,数据结构直接关系到算法的选择和效率,在面向对象的程序设计中,二者是一个整体,不可分割。
4数据结构:数据资源的管家
数据结构是计算机存储、组织数据的方式。讨论数据结构必须同时讨论在该类数据上执行的算法才有意义,通常情况下,精心选择的数据结构可以带来最优效率的算法。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。在程序设计中,根据不同的应用需要,可以选择不同的数据结构。
如果有一堆相似数据需要管理,通常会选择线性表。如单位人员的记录、游戏世界里的道具包。线性表一般分为数组与链表两类。数组里的元素以连续的内存空间存放,因此可以用内存地址检索到对应的数据元素,访问元素很方便。但如果要进行插入/删除数据元素,就要做一些内存移动,效率比较低。而链表的数据元素存放在任意的物理内存位置,相邻的元素以指针作为“链扣”串连起来,可以更高效的插入/删除数据元素。
队列和堆栈可能是使用频率最高的数据结构。队列是一种“先进先出(first-in first-out, FIFO)”的数据结构。就好像是在银行里排队,排在前面的先服务。因此顺序执行的任务可以从一端依次压进任务队列里,要做任务时依次从另一端取出,哪个任务先接到就先做哪个任务。也许有些任务报酬更高,如果最求报酬最大化,就需要使用优先级队列。在插入元素时,优先级高的元素插入队列前面,把任务的报酬设成优先级数据就可以了。
堆栈是一种“先进后出”的数据结构。就好像是叠盘子,叠在最上面的盘子最先拿来使用。比如Word中的“撤消”按钮,使用户在编辑误操作时不必惊慌,因为“撤消”功能可以撤消之前的操作。只要把用户的操作压入栈里,撤消操作就是从栈中弹出最近发生的操作,可以很方便地实现这个功能。
此外,树型结构和图形结构也是比较常用的、非线性的数据结构。树的实现与应用比线性数据结构复杂,但其应用很广泛,如Windows操作系统的文件管理。图形结构可以用于地图数据的管理等。
5数据库:智能化的大仓库
在程序设计当中,具有各种数据结构的变量或对象是不可缺少的元素。如果数据量比较小,直接使用内存变量或文件存储就可以了,但在当前信息化的环境中,数据量通常是海量的,为了加快对数据的操作与访问,同时保护数据的安全性,必须借助专门的工具,这就是数据库。严格地说,数据库是按照数据结构组织、存储和管理数据的仓库。
例如,在企事业单位的日常管理工作中,常常要把本单位职工的基本情况(职工号、姓名、年龄、性别、籍贯、工资、简历等)存放在表中,这张表就是数据库的一个基本元素,可以通过不同的“视角”加以查看。如果建立了包含相关信息的多个表,我们就拥有了一个“数据仓库”。在应用程序的设计中,可以模拟现实世界,为不同的人员划分相应的权限,使他们可以根据需要随时在权限范围内处理数据,如查询某职工的基本情况,添加新进的职工信息等。此外,在财务管理、生产管理中、仓库管理时,也可以建立众多的数据库,以实现财务、仓库、生产的自动化管理。
6结语
计算机的课程体系是实现完整应用的一个整体,独立的程序设计教学会使学生对许多概念的理解发生混淆,造成实际应用的偏差。本文论述了将相关的专业课程概念融入C++程序设计的教学过程中,增强学生对程序设计概念的理解,并根据需要灵活应用。当然,面向对象的程序设计也是一门实践性很强的课程,学生对所有概念的理解及应用必须通过上机操作,在程序设计中不断磨练才能提高。
参考文献:
[1] 刘建华. 计算机语言类课程教学模式初探[J]. 高教论坛,2005,2(1):91-93.
[2] 郑莉,董渊,张瑞丰. C++语言程序设计[M]. 北京:清华大学出版社,2005.
[3] 陈渝译. 操作系统:精髓与设计原理[M]. 北京:电子工业出版社,2006.
[4] 王晓东. 算法设计与分析[M]. 北京:清华大学出版社,2008.
关键词:拓展式教学;计算机语言课程;教学研究
中图分类号:G424 文献标识码:A文章编号:1009-3044(2011)31-
Discussion on Extensive Teaching Method of Computer Language Course
CHEN Guo-chao
(Sichuan Institute of Technology, Zigong 643000, China)
Abstract: In the teaching of computer language courses for the student not majoring computer, the author breaks the limit of textbook and begins with the study of the computer software for the perspective of the system resources. The essay, combined with the author's teaching practices for years, discusses the purpose, the significance and specific implementation scheme of the method for computer language extensive teaching.
Key words: extensive teaching; computer language course; teaching and research
拓展式教学是对教学内容、形式、方法等进行延伸挖掘并揭示其本质,透彻研究问题,使学生能够灵活变通、准确地进行理解、巩固教学内容。这种突破教材约束的教学方式,有助于激发学生学习的主动性,培养学生的创造性思维能力,促使学生敢于探索问题并解决问题。
计算机语言课程是高校非计算机专业本科生的必修课程,多数学生学习计算机语言比较吃力,在课程后期少数学生无法跟上老师的教学进度。在计算机语言教学过程中,经过长期的实践和摸索,引入了拓展式教学方法,取得了良好的教学效果。
学生在学习计算机高级语言之前虽然已经学过计算机基础知识,但许多学生对计算机知识的理解仅仅停留在概念上,没有应用于实践,对计算机系统的认识没有质的提高。学生在计算机语言的学习中,通过教师的拓展式教学,可以加深对计算机基本概念、专用术语的理解,提高对计算机体系结构的认识水平,并在编程中付诸于实践。
计算机语言课程中的难点和重点是:内存变量、数组、指针、程序设计和算法等,下面就这个方面探讨拓展式教学方法。
1 由内存储器结构拓展到内存变量和指针
在计算机高级语言教材中,涉及内存变量和指针的章节很少提及内存储器结构。教师应突破教材的限制,在引入内存变量和指针之前,先讲解计算机内存储器的相关知识,随后由计算机内存储结构拓展到内存变量和指针。
讲解内存储器的组织结构,用如图1所示的简图来说明。每个矩形格就是一个存储单元,每个存储单元在计算机高级语言中称为一个内存变量。存储单元是临时存储数据的空间,数据存入哪个存储单元或从哪个存储单元取出数据,必须明确存储单元的地址,而2000H,2001H就是存储单元的地址。在计算机高级语言程序设计中,无需明确具体的存储地址,存储单元的地址只需用符号来表示,这就是内存变量名,内存变量名需要程序设计者来定义。
图1 内存储器结构简图
在计算机高级语言中,将地址形象化地称为“指针”,一个变量的地址称为该变量的“指针”。存储数据的单元就是变量,存储地址的单元就是指针变量。
内存变量和指针的使用贯穿于计算机高级语言程序设计的始终,对内存变量和指针认识模糊或认识不深入,在以后的程序设计中就不能合理使用,从而影响程序设计的学习。教师通过教学内容的拓展,把抽象的变量和物理存储器联系起来,帮助学生看清了内存变量和指针的本质,加深了对内存储器结构的认识。
2 由“存储程序”原理拓展到程序设计
由于计算机高级语言源程序是基于计算机硬件执行的,在计算机高级语言程序设计教学过程中,教师要突出和强调“存储程序”原理的讲解。
“存储程序”原理可以借助微型计算机结构简图来说明,如图2所示。程序运行之前,首先把程序调入内存储器,然后在系统的控制下,从内存储器中逐条取出指令加以分析,并执行指令规定的操作,使计算机按程序流程运行直至结束,从而实现自动化的连续工作。
图2 微型计算机结构简图
基于“存储程序”原理的拓展,教师讲解编程计算cgc3.tif时,让学生明白:计算机处理数据是分步骤完成的,本例计算100个数的累加和,需要计算100次,可用循环语句来实现。
通过科学、合理的教学内容拓展,学生能够准确地理解教学内容,逐渐地养成计算机的思维习惯,学会用算法分析问题、解决问题。同时,学生加深了对冯・诺依曼体系结构的理解,对计算机体系结构的认识上升到一个新高度,为以后合理、高效地使用计算机解决本专业的问题打下良好的基础。
3 从硬件资源的高度认识程序设计
大多数学生编写程序只追求任务的实现,忽略程序运行的效率。教师讲解程序设计时,引入“计算机硬件资源”等教学内容,引导学生不但要学会编写程序,而且在满足正确性、可靠性、健壮性等质量因素的前提下设法提高程序的效率。
最主要的计算机硬件资源是计算资源和存储资源,计算资源就是CPU(中央处理器),存储资源包括内存储器和外存储器。高效的程序是指程序运行时尽可能少占用CPU的时间,减少无谓的时间消耗,让计算资源可以被更多的任务利用,提高计算资源的利用率。
例如,编程计算 (n是正整数)。许多学生编程时,使用循环语句来实现,但是,当n的值很大时,会耗费CPU的大量时间。如果把计算式修改成
,则。通过这个例子,让学生明白最好不要把所有计算任务都交给计算机完成,有些计算任务需要程序员提前处理,让出更多宝贵的计算机资源给计算机用户。
通过“计算机硬件资源”的拓展,借助于计算机高级语言教学平台,实现计算机基础知识和上机实践的有机结合,培养学生不但具有基本的编程能力,而且树立高屋建瓴、系统全局的思想,为计算机在本专业中的应用提供指导。
4 总结
高校开设计算机高级语言课程的目的:培养学生掌握编程的基本知识、初步的程序设计能力和基本的程序调试技能。教师在教学过程中,不要局限于教材的限制,通过教学内容的拓展,讲解和程序设计相关的基本知识、基本理论,不但有助于激发学生学习高级语言的热情,而且有利于学生深入理解计算机体系结构,提升对计算机的认识高度。
参考文献:
[1] 张晓萌.关于结构力学拓展式课堂教学的思考[J].科教文汇,2009(23).
[2] 薛永宁.高职院校《数据库原理与应用》教学拓展探讨[J].硅谷,2009(24).
关键词:算法;结构化程序设计;模块化教学;任务化
中图分类号:G712 文献标识码:B 收稿日期:2015-12-29
一、教学现状
“C语言程序设计基础”整个课程分为基础知识和程序设计两个大的模块:基础知识属于纯理论部分,主要介绍C语言的使用规则以及语法;程序设计部分需要通过实训的模块化教学来讲解。C语言知识点很多,很琐碎,用模块化理念来开展教学,学生会感到知识点集中并且思路清晰。
二、模块展示
整个课程是以模块化设计为中心,将原来较为复杂的问题化简为一系列简单模块的设计,也就是将―个大的计算任务划分为一个个比较小的任务。在教学中,要注重把教学重心放在解决问题的算法分析上,培养学生分析与解决问题的能力,也注重培养学生养成规范代码行文。
1.基础篇
首先是引入,在这里运行几个有趣的小程序以提高学生的兴趣;其次要告诉学生C语言这门课程的重要性,即其为后续课程Java的基础。在这个模块主要是语法规则的讲授,多采用案例和计算方法讲授运算符和表达式,用贴近生活的案例来引出算法的应用。在学生具备一定的程序设计能力的基础上,有意识地在程序中有意识的错误设置,强调调试程序的重要性,让学生充分体验与掌握调试程序的方法,逐步提高学生独立调试程序,并在调试过程中发现问题、解决问题的能力。
2.结构化程序设计篇
对程序设计的三大结构――顺序结构、选择结构、循环结构分模块讲授,每一个模块讲授完成,就配合做该模块的练习题,并且进行必要的程序设计。整个实践过程由浅入深、由简单到复杂。在Visual Studio C++环境下,举出几个简单的小程序例子演示给学生看,并逐一讲解,引导学生自己去发现程序中存在的缺陷以及改进的方式。从熟悉C语言源程序到可执行文件的整个操作流程,让学生仿照所列举的几个程序模仿着编一个小程序。学生在正确完成程序设计算法的过程中,不但体会到了成就感,也丰富了自己的知识。
3.数据对象构造
讲授完经典三大结构以后,就对数组、函数、指针三个模块进行讲授。讲授数组模块的过程先给出若干程序案例,分析实现功能的算法,讲授时以读程序为主。解决的方法可能不唯一,如果能启发学生多角度、多侧面去寻求解决问题的办法,则可激发学生思考的积极性,提高其学习兴致。在C语言中一题多解的情况有很多,有意识地引导学生采用新思路和新方法解题,以培养学生在编程中的求异思维,而不是死记硬背,墨守成规。习题课采用读程序与编写程序相结合的方法,让学生熟悉数组的使用和算法实现的相关知识。
函数模块的讲授以自定义函数为重点,讲授其定义使用的语法,要求学生会编写简单的自定义函数。
指针模块对程序设计没有过多要求,只要求读程序。讲授最基本的指针定义和使用。重点突出指针在数组指向的时候的应用。
最后一个模块就是文件,主要讲授文件的打开和访问方式即可。并且案例化讲授使用文件的代码使用方法即可,对学生的编写不作要求。
三、探索结论
对于高职新生,实现C语言教学的基础化、实用化就可,不需要讲授过多复杂和难以理解并且实用性不强的功能。有些知识点只需要理解,有些知识点必须掌握,按照模块化基础教学方案,学生思路清晰,易于掌握。C语言程序设计的教学要讲究方法,通过这门课的学习,不仅要让学生掌握语言的基本规则,而且要切实培养学生分析问题、解决问题的能力,最终使学生明白,语法是有限的,可解决的问题是无限的。只有在分析实际向题的基础上,以清晰的思路去设计算法,才能举一反三,以不变应万变。程序设计的任务不只是编写出一个能得到正确结果的程序,还应考虑程序的质量。
参考文献:
[1] 张正琼,黄文胜.C语言程序设计基础教程[M].重庆:重庆大学出版社,2014.
【关键词】教学;程序设计;计算思维
2010年“第六届大学计算机课程报告论坛”中,陈国良院士指出,计算思维能力是大学计算机基础课程教育过程中一个重要的培养目标。人类科学发展的三大支柱是理论科学、实验科学和计算科学,与之相对应的是人们认识世界、改造世界的三种思维方式,即理论思维、实验思维和计算思维[1]。
程序设计基础课程是高校非计算机专业必修的公共课,教学目标是培训学员的基本编程能力、逻辑思维能力和抽象思维能力。当前程序设计基础的教学中存在如下两个主要问题:第一,学员的计算机理论知识储备不够,没有成体系的专业知识结构,因此,学员对计算机的“思维方式”与传统解题方式的区别难以理解,接受较慢。第二,在实践中出现“重结果、轻过程”,“重编码,轻算法”的现象。学员往往把学习重心放到基础语法的学习上,全神贯注于看到程序“运行结果”,不注重从宏观的角度总结问题,也不注重求解的构建过程,忽略了思维方式的锻炼。因此,在教学中的首要问题应该是培养学员的程序设计和计算思维能力。
1.计算思维
目前国际上广泛认同的计算思维定义来自美国卡内基・梅隆大学的周以真(J.M.Wing)教授,周教授于2006年提出:计算思维是运用计算机科学的基础概念进行问题求解、系统设计和人类行为理解,它是涵盖计算机科学之广度的一系列思维活动[2]。计算思维的本质是抽象(abstraction)和自动化(automation)[3]。抽象是通过简化、转换、递归、嵌入等方法,将一个复杂问题转换成许多简单的子问题并进行求解的过程,这是所有科学发现的必然过程;自动化是充分利用计算机运算能力来实现问题求解,以弥补人的计算缺陷,这将丰富计算机的应用范围。因此计算思维是一种形式规整、问题求解和人机共存的思维。
需要指出的是:计算思维不是侠义的计算,而是运用计算机基本概念去求解问题、设计系统和理解人类的行为[2]。
2.以计算思维为导向的程序设计课程教学
思维方法比知识本身更重要,作为从事计算机基础教学的一线教师,应该在日常教学中潜移默化地训练和培养学员的计算思维能力,提高他们的计算思维素养,从而进一步培养和锻炼学员的创新能力。
教师对学员进行直接教学指导产生应该保证基于计算思维,然后再运用其它教学手段和方法来辅助和引导学员进行知识点的构建和学习问题的思考与解决。通过计算思维的一系列方法――递归,关注点分析,抽象和分解,保护、冗余、容错、纠错和恢复,利用启发式推理来寻求解答,在不确定情况下的规划、学习和调度等,达到引出问题,深入探究、找寻答案,讨论交流、得出结论,反思自评、内化知识的目的。当学员掌握了知识点的同时也掌握计算思维方法之后,再通过已获得的知识和方法自主建构学习的知识和学习的框架,相互间交流协作,同时运用计算思维方法达到迁移拓展科学知识的目的。在这整个学习过程中,所有的学习过程都通过一系列基于计算思维的学习方法展开。
程序设计基础课程是理论与实践并重的课程,在实际教学过程中两部分的教学都必须以面向计算机思维为导向,否则该课程的教育就是不完善不成功的。
3.基于计算思维的案例分析
将计算思维与程序设计课程教学的结合主要体现在两个方面:首先要保证在整个教学过程中要贯穿抽象和自动化这两个核心思想,其次要根据讲授的具体知识点恰当地引入计算思维中所有的其他基本概念和思维方法。
传统教学一般是先讲解本次课所学语法的基本结构,接着讲解具体的例子,最后总结、布置作业的过程。从计算思维的角度出发,教学内容采用“问题导入语法、语法引入应用、应用面向实践”的方式,突出知识点与技术点的关联性,注重内容在应用上的层次性。
以循环结构为例,该结构要求程序根据对某个特定条件的判断来决定是否重复多次进行某一特定的相同操作。教学可分以下几步进行:
①初始时结合学员日常生活举例:列队报数,没有报到队尾时每名学员要在前一名学员数字上加1后大声报出,使整个教学显得过渡自然,给同学们展示了现在所学的知识已经实实在在存在于我们的日常生活中,不仅可以拉近与他们的距离,更重要是让他们觉得所讲授的内容比较简单,为后续教学活动的开展埋下了伏笔。
②采用抽象的方法,提炼出循环结构的基本结构,然后再引入学员中学就已熟悉的等比数列;接着把等比数列前n项求和的算术问题转换成对应的循环结构,这样不露声色把数学的思想灌输给学员。
③在学员已经基本掌握的基础上,再增加一次实践的机会,给出现实生活中一个例子:如求班级平均分问题;鼓励学员积极思考,同时引入计算思维的约简、嵌入、转化等方法,把复杂的问题转分解易于解决的问题并加以实现。
④再进一步拓展,从问题入手,例如:九九乘法口诀表,引入多层循环嵌套结构,着重分析基本结构与多层循环嵌套结构的异同和适用的范围,使整个知识点链自然形成。
在整个教学过程中,运用问题诱发学员使用抽象的思想和方法,学习用抽象方法去表达自己的想法并建模,能够透过现象看本质,通过持续的训练达到完全掌握抽象这个工具。
4.结语
计算思维目前是程序设计类课程教学关注的热点。最终目的是提高学生的程序设计能力和分析解决问题的能力。因此,我们要充分认识到计算思维的重要性。在教学的实施过程中要突出运用计算机知识解决问题的思想,培养并训练学生运用计算思维去思考并解决问题。
参考文献
[1]陈国良.计算思维与大学计算机基础教育[R].济南:第六届大学计算机课程报告论坛,2010.
[2]Jeannette M putational Thinking[J].Communications of ACM,2006,49(3):33-35.
[3]董荣胜,古天龙.计算思维与计算机方法论[J].计算机科学,2009(1):1-4.
[4]贾茹,郝长胜,裴衣非.VB程序设计课程的计算思维教学实践[J].电脑知识与技术,2011(25):6266-6268.
[5]吴绍兵.计算思维和程序设计能力的培养[J].计算机教育,2011(16):11-4.
[6]周显春,刘东山.基于计算思维能力培养的程序设计课程教学研究[J].电脑知识与技术,2012(35):8475-8477.
作者简介:
杜晓静(1975―),女,镇江船艇学院讲师,研究方向:网络安全。
关键词:实验导学;计算思维;程序设计
中图分类号:G642 文献标识码:B
1引言
程序设计课程的教学已逐渐舍弃传统的“填鸭式”教学模式,由“知识传授型”向“能力训练型”转化。教学要以学以致用为目的,以培养学生的学习能力、思维能力和自我约束能力为重点,构建以“学生为中心”的教学模式。笔者集多年程序设计课程教学体验,以C语言程序设计为例,构建“实验导学型”课堂教学模式,探寻以计算思维训练为核心的自我体验式教学方法和策略。在传授基础知识的同时,调动学生的学习兴趣,培养学生分析问题、思考问题和解决问题的能力,使学生由被动接受知识变为主动获取知识,以更好地适应社会对人才的需求。
2从计算思维到程序设计
J.M.Wing教授在《Computational Thinking(计算思维)》一文中指出:计算思维是建立在计算过程的能力和限制之上的,不管这些过程是由人还是由机器执行的。计算方法和模型给了我们勇气去处理那些原本无法由任何个人独自完成的问题求解和系统设计。计算思维涉及运用计算机科学的基础概念去求解问题、设计系统和理解人类的行为,它涵盖了反映计算机科学之广泛性的一系列思维活动。
从计算机的发展和普及来看,计算机已经成为适合于每一个人的“一种普遍的认识和一类普适的技能”。这在一定程度上意味着计算机科学从前沿高端到基础普及的转型,因此,计算思维也被视为是每个人应当具备的基本技能。而对程序设计课程而言,编程能力是计算思维和技能化知识的综合体现,如何培养学生的计算思维能力,是课程教学改革的一项重要内容。
计算机最初是作为一种计算工具问世的,计算机高级语言的理论基础和基本方法都源于数学,而程序设计是求解一系列具体的问题的方法和过程。因此,在程序设计课程的教学设计和实施过程中,必须明确以培养和提高学生的计算思维能力为最终目的,而具体的程序设计只是实现这个目的―种手段。
3基于计算思维训练的“实验导学型”教学模式的构建
近年来,由于C程序设计课程教学的总学时数削减为64学时(理论学时与实验学时比为3∶1),实验学时明显不足,不利于实际编程能力的系统训练与提高。改变传统的课堂教学模式,从单纯性的课堂理论教学转入互动式机房实践教学,以“自主体验”的方式展开课堂教学内容,可以利用有限的学时,使学生充分领会程序设计的基本思想与方法,提升运用计算机求解实际问题的能力。因此,我们在课堂教学环节中集中体现“以学生为中心”的教学理念,以计算思维训练为目的,精讲多练;利用机房环境营造自主体验式教学氛围;以案例为线索,采用“讲练结合,边讲边练”的教学手段,融合知识重点,构建四种体验型实验导学内容。
3.1模仿型实验
模仿型实验是学习者采用“临摹”手段来体验编写程序的过程。俗语说:像不像,三分样。对于学写程序而言,可以像小时学写字时的“描红”一样,首先将现有的案例程序读懂,然后尝试着写出类似的程序。通过模仿型实验的训练,达到初步认识程序的目的。
模仿型实验的构建原则是:以“案例”介绍基本语句和语法,经过举一反三的练习学习编程的方法和技巧,学会用程序设计思维方式分析和解决问题。构建模仿型实验主要针对简单程序的体验学习。模仿型实验示例如表1所示。
3.2验证型实验
对于程序设计的初学者来说,验证型实验是一种最直接、最有效的体验方式。当学生还对程序“懵懂不清”的时候,为他们开启程序设计的大门。通过验证型实验的训练,学生尽快学会并建立起程序设计的思维方式,了解编程基本思路和方法,掌握基本语句的使用及程序的执行过程。
验证型实验的构建原则是:根据案例提出的问题,通过分析问题提出解决方案,并给出全部程序代码及测试数据,由学生对程序运行编译运行,观察并验正运行结果。构建验证型实验主要针对基本语法、语句及程序基本结构的进行体验学习。
以下是验证型实验的一个实例:计数问题。
在解决某个具体问题时,要综合运用程序设计中的三种基本结构,特别是循环与分支结构的组合搭建。例如:设计验证实验,从键盘输入若干个学生成绩,分别统计不同分数段(即:90~100、80~89、70~79、60~69、0~59)的人数。通过本实验,在掌握程序结构与基本语句的同时,学会使用“循环结构中含分支”的常见解题方法及程序结构,测试数据与运行结果如图1所示。验证程序的代码如下:
#include
void main()
{
int sc;
int a=0,b=0,c=0,d=0,e=0;
printf("Input score,with -1 to End:");
scanf("%d",&sc); // 读入第一个成绩
while(sc!=-1) // 成绩sc不为-1时,执行循环
{
switch(sc/10) // 提取十位上的数值
{ // 分别统计各分数段的人数
case 10:
case 9: a++; break;
case 8: b++; break;
case 7: c++; break;
case 6: d++; break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0: e++; break;
default: printf("Input Error!\n");
}
scanf("%d",&sc); // 读入下一个成绩
}
printf("90~100:%4d\n",a);
printf("80~89 :%4d\n",b);
printf("70~79 :%4d\n",c);
printf("60~69 :%4d\n",d);
printf("0~50:%4d\n",e);
}
3.3改装型实验
改装型实验是学习者独自解决实际问题的开始。学生对较复杂的问题进行解析,将已学的知识、算法和技能进行重新组合,寻求解决问题的具体方法。通过改装型实验的训练,学生在巩固已学的知识的同时提高了综合应用知识的技能。
改装型实验的构建原则是:针对“案例”提出的问题分析并提出解题方案,引导学生用已掌握的算法和技巧为较复杂的问题搭建出解题方案。改装型实验主要是针对常用算法和复杂程序的体验学习。
以下是改装型实验的一个实例:批量数据的处理问题。
对批量数据的处理通常采用数组存储的形式,除了输入和输出外,对数组中数据的操作还包括:在指定位置处插入或删除、查找指定的数据,按次序排列等常用操作。例如:设计改装型实验,在数组中查找指定的数据,并对查找到的数据进行删除处理。提出解题方案:先用“查找”算法找到指定数据所处的位置,若找到,则执行“删除”算法,若未找到,显示“数据未找到!”的回馈信息。通过本实验,学生将掌握数组的基本操作和对批量数据的综合处理方法。
3.4独创型实验
独创型实验是构建“学思统一”思维教学空间的关键环节。要培养聪明的学习者,就要给学生提供足够的思维空间,设法激励和引导学生自主思维,并加强综合训练,扩展学生思维发展的学习空间。
独创型实验的构建原则是:提出实际问题及具体要求,引导学生正确地思考,并通过对问题的分析和讨论设计出恰当的数据结构及解题算法,最后独立完成编码及程序的调试。
以下是独创型实验的一个实例:中值滤波器模拟处理问题。
中值滤波是图像处理技术之一,即根据输入图像中对应像素邻域内灰度的“中值”确定输出图像对应像素的灰度值。具体操作步骤是:
(1) 设定一个n×n的模板,让其在图像中漫游,并将模板中心与图中的某个像素位置重合
(2) 读取模板下所对应的像素灰度值,并将这些灰度值从小到大排成一列
(3) 找出排在中间的灰度值,称为“中值”
(4) 将“中值”赋给对应于模板中心位置的像素
解决此问题时,采用二维数组描述图像的像素灰度值。对于数组中的每个元素(灰度值),按n×n模板提取邻域内的元素值(灰度值),经排序确定“中值”,修正元素值,完成滤波处理。通过本实验,学生可以充分理解二维数组的结构特点以及它在实际问题中的应用。
4结束语
程序设计是实现计算思维的―种手段,程序设计课程的教学重点是帮助学生获得解决问题的途径与经验。实验导学型课堂教学模式体现了“以学生为中心”的教学理念,自我体验式的学习氛围有助于引导学生正确的思维,使学生由被动接受知识变为主动获取知识,自我发展,成为一个聪明的学习者。在教学中,教师应加强对计算思维能力的培养,使学生学会用程序设计的方式进行思考,给学生提供足够的思维空间,设法激励与引导学生去思维,主动去获取和建构知识,使学习变得轻松、高效,教学效果得到真正提高。
参考文献:
[1] 王飞跃.从计算思维到计算文化[J].中国计算机学会通讯,2007,3(11).
关键词:C语言;数据结构;课程整合;信息
中图分类号:G642
文献标识码:B
文章编号:1002-2422(2010)06-0090-03
1 课程整合的必要性
首先,从信息管理与信息系统专业的研究内容与构成分布特征来看,专业主要研究信息系统开发与设计的理论、原理、原则和方法。解决信息的获取、加工、检索、控制和利用等一系列重要问题,为科学研究和管理决策提供高质量的信息服务。专业是信息管理与计算机技术、系统科学、管理学、经济学等相结合的交叉学科专业,在课程设置方面突出信息管理与信息系统内容。同时,加大计算机技术和商务课程的力度,增加了市场营销、电子商务等方面的课程。可见,信管专业的学习任务十分繁重。
其次,从“C语言”与“数据结构”两门课程的学习情况来看,很多学生对这两门课程的掌握情况不理想。有如下原因:
(1)C语言是学生接触的第一门程序设计语言,学生的学习精力大多在基本概念及简单程序的编写上面,而对数组、函数、指针、结构体的学习深度不够,这使得学生对复杂问题的处理上缺乏相应的能力。而数据结构的学习必须以数组、指针、结构体等数据类型为基础,C语言学习环节的薄弱导致数据结构的学习上不能得心应手。
(2)由于C语言与数据结构被安排在两个学期学习,大多数同学在学习数据结构时,C语言的相关理论被忘记殆尽,学生在学习过程中不得不重新花费相当的精力去复习c语言的内容,这使得数据结构的学习效果大打折扣。
(3)在学习数据结构时,学生往往掌握了算法,但是最终不能将算法转换成程序,究其原因,是由于C语言的实践环节薄弱造成的。
最后,C语言中的程序相对来说比较简单,学生在编写时往往会觉得困惑:编写这样的程序有什么意义?这导致学生的学习热情不高。而数据结构所涉及的程序往往会解决一些复杂的现实问题,这样学生就可以亲身感受到这门课程的现实魅力,提高学习积极性。
2 课程整合的思路
2.1 课程内容整合设计
“C语言”与“数据结构”课程整合后,由于数据结构以C语言为基础,因此,对于初次接触程序设计语言的学生来说,学习的内容应以C语言为纲,将数据结构的内容穿插其中,在学习C语言语法基础的同时,融入一些复杂数据类型及其操作的实现方法。当然,由于课时的限制,数据结构的内容应以“必需、够用”为度,适当删减其中的章节,合理安排教学内容,做到“有理、有利、有节”。
主要的课程内容安排如下:
(1)C语言常用数据类型:包括常量、变量、运算符和表达式,以及变量的指针和指针变量的用法。
(2)顺序结构程序设计:预处理命令和常用输入输出函数的用法。
(3)选择结构程序设计:if语句与switch语句的用法。
(4)循环结构程序设计:while循环、do-while循环、for循环、break和continue语句的用法。
(5)模块化程序设计基础:函数的定义与调用、函数的嵌套与递归调用、变量的作用域与存储类型、函数与指针。
(6)结构体与共用体:结构体变量、结构体变量的指针、结构体数据作函数的参数、链表、共用体类型、枚举类型、typedef定义数据类型。
(7)数组与广义表:一维数组、二维数组、数组与指针、数组的压缩存储、顺序表的表示和实现、广义表的表示和实现。
(8)栈与队列:栈的表示和实现、队列的表示和实现。
(9)字符串:字符数组、字符串与指针、字符串处理函数、字符串的存储表示方法、模式匹配算法及程序实现。
(10)树与二叉树:二叉树的性质、存储、与遍历、树与森林、赫夫曼树以及现实问题的引入与求解。
(11)图:图的存储、遍历、图的连通性、拓扑排序、关键路径、最短路径的求解。
(12)查找与排序算法:静态查找、动态查找、哈希表、插入排序、快速排序、选择排序。
(13)文件:文件的打开与关闭、文件的读写等。
课程内容设计参考文献[2][3]进行设计,对以往C语言教程的结构进行重新组织,将指针糅合在各章节中,将数据结构的知识点与C语言基础有机结合,注重知识点前后衔接。经过课程的整合,使所有知识成一体系,学生的学习更加系统、全面。但是该课程也有一个典型的缺陷:知识覆盖面广。如果学生的学习积极性和主动性没有被充分调动起来,这门课的学习将会陷于混乱。因此,整合后的课程对授课教师与学生都将是一个新的挑战。
2.2 实验课程设计
“C语言”与“数据结构”都是实践性非常强的课程,在开展理论授课的同时,还必须安排合理的上机实践。实验课程的任务是使学生能使用所学的程序设计与数据结构的基本知识和算法解决一定的问题,使学生在程序设计中能构造各种数据结构和综合使用各种算法,提高学生解决实际问题的能力。
为了提高实验教学的效果,实验课程的设置应与理论授课配套,且必须有充足的课时,具体课时的分配也是参考课程的重点难点来制定的,实践的内容与理论课保持同步,使理论教学与实验教学紧密结合,内容的安排也应该做到循序渐进、由浅入深。这样利于学生巩固所学知识。
根据整合后的课程教学目标、课程的特色及学生的认知过程,对实验课程采用“分层次思想”来设置实验内容:
(1)知识的认知,理解C程序语法知识。
(2)知识的运用,能解决简单的问题。
(3)应用知识解决实际问题。
因此,实验的形式可以分为四类:认知型实验、知识应用型实验、程序设计型实验、综合案例型实验。认知型实验,主要用于加深基础知识的理解,包括c程序的结构、基本语法、语句以及c程序的调试方法等,通过给出现有程序进行调试的方式来展开;知识应用型实验是在认知实验的基础上,提高学生阅读程序、调试程序的能力,主要形式是对现有程序进行阅读,理解语句的功能,并设置一些错误以待学生调试解决;程序设计型实验是用于培养学生编程的能力,通过给出一些题目,让学生自己编程并在计算机上实现;综合案例型实验是提高学生应用C语言与数据结构的知识解决实际问题的能力,例如可选择学生感兴趣的游戏来实现:比如俄罗斯方块、贪吃蛇、走迷宫、五子棋,或者是与信管专业相关的管理信息系统的设计:仓储管理系统、通讯录系统等。
3 教学方法设计
“C语言”与“数据结构”的整合设计以C语言为主线,将各种类型的数据结构糅合其中,将C语言与数据结构有机地结合在一起。“学生能更好地掌握最常用的数据结构,理解数据结构内在的逻辑关系,理解数据与关系在计算 机中的存储表示以及用C语言描述这些数据结构的运算和实际的执行算法”。
3.1 激发学生兴趣
兴趣是最好的老师,该课程的教学过程中应时刻重视学生兴趣的培养。为了不让学生从一开始就产生畏难情绪,第一堂课就变得非常关键。因此,第一节课的授课重点应在于告诉学生现实中的问题用C语言与数据结构解决的实例,比如对弈问题、迷宫游戏、俄罗斯方块等,以此来激发学生的好奇心理。同时,还应该从后续课程和考研的角度来介绍该课程的重要性。在授课过程中,教师应时刻关注学生的学习激情,实时插入一些用已学知识解决现实问题的案例,并引导学生解决。
3.2 案例教学
案例教学的目的是为了启发学生的思维,拓宽知识领域,激发学生的学习兴趣。课程中可设计以下案例来充实课堂教学内容:
(1)将C程序的三种基本结构结合起来,以举例的形式讲解三种基本结构在字符处理、多项式求和、选数、迭代、随机数处理等多方面的具体应用。
(2)引入经典问题来研究算法,比如汉诺塔问题采用递归算法,二维幻方问题采用蛮力法,棋盘覆盖问题采用分治法,n皇后问题用回溯法,背包问题用贪心法等。
(3)通过引入约瑟夫环、一元多项式求和、走迷宫等案例来加深对链表与栈的理解,树的应用可引入赫夫曼编IN/译码的应用实例,图中引入求最短路径的实用程序。
3.3 引导式教学
“C语言与数据结构”课程的难点在于算法的最终实现,在授课过程中,对于每个问题通常采用五个步骤来解决:引入问题分析问题框架构造算法设计程序设计。首先通过问题引入让学生明确研究的任务:然后让学生讨论问题的解决思路,制定具体的实现策略;第三,为程序划分模块,构造程序的框架;第四,对程序实现的关键步骤设计算法,要求在教师的引导下,与学生共同完成;最后,在前面的框架中将算法转换成C程序。实践证明,采用该五步引导法能很好地吸引学生的注意力,教学效果良好。
3.4 网络辅助教学
借助已有的网络教学平台、BBS等进行网络互动交流,在教师的指导下,根据学习的要点利用网络调用信息资料,或者探讨某一问题。教师应在网络上提供丰富的实例供学生参考,学生也可将自己的成果上传共享。网络辅助教学为提高学生创新能力、实践能力、学习积极性提供可能。
4 结束语
整合之后的课程以C语言程序设计为主线,将数据结构及算法实现糅合在其中,根据需要对课程内容进行调整,使得各知识点前后自然衔接。整合后的课程注重理论与实践的有机结合,注重学生编程能力的培养。通过培养学生的兴趣,提高了学生学习积极性和主动性。
参考文献
[1]谢莉莉,李勤,傅春,等.“C语言与数据结构”课程的教学改革实践[J].北京:计算机教育,2009(7).
[3]顾元刚.C语言程序设计教程[M].北京:机械工业出版社,2004-06.