程序设计基础课程教学模式研究与设计

2012-07-13 03:06葛文庚
电子设计工程 2012年4期
关键词:运算符子集程序设计

葛文庚,蔺 莉

(黄淮学院 信息工程学院,河南 驻马店 463000)

程序设计基础课程是计算机相关专业普遍开设的一类重要课程,因为程序设计本身有其自己独立的理论体系,对学习者思维方式的要求也比较特殊,对逻辑性思维的要求很高,同时对实践开发一能力的要求也很高,所以大多数学生很难适应课程的要求,学习过程比较痛苦,教师的教学也很难达到理想的效果,成为师生普遍认为难学、难懂、难教的一门课程。该课程的教学目标是要学习结构化程序设计方法和面向对象程序设计方法,掌握 C/C++程序设计语言的语法、语义和语用,能够熟练运用C/C++语言解决一般问题。此外,还要求通过课程学习,使学生能够掌握学习高级程序设计语言的一般方法,养成良好的程序设计风格,对软件工程有初步的认识。

1 高校程序设计课程普遍存在的问题

随着各行各业对计算机技术的应用越来越普及,为适应社会对高层次人才的需求,各高校不仅在计算机专业开设了程序设计以及数据结构等课程,还在非计算机专业的学生中加强了计算机知识的教学,陆续开设了程序设计课程,并将其设为必修课程[1]。学习基础的程序设计语言,涉及的语言如C、VB等,“程序设计基础”课程虽然以讲授 C/C++语言为主,但并非单纯讲授一门语言,其主要目标是培养学生具有一定的阅读程序、设计程序的能力,分析、解决问题的能力和逻辑思维能力[2]。这样不仅有助于提高大学生的综合素质,更加强调对程序设计方法的掌握和程序设计风格的养成,为学生今后继续学习其他高级程序设计课程打下牢固的基础[3]。

程序设计是高等学校学生第一学年必须选修的基础课程。学生对该课程的实际掌握情况将直接影响到后续专业课程的学习。高校“程序设计基础”课程包含了两个方面的内容,即程序设计语言和程序设计方法。程序设计语言是语法规则和语句的集合,多数以 C或者 C++为例加以介绍;程序设计方法则是算法设计和使用计算机语言描述算法的过程。然而目前程序设计教学的现状却不容乐观[4]。由于程序设计课程所采用的仍然是传统的知识传授方式,这种教学方式偏重于“教”,忽略了学生作为学习主体的特征,以至于学生花了很大精力去学习语法,但还是不知如何编写一个正规的程序,不知道怎样通过编程去解决实际问题[4]。使得程序设计低效难教的现状得不到改善。通过对学生调查和访谈,大部分学生对程序设计充满了畏惧,认为其晦涩难懂,学难致用,并因此沮丧,渐失学习兴趣;而教师也因反复教授学生也无法掌握最基本的程序结构而感到苦恼,渐失教学热情,“难学”、“难教”成为师生的共识。如何有效地开展程序设计教学,探讨程序设计教学的新思想、新方法和新理论,已成为教学改革中亟待解决的问题。

2 算法与语言规则的在本课程中的关系

“程序设计基础”课程既培养学生解决问题(算法与程序设计)的能力,又使他们比较熟练地掌握一种程序设计语言。“程序设计基础”课程不仅包括语言语法规范的学习,还包括程序算法的设计。

2.1 算法内容学习

一般情况下,问题可以分为两大类两类问题都需要有自己的算法,数值类一般有固定的算法。而非数值处理中,只有少数的典型问题有现成的算法(如排序问题、检索问题等)可供选用,其余算法设计是各异的,没有统一的模式,需要学生根据已学过的知识充分发挥个人的创造力,对给定的问题设计出最优算法,这也是最能培养学生创新能力的部分。不管是哪一类算法,在教学内容的选择上都要求结合实际选取典型的问题,同时还要考虑学生的接受情况,由易到难,循序渐进地进行教学。通常,一个问题都会有不止一种解决方法。随着语言语法知识的深入学习,可能会使某一问题的求解过程变得简单。例如在求解Fibonacci数列问题上,学习数组之前的解决方法就比学习之后要复杂得多。如果一开始就选择难度较高的算法,往往会使学生望而生畏,挫伤学生学习的积极性,进而产生抵触情绪。俗话说:“兴趣是最好的老师”。但是要让学生对学习程序设计感兴趣,并不是一件容易的事情,这是由程序设计本身的特性——抽象所决定的。为此,教师要想方设法调动学生学习程序设计的积极性。

2.2 语言规则学习

对程序设计而言,语言仅是一个描述算法的工具。所以,语言规则的学习应该是在确定了问题空间 (解决问题的范围)的基础上有目标的语言学习。用不同的计算机语言编写程序解决同一个问题,其算法可以是一样的。但是程序设计最终是对程序设计语言的应用。一般地,编写程序总是要选择一种计算机语言,而每种计算机语言又都有各自的规则体系。因此有人提出,既然算法是程序设计的核心,就应该把“算法分析”和“语言规则体系”两者分开学习,以便突出重点、分散难点,这种主张有一定的道理。然而,程序设计作为计算机及相关专业开设的重要课程,在教学中首先应该强调通过算法与程序设计解决问题的方法,让结构化程序设计的思想渗透到教学的全过程;其次才是对程序设计语言的教学。“算法分析”与“语言规则体系”在实际教学中彼此是相融合的,不可能决然分开,必须结合某种具体的程序设计语言进行算法的教学。

