【关键词】面向对象;程序设计特征
程序的质量取决于程序设计的质量,选择了程序设计语言之后,编程风格决定了程序的可读性、可测试性和可维护性。对面向对象实现来说,良好的面向对象程序设计风格,不但要遵循传统的结构化程序设计风格和准则,也要遵循为适应面向对象方法所特有的概念(例如,继承性)而必需的一些新的风格和准则。
一、提高可重用性
提高软件的可重用性是面向对象方法的一个主要目标。软件重用是指在两次或多次不同的软件开发过程中重复使用相同或相似软件元素的过程。软件元素包括程序代码、测试用例、设计文档、设计过程、需求分析甚至知识领域等多个层次。在编码阶段主要考虑代码重用的问题,代码级的重用是最简单,也是最流行的,是迄今为止研究最深入、应用最广泛的重用技术。传统上,代码级重用部件的主体是子程序(函数或过程)。现在,由于基于对象和面向对象的程序设计语言及相应开发环境的发展,代码级重用部件的内容更加丰富,不仅包括结构化程序设计语言中的函数或过程,同时也包括面向对象程序设计语言中的程序包和类。
一般说来,代码重用可分为两种形式,一种是本项目内的代码重用,称为内部重用;另一种是新项目重用已有项目的代码,称为外部重用。内部重用主要是找出本项目设计中相同或相似的部分,然后利用继承机制共享它们。要做到外部重用,即一个项目重用另一项目的代码,就要求开发人员必须具有重用的设计思想,做到反复考虑,精心设计。虽然为实现外部重用与内部重用需要考虑的范围不同,但是有助于实现这两类重用的程序设计准则却是相同的。实践经验表明,主要的准则有:
1.提高方法的内聚,减小方法的规模
一个方法(即服务)应该只完成单个功能,这样的方法是高内聚的。如果某个方法涉及两个或多个不相关的功能或规模大的方法,则应该把它分解成几个更小的方法。
2.保持方法的一致性
实现代码重用的一个重要因素是应该保持方法的一致性。一般来说,功能相似的方法应该有一致的名字、参数特征(包括参数个数、类型和次序)、返回值类型、使用条件及出错条件等。这样有助于实现代码重用。
3.把策略与实现分开
方法从所完成的功能来看有两种类型:策略方法和实现方法。策略方法负责做出决策,提供变元,并且管理全局资源;实现方法只负责完成具体的操作,但却没有执行这个操作的决定权,也不知道为什么执行这个操作。
策略方法不直接完成计算或实现复杂的算法,只是检查系统运行状态,并处理出错情况。该方法通常紧密依赖于具体应用,这类方法易编写、易理解。
实现方法仅仅针对具体数据完成特定处理,通常用于实现复杂的算法。实现方法既不制定决策,也不管理全局资源。实现方法如果在执行过程中发现错误,只返回执行状态而不处理出错情况。由于实现方法是自含式算法,与具体应用相对独立,因此,容易在其他应用系统中重用,具有较高的可重用性。
在编程时分清策略方法和实现方法,不要把它们放在同一个方法中。应该把算法的核心部分放在一个单独的具体实现方法中。为此需要从策略方法中提取出具体参数,作为调用实现方法的变元,才能提高方法可重用性。
4.采用全面覆盖技术
在编程时,对系统全面考虑,写出覆盖整个系统所有可能的方法。而不能仅仅针对当前需要的功能写方法。例如,如果在当前应用中需要写一个获取表中第一个元素的方法,则至少还应该为获取表中最后一个元素再写一个方法。一个方法不仅能处理正常值,而且还能够对异常情况(如空值、极限值及界外值等)作出有意义的响应。
5.降低方法的耦合度
降低方法与外界的耦合程度的一项主要措施是在方法中尽可能少使用或不使用全局信息。
6.充分地利用继承机制
使用继承机制可实现共享和提高重用性,是面向对象程序设计的主要途径。
(1)使用子过程。把公共的代码分离出来,构成一个被其他方法调用的公用方法,是实现代码复用最常用、最简单的方法。通常可以在基类中定义这个公用方法,供派生类中的方法调用。
(2)分解因子。提高相似类代码可重用性的另一个有效途径,是从不同类的相似方法中分解出公共代码和不同的代码(即因子)。把公共代码作为公用方法,定义在一个抽象基类(额外的)中;把不同的因子作为名字相同而算法不同的方法,定义在不同类中,并被这个公用方法调用。把这种分解与面向对象语言提供的多态性机制结合起来,抽象基类中定义的公用方法可由派生类来继承,在新子类中只需编写其特有的代码,由于增添新子类编写的代码减少了,显然为增添新子类所需付出的工作量也就明显降低了。
(3)使用委派。当确实存在一般—特殊关系时,利用继承关系,子类可以继承父类的所有方法和属性。但是,当逻辑上不存在一般—特殊关系时,为重用已有的代码,可以利用委派机制。要恰当地使用继承机制,否则会降低程序的可理解性、可修改性和可扩充性。
(4)把重用代码封装在类中。解决同一类应用问题时,程序员往往希望重用其他方法编写的程序代码。那么就将被重用的代码封装在类中,这样使用起来比较安全,也是程序员应该提倡的编程风格。例如,如果开发一个应用数学系统时,发现有现成的实现迭代法的商品软件包,程序员想重用这个算法,于是先定义一个迭代法类,然后把这个商品软件包的功能封装在该类中即可。
二、提高可扩充性
前面所述的提高可重用性的准则,同样能提高程序的可扩充性。通过实践研究,有助于提高程序的可扩充性的面向对象程序设计准则如下:
1.封装实现策略
为了提高类中数据结构或算法可修改性,应该把类中描述属性的数据结构以及修改属性的算法等实现策略封装起来,只提供公有的接口供外界访问。
2.方法的功能应该单一
一个方法应该高内聚低耦合,包含对象模型中的有限内容。如果用一个方法遍历多条关联链,将使方法过分复杂,既降低了可理解性,又影响了可修改性和可扩充性。
3.避免使用多分支语句
在实施系统开发过程中,可以利用DO-CASE语句测试对象的内部状态,避免使用多分支语句来根据对象类型选择应有的行为,否则在增添新类时将不得不修改原有的代码。一般来说,应该合理地利用多态性机制,根据对象当前类型,自动决定应有的行为。
4.精心选择和定义公有方法
公有方法是对外公用的接口,私有方法是仅在类内使用的方法,通常利用私有方法来实现公有方法。一般来说,公有方法的修改代价要比私有方法大得多,因为对公有方法的修改常常会引起许多其他类的修改,而私有方法的删除、增加或修改所涉及的面要小得多(仅在类内),因此代价也比较小。为提高可修改性,降低维护成本,必须精心选择和定义公有方法。
三、提高健壮性
提高健壮性,也是程序员在编写实现方法的代码时应该考虑的一个重要方面。通常需要在健壮性与效率之间做出适当的折衷。健壮性对任何一个实用软件都是不可忽略的质量指标。遵守下述准则将有助于提高健壮性。(下转第83页)
(上接第81页)
1.增强系统的容错功能
系统应该具备容错功能,即具有处理用户操作错误的能力。当用户操作失误或输入数据出错时,不会引起程序运行中断,更不应该造成“死机”,而应该对操作进行检查,发现了的错误,必须给出有关的提示信息,并允许用户再次输入或正常退出。
2.检查参数的合法性
对软件系统中所使用的方法或过程,尤其是公有方法或过程,应该着重检查其参数的合法性,不能因为用户在使用公有方法或过程时,违反参数的约束条件而引发程序运行中断或造成系统“死机”现象。
3.不要预先确定限制条件
预先确定限制条件对所开发的系统往往会产生一些不良的后果。特别是在设计阶段,往往很难准确地预测出应用系统中使用的数据结构的最大容量需求。当系统中使用的数据结构的容量大于预先确定的限制条件时,系统有可能引发一连串的问题。因此不应该预先确定限制条件。如果有必要和可能的条件下,则应该使用动态内存分配机制来创建数据结构,当然,该数据结构是未预先确定限制条件的。
4.先测试后优化
为了提高健壮性,往往需要增加大量的代码,这就或多或少地影响了系统的执行效率。因此,就需要在效率与健壮性之间做出合理的折衷。一般来说,首先根据应用程序的特点,确定需要着重测试的部分(例如,最坏情况出现的次数及处理时间等),进行测试。然后为提高性能,确定着重优化的关键部分。此外在选择算法时,要综合考虑内存需求、速度以及实现的简易程度等因素,选择出适当的算法。
四、结论
关键词:高职高专 程序设计 教学改革
程序设计是计算机专业领域中最为核心的工作。在程序设计工作中,既要对问题进行分析,又要考虑各种设计的可能性,更高层次地,还要考虑运行程序的代价问题。作为计算机各专业的三大基础课之一,学生对其掌握的熟练程度将直接影响后续课程的学习。
一、 程序设计基础课程教学的现状及面临的问题
1、教学的现状
各院校开设的程序设计基础课程,多为教授学生某一种程序设计语言,其中Pascal、VB、C、C++、Java语言较为多见。 C语言作为当今最为流行的程序设计语言之一,不但成为计算机专业的必修课,而且也越来越多地成为非计算机专业的学习课程。但在实际的课程教学中,许多教师和学生都认为C语言涉及的概念比较复杂,规则繁多,使用灵活,容易出错,教师教学和学生学习都感到困难,并不同程度产生畏难心理。特别地,多数院校将C语言作为计算机专业学生进校后首先接触的第一门专业基础课,这种现象尤为明显。
2、面临的问题
一直以来,关于如何讲授面向大学生的程序设计基础课程,许多人争论的焦点放在了语言选择上,把讲授的重点放在了语言的语法规则介绍上。从短期看,这样做便于学生学,也便于教师教。但从长期看,越是注重以语法来衡量学生对语言的“掌握”程度,就越是忽略了程序设计真正使用的基本思维方式和方法,最后导致学生可能在学习完一学期的课程之后,满脑子除了一些语法知识,几乎没有任何分析解决实际问题的技能。
二、教学内容的改革
纵观教学的现状和所面临的问题,笔者认为程序设计基础课程应围绕程序开发周期,即分析问题、设计程序、编写程序代码、测试程序以及其他额外步骤等展开教学。但这并不容易实现。首先,若要从程序开发周期的各个方面教授学生,需要花费较多的课时。目前各院校开设的程序设计基础课总课时不尽相同,但大多在50到60课时之间,其中有三分之一是学生实验实训环节。换句话说,教师用于讲授的时间一般只有30课时左右。其次,以C语言为例,涉及基本数据类型、运算符和表达式、控制结构、数组、函数、指针、结构体和共同体、位运算和文件等诸多内容,显然,要在30课时内讲授完是很困难的。第三,即便是用填鸭式的方式将上述知识全部灌输给学生,学生也是不可能学会的。反而会造成学生的抵抗情绪。第四,本科计算机专业的程序设计教学一般是在一年级上学期先开设程序设计导论课,然后再开设具体的语言程序设计课,这是个循序渐进的过程。然而高职高专计算机专业的培养目标和教学进度与本科的是有区别的,因此,本科计算机专业的教学模式不能全部采纳。笔者以总学时50课时,其中讲课30课时,教授C程序设计语言为例,认为课堂教学可以进行以下改革。
1、以结构化程序设计为核心,重点讲授程序设计的控制结构
人类的自然语言有千百种,归根结底都是人类思想交流、记录的工具。计算机语言同样也是对解决具体问题的算法思想的表达工具。表达的形式――程序设计语言千差万别,但表达的内容――算法则是殊途同归。这里所说的算法不单是算法的概念和具体的某种算法,还包括算法的表示方法如流程图、结构图和伪代码等。程序设计语言本身只是在最后用来描述算法的一种工具,而任何程序不外乎由顺序结构、选择结构和循环结构组成。不论用哪种语言编写程序代码,都无法脱离这三种控制结构。可以说,是否掌握它们的用法决定了学生设计程序的优劣。因此,笔者认为,在高职高专的程序设计基础课中,让学生学习、掌握如何分析实际问题和设计解决它们的算法及算法描述的同时,应重点传授三种控制结构。
以往除了三种控制结构外,指针也是C语言的教学重点,或者说是重中之重。不可否认,指针是C语言的精髓,对程序设计有锦上添花的作用。能够驾驭C这门程序设计语言,势必熟练掌握指针的运用。而且,在目前的各类计算机等级考试中,C语言的指针也是必考而且重点考查的内容。那么,仅把教学重点放在控制结构上是否合适呢?笔者是这样考虑的:
第一,学习指针需要研究指针四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、以及指针本身所占据的内存区。这个学习的过程是相当费时的。较短的课时教授较多的内容之间存在矛盾。
第二,学习指针还要有一定数据结构的知识,对于初学程序设计的学生而言,过快地接触指针会使他们措手不及。有限的认识能力和知识水平与较复杂的应用之间存在矛盾。
第三,作为高职高专的程序设计基础课,浅显易懂实际上是非常重要的。高职高专学生的学习基础相对本科以上层次的还是较弱的,更应当使课程真正发挥“基础”的作用,成为为学生打下的坚实基础的奠基石。
那么,在高职高专的程序设计基础课中,是否就不必教学生指针的知识呢?当然不是。在学生掌握了程序设计的控制结构以后,选择性地将指针的概念及其一般的规则进行讲授,其他复杂及带有技巧性的内容,可以放在后续课程,或者在应考培训班里再作深刻的研究。
2、始终贯穿程序开发周期的教学,培养学生建立良好的程序设计风格
如1中所述,不能从语法规则角度来衡量学生对语言的“掌握”程度,不能忽略程序设计真正使用的基本思维方式和方法的教学。人类学语言很多时候不是先学语法语义规则的,而是先能听懂,然后会跟着说,然后才是学习书写以及其它更高形式。学习计算机语言也是一样的。让学生从感性再到理性去认识和理解程序设计,学生才有可能在学完课程之后大有收获。
现实中一个程序的开发是要经历一个漫长的开发周期的:分析问题阶段是整个周期中最困难的部分也是最重要的部分,需要明确期望的结果,需要明确有哪些信息参与来得到结果,需要对什么样的数据进行什么样的操作去得到期望的结果;设计程序阶段是开发过程的核心,需要把分析阶段的结果模块化,并采用算法加以描述;编写程序代码阶段用具体的计算机程序设计语言实现前一阶段的算法;测试程序则需要花费更为漫长的时间,因为实际的用户无法容忍一个有隐患的软件。这样看来,具体的程序设计语言要在整个开发周期的第三阶段才发挥作用。而程序设计风格就像一个人的习惯一样有好坏之分,好的程序设计风格会增强程序的可读性和易用性。因此,在学生学习程序设计基础之初,就应该注重培养学生的良好编程习惯,并在每个章节的教学中展开对程序开发周期的学习,让学生认识和理解整个程序开发过程,这样才不致使程序设计语言的教学脱离实际的应用。
必须注意到,高职高专的目标是培养应用型人才。学生在掌握一定理论知识的同时,更重要是实践。适量的实验实训环节必不可少,教师也应重视学生的实验实训课。以往有些教师因为总课时少,在不能增加总课时的情况下为了多讲理论便压缩实验实训课时的做法不可取。
三、教学策略的改革
作为程序设计基础课,让学生了解到什么是程序设计的基础是重要的。其实,具体的程序设计语言已经是实现程序的方式了,所以它才规则详尽、语法严谨、技巧多样。从这个角度也不难理解初学的学生为什么会感到困惑和吃力。
1、注重培养学生描述算法的能力
要用计算机解决实际问题,那么,在对问题进行分析后,就要针对问题设计解决该问题的算法。设计算法就是要把解决问题的步骤用清晰的语言表示出来。有多种方法可以描述算法,如自然语言、图像符号、伪代码等。用自然语言表示算法,人比较容易理解,但书写较烦琐,而且在某些场合,由于自然语言含义的不确切性,容易引起歧义,造成误解;对较复杂的问题,用自然语言又难以表达准确。因此,一般情况下较少采用自然语言这种方式表示算法。据笔者所知,部分院校的程序设计基础课在算法描述这个知识点的教学上以介绍流程图或结构图这类用图形符号的描述方法。笔者认为除此方法之外,也应注重对伪代码的讲授。伪代码介于自然语言与程序设计语言之间,代码简单、可读性好、并且类似自然语言,使用它可使被描述的算法较容易地以任何一种程序设计语言去实现。教师在教学过程中不一定限于具体的一种程序设计语言,训练学生用不同方法描述解决问题的算法,特别是伪代码,可以增强他们组织语言的能力,进而更好地理解程序的控制结构。
2、注重培养学生良好的程序设计风格
程序是最复杂的东西,良好的格式能使程序结构一目了然,便于编程人和其他人理解它,同时有助编程人的思维,帮助其发现程序中不正常的地方,使程序中的错误更容易被发现。因此从学生学习开始,教师就该讲授什么是良好的程序设计风格,并严格要求学生按分层缩进法书写和键入程序代码,尽量避免学生养成不良习惯后再去纠正,为时已晚。
3、注重培养学生分析问题的能力,从不同角度分析问题
多数教材在第一章就能见到程序代码,虽然在代码后会有注释,但学生在课程学习之前多数是从未接触过程序设计语言的,他们不懂语法语义规则,这个时候即使只是简单的格式输出程序代码,学生也是难于理解的;在学生学习一段时间有一定基础之后,他们又迫切需要阅读那些用于解决问题的可执行的程序代码。可见,机械地讲解教科书上的例题教学效果不好。对于一个问题,可以从提出问题的角度入手给出分析的步骤,如:什么是问题要输出的结果?什么是问题已经有的数据?用什么方法可以得到结果?或者从算法描述的角度给出同样的分析步骤;亦或从程序代码的角度,边讲解边让学生思考代码究竟是要解决一个什么问题。并且引导学生举一反三,逐渐使学生具备解决问题的能力。
四、结论
本文主要针对课时少知识点多这一矛盾对高职高专程序设计基础课教学内容和教学策略的改革进行了探讨。笔者也注意到:一个完整的课程内容通常有九大要素,即吸引注意、告知目标、追忆学前经验、呈现教材、提供指导、实际演练、提供反馈、评价成就及强化学习、保留与迁移。因此在教改过程中,除了教学内容和教学策略外,还有许多待研究的问题。
上述教学内容、教学手段的改革,已经在程序设计导论课程教学实践中运用。笔者将继续努力研究,使程序设计基础课程教学日趋完善。
参考文献:
[1](美)维尼特(Venit,S.),(美)德雷克(Drake,E.).《程序设计基础》(第三版)[M].北京:清华大学出版社,2008
[2]高林,周海燕.《程序设计方法与案例分析》[M].北京:人民邮电出版社,2005
[3]谭浩强.《C程序设计》(第三版)[M].北京:清华大学出版社,2005
[4]向华.《C语言程序设计》[M].北京:清华大学出版社,2008
关键词:软件工程;程序设计;课程群;建设;实践
软件工程专业的培养目标是面向我国软件产业培养急需的工程应用型人才。软件产业的发展要求学生具备较强的系统分析、设计、开发与维护能力[1]。为培养学生软件系统方面的相关能力,许多高校的软件工程专业都设置了系列课程模块,如程序设计课程模块、网络技术课程模块、计算机体系和操作系统课程模块、软件工程课程模块等,这些模块往往是一些单独课程的组合,有很多学生学了这门课程,又忘记了那门课程,到毕业时专业能力达不到社会所要求的层次。程序设计课程群是软件工程专业系列课程的重要组成部分,其承载的技能培养目标是专业培养的子目标[2],处于非常重要的地位。课程群建设是专业建设的一部分[3],有利于打通课程知识脉络,避免课程内容重复或前后脱节,使前后连贯,内容融合,进而获得整体优势[4]。程序设计课程群主要培养计算思维能力、算法设计与分析能力、程序设计与实现能力和系统分析开发能力[5]。学生通过程序设计课程群的学习,可掌握1~2门程序设计语言,更进一步理解程序设计方法,熟练掌握常用的数据结构和算法,形成良好的程序设计风格,可独立分析、设计和开发中小型软件系统。所以对程序设计课程群进行研究并积极实践对专业培养目标的实现具有重要现实意义。
1问题分析
目前,大多数高校信息类相关专业都开设了程序设计系列课程,一般为C语言程序设计、数据结构与算法、java程序设计等。许多高校都将C程序设计作为第一门程序设计课程[6],一般安排在第一学期或者第二学期,学完C语言之后,再学其他程序设计课程,如数据结构等。由于C语言本身比较灵活且语法内容比较多,对于初学者来说并不太好掌握。一些教师在授课过程中,没有站在软件设计的高度思考教学内容,往往过多地强调语言成分的语法和语义,而忽视了计算思维能力[7]的培养,使学生从开始就扎进程序设计语言的细枝末节中去,忽略了软件工程思想的渗透,到最后学生掌握了一些语法,却不能写出较为优美的程序或没有形成较好的程序设计思维和风格。算法是程序的灵魂,数据结构和算法在课程群中具有基础和核心地位[8]。在实际教学过程中,学生普遍反映数据结构和算法课程抽象难学,在学习和实际应用中出现的问题比较多,很难写出能正确运行的程序,学习过程中成就感不强,学完之后还是不知道如何应用,很难达到预期的效果。由于在前期的学习中,程序设计基础没有打牢,对常用的数据结构和算法没有真正掌握,模块化程序设计思维没有有效建立,良好的程序设计风格没有形成,导致后续的高级面向对象语言程序设计学习很难深入,最终导致软件分析与设计能力得不到有效的提升。
2程序设计课程群建设
我校软件工程专业采取校企合作办学模式,由吉首大学和中软国际共同建设,企业参与人才培养的全过程,在具体实施过程中,学校侧重于理论教学部分,企业侧重于实践教学部分[9]。程序设计课程群是软件工程专业课程体系的重要组成部分,企业参与讨论与建设,确定该课程群以软件设计能力培养为主线,以C语言程序设计、数据结构、面向对象技术、算法设计与分析几门课程为基础组建课程群,C语言程序设计开设在第一、二学期,数据结构、面向对象技术、算法设计与分析分别开设在第三、四、五学期,第六学期可开设JavaWeb程序设计或Web程序设计,使课程群在能力构建和开设形式方面形成一个不间断的体系。
3程序设计课程群实施
3.1精讲课程主要内容,提高程序设计能力
课程组教师首先需要站在软件分析与设计的角度研究各门课程在课程群中的地位和作用,把课程群中的系列课程作为一个有机的整体,研究各门课程的主要教学内容,针对课程重点、难点、疑惑点进行精讲,做到理论与实践课并重,有效提高学生程序设计水平。在课程群系列课程中,由于第一门课程是后续系列课程的基础,所以学生必须掌握它。在C语言的教学中,要渗透软件分析与设计的思想,把握程序的主要框架,不纠缠于一些细枝末节的语法。函数是C语言教学中的重点,需要重点突破,从模块设计的角度来考虑函数设计,对于一个具体的函数,则要掌握函数的返回类型、参数类型以及参数个数。如用函数处理一个数组时,需要传递数组的首地址和数组的规模,首地址用指针表示,数组的规模则有两种表示方法,一是数组的长度,二是数组的起始下标和结束下标,这两种方式可能会分别应用到不同的地方,如果教师一直不提示第二种方法,则将来学生在写数组做参数的递归程序时可能会遇到困难。从多年的教学实践来看,如果学生真正掌握了函数设计方法,再加上必要的算法知识,一般情况下,程序设计就会变得得心应手而且十分有趣;对于数据结构课程,采取以数据存储(内存)为主线的方法,将重点放在数据的存储和相关算法方面,在算法实现时渗透模块化的思想,需注意头文件和实现文件的定义,因为数据结构内容具有很强的连贯性且程序的初始化工作较多,如链表的具体应用则先要建立链表、树的遍历和节点的查找等则先要建立树、图的遍历和最短路径及关键路径等则先要建立图,在实验过程中有意识地把一些基础工作放入头文件,则会极大地提高实验的效率;在面向对象技术教学中,以面向对象程序设计的方法为核心,以语言中的面向对象机制为主要内容,在适当的时候引入《ThinkinginC++》、《EffectiveC++》、《ThinkinginJa-va》等优秀书籍中的一些思想和经验,要注重面向对象程序设计过程中大的程序框架的合理性以及具体处理算法的正确性;在讲授算法设计与分析的时候,应集中精力将主要算法讲透,直到学生学懂为止,在实现算法时,应充分运用面向对象设计的思想,将算法封装在类中;在web程序设计教学中,采用案例驱动的方式,精讲软件项目设计中的主要方法和主要问题,培养学生工程化设计思想。精讲的目的是让学生多练,精讲之后要布置任务并为学生提供练习环境和相关指导,必须充分发挥教师主导和学生主体作用,教师要认真检查学生的作业、实验和练习情况,及时纠正问题,引导学生运用软件工程的思想设计程序,培养学生良好的程序设计思维和程序设计风格,激发学生自觉学习和实现相关算法,最终提高程序设计能力。
3.2大规模开展程序设计训练,培养程序设计能力
为培养学生算法设计与分析能力,学院在晚上和周末开放了实验室,在实验室搭建了ACM在线测评系统(ACMOnlineJudgeSystem),并接入了校园网,结合C程序设计、数据结构与算法等课程部署了大量习题。学院利用课余时间,有计划组织学生进入实验室进行编程训练,并为每次训练配备了指导教师。平时,学生也可以在寝室登录平台进行训练。教师在讲授C程序设计等课程的时候,要求学生利用课余时间在ACM平台上完成至少上百道题的训练,并将完成情况计入课程的平时成绩。通过大规模开展在线程序设计训练,学生的程序设计能力有了明显的提高。
3.3开展课程设计训练,培养工程化设计思想
在课程群中除开设理论课程对应的实验项目之外,还针对整门课程开设了综合性课程设计项目,如C语言课程设计、面向对象技术课程设计、javaweb课程设计,单个课程设计周期为1-4周。学院课程设计项目主要由企业教师指导完成,该类项目采用分组形式,在组内模拟软件企业运行模式设置相关岗位角色,学生在仿真企业环境中,利用仿真的软件开发项目,进行轮岗和角色体验,培养学生的软件工程应用能力、软件项目开发与测试能力、职业素质等,从而使学生熟悉软件项目开发流程和规范,养成良好的软件开发习惯。课程设计结束时,要求学生演示并讲解自己的项目开发情况,由学院教师和企业教师组成评定小组进行评分。
3.4改革考核与评价方式,理论与实践、平时与期末相结合
理论与实践相结合。程序设计课程群内的课程都是实践性很强的课程,其目的是运用所学的知识解决实际问题,决定了课程的期末考核要综合考虑理论和实践两部分内容。理论部分主要考查学生对基本概念的理解和对基本知识的掌握情况,实践部分侧重考查学生的综合应用能力,这两部分成绩都在期末完成,占课程总成绩的60%左右。平时与期末相结合。期末考核重在体现学习的结果,平时成绩则侧重于体现学习过程,在课程总成绩中,平时成绩占40%左右,即一门课程约有40分来自平时的学习过程。平时成绩一般由出勤、作业和平时实验情况、课程设计情况组成。在学期开始第一堂课的时候将课程评分方式告知每一个学生,必须抓紧平时的学习,若平时分小于20分,则取消课程考试资格或直接将课程总成绩记为不及格。
4结语
程序设计课程群对培养学生计算思维能力、算法设计与分析能力、系统分析与设计能力具有重要作用。本文分析了学生在课程群学习中遇到的一些问题,从软件分析与设计的角度对课程群进行建设与改革,提出了以C语言程序设计、数据结构、面向对象技术、算法设计与分析等几门课程为基础组建程序设计课程群,给出了课程群的主要知识与能力体系要求,通过精讲课程主要内容、大规模有组织地开展程序设计训练、企业教师指导课程设计、改革考核与评价方式等方法进行教学改革,学生的程序设计能力得了到较大的提高。
参考文献
[1]韦迎春,文俊浩,陈蜀宇.以能力培养为核心构建示范性软件学院实践教学体系[J].中国高等教育,2011(2):49-50.
[2]乔付,王国权,张凤武.CDIO理念下计算机程序设计课程群建设探索[J].内蒙古师范大学学报,2011,24(11):39-41.
[3]孙雷,王新.计算机专业程序设计课程群的研究与实践[J].教育教学论坛,2013(11):222-224.
[4]翁伟,吴克寿,吴芸,等.程序设计课程群建设探索与实践[J].计算机教育,2009(23):123-125.
[5]王海舜,蒋巍巍.基于程序设计能力培养的软件设计类课程群架构[J].计算机教育,2012(2):23-26.
[6]万臣,谢芳,胡泉.计算机专业程序设计课程群的建设与研究[J].合肥工业大学学报:社会科学版,2009,23(1):33-36.
[7]汪红兵,姚琳,武航星,等.C语言程序设计课程中的计算思维探析[J].中国大学教学,2014(9):59-62.
[8]熊回香.数据结构课程与信息化人才培养的关系研究[J].高等理科教育,2008(5):43-46.
[9]周清平,王晓波,徐洪智,等.平台化思维模式助推高校软件工程专业综合改革[J].中国高等教育,2015(8):58-60.
关键词:分段式教学 程序设计 改革
分段式教学法指的是教师在上课前,提前将课堂上准备传播的知识内容分割成几个阶段或者几个小块,然后再计划好每个小块需要完成的任务,并且逐个或者统一部署,指导督促学生完成计划。
通过分段式教学方法开展实践教学,可以帮助学生更轻松地领会教学内容,进一步实现教学计划,有助于强化教学管理,使学生认识课堂教学的内容和意义,从而顺利达成教学目标。分段式教学法能够使学生循序渐进地接受教学内容,各个教学阶段逐步递进,连贯进行,避免教学内容脱节。这种教学方法能帮助学生及时温习巩固之前的课堂内容,并与新的教学内容之间做好前后衔接。部分学生具有很强的学习能力,也可以在教师的指导下自主安排课程进度,从而进一步拓展学习内容。
《程序设计基础》是一门专业基础课,它是人机之间进行信息交流的重要工具,也是后续专业课程的基础。对于一个刚接触计算机语言的学生来说,建立程序设计思想并不是一朝一夕的事情。有的学生虽然能够快速领会课堂教学内容,一旦进行上机操作或涉及到具体的操作编程时,就不会调试程序、无从下手,甚至毫无思路,这说明学生所能领会的编程知识内容仍停留在跟着教师的例题“画瓢”的阶段,情况一旦发生变化,就措手不及。长此以往,学生就容易产生畏难情绪,甚至开始厌倦程序设计课程,这往往会出现学生完成了教学内容的学习,但实践操作方面的知识几乎为零,他们没有足够的实践经验去解决实际问题,不利于学生学习兴趣的培养以及学生思维能力、创新能力、独立分析问题和解决问题的能力的提高。
在《程序设计基础》中采用分段式教学,既能使学生具备扎实的基础知识,又具备解决实际问题的能力,达到逐步培养学生良好的程序设计风格、程序设计思想、动手能力和创新能力的目的。
1 在采用分段式教学之前,教师应制定好详细的教学计划
1.1 选取适当的阶段性项目是关键
所选取的项目必须覆盖教学知识点且难度适合,必须充分考虑学生现有的知识经验和能力水平,以及学生通过努力是否有可能达到项目学习的目标,能解决项目中出现的各类问题。
1.2 按阶段性项目开发的难易程度和形式制定教学计划和教学进度
在制定课程教学进度的时候要结合项目来进行,教学计划和教学进度的设计应按软件设计过程的顺序来进行。
1.3 鼓励学生变换代码
很多时候学生只会照搬代码,并没有真正理解程序代码的含义,教师在分段式教学过程中,应针对本阶段的项目,设计具体的案例,鼓励学生使用其他代码来实现某些功能,促进学生对程序的理解,提高学生的创新能力。
1.4 完善评价系统
以项目学习的过程和项目完成的情况,来评价学生本阶段的学习效果。
2 《程序设计基础》中的“四段式”教学
根据循序渐进的原则,可以在教学中把程序设计分为基础入门、提高、高级和综合应用四个阶段,并采取相应的教学方法,逐项落实技能训练的阶段目标,取得了满意的教学效果。
2.1 基础入门阶段
本阶段以讲述基本知识为主,是所有的学生都应该掌握的,有利于学生落实基础知识,形成基本技能。对于初学者来说,本阶段的任务是掌握程序的基本构成,了解程序设计的基本步骤,讲述选择结构、循环结构的程序设计。讲授时选择的分阶项目要精挑细选,遵循从单分支到多分支,从易到难的原则。要引导学生分析问题的特点、发现解决方法的多样性,从而培养学生的发散思维及创新意识。
2.2 提高阶段
本阶段的任务是掌握数组和函数,并简化、重用了代码。这个阶段的教学侧重以学生为中心,在教师的指导下使学生逐步养成自主学习的习惯。在每堂课上,由教师先提出自学提纲,让学生按提纲的要求安排自学。为了拓宽学生的知识面,培养学生的创新意识,指导学生利用网络资源,在课余时间搜集与教学内容相关的信息。然后,在教师的指导下,让学生针对所学内容提出问题,在师生共同分析与讨论中使问题得以解答。最后,教师对本次授课内容进行精炼的总结。这一阶段的教学任务是初步培养学生的自主创新意识和创超性思维能力,使学生掌握自主学习方法。
2.3 高级阶段
本阶段的任务是掌握数据类型的自定义,结构体及指针变量的输入输出及其简单运算,在不考虑算法健壮性的前提下,能应用结构体指针进行链表的建立、访问等操作。
2.4 综合应用
学习完上述内容后,一般安排课程设计,通过综合性题目的练习,能有效地检验学生对所学知识的理解、掌握、熟练和应用,培养和孕育综合应用能力和创新能力;同时,适时、适当引入软件开发的思想。这一阶段,是检查学生充分所学知识的掌握情况的重要阶段,也是教师教学的关键环节,是学生落实课内知识的有效途径,对提高学生的成绩、能力、以及学习课程的积极性都有极大的帮助。
3 在分段式教学中应注意的问题
3.1 科学划分教学模块
将一门课程划分为多个模块,会破坏知识的完整性、连贯性,学生就很难从整体上把握知识结构。所以,模块的划分不能忽视知识结构的内在联系,应确保每个模块具有一定的独立性;教学模块的划分应该把程序设计的前瞻性、科学性、实用性体现出来,切忌冗余或重复;重点内容要重点讲解,淡化细节,有节奏的引导学生通读知识点,帮助其全面把握知识脉络,培养学生的自学能力。
3.2 引导学生转变学习模式
关键词: C语言;常见错误;程序调试;实例
中图分类号:TP312文献标识码:A文章编号:1009-3044(2009)35-9969-02
Analysis of Common Error Based on C Programming Language
GAO Ya-xia1, ZOU Hai-rong2
(1.Shaanxi Commercial School, Hanzhong 723000, China; 2.Shaanxi Institute Of Technology, Hanzhong 723000, China)
Abstract: In recent years, not only the computer professionals use C language, but also the majority of staff computer applications favorite and use. In the use of C language application development, due to C language has a flexible programming style, grammar constraints are less stringent and program design large degree of freedom and so on. This C language to a number of beginner and causing a number of difficulties, in order to be able to quickly identify and correct errors in the program; this paper, the C language program design issues common mistakes analysis and research. Gives some examples and reference solutions, in order to learn C language program designed users to provide with convenient.
Key words: C Language; common errors; debugging program; example
C语言是在国内外广泛流行、使用的一种计算机高级程序设计语言。它的主要特点是:概念简洁、数据类型丰富、表达能力强,运算符多且使用方便灵活。与其它程序设计语言相比较,具有灵活的编程风格,语法限制不太严格,程序设计自由度大(例如:一个语句可以采用多种方式,分多行撰写;对数组下标越界不做检查;整型、字符型和逻辑型的数据可以通用等)。这就给程序设计人员留下“灵活的余地”,但是由于这个灵活往往给程序调试,尤其对初学C语言的人来说,经常会出一些连自己都不知道错在哪里的实例。看着有错的程序,不知该如何进行修改。通过在C语言的教学与研究过程中,分析了一些关于C语言程序设计时容易犯的错误实例,提供给学习C语言的同学及相关人员参考。
1 C语言常见错误实例与分析
实例1.Printf语句中“控制字符串”部分分写在不同的行。
例如:main()
{ printf(“* * * * *”\n
Very good!\n
* * * * * \n);}
该程序的目的是为了显示这样的结果: * * * * *
Very good!
* * * * *
但程序运行后却出现错误信息:“Unterminated string or character constant in function main”,对上述错误,只要在程序第二行、第三行的最后分别加上“\” 即可得到正确的结果,也就是说printf语句中的“控制字符串”部分分写在不同的行时加“\”连接。
实例2. 忽略了“=”与“==”的区别。
在许多高级语言中,用“=”符号作为关系运算符“等于”。如在BASIC程序中可以写if (m=10) then …,但C语言中,“=”是赋值运算符,“==”是关系运算符。
例如:if (m==10) m=n;
前者是进行比较,m是否和10相等,后者表示如果m和10相等,把n值赋给m。由于习惯问题,初学者往往很容易犯这样的错误。
实例3.定义变量的位置不正确。
例如:#include
main()
{ char ch,filename[10];
scanf(“%s”,filename);
FILE *fp;
fp=fopen(filename,“w”);
ch=getchar();
while(ch!=‘#’)
{ fputc(ch,fp);putchar(ch);ch=getchar();}
fclose(fp);}
程序运行后出现错信息“Improper use of a typedef symbol in function main”,只要把第六行:FILE *fp;放到第四行前,程序通过。原因是:说明部分要放在其他语句之前。
实例4.将字符常量与字符串常量混淆。
char ch;
ch="M";
在这里就混淆了字符常量与字符串常量,字符常量是由一对单引号括起来的单个字符,而字符串常量是一对双引号括起来的字符序列。C规定以‘\0’作字符串结束标志,它是由系统自动加上的,所以字符串“M”实际上包含两个字符:‘M'和‘\0',而把它赋给一个字符变量是不正确的。
实例5.输入变量时忘记加地址运算符“&”。
int a,b;
scanf("%d%d",a,b);
这是不合法的。Scanf函数的作用是:按照a、b在内存的地址将a、b的值存进去。“&a”指a在内存中的地址。“&b”指b在内存中的地址。
实例6.输入数据的方式与要求不符。
1) scanf("%d%d",&x,&y);
输入时,不能用逗号作两个数据间的分隔符,如下面输入不合法:
1,5
输入数据时,在两个数据之间以一个或多个空格间隔,也可用回车键,跳格键tab。
2) scanf("%d,%d",&x,&y);
C规定:如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。下面输入是合法的:
1,5
此时不用逗号而用空格或其它字符是不对的。如下面输入不合法:
1 5 1:5
又如:scanf("a=%d,b=%d",&a,&b);输入应如以下形式:
a=1,b=5
实例7.输入字符的要求与格式不一致。
在用“%c”格式输入字符时,“转义字符”和“空格字符”都作为有效字符输入。
scanf("%c%c%c",&c1,&c2,&c3);
例如:输入O K !
则字符“O”送给c1,空格字符“ ”送给c2,字符“K”送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔。
实例8. 同时定义了形参与函数中的局部变量。
int max(x,y)
int x,y,z;
形参应该在函数体外定义,而局部变量应该在函数体内定义。应改为:
int max(x,y)
int x,y;
{int z;
z=x>y?x:y;
return(z);}
实例9. 误用变量定义数组。
int n;
scanf("%d",&n);
int a[n];
数组名后用方括号括起来的是常量表达式,可以包括常量和符号常量。即C不允许对数组的大小作动态定义。
实例10. 被调用的函数未在主函数中进行声明。
例如:main()
{ int a,b,*p1,*p2;
Scanf(“%d,%d”,&a,&b);
p1=&a;p2=&b;
if(a
printf(“5d,%d\n”,*p1,*p2); }
void swap(int *p1,int *p2)
{ int *p;
P=*p1;*p1=*p2;*p2=p; }
程序运行后出现错误信息:“Type mismatch in redeclaration of ‘swap’”,只要在程序的第二句int a,b;前加一句:void swap();程序运行通过。也就是说:被调用函数的定义出现在主调函数之后(除了函数的值是整型或字符型的),要在main()函数中对被调用函数进行说明,void型函数也不例外。
2 结论
通过上面这些实例的分析,可以看出,由于C语言的开放式编程风格,让C语言初学者,在进行C语言程序设计时往往会出现一些微妙的、不易觉察的错误。C语言作为一门完善的编程语言,具有它的科学性与严谨性。因此,只有在充分掌握和熟练运用C语言的基本概念、语法规范及结构的基础上,才能真正享受到C语言灵活自如的编程风格的魅力,这也是学习一切科学知识的基本方法。
参考文献:
[1] 谭浩强.C程序设计[M].北京:清华大学出版社,2008:37-242.
[2] 杨路明.C语言程序设计[M].北京:京邮电大学出版社,2006:20-150.
关键词:教育数学;计算机教育;教育计算机;程序设计
文章编号:1672-5913(2013)03-0042-04
中图分类号:G642
计算机教育和教育计算机是不同的概念。计算机教育是为了传授计算机知识而作教育,它不创造计算机知识,只改造教学法。而教育计算机是为教育而做计算机,它要对计算机知识进行再创造,使之更适合于计算机教育。
下面笔者用吃核桃的例子来阐述计算机教育和教育计算机之间的例子。有种核桃,核仁与外壳结合得很紧,成都人叫它们“加米子核桃”,若砸的方法不当,即使砸开了也很难吃到核仁。计算机教育研究的是一套砸核桃的方法,但它既改变不了“加米子核桃”存在的事实,更改变不了核桃的味道和营养成分;而教育计算机则研究如何改良核桃的品种,目的是让核桃容易被砸开、吃净,而且使桃仁更美味、更营养。
笔者只从编程教育层面上来谈计算机教育和教育计算机的关系,因为计算机文化是建立在程序基础上的,所以这种研究是有代表性的。
1 来自教育数学的启示
教育计算机和教育数学有类似之处,我们从后者可以得到一些启示。
以微积分为例。17世纪,由牛顿和莱布尼茨创建的微积分是第一代微积分,这是说不清楚原理的微积分。创建者说不清楚,使用微积分的数学家也说不清楚。微积分在说不清楚原理的情形下应用发展了130多年。
到19世纪,柯西对积累了两百年的微积分成果进行了再创造,写出了迈向严密的微积分王国的第一部教程——《分析教程》。这是一部教育数学的经典,形成了第二代微积分,但使用的极限ε-语言使概念和推理繁琐迂回,多数学生听不明白。第二代微积分在这种情况下发展了170多年。
直到今天,出现了正在创建的微积分——第三代微积分。人们希望微积分不但严谨,而且避开ε-语言关卡,直观易懂,简易明快,让更多非数学专业的学子听得明白。在我国,张景中和林群院士十几年来一直从事第三代微积分的创建工作,而且卓有成效。《直来直去微积分》一书是他们的代表作。
这三代微积分在具体计算方法上基本相同,不同的是对原理的说明:第一代微积分说不清楚;第二代微积分说清楚了,但是繁琐迂回;第三代微积分深入浅出。
再以几何为例。欧几里得的《几何原本》是第一个对数学知识进行再创造的教育数学范例。它影响数学家和科学家的思维方式长达两千年之久。直到今天,它仍然是中学数学教育的主要内容之一。但是,由于它没有借助代数和三角,孤立无支,使学生学得很难,教师教得很苦,
我们知道,几何与三角研究的都是图形。几何侧重定性研究,三角侧重定量研究。代数研究的是运算的规律和方法,它不仅是解决数学问题的基本工具,也是几何和三角的基本工具。几何、代数和三角应该相互支撑,携手共进。
然而,几何、代数和三角的知识是在不同历史时期和不同地域分别形成的,它们各有自己的体系、术语和记号。现在我们是根据它们在历史上形成的顺序分别讲授,而且基本上保持着它们各自的体系。张景中院士对此提出质疑:“学习数学的顺序必须和数学知识在历史上形成的先后一致吗?这些在不同年代、不同地方,由不同的人,为不同的目的创造出来,而且其中很多是为了应用而创造出来的知识,会自然而然地相互融合,相得益彰吗?当然不会。
几何在没有工具的情形下孤军奋战地作定性研究,不辛苦吗?三角建立了有力的定量工具但为时已晚,空怀绝技难以施展,不委屈吗?几何自顾自地推理,三角自顾自地计算,代数该用不用,不冷落吗?
为使几何、代数和三角携手共进,张景中院士重建三角,请三角早出茅庐,因为三角是解决几何问题的有力工具,是训练代数变换能力的天然平台,也是沟通初等数学和高等数学的一条通道。
微积分和几何,乃至整个数学,进入20世纪后迅速发展,其再创造工作越来越重要。以布尔巴基命名的一个数学家集体,已经出版了皇皇巨著《数学原理》的前40卷。他们的目标是对数学从头探讨,并给予完全证明。布尔巴基把数学归结为“研究抽象结构的理论”。他们认为,集合论是数学大厦的地基,大厦的骨架由三种母结构组成:序结构、代数结构和拓扑结构。比如,实数有大小,这是序结构;有四则运算,这是代数结构;有连续性,这是拓扑结构。母结构加进新的公理,产生子结构。不同的结构结合起来,产生复合结构。布尔巴基认为,研究今天已有的和未来可能产生的种种结构,就是纯数学的特征。有了结构观点,数学的核心部分就显得条理化、系统化了。
教育数学给我们的启示有两点:①逻辑在发展;②综合促创新。
2 第一代教育计算机
第一代教育计算机始于20世纪60年代末和70年代初。为此作出贡献的人很多,其中的3个人我们比较熟悉。
一是单源最短路径算法的发明者E·W·迪克斯特拉(Dijkstra),他最先察觉goto语句的有害性,首创结构化程序设计。他在《结构程序设计札记》一文中提出了把程序的可靠性建立在程序的“有效结构”基础之上的观点,揭开了程序设计革命的新篇章。
二是快速排序法和CASE语句的发明者霍尔,他的《计算机程序设计公理化基础》一文使得对程序设计的分析可以在数学推理的基础上进行。
三是N·沃思(Nicklaus Wirth),他在《算法+数据结构=程序》一书中,第一次揭示了程序的本质。“算法+数据结构=程序”这个公式对计算机科学的影响程度类似爱因斯坦的质能等价理论方程式“E=mc2”对物理学的影响。
第一代教育计算机确立的原则和方法对计算机教育产生了深远的影响,意义至今尚存。但是有些原则和方法在计算机教育中被打了折扣。N·沃思的思想是:“程序设计这一领域极为纷繁多变,常常包含复杂的脑力劳动。因此,以为能够把它压缩成一种纯粹‘开药方’式的训练是错误的。我们所能采用的教学方法只能是仔细地选择和描述标准的例子。N·沃思所说的标准例子都是依赖数据结构的算法。但是学习数据结构有两个难点:算法的性能分析和算法的实现。
算法的性能分析是以极限概念为基础的,非数学专业的学生很少能够掌握极限概念,因此在数据结构教学中进行算法的性能分析是让教师很为难、让学生很困惑的事情。
N·沃思非常强调算法实现的原则,他指出:“把程序表达为充分考虑细节的最终形式是很重要的,因为程序设计的错误正是隐藏在细节中。尽管对于学者来说,纯粹描述算法原则及其数学分析可能具有刺激性和挑战性,但对于实际工程人员来说,似乎是不切实际的。因此,我严格遵循这一原则:将程序的最终形式以某一语言表述出来,以便确实能在计算机上执行。但是那时候的程序语言还只是过程式语言,用这种语言描述数据结构需要很高的水平,实现一些比较大的数据结构算法是单个人难以做到的。
结果是,非计算机专业很少讲授数据结构,计算机专业讲授的数据结构让许多学生感觉抽象难懂。
3 正在形成的教育计算机
现在,学习数据结构的两个困难有了解决办法。第三代直观易懂的微积分便于更多的人掌握,进而使数据结构中的算法性能分析更普及。C++的出现使数据结构的实现变得简单。如本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)所说:“C++的设计就是为了使较大的程序能够以一种合理的方式构造出来,并因此使单独一个人也可能对付相当大的一批代码。”特别是,C++最重要的发展就是STL——容器和算法的标准库。它不仅使数据结构和C++语言得到近乎完美的统一,而且促进了程序设计的发展。
但是新问题又出现了:程序语言多了,不知学习哪一种好;程序设计方法多了,不知道什么才是程序设计。
今天,流行的程序语言已经有C、C++、C#、Java、Visual Basic、Delphi等。这使很多人困惑,不知道学习哪一种语言才好。有没有最好的语言呢?对此,Alan Perlis的回答是:“如果某人说,‘我想要这样一种程序设计语言,我只需说出我希望做什么,它就能帮我完成’,那么就给他一个棒棒糖吧。”可见,要求一个万能的程序设计语言是很天真的。
其实,几乎每一种语言都是为特定的商业目的而设计,并不是为教育而设计。COBOL是为商业应用而设计;FORTRAN是为数学运算而设计;Basic是为了易学易用而设计;Ada是为美国国防部开发的,主要用于国防项目;Visual Basic和Delphi用于开发图形用户界面,可以进行快速应用开发。
现在很多人选择C、C++或Java,主要还是因为它们具有更大的商业用途。C语言不仅具有汇编语言的强大功能,而且如高级语言一样易学和易移植;C++适合开发系统软件,如编写编译程序和操作系统,Microsoft公司的Windows操作系统就是用C++编写的;Java用于开发Internet应用程序。
今天,程序设计除了以前的过程式设计,还有了数据抽象、面向对象设计、泛型设计等。那么什么才是程序设计呢?对此,Bjarne Stroustrup的回答是:“通常人们一提到程序设计风格,都是将它们看作是毫无关联的:你要么使用泛型程序设计,要么使用面向对象程序设计。但如果你的目标是尽可能好地表达解决方案,就需要组合多种风格了。这里的‘好’是指代码易读、易编写、易维护以及足够高效。”这种组合多种风格的程序设计是多范型程序设计。
面对新的问题,新的教育计算机正在形成,它要把用于商业目的的核心程序语言和程序设计方法再创造,使它们连贯起来,服务于计算机教育。
关于程序语言,Bjarne Stroustrup指出“在你已经掌握了C和C++的公共子集和某些C++直接支持的高级技术之后,你会更容易去学习C中那些更诡秘的部分”,实际上,这是“人体解剖法”的秘密:事物的本质只有在一个事物发展过程结束时才能最清晰地显露出来,借此我们可以对整个历史重新作出合乎逻辑的描述,展示出历史的内在规律性。Bruce Ecke1便利用这个方法,在《C++编程思想》一书中建立起一个从C结构到C++类的平滑过渡模型:先实现一个袖珍的C库,然后再将它转换为C++代码,通过比较分析而进入C++。这样一来,从C到C++的一条脉络就疏通了。Aninash C·Kak也是利用这个方法,在《面向对象编程C++和Java比较教程》一书中,给我们指出了一条从C++到Java的道路。
用李未院士的三个语言环境理论,可以对从C到C++再到Java的线索作出严谨的形式描述。“一般说来,一个语言在它作为对象语言时,它的符号和语法对象所取得的准确性和已被人们证明的结论,在它作为元语言时,就可以用来解释和说明相应对象语言的符号和语法对象,并用来证明该对象语言中不同语法对象之间的关系。这是人类从事科学研究的基本方法。”例如,C、C++和Java是程序语言发展中的版本序列。如果把C++视为对象语言,那么从C++程序集合到C程序集合的一个解释映射(记做IC++)和C程序集合就构成C++的一个模型,而C语言就构成了C++语言和它的模型的元语言;如果把Java视为对象语言,那么从Java程序集合到C++程序集合的一个解释映射(记做IJ)和C++程序集合就构成Java的一个模型,而C++语言就构成了Java语言和它的模型的元语言。
从C到C++再到Java,这是新一代教育计算机给予计算机教育的一个方向性选择。
关于程序设计,Stanley B·Lippman从发展的角度给予了定义:“纵观短暂的计算机发展史,算法和数据这两个主要方面一直保持不变。发展演化的只是它们之间的关系,就是所谓的程序设计。”这种观点启发我们对过程式设计、数据抽象、面向对象设计和泛型设计,不要仅仅把它们毫无关联地排列起来,平等地看待,而是要由此及彼地把它们推出来,使它们互相隶属,从低级形式发展出高级形式。把C和Java连接起来的C++,这个在计算机软件领域中覆盖面最为广阔的编程语言,不仅支持多种不同的程序设计风格,而且它记录着程序设计从低级形式到高级形式的发展。用Stroustrup的话讲:“它的特点是可以看作是更好的C;支持数据抽象;支持面向对象程序设计;支持泛型程序设计。”因为兼容了C,所以C++自然也支持过程式设计。
从过程式设计到数据抽象,从面向对象设计到泛型设计,这是新一代教育计算机为计算机教育指出的又一个方向性选择。而且这个过程,因为C++的特性,所以又和从C到C++再到Java的过程相互融合为一个过程。
这个过程不是从概念出发,而是从实际出发,如Stroustrup在总结C++的一些设计原则时所说:“C++的每一步演化和发展都是由于实际问题所引起的。”“C++支持一种逐步推进的学习方式。你学习一个新语言的方式依赖于你已经知道些什么,还依赖于你的学习目的。”所谓逐步推进,就是从C到C++再到Java,而目的就是认识发展规律。
正在形成的教育计算机将使计算机教育沿着严谨、流畅、丰富和启迪的方向发展。所谓严谨就是讲逻辑,而逻辑是随着事物发展而发展的,一个事物发展了,我们才可以观察它的变化,研究和发现事物的本质。所谓流畅就是不重复,把C、C++和Java贯串起来学习,就去除了不必要的重复。所谓丰富就是包含更多的典型程序设计实例,数据结构包含着丰富的典型程序设计实例,C++不仅是我们描述数据结构的有力工具,而且它的标准模板库(STL)把数据结构近乎完美的统一到C++语言中。所谓启迪就是引导人们注重规律,从事物的发展和变化中来观察事物。
4 结语
关键词:Web程序设计;项目导向;教学改革
1 引言
Web程序设计是软件工程专业的重要先导课,为JavaEE等课程奠定基础。Web程序设计课程的知识点涉及多个分支,涵盖了HTML基础、Javascript、CSS、XML等内容。现有的教材依然沿用了知识点为中心的模式,根据一个个相对孤立的知识点设计例题和练习题,这种设计方式降低了学习难度,但导致学生对知识点之间的联系重视不够,学生在学习完课程后虽然掌握了各个知识点的作用,但却不能做到融汇贯通,不能将所学各个知识点有效组织以便与应用场景的需求对接。要改变这种局面,就必须从课程设计和教学方法入手,以实际的项目为抓手,将知识点分解到项目中,以应用场景导向教学实践过程,从而改变目前的学难致用的窘境。
2 案例的设计是教学成功的关键
项目导向的教学模式要求实现角色的转变、充分认识师生合作的重要性。这是因为“授人以鱼,不如授人以渔”。在知识不断快速更新的今天,知识本身的获得已经不是最重要的了,重要的是如何获得知识。教师需要遴选难度适中、有实际应用场景的项目,并将其分解后投影到课程的主要知识点中;教师需要参与软件项目开发的全过程,帮助学生理清项目需求内涵和设计思路,并整合各个知识点中的实验内容,形成项目框架;提前预见并适时澄清可能遇到的问题、及时向学生推荐相关的书刊、网址和论坛等并讨论可能的解决思路,避免学生遇到困难后放弃任务。因此,这一新的教学模式实际上加大了教师的工作量,对教师自身的软件工程实践能力的要求也大大提高了。参与教师需要在学生学习及项目开发的过程中当好指导者、激励者和引路人的角色。
3 项目导向的Web程序设计教学实践
Web程序设计是一门实践性很强的专业课程,涉及软件工程、网络工程和计算机科学与技术多个专业。课程内容近年来不断调整优化,不仅讲授Web程序设计语言基础,也涉及最新技术的发展,比如HTML5和CSS3。通过多轮的课程实践和不断的探索,我们从以下几个方面尝试实施了项目导向的Web程序设计教学改革。
3.1 丰富教学资源库
除了将教学大纲、实验大纲、项目介绍等加入课程网站之外,我们还为同学们提供各种学习资源,包括各种电子参考书、项目背景文档、问答记录(FAQ)等,并推荐各个技术领域最为相关的技术论坛,丰富学生的视野,扩大交流的途径。
3.2 迭代演进项目开发
我们引入敏捷开发的思想,让学生在实验中以最小功能集为起点,不断演进项目的开发,逐步丰富项目的实现。避免自顶向下的设计方法导致学生产生畏难情绪,影响实践的效果。教师将知识点蕴含到项目中,使得学生清楚各种技术要素的使用场景和最佳实践。因此,教学过程是以项目为模块进行,而不是原有的章节组织。这样,所有的知识点都有其应用背景和具体目标,那么学生学习的目的就很明确,知识点的应用场景就能得到实际的操练。
Web程序设计实验课程不是单独设课,因此,实验的操作上也需要我们根据教学进度将实验内容再分解到各个知识点的实验中,这样既解决了项目集中开发时间不足的问题,又有利于培养学生的大局观,能使其从整体上把握系统的构建和设计,提高其工程性意识及工程性设计能力。随着实验课程的不断进行,学生实验内容也不断整合,从而构建项目的多个版本,并持续融合新的实验点,丰富项目的功能。
下面给出一个项目设计实例。
项目名称:通讯录
项目需求描述:设计一个学校内部使用的通信录,以便各个二级单位方便管理教师和学生的联系方式。要求实现如下功能:
实现人员登录页面的设计,要求学生、教师风格不同。
页面风格定义在各自的CSS文件中。
学生信息登记页面有院系和班级的下拉选择框,个人资料包括学号、姓名、通信方式(电话,邮件)等基本内容,但必须验证各个字段的格式合法性。
教师端要求传输照片,填写科研方向以及个人联系方式。同样各个字段也必须验证。
表1给出了项目通讯录的知识点分解,以便更清楚的理解项目中各个部分的协同工作过程。
表1 知识点项目分解表
3.3 以小组为单位进行项目开发和评价
在经历多个小项目的锻炼后,需要在学期后半段安排较为综合的项目,作为考核的重要指标。在考核项目题目确定后,根据学生能力、意愿进行分组,每2-4人。然后以小组分工协作的方式由组长协调方案(比如设计风格、版本控制等)并控制项目推进进度和完成质量。
当任务基本完成时,就进入结题评价阶段。指导教师对每个开发小组的项目进行评价,原则是:肯定和鼓励为主,重过程轻结果。答辩和展示是重要环节,通过答辩,一方面展示项目成果形成竞争氛围,另一方面也扩大了大家的知识面,增加了解决问题的经验,使同学们在交流中提高自己的能力。交流时软件开发人员的重要素质,也是项目成功的重要保障。
4 结束语
项目导向的教学方法秉承“始于实践而终于实践”的原则,以项目作为开展教学活动的核心。即通过选择具有实际应用场景的项目,以项目的视角而非知识点的视角开展课堂教学和实践教学活动。通过引入项目,增加学生学习的主动性和学习热情,也增加了教师与学生沟通的机会,学生的积极参与和体现出的潜力也极大推动了我们的教学热情,增强了教师的改革意识和教学的创造性。
参考文献:
[1] 屈波,程哲,马忠. 基于自主性学习和研究性教学的本科教学模式的研究与实践[J].中国高教研究,2011,04:89-91.
[2] 王勇杰.“Web程序设计”课程的任务驱动教学研究[J].教育教学,2011(4):205-206.
Practice of Project-Driven Research Teaching for Web Programming Course
SUN Li, ZHANG Lifeng, YUE Jun
(School of Information & Electrical Engineering, Ludong University, yantai 264025 Shandong)
Abstract: With the goal of solving the weak practice capabilities in programming teaching, a new teaching paradigm based on project-induction in Web programming course is proposed. The practice procedure and evaluation metrics are illustrated in depth and the practice and innovation ability of students are improved significantly.
Key words: Web programming; Project-driven; Teaching Reform
作者简介:
关键词:C++高级编程;实践教学;案例教学;综合性实验
“C++高级编程”是一门对学生理论基础及实践能力要求较高的课程。C++高级编程是基于C++静态数据类型检查的、支持多重编程范式的通用程序设计语言基础上的高级编程。它支持过程化程序设计、数据抽象、面向对象程序设计、制作图标、泛型程序设计等多种设计风格,对学生理论水平及动手能力综合素质要求较高。
在教学工作中,我们坚持理论联系实践,帮助学生建立科学、有效的编程思想。并结合教学工作进行开发应用,提高了学生编写程序的动手能力,取得了较好的教学成果。
1教学中存在的主要问题
通过对我院计算机专业“C++高级编程”课程教学现状分析,发现主要存在以下问题:
(1) 重“理论教学”轻“实践教学”。我校计算机专业该课程教学总课时为70学时,要求学生在较短的学习时间内既要掌握理论知识,同时又具备较强的动手实践能力。因此,教师在授课过程中,要么过分强调理论教学,要么过分侧重于流行数据库开发工具的教学,致使理论教学与应用实践比例失衡,使学生存在理论高分实践低能现象。
(2) 教学方法和手段缺乏多样性。目前,多媒体教学日趋流行,我校教师在“C++高级编程”理论授课中大多采用CAI课件进行教学。此教学方法虽然减轻了教师的板书负担,增加了信息量。但学生反映在学习过程中,教学内容重视语法细节而轻视实践环节,理论结合实际解决问题的能力较低,始终处于被动学习状态。
(3) 实验内容过于简单,覆盖理论知识范围有限。在实验课教学过程中,每章节课后题可供学生选择范围较小,各章节实验内容联系不紧密,存在脱节现象。学生无法将所学知识应用到项目的分析、设计、实施、验收各环节中去。既不利于学生理论联系实际,也不利于学生适应工作后的企业项目开发环境。
(4)“教”与“学”考核方法过于单一。我校在“教”与“学”考核方式上以传统的理论笔试为主。该考核方式在“教与学”环节上存在重理论学习轻实践应用,使得绝大多数学生学习目的就是为了顺利通过考试,而忽略了实践能力的培养,致使“高分低能”现象的出现。
2教改思路
“C++高级编程”包括理论讲授、实验和课程设计三个环节,只有各环节紧密衔接、密切配合,才能保证该课程的教学效果。
2.1理论联系实际,采用案例教学法吸引学生兴趣
“C++高级编程”课程涉及知识面较广,理论性和实践性要求较强。在教学过程中,我通过设置具体案例,将学生学习内容溶入到分析、讨论、表达等教学过程中,让学生在具体的问题环境中积极思考、主动探索,培养学生认识问题、分析问题和解决问题的能力。
(1) 以典型案例为例证,引入核心知识。结合教学过程中每个关键知识点设置一些典型程序,以典型程序为例,详细讲解相关的知识点。在此过程中,以教师讲授为主,学生通过对典型程序代码的研讨学习,加深对知识的理解和掌握[1]。
例如,在讲解“网络程序设计”这一章时,首先向学生展示目前网络中最常见的即时聊天软件,如腾讯QQ;其次演示具体的程序实例,并讲解文字、语音或视频聊天程序的核心代码,遇到核心知识点时,再深入讲解相关的理论知识。
采用这种方法授课,可将复杂的问题简单化、枯燥的知识趣味化、抽象的道理具体化,可以使学生产生浓厚的兴趣,极大调动了学生研究学习代码的积极性。
(2) 围绕实际案例,展开讨论。当课程进行到中期时,学生已具备了一定的编程经验,这时可以借助一个实际案例,组织学生开展辩论和研讨。教师提出该案例,但不对案例作具体的解释说明,让学生在课堂上各自阐述自己的观点、论据,并相互提问和回答[2]。
例如,在“数据库程序设计”一章的学习中,总结该章节的内容后,就可以用一个学生做过的数据库程序为实际案例,让学生们讨论该程序有何优点、不足及如何改进。这种方法不仅可以锻炼学生独立发现问题、思考问题的能力,还有利于培养学生敏锐的应变能力、思维能力和语言表达能力。
2.2加强实验教学,锻炼学生动手能力
“C++高级编程”课程的实验教学是整个教学过程中一个非常重要的环节。上机实践不仅能提高学生灵活运用理论知识的能力,而且使学生在编程、上机操作、程序调试等方面受到严格的训练,有效地提高学生程序设计能力。
在开始学习“C++高级编程”课程之前,学生通过“C++程序设计”和“面向对象编程方法”的学习,已具备一定的编程基础。很多学生对程序设计的认识还只是停留在借助程序熟悉语法的程度上,对如何使程序高效、稳定、可移植性强等方面没有很理性的认识。如何培养学生养成良好的编程习惯,真正从专业角度进行软件设计,是“C++高级编程”实验教学需要认真思索和努力解决的问题。
首先,向学生介绍自己多年来的编程经验体会,推荐一些好的书籍和文献资料供学生使用。其次,让学生大量阅读和仿写优秀的程序,通过学习和借鉴快速掌握这些优秀程序员的经验和方法,少走弯路,养成良好的编程习惯。第三步,也是最关键的一步。在实验过程中,始终严格检查学生设计的程序,及时指出其在编程习惯上的错误。很多学生认为只要编写的代码能调试运行出结果就万事大吉,这是错误的思想。作为教师要具有极大的耐心和持之以恒的耐力,及时指出并纠正学生编程中出现的问题,使学生养成良好、高效的编程习惯。
另外,为取得实验教学的最佳效果,在实验项目的设计上采取由浅入深,逐渐增加难度的办法,引导学生逐步提升编程能力。开始时,多设计一些验证性强的实验,让学生结合事例步骤仿写程序。在中后期设计一些具有较强综合性的实验项目,锻炼学生综合运用知识的能力。教师开始时要详细讲解,分阶段布置一些难度较大的作业由学生独立完成,培养学生动手能力。
2.3通过综合性实验,培养学生独立研究的能力
课程设计环节安排在整个教学过程的后期,目的是着重提高学生软件分析、设计和开发的综合能力,是培养学生综合运用知识独立研究的关键环节。
所谓综合性实验是指实验内容涉及本课程的综合知识或相关课程知识的实验。开设综合性实验的目的在于培养学生的综合分析能力、实验动手能力、数据处理能力及查阅中外文资料的能力[3]。为此,我布置了4个综合性设计实验项目。
(1) 多媒体软件设计项目:设计开发一个多媒体播放器,能够播放某种格式的音频文件、视频文件或动画。要求该软件具有选择播放文件,播放、暂停、继续播放、停止、音量控制等基本功能。
(2) 图形图像软件设计项目:设计开发一个图形图像软件,要求该软件能够画出点、直线、圆等基本图形,具有设定颜色、大小、位置等基本功能。
(3) 数据库系统程序设计项目:设计开发一个后台数据库与一个前台信息管理系统,可以对数据库中的记录进行管理。要求该软件具有浏览、修改、增加、删除和查询等基本功能。
(4) 网络程序设计项目:设计开发一个客户机/服务器模式的网络软件,要求能够根据选择建立客户机端程序或服务器端程序,客户机端和服务器端之间能够相互交换数据。
实验中教师采取个别讲解、个别辅导、就普遍存在的问题演示相结合方法进行讲授,有针对性地发现和解决每个学生存在的问题。在课程设计过程中始终坚持以下要求:①按照软件工程思想使用面向对象技术进行程序设计。②注意养成良好的编程习惯和程序设计风格。③不断提高程序调试技能。
要求学生提交的课程设计报告包含的内容有:设计项目涉及的核心知识介绍、设计开发的步骤、程序功能介绍、核心源代码、设计总结。
经过4周共20学时的实践课程学习,学生按时提交了设计结果。其中40%的学生选择了多媒体软件设计项目,45%的学生选择了数据库系统程序设计项目,10%的学生选择了网络程序设计项目,5%的学生选择了图形图像软件设计项目。从设计过程、设计结果和课程设计报告综合分析来看,10%的学生非常优秀地完成了设计,30%的学生完成得较好,50%的学生基本达到了设计目标,而有10%的学生未完成或部分完成了设计。学生普遍反映通过实践学习开阔了视野,提高了编程综合能力,增长了信心,达到了预期的课程设计实践目标。
3结语
2008年5月教育部对我校的本科教学评估中,“C++高级编程课程设计”作为综合性、设计性实验项目获得专家的好评,该科目评审结果为优秀,教学经验在全校教师中进行了推广。
“C++高级编程”这门课程在教材、教学内容、教学方法的选择及实验内容的设计等方面都对任课教师提出了新要求。坚信通过不断实践改革“C++高级编程”教学内容,改进教学方法,我们会培养出更多具有创新型、研究型、综合素质高的人才。
参考文献:
[1] 黄英琼. 谈“计算机图像处理”课程实例教学法[J]. 计算机教育,2007(3):24-26.
[2] 马晓敏,姜远明,胡光. 试论计算机案例教学的新思路[J]. 教学与管理,2007(4):133-134.
[3] 江静.“数据结构”课程综合性实验的实践[J]. 实验科学与技术,2006(6):64-66.
Exploration and Practice on the Teaching Method in C++ Advanced Programming
MA Xiao-ting
(School of Information Engineering, Lanzhou University of Finance and Economics Lanzhou 730020, China)
Abstract: C++ Advanced Programming desires advanced learners that have firm theory base and strong ability in practice, so it is asked highly for students. Which methods are more effective and how to enhance the theory and practice ability of students, it’s one of emphases of the teaching of our school in C++ Advanced Programming. This paper introduce mostly the teaching methodspreap and experience of author in theory teaching and practice teaching.