3 提出语法子集的客观必要性

3.1 课程性质所限

“程序设计基础”课程包含了两个方面的内容,即程序设计语言和程序设计方法。按照教学大纲的要求,“程序设计基础”课程的计划学时是 48+16,仅利用 48(理论)+16(实践)学时学习并掌握程序设计的基础知识(包括语法的算法两个方面),时间紧,在授课时,老师对教学内容作了删减,精选了课堂上应该讲授的基本知识,其余部分让学生在课下自学完成。应该重点讲解程序设计的思想和方法,真正做到“精讲”。

3.2 学习者之需要

高中生经过选拔性考试进入大学学习,他们已经具备了接受高等教育的智力和能力水平。新生大都是带着胜利者的喜悦和自信步入大学的。面对新的学习、生活环境,几乎所有新生都有一种寻求自己位置的迫切需要,表现在学习上就是想在新班级新同学中力争上游,首先在学习上超过他人。所以,他们大都有好好学习,不虚度大学时光的愿望,对自己有较高的期望值[6]。但经过一学期的学习后,一部分学生学习效果却不佳,尤其是在学习程序设计时更是步履蹒跚。其原因之一是由于程序设计教学内容的特殊性及教学方法的不断更新和对学习能力要求的提高,给学生学习带来了很大的困难。计算机的‘思维’方式是不同的;它有不同的记忆方法来记忆事实。”因此在算法教学中要引导学生突破传统的思维方式,超越教材内容的束缚,通过寻求不同的解决方案来努力培养自己创新的思维习惯。为了使学生尽快适应新的学习环境及学习方式,我们必须从教学的每一个环节下功夫,想办法。经过教学实践笔者认为,如果合理地选择教学内容,巧妙地进行教学设计,会使教学收到事半功倍的效果。

4 语法子集抽取实验的设计

语法子集:程序设计语言的语法内容相对来说比较多,由于课时、课程性质、学习者的认知水平等限制只能讲授其中最主要的语法要素,将这一部分语法内容定义为语法子集。

研究设计的实验首先用来将 C/C++语言程序进行分词编码,为统计阶段提供接口;其次,对得到的大量的数据进行频数统计。为了对得到的实验进行科学的分析,选择实际选用的教材样例程序作为实验数据,并对实验结果的进行了验证,来检测语法子集的可行性、可靠性。

4.1 实验分析

“程序设计基础”课程包含了两个方面的内容,即程序设计语言和程序设计方法。将其中所讲授的某一种确定的程序设计语言称为教学语言。目前作为该课程教材的大多是 C或者 C++语言,而 C++是在 C的基础上发展起来的,可以说C++是 C的超集,所以研究选择了 C/C++语言,其关系如图1所示。

图1 C/C++语言Fig.1 C/C++language

1)“程序设计基础”课程教学内容要点

“程序设计基础”课程不仅包括语言语法规范的学习,还包括程序算法的设计。这些内容涵盖的知识单元有:程序设计语言概论,程序设计基本结构,算法与问题求解,事件驱动程序设计,算法策略,基本算法,面向对象程序设计。一般情况下,一个问题的求解过程可能涉及多个知识点,一个知识点可能会出现多个语法要素,如在求解两个整数的最大公约数问题上,会用到如变量定义、输入输出、数据交换、循环控制结构等知识点,而就单纯循环控制结构中就会出现很多语法要素,如用到的关键词可能有 while,for等,运算符有=,%等。因此对语法内容的选取首先需要确定问题空间,即先确定学习者所能解决的问题范围。

2)C/C++语法特点

从语法的角度看,源程序实际上是一个字符序列。这些字符序列按顺序分别组成了一系列“单词”。这些“单词”包括语言事先约定好的保留字(ReservedWords,如用于描述分支控 制 的 if、else, 用 于 描 述 数 据 类 型 的 int等 )、 常 量(Constant)、运算符(Operator)、分隔符以及程序员自己定义的变量名、函数名等。“单词”的组合形成了语言有意义的语法单位,如变量定义、表达式(Expression)、语句、函数定义等。一些简单语法单位的组合又形成了更复杂的语法单位,最后一系列语法单位组合成程序。

4.2 实验设计

实验主要由以下3个步骤组成:

1)数据采集(数据采样)

将目前国内大多数院校所选用的作为计算机及相关专业的“程序设计基础”课程的教材作为主要分析对象。原始数据主要来源于目前国内用于“程序设计基础”课程的教材,包括国内的许多专家学者所编著的教材和国外原文教材的翻译版本教材。由于数据量较大,只能选取其中的一些由权威出版社及程序设计方面的专家学者所著的一部分。为了尽量降低采样主观性,体现实验数据的普遍性,处理数据主要是其中的样例程序和课后习题的实现程序。由于这些教材形式主要包括课件及相关的电子文本,所以首先要解决的问题就是从自然语言文本中抽取样例程序,并生成 TXT文本。

2)数据处理

数据处理阶段要解决的问题就是对已经筛选出的符合条件的程序进行分词、标注。分词工作会去除掉程序中多余无用的部分(如注释,多余空格等),标注的信息包括该词的类型(关键字、运算符、界符、标识符、常量),该词所属的程序文件编号,该程序所属的问题范畴。C/C++程序设计语言中的单词分为5大类:关键字、运算符、界符、常数和标识符。数据处理阶段主要实现对样例程序的分词,它将接收到的所有符号根据构词规则转换成一系列单词串,并将单词分为以上5大类。其中,关键字(如while等)和界符(如分号等)都是确定的且数量有限,将属于这两类的单词赋予一个固定的类型编码,如关键字用 1表示,界符用 2表示;运算符(如加号等)是确定的,则所有的运算类型(算术运算符、逻辑运算符、关系运算符、位运算符、赋值运算符和结构运算符)都用一个统一的编码 3表示;标识符(如变量名等)统归为一类用 4表示;而常数(如整数 6等)也统归为一个编码5。

对13类算法进行了编码,如计数、求和、求阶乘等分一类,编码为 01;求两个整数的最大公约数、最小公倍数等分另一类,编码为 02;以此类推,编码表如表1所示。

表1 算法编码表Tab.1 Algorithm code table

3)数据统计

对数据处理阶段得到的单词表进行统计。以单词出现的频数和在所有文件中出现的比例为统计依据。比较其中出现或未出现的语法部分,统计其中出现频率较高的语法内容,得出子集。最终得到的是所有程序文件中出现的C/C++语言的单词频数统计表(不包括重复出现的情况)。通过对该表的分析得出最后的结论。

实验对现有国内外大量用于高校计算机及相关专业“程序设计基础”课程教学的教材进行分析统计,通过数据采集、数据处理两个阶段将教材中的样例程序文件按照所属算法分类,并对程序代码进行分词、标注;经过统计分析阶段得到一个量化语法子集。通过对该量化子集和经验子集进行比对后发现,它们的一致性程度高。本文还进行了相关实验,结果表明:基于语法子集的程序设计教学开展,不会对后续专业课程的教学产生不良影响,说明该子集可以应用于教学。

实践证明,应用 C/C++语言的语法子集开展“程序设计基础”的教学能更好地提高程序设计课程的教学效率,帮助学生理清学习思路,对培养学生分析问题、解决问题的能力有比较大的帮助。

5 结束语

本研究的主要内容是针对初学者特点,在“程序设计基础”课程的知识选取上采取“瘦身”措施,消除很多 C/C++语言教材中存在的“知识臃肿”现象。教学内容应突出C/C++语言程序设计的主干知识,淡化分支知识,摒弃末叶知识。在对C/C++语言程序设计知识点进行系统论证分析的基础上,合理取舍每个教学单元的知识内容,将主干知识列入教学目标,放在首位;将分支知识作次要介绍;对不利于课程主体内容教学、容易使初学者陷入迷魂阵的“末叶”知识坚决舍弃。学生在学习时既容易进入主题,又不迷失方向。

[1]李秉德.教育科学研究方法 [M].北京:人民教育出版社,2006.

[2]李文新,胡薇薇.北京大学信息科学技术学科课程体系研究组[M].北京:清华大学出版社,2008.

[3]胡毅.《程序设计基础》课堂教学方法探索[J].现代计算机:专业版,2011(11):42-43.

HU Yi.Exploration on teaching method of programming fundamentals[J].Modern Computer,2011(11):42-43.

[4]张勇.“Java程序设计”课程教学改革研究[J].电脑知识与技术,2011(24):5980-5981.

ZHANGYong.Teachingreformresearchof“JavaProgramming”course[J].Computer Knowledge and Technology,2011,24:5980-5981.

[5]于晓强,赵秀岩,闫丕涛.计算机程序设计课程中计算思维能力的培养[J].计算机教育,2011(13):18-21.

YU Xiao-qiang,ZHAO Xiu-yan,YAN Pi-tao.Cultivation of capacity for computationalthinking through computer programming[J].Computer Education,2011(13):18-21.

[6]宫海梅.《程序设计基础》教学探索[J].海南广播电视大学学报,2011(2):142-143.

GONG Hai-mei.Study on teaching activities in the fundamentals of programming[J].Journal of Hainan Radio&TV University,2011(2):142-143.

猜你喜欢
运算符子集程序设计
拓扑空间中紧致子集的性质研究
老祖传授基本运算符
连通子集性质的推广与等价刻画
基于Visual Studio Code的C语言程序设计实践教学探索
关于奇数阶二元子集的分离序列
用手机插头的思路学习布尔运算符
从细节入手,谈PLC程序设计技巧
高职高专院校C语言程序设计教学改革探索
PLC梯形图程序设计技巧及应用
每一次爱情都只是爱情的子集