时间:2023-06-01 09:09:37
开篇:写作不仅是一种记录,更是一种创造,它让我们能够捕捉那些稍纵即逝的灵感,将它们永久地定格在纸上。下面是小编精心整理的12篇结构化程序设计,希望这些内容能成为您创作过程中的良师益友,陪伴您不断探索和进步。
关键词:实例拓展;结构化;程序设计教学;教学应用
中图分类号:TP311.1
在计算机专业的教学中,程序设计是一门最基础,也是最重要的课程之一,是培养学生计算编程能力的主要课程[1]。但是又因为这门课程涉及到很多理论性极强的内容和大量的编码知识,不容易被学生理解,所以是计算机专业教学的重点和难点。在过去传统的教学方式之下,老师只是按照大纲的顺序来讲解相关的知识点,即使举例也只是引用一些比较典型的例题,例题和例题之间缺乏联系,使得学生只能进行生硬的记忆法来掌握程序设计各种语句,不能真正理解这些编程方法,达不到自主编程的教学目的,收效甚微。为了改变这一现状,让学生能够真正理解程序结构之间的关系,能够灵活运用各种编程方法进行自主编程,在教学的过程中怎样选择具合适的实例已经成为提高教学效果的关键。我校推行的实例拓展教学法很好地解决了这一难题,在我校大力推行之后,受到广大师生的好评,结构化程序设计的教学效果明显。
1 实例拓展法概述
实例拓展教学法属于教学方式创新的表现形式之一。在这种教学方法中,实例就是整个教学的中心,所有的教学活动都可以通过实例来完成,这也是这种教学方法最典型的特征[2]。运用实例拓展法进行教学,学王可以充分利用各种学习资源,通过自主探索或者相互合作的方式来完成实例任务,同时又会催生出一种新的实例。这种重在学生实践活动的教学方式就被称之为拓展实例法。这种教学方法有助于培养学生的自主学习能力,提高他们独立分析问题和解决问题的能力。在计算机结构化程序设计这种实践性较强的课程教学中,尤其适合使用这种方法。
2 实例拓展法在结构化程序设计教学中的实际应用
在计算机程序设计中,VB语言是一门重要的课程,所以我们就以这门课程为例,对实例拓展教学方法在课堂上的具体应用进行具体。为了便于学生理解和练习,我们将实例分成了两种,一种在老师进行课堂理论教学时应用,另一种则在上机实践活动中应用,下面我们对实例的应用进行出详细介绍。
老师在进行教学设计时,如何安排实例是教学活动的核心所在。在对教学实例进行安排时,老师一定要结合中专学生的年龄特点、心理发展水平和实际生活的需要等因素。同时,实例的拓展应该遵循教育学的客观规律,从易到难,由浅入深,便于学生进行理解[3]。另外,实例的难度应该适中,既不能让他们一看就明白,也不能让他们冥思苦想而不得,要让大部分学生通过自己的思考能够完成,而且要将相关的知识点囊括其中,这样才能充分实例拓展的作用。
在VB结构化程序设计的教学中,课堂内容可以被大致分成顺序结构、选择结构、循环结构、数组应用和过程设计等五个部分[4]。老师在进行教学的过程中一定要全面掌握这些内容之间的内在关系。在本文中,我们将省略比较复杂的程序代码,对这5部分内容运用到的实例进行简单分析。
在进行顺序结构这一内容的教学时,我们可以以计算圆的面积为例,在输入圆的半径之后就可以计算出来。这一实例可以作为入门介绍,理解起来并不困难。在这个实例中,融入了程序的三大基本组成部分,即数据输入、处理和输出,在讲解实例的过程中,就能让学生掌握这一知识点。
在结构程序的教学中,可以在对上述实例进行拓展,提出问题:“假设圆的半径的小于0时该怎们办?”让学生进行思考,然后提出程序设计中的基本语句――选择结构的if语句。为了让学生理解if语句的语法,老师可以让学生在键盘上随意输入三个数字,求解最大值和最小值,在这个过程中介绍if语句的两种格式,即单行格式和多行格式。到这里,我们就在前两个实例的基础上衍生出了新的实例。在了解if语句的格式之后,老师还可以对实例进行进一步拓展,让学生求解分段函数,明确if语句和Select Case这两种多支结构的语句格式。
在循环结构的教学中,我们可以引入一个新的实例来介绍循环结构For Next语句,例如在窗体上显示出1、3、5、7、9这五个奇数。然后让学生对求解上述数字之和,对上述实例进行拓展。进一步掌握For Next语句。在求和的基础上,再一次对实例进行拓展,让学生在100以内,求出1+3+5+7+……的最大奇数值,在讲解实例的过程中引入循环结构中一种重要的语句形式――Do Loop语句。
在讲解数组应用这一内容时,可以在任意输入3个数字求解最大值和最小值这一实例的基础上加以拓展,让学生思考怎样求出任意10个数字的最大值和最小值,通过这个实例引入数组概念和静态数组的使用方法。在这一实例的基础上还能进一步拓展,求出任意数字的最大值和最小,引入动态数组的概念的和具体的使用方法。
在进行过程设计这一内容的教学时,依然在任意求解3个数字的最大值和最小值这一实例的基础上加以拓展,将它们分成两个函数,在讲解的过程中让学生掌握过程的概念以及Function过程的建立和使用方法。在此基础上,对实例进一步拓展,将3个数字的最大值和最小值看成两个Sub过程,让学生通过老师对实例的讲解掌握Sub过程的建立和使用方法[5],并与Function过程进行对比。
以上的实例主要是在引入相关概念和讲解程序基本原理时使用的,需要在多个课时中讲解。根据所讲内容的课时安排,可适当补充其他实例,更加详细地讲解相关知识,也可以补充一些比较有趣实用的综合例子,如制作计算器、打印九九乘法表等,进一步开阔学生的眼界。
经过多年的教学实践,笔者发现在运用实力拓展法之后,学生对程序设计的学习兴趣大增,不管是课堂表现还是作业完成情况都有了明显改善,考试成绩也得到了大幅度提升。通过这种教学方法,学生能够从中学到自己需要的知识,并真正将其转化为实际应用,设计出实用的小软件来,对于他们将来学习其他知识和提高计算机操作水平都有很大的促进作用。
3 结束语
综上所述,在结构化程序设计的教学中,实力拓展法对于提高教学效果,培养学生的计算机运用能力具有非常重要的作用。但是在具体的教学过程中还要从学生的实际情况出发,进行灵活地调整,才能真正激发出学生的兴趣,充分发挥实例拓展法的作用。
参考文献:
[1]武相军,白晨希.实例拓展法在结构化程序设计教学中的应用[J].计算机教育,2013(17):47-49.
[2]傅篱.计算机结构化程序设计教学探索与实践[J].计算机教育,2009(12):78-80.
[3]孙英,徐顺琼,李兴美.C语言中循环结构程序课的教学设计与探讨[J].计算机教育,2009(07):186-187.
[4]周显春.合作探究式教学法在结构化程序设计教学中的运用[J].学习月刊,2010(30):91-92.
摘要:本文结合学生的学习心理和认知规律,分析了C语言教学问题的主客观原因,提出了“先过程,后对象”的教学理念,从教材建设、教学内容安排上阐述了教学内容的具体组织实施过程,从教学思路、教学观念、教学手段几方面探讨了教学方法的改革。
关键词:C语言;教学方案;教学组织;教学改革
中图分类号:G642
文献标识码:B
C语言程序设计是一门难学、难懂、难以应用的课程,对学生越来越缺乏吸引力。传统的C语言教材大都存在着内容陈旧、缺乏现代编程思想、过于偏重语法、难度高等缺点,难以提起学习兴趣,学生有畏难情绪。
传统的教学观念,强调先打好基础,然后再进行实践、学习技能。教学实践证明,基础和技能的教学可以同步进行,甚至先教技能再教理论,在不断实践中掌握技能,在技能学习中提高基础理论。这样更适合学生的成长。
为此,我们以社会对学生编程和软件开发能力的需求为依据,参照人才培养模式和专业课程体系改革,对C语言课程教学进行了探索实践。
1 教学方法的改革
在C语言程序设计教学中,我们不再局限于单纯介绍C语言基本语法,而是本着面向未来的精神,把C语言作为一种实践工具,以程序设计方法为主线,以语法和结构为核心,以能力培养和提高学习兴趣为目标,注重理论与实践的结合、先进性与基础性的统一,变应试为应用。
1.1先过程、后对象的教学方法
考虑到绝大部分学生今后不会去搞程序开发,所以思维能力的培养是首要的。从这一角度来说,先过程、后对象的方法更符合学生的认知规律。而过程化的程序设计方法和解决问题的思路更切合学生已有的认知结构,甚至可以说就是我们日常分析问题、解决问题思路和步骤的一种计算机的代码化,更易于被学生接受。
1.2采用一体化教学方法,以程序案例为主教学,通过案例讲解语法要点和难点
“案例驱动”教学法应用在C语言程序设计教学中,就是讲解语法时不停留在理论讨论上,不是教会这一语法现象是什么,而是通过实例教会学生某一语法现象如何应用。比如,算术运算符中的求余运算和整除运算是比较有特色和应用较多的运算,在讲解这两个运算符的时候,就不能只停留在写两个表达式让学生计算出结果来,而应该结合实例让学生知道这样的语法特色用在什么地方,怎么用。如通过求1到5的倒数和这样一个小例子使学生认识整除运算的特点及在今后级数求和运算中如何避免可能引起的误差;通过一个求两位整数的逆序数的小程序,学生就会明白整除运算和求余运算可以用来将一个整数的各个位数分解出来,待后续循环结构介绍完毕时,又可将问题扩展到求任意位数整数的逆序数;当介绍到函数的概念时,又可将问题引申到回文数的判别,这样将一个对学生来说很难的算法问题分散到各个部分来处理,不仅降低了算法讲解的难度,也使学生能真切地体会到学习语法知识的必要性。
教学始终贯穿一个核心实例 ―― 学生成绩管理系统的开发。选择这样一个系统的原因是学生比较熟悉有关成绩的业务和功能,同时开发学生成绩管理系统将涉及到 C 语言程序设计课程的全部知识点。
1.3教学模式特色
集课堂、实验、网络教学于一体,教、学、研有机结合、相互促进,形成了“课内教学+课外俱乐部”、“常规教学+实验教学+网络教学”、“开放实验室+自编教材+教学网站+教辅系统”、“课上现场编程互动+课后作业练习+课下实验练兵+机上考试实战+课外创新实践提高”的立体化教学模式。
2 教学的组织实施
C语言课程的教学目标突出培养学生的编程能力,为实现这一目标,在教学内容上抛弃了过多的语法细节和非通用的或实际用途很少的语言特性,注意强调基础性、实用性、先进性和系统性,兼顾教学和自学两方面的适用性。精简过程化部分的内容、降低其难度、衔接面向对象的方法是关键。主要特点如下:
(1) 以结构化程序设计为重点,面向对象的概念和编程思想为扩展,MFC编程基础为补充,体现了先进性和系统性的统一。
(2) 淡化语法,对语法难点通过实例具体而分散地介绍,舍弃不实用和过于复杂的内容,如位运算、共用体、多继承等概念,体现了基础性和实用性的统一。
(3) 在内容上降低难度,淡化了过于繁杂的指针概念,简化了字符串的处理方法,体现了基础性和先进性的统一。
(4) 将面向对象的一些概念有机地渗透到过程化的内容中,如引用、函数重载、默认参数,这样避免了在面向对象部分集中介绍过多的概念而使学生产生畏难心理。
(5) 强调算法的分析训练,有利于在学时紧张的情况下学生通过自学提高分析问题、解决问题的能力。
3 教学内容安排
结构化的程序设计是本课程教学的基础和重点。结构化程序设计强调按照一定的结构形式来设计和编写程序,不仅可以让学生养成良好的程序设计习惯,而且可以有效地培养学生思维的条理性和逻辑性,这正是程序设计课程的主要教学目的所在。面向对象的程序设计也是以结构化为基础,这充分表明了结构化程序设计的基础地位。这部分内容在讲解上强调算法分析、淡化语法细节,语法内容是程序实现的手段和工具,而不是学习程序设计的目标。
通过类和对象的介绍使学生了解面向对象方法的实质是强制通过函数来对数据进行操作,从而保证数据操作的安全性,这就是数据隐藏和封装的思想;通过介绍派生类的继承关系,使学生深刻认识面向对象方法对代码重用的支持;而介绍多态性的关键在于让学生了解基于虚函数的多态性的实质是允许将派生类的对象当作基类的对象使用,因而不必为每一个派生类编写功能调用,从而实现接口的复用。这部分内容强调从实用出发,着重介绍基本的、主要的概念。而对从纯理论研究着眼的一些概念,如继承关系中的私有继承以及多继承中的诸多概念等,对于初学者来说过于复杂,要么不做展开讨论,要么就干脆舍弃。
从结构化程序设计到面向对象的方法过渡时,要解决学生思维方式的转换和衔接的问题。由于思维惯性,学生会将面向对象方法和结构化方法的比较贯穿于所设计的程序中。授课时要从学生的认识规律出发,不必急于空泛地强调面向对象方法的好处,要让学生清楚面向对象的程序设计和结构化程序设计一样,只是一种程序设计方法,它是为解决程序复杂性而产生的。就解决简单问题而言,并非一定要采取面向对象的方法,也并非面向对象方法一定比结构化方法更好。结构化程序设计是从一个个具体的局部入手,描述问题的解决过程;而面向对象的方法是从全局的角度抽象出问题所涉及对象的整体框架,再来描述各层次、各部分的内在联系。方法虽然因着眼点不同而不同,但面向对象的方法仍然是以结构化程序设计方法作为其代码基础的。这样学生既了解了它们之间的区别,又认识到了其间的联系。
4 考核体系
课程考核评价方面,建立了全新的考核评价体系,注重过程考核、编程实践能力考核,改革后的课程评价考核体系主要体现了考核形式多样化、考核标准合理化以及考核试卷个性化三大特征。
5 实验教学
C 语言特别适合编写系统软件,执行速度快,代码质量高,在进行系统控制、调节、测量、硬件驱动等方面具有独特优势,这些优势必须要通过实训室中软硬件结合的程序设计方可体现。按照“少而精”的原则,压缩并精选实验项目与内容,提高教学效率,从而使实验教学与理论教学的结合更加紧密。
开放实验室,让学生可自主选择实验时间、自主选择实验内容,为学生提供勇于探索、敢于创新的外部环境。
建设了与课程相配套的具有我院特色的实验环节: 课程设计、项目分析设计、科研开发等。考试方式:上机实验和考试结合,增加机试,借助编程题自动评分系统考核学生实际编程能力;开发编程题自动评分系统,向无纸考试过渡;开发题库系统,为机考提供支持;开发在线教学网站,拓展教学空间。
课内实验教学兼趣味性和实用性于一体,课余通过指导学生参加科技创新活动、各种程序设计大赛、学生俱乐部的各类小型软件开发项目,达到巩固知识、锻炼能力、提高素质的目的。
6 结束语
通过几年来的实践,我们加强教学的内容选取、组织形式、实例贯穿、上机实践、课时安排、教学环境与利用、教学评价与考核等多个环节的改革,取得了相当不错的教学效果。
参考文献:
[1] 龚沛曾等. 案例教学法在"Visual Basic程序设计"课程中的应用[J]. 计算机教育,2004,(5): 62-63.
[2] (美)HM.DeitelP.J.Deitel著.C++编程金典第三版[M].北京:清华大学出版社,2005.
[3] 张春兴.教育心理学[M].杭州; 浙江教育出版社,2006.
[4] 龚沛曾,杨志强主编.C/C++程序设计教程[M].北京:高等教育出版社,2004.
[5] 刘鹏,安玉洁. 微格教学的多元化架构[J]. 电化教育研究,2007,(9).
关键词:C语言;算法为先;教学模式
中图分类号:G642 文献标识码:B
1引言
为适应社会和经济的信息化需要,掌握计算机技术显得尤为重要。C语言以它结构化丰富、灵活性大、可移植性强、效率高等优点,被广大高校作为计算机专业基础课,以及许多非计算机专业学习程序设计的首选课。但是又由于C语言涉及的概念复杂,规则繁多,数据类型和运算符丰富等特点,使许多初学者望而生畏。很多文献致力于研究好的教学方法,帮助学生掌握C语言语法及上机技巧,这在一定程度上改善了教学效果,但是学生的学习热情仍然缺乏积极主动。本文通过分析算法在C语言教学中的重要作用,进一步探讨算法的教学方法,目的是从根本上激发学生的学习热情,降低学习难度。
2C语言教学中常见问题分析
算法设计、基本语法规则、程序调试是C语言教学的核心内容。算法注重解决某一问题采用的方法步骤,语法注重语言规范,用规范的C语言描述的算法必须通过上机调试才能实现,三个核心内容紧密联系。然而在教学环节中,教材内容基于语法体系,通常采用课堂讲语法、上机调程序的教学模式,忽视了算法在教学中的积极作用,殊不知过细的语法知识易使学生失去兴趣,灵活的编辑环境让学生望而却步,学生的学习热情很难调动起来。
2.1语法细节易使学生失去学习兴趣
通常C语言是学生接触的第一门程序设计语言,任何程序主要由数据和操作两部分组成,围绕这一特点,C语言教学内容可归纳为:算法,数据结构,程序结构三部分。算法是编程的指导思路;数据结构是数据的组织形式,可细分为基本数据类型,构造类型,指针类型、位运算;程序结构是操作语句的组织形式,具体包括预处理,函数,顺序结构,选择结构,循环结构。虽然C语言知识结构清晰,但是它是面向过程的编程语言,具有灵活的编程格式及丰富的运算符和函数,如果对语法细节不熟悉,以及相关概念混淆不清,很难编出正确的程序。教师往往投入较多课时,讲解C语言语法,而繁多的语法细则,不仅使学生难于记忆,而且容易误导学生的编程思路。例如scanf函数的应用:
scanf函数的一般使用形式为:scanf(格式控制,地址表列)。
格式控制是用双撇号括起来的字符串,它包含两种 信息:
(1)%和格式字符,如%d,%c,%s等,它的作用是按指定的格式输入数据;
(2) 普通字符,即在数据输入时,需要原样输入的 字符。
地址表列由若干个地址组成,通常是变量的地址或字符串的首地址。输入多个数据时,空格,回车键,跳格键为默认分隔符。
如:“scanf(“%d%d%d”,&a,&b,&c);”语句,运行时输入:689L,可得到变量a,b,c的值。如果输入语句变为:“scanf(“%d,%d,%d” ,&a,&b,&c);”,仅添加了两个逗号,仍按以上方式输入,则会出错。原因在于格式控制部分出现的普通字符“,”,在数据输入时要原样输入,正确的输入方式为:6,8,9L。可见C语言语法格式非常灵活。
运用scanf函数输入字符时,又出现特殊性。
如:“scanf(“%c%c%c” ,&c1,&c2,&c3);”语句,运行时输入:abcL,目的是将a赋给c1,b赋给c2,c赋给c3。用“printf(“%c,%c,%c”, c1,c2,c3);”语句输出,结果却为a,,b。出错原因在于:%c格式字符不需要空格作为输入字符的间隔。正确的输入为:abcL。
然而,用scanf函数输入多个字符串时,空格又成为有效的分隔符。
如:“scanf(“%s%s%s” ,c1,c2,c3);”语句,其中c1,c2,c3为字符数组名,若输入数据:How are you? L,则c1数组的数据是“How”; c2数组是“are”;c3数组是“you?”。若将语句改为“scanf(“%s”,c1);”,输入字符串:How are you? L,用“printf(“%s”,c1);”输出,则只显示How,与原意不同。如果一定要将带空格的字符串输入到字符数组c1,需要用到另一个输入函数,如“gets(c1) ;”。
虽然任何一个C程序输入数据,都可能用到scanf函数,但是它灵活的编程格式,往往使初学者在具体运用时举棋不定,忘却抓住编程题目的实质性要求。教材中还有许多值得注意和思考的语法细节,学生编程时,如果缺乏解题思路的引导,常因语法的困扰而失去编程兴趣。
2.2编程环境易让学生望而生畏
上机操作是学习程序设计的必备环节,学生可以验证语句的正确性,测试程序的功能,进一步增强对语法知识的理解和记忆。但是C语言编辑环境的一些特点,又让学生望而生畏。
首先,编辑环境基于DOS,不像其它可视化语言有友好的交互界面,加之初学者对语法知识不熟悉,编程时稍有不慎就会出错。如经常字母大小写不分;语句末尾忘加“;”;关系运算符“= =”误用为赋值运算符“=”等。初学者对出错提示缺乏了解,不知道错在哪里,更无从改正,经常一个小小的错误导致整个程序无法运行。
其次,C语言编译程序对语法检测不像其它高级语言那么严格,这种风格虽然给编程留下“灵活的余地”,却常导致一些非语法性和非算法性的隐型错误。比如程序:
main ( )
{
int a,b;
a = 32767;
b = a+1;
printf(“%d”,b);
}
运行结果为-32768,不正确,原因在于发生了溢出。系统运行时并不报错,程序中潜伏的隐型错误,给编程带来很多麻烦,增加了调试难度,对编程者提出更高要求,只有他们较全面地掌握了计算机知识,才可能检查出错误。然而初学者往往只懂得编程的一部分知识,这使他们感到C语言编程即抽象又复杂。如果没有浓厚的兴趣驱动,很容易在不知所措中放弃编程。
2.3算法为先,激发学习热情
“C语言”课程长期沿袭传统教学模式,以语法体系为脉络展开教学,重视语法细节和操作技巧,忽视算法对编程的指导作用,学生见木不见林,容易失去兴趣,经过一个学期的学习,除了掌握一些零星的语法外,收获甚微,面对具体的编程问题,无从下手。从事软件开发的人都知道,软件开发过程包括:可行性研究,需求分析,概要设计,详细设计,编码,测试,维护等几个阶段。重点在于先设计,后编码,并且整个开发环节需要不断查阅资料,反复调试修改,最终才能设计出可运行的软件,单靠记忆和背诵一些语法知识,根本无法适应实际需要。
在教学过程中,正确处理语法与算法的关系,是提高编程能力的关键。算法是程序设计的灵魂,没有正确的算法,计算机解决不了任何问题,语言只是实现算法的工具,要从算法实现的角度来介绍语言,而不是用语言来套用算法。程序设计课程本身是综合性较强的一门课,注重由设计算法到书写程序并进行调试的整个过程,它要求学生首先明晰结构化程序设计思路,知道怎么做,其次要求学生用扎实的语法知识实现编程,最后通过上机调试保证程序正确运行。然而,这个过程并非一帆风顺,会遇到许多意想不到的困难,需要耐心与毅力,只有具备真正的兴趣和强烈的好奇心,才容易完成。
经过研究与实践,教师在教学中如果注重算法为先,从算法实现的角度来介绍语法,那么不仅可以加深学生对语法知识的理解,增强语言应用能力,而且通过构造算法,培养了学生的逻辑思维,增强了学生分析和解决问题的实践能力。学生面对新的问题,会从程序设计思想的角度出发,先设计算法,在迫切想要实现的好奇心下,克服学习语法和调试程序的各种困难,变被动为主动。著名计算机科学家Dijkstra曾提到:“学编程是一个由新奇到熟悉循序渐进的过程”,继而又说:“在这种激进的新奇中含有愉悦的尝试”。
3算法教学建议
由上分析可知,C语言教学目标不仅仅是要求学生掌握语法规则或再现简单程序,更重要的是要求学生具备编程实践能力。传统教学方式,学生形成以语言为中心的思维模式,编程能力差。教师应引导学生逐步形成以算法为中心的思维模式,提高编程能力。但是算法的学习和掌握并不是一蹴而就,必须依靠平时训练和知识积累,以下提几点学习建议。
3.1以结构化程序设计思想为核心,开拓算法设计思路
学习的认知规律是将复杂问题简单化,以便于初学者理解和接收。C语言程序设计遵循结构化程序设计方法,该方法提高了程序的可读性,方便了程序的调试和维护,最重要的是该方法不拘泥于算法多变的外观形式,总结出算法结构的内在规律。学生掌握了这种规律,面对新的问题,很容易进行知识结构的迁移,复杂的编程问题将变得简单。
结构化程序设计包括结构化算法设计和结构化编程。由顺序、选择、循环三种基本结构(或基本结构的简单变形),按由上到下的顺序排列,组成的算法称为结构化算法。已经证明,结构化算法可以解决任何问题。对于特别复杂的编程项目,可以先采用自顶向下、逐步细化的分析方法,或采用模块化设计方法,把大任务分解为容易求解的若干子任务,分而治之。对于非结构化算法,还可以用等价的结构化算法替换。在设计好一个结构化算法之后,就可以进行结构化编程,C语言提供了与三种基本结构相对应的语句,进行结构化编程也并非难事。
由上可知,既然基本结构的顺序组合,可以表示任何复杂的算法结构,并且基本结构易于用C语句实现,那么学生只要深刻理解并熟练掌握这三种基本结构,就会提高设计算法和编写程序的能力。表1对算法的三种基本结构进行了总结。
说明:算法的表示方法很多,其中N-S流程图最适于表示结构化算法。表1列出了算法的三种基本结构以及相应的N-S流程图和语句的主要表示形式,学生通过该表很容易理解算法,N-S图,编程三者之间的关系。
教师要向学生说明,任何复杂算法都是由这三种基本结构构成,构造算法其实很容易,大家之所以觉得困难,是因为没有深刻理解A、B代表的含义。正如表中提到:A、B较灵活,既可以代表选择结构也可以代表循环结构,选择结构中还可以再套用一个循环,循环结构中还可以再嵌套循环或选择……由于A、B代表含义不同,可能构造出各种各样不同的N-S图,教师边阐述,边在黑板上绘制,开拓学生的思维空间。最后总结:能构造多少N-S图,就可能存在多少算法;顺序、选择、循环是三块基本的积木,形式多样的算法是由它们搭建而成,用于解决实际问题。这种教学方式,以简单的N-S图为切入点,学生很容易发现N-S图的多样性,算法的多样性,实际问题的多样性之间的联系,从而激发设计算法的浓厚兴趣。
正确的解题算法将减少程序的逻辑错误,算法用N-S图描述出来后,利用相应的C语句,学生很容易编写出程序的主体代码,至于其它编程细节,可以引导学生查阅资料。这样,学生对语法的学习由被动变为主动。精心培植的幼苗,一定期盼开花结果,学生经过一番努力,编写出的程序代码,也一定希望能用计算机实现,于是上机调试也变得既有目的性,挑战性又有趣味性。
3.2案例式教学,一题多解,培养设计算法的逻辑思维
C语言是实践性很强的一门课程,学生除了掌握结构化程序设计方法外,还必须进行大量编程训练。通常情况下,一个程序是用哪种语言实现的并不重要,关键在于算法设计的优劣。计算机科学家N. Wirth教授提出了一个著名公式:算法+数据结构=程序,由此可见程序设计的本质在于先设计出解决问题的算法。
教学初期,学生对语法知识了解甚少,教师可以根据每节课的教学目标和内容,精选程序例题,将重点放在算法的设计思路和方法上,逐步培养学生建立正确的思维模式。学生设计算法时,常犯的错误是,不会从计算机角度出发,分析实际问题内在的逻辑关系,而习惯于按照人的思维方式设计求解过程,算法往往无法用计算机操作实现。因此改变学生思维习惯,培养逻辑分析能力,尤为重要。
实践证明,对同一问题,设计多种有效算法,并对算法进行优化选择,有利于培养学生逻辑思维。通过一题多解,既拓展了学生的解题思路,增强了学生对同类问题求解的熟练程度,同时又潜移默化地培养了学生思维的科学性、严谨性。通常,不同问题间存在某种共性,一些基本算法掌握熟练后,学生很容易举一反三解决不同问题,树立起编程的信心。
例如通过一题多解,让学生熟练三个数由大到小排序的算法,进而引导学生对一组无序数据进行排列,用N-S图描述算法,更能反映出不同问题之间的联系和区别。
再如典型例题:用100元钱买100只鸡,每只公鸡5元,每只母鸡3元,每3只小鸡1元,要求每种鸡至少买一只,而且必须是整只,问各种鸡各买多少只?
对该问题设计多种算法,既帮助学生熟悉了循环语句,同时通过对各种算法进行评价,学生又深刻体会到算法设计的优劣对程序执行效率的影响。经过这种长期训练,学生求解问题时,不仅会注意算法的正确性,也会注重思维的严谨性。一题多解既培养了学生创造性思维,又训练了逻辑思维,是提高算法设计能力的有效方法。
3.3算法带动语法学习,全面提高编程能力
在编程训练过程中,学生不仅要积累设计正确,高效算法的经验,而且随着课程内容的不断丰富,还要能将各种算法转化为可执行程序,完成整个结构化程序设计过程。
以往教学模式过多重视语句命令格式,教学内容繁琐,学生需要识记的知识多,并且不易体会其用途,容易失去学习兴趣。如果在教学过程中,教师采用一些方法,充分利用学生对算法的理解和掌握,激发学习语法的兴趣,将取得好的教学效果。
首先,面对编程问题,如果学生明晰解题思路,在结构化程序设计思想的指导下,会很快设计出算法的N-S图。由前可知,算法是由顺序、选择、循环三种基本结构构成,表1只是简单地列出了三种基本结构的C语句实现,教师应广泛搜集并认真挑选典型例题,帮助学生全面掌握三种基本结构的各种语法表示。这样,学生根据算法的N-S图,就会很容易编写出程序的主体代码。
其次,教学初期,采用案例式教学,注重培养学生的算法设计能力,学生的语法知识比较薄弱,若要求他们将算法的N-S图完全转换成计算机语言,会遇到较多困难。如果教师能认真解析C语言知识,将教学内容有机组织起来(见2.1所述),再现在学生面前,那么学生在迫切想要实现算法的心理之下,借助脑海中的知识体系,会很容易寻找到相关章节,查阅还未曾系统学习的语法内容,独自完成编程过程。这样既增强了学生的学习自主性,学生在解决问题的同时,又深刻体会到语句的用途和功能,从而激发出强烈的编程兴趣。
最后,建议教师按照总体教学目标组织教学,制定每节课的语法教学任务,针对教学任务挑选例题,通过对案例的分析讲解,一方面帮助学生积累设计算法的经验;另一方面,加强学生对算法所涉及语法内容的理解,掌握和应用,学生只有正确理解并熟练掌握每一个基本概念,编程时才会少犯语法错误,从而减少不必要的程序调试,逐渐树立编程的信心。
4结束语
C语言是计算机基础教育的重要组成部分,教学目标在于培养学生的编程能力。多年来,教学模式一直围绕语法体系,学生学习兴致不高,分析和解决实际问题的能力差。经过多年教学与实践,本文倡导算法为先的教学模式,以结构化程序设计思想为指导,通过案例式教学,提高学生算法设计能力;利用学生对算法的理解和掌握促进语法学习,进而提高学生将算法转换为计算机语言的能力;算法和编程能力的提高,将有效减少程序中的逻辑错误和语法错误,降低调试难度。由此可见,算法为先的教学模式,有利于提高学生的程序设计水平。
参考文献:
[1] 谭浩强. C语言程序设计[M]. 北京:清华大学出版社,2000.
[2] Edsger W. Dijkstra. On the Cruelty of Really Teaching Computing Science[J]. Comm.ACM,1989(32):1398-1404.
【关键词】数据结构;算法;软件设计
1.经典算法的选择
选择经典算法的重要性,PASCAL语言的创始人、著名的计算机科学家N.沃思说得好“程序=数据结构+算法”,足以见得算法在程序设计中的重要地位。在合理的数据结构基础上,算法是对数据结构的操作(运算),是数据处理的核心。在《数据结构》中介绍的基本数据结构有线性表、堆栈、队列、数组、树、二叉树、图以及相应的算法。一个算法是建立在某种数据结构的基础上,一个算法不可能脱离数据结构而孤立存在。只有通过学习算法,才能真正掌握某种数据结构。可以说学习《数据结构》的过程基本上是学习各种算法的过程。在众多的算法中有简单的、有复杂的、有容易的、有难度大的,在有限的学时情况下,不可能也没有必要逐一讲解每一个算法。大多数的算法,要靠学生自己理解消化。在这种情况下,如何选择少量的经典算法进行分析讲解,显得尤其重要。一个经典算法往往能起到以一当十、以点带面的关键作用。通过经典算法的分析,一方面让学生加深对数据结构基本理论的理解另一方面让学生学习程序设计方法。
选择好经典算法后下一步就是要对其展开综合分析,下面以具体的算法为例进行讨论。
2.利用经典算法说明基本原理
2.1 经典算法应能体现某个数据结构的基本特征
我们知道线性表顺序存储时其优点是能够对每个数据元素随机访问,存储密度高,其缺点是插入、删除操作时需要移动大量的数据元素,操作效率低。“向有序(由小到大或由大到小)的线性表(顺序存储)插入一个新的数据元素”,这一经典算法集中反映了线性表顺序存储的这些特点。
分析:将一个值为X的数据元素插入到有序(由小到大或由大到小)的线性表(顺序存储)中,可以分两步进行,首先查找到值为X的数据元素在线性表中应有的位置,采用从头到尾循环比较的方法确定其位置I,然后,将第I个以后的全部数据元素向后移动一个存储单元,最后将值为X的数据元素存放到第I个位置上,线性表元素个数增1。
【算法1】
PROCEDURE INSERT(V,m,n,X)
//将值为X的数据元素插入到V数组中,(线性表顺序存贮在V中)m为最多元素个数,n为当前实际元素个数
IF (m=n) THEN{“OVERFLOW”; RETURN}
FOR I=1 TO n DO
IF (X〈V(I))THEN BREAK
FOR J=n TO I BY -1 DO V(J+1)=V(J)
V(I)=X
n=n+1
RETURN
分析:【算法1】的优点是简单,便于理解,缺点是:
①循环体内有提前退出语句,不利于结构化程序设计;
②确定新数据元素位置和移动数据元素分两步进行,有重复操作,可以改进之,将两步合并一步完成,即将循环比较与移动数据元素同时进行。从线性表的尾部开始向前循环比较,比新数据元素大者后移,直到小于等于时停止。
【算法2】
PROCEDURE INSERT(V,m,n,X)
IF(m=n)THEN{“OVERFLOW”;RETURN}
I=n
WHILE (I〉=1)AND (V(I)〉X)DO {V(I+1)=V(I);I=I-1}
V(I+1)=X
n=n+1
RETURN
分析:注意【算法2】中循环条件,当循环结束后I=0或V(I)〈=X,新数据元素的位置为I+1,【算法1】的时间复杂度为0(2n),而【算法2】的时间复杂度为0(n),效率提高一倍。循环结构是结构化程序设计中最基本最核心的部分,归纳循环条件是关键。【算法2】能进一步推广。
2.2 利用经典算法学习算法设计
经典算法能给学习者以启示、示范作用。
分析:可以将【算法2】用于对线性表(顺序存储)排序算法中。在直接插入排序算法中,其算法思想是从第2个数据元素开始直到第n个数据元素,逐一插入到已有序的子线性表中。
【算法3】
PROCEDURE SORT(V,n)
FOR I=2 TO n DO
{ Y=V(I)
J=I-1
WHILE (J〉=1) AND (V(J)〉Y) DO {V(J+1)=V(J);J=J-1}
V(J+1)=Y }
RETURN
分析:【算示3】其结构分为双重循环,外循环完成逐一取数据元素,即取第I个数据元素,内循环完成将第I个数据元素插入到前I-1个已有序的子线性表中。内循环完成的功能可以独立成为一个子函数(子过程),可以借用【算法2】。这正是结构化程序设计思想的体现,即主程序完成任务的划分,说明“做什么”,子函数(子过程)完成任务的具体实现,说明“如何做”。结构化程序设计方法采取“分解”的手段来控制系统的复杂性,将大系统划分为若干个相对独立的、功能单一的子模块。一方面子函数(子过程)可以实现软件的重用性,在不同的程序段有相同的处理过程时调用子函数(子过程),减少软件开发的工作量;另一方面子函数(子过程)对具体的实现技术细节进行隐藏,便于开发人员集中精力把握软件开发的核心和主要问题,降低了软件开发难度,从而保证软件质量。在利用【算法2】时要稍加修改,见【算法4】。
【算法4】
PROCEDURE INSERT(V,I,X)
//将值为X的数据元素插入到已有序的前I-1个数据元素中
J=I-1
Y=X
WHILE (J〉=1) AND (V(J)〉X) DO {V(J+1)=V(J);J=J-1}
V(J+1)=Y
RETURN
相应的主程序也要作修改,见【算法5】
【算法5】
PROCEDURE SORT(V,n)
FOR I=2 TO n DO
INSERT(V,I,V(I))
RETURN
3.结束语
在众多的算法中选择好少量的经典算法对于教好、学好《数据结构》至关重要;经典算法要有助于学生理解对应的数据结构,经典算法的分析要侧重于程序设计能力的提高。
参考文献
[1]欧建圣.数据结构教学研究――经典算法的综合分析[J].武汉工程职业技术学院学报,2004,16(1):58-60.
C语言 结构化程序设计 循环结构 效率
一、引言
学习和应用计算机高级程序设计语言的人都知道,在这些语言中为实现结构化程序设计,一般都会采用三种最基本的结构,即顺序结构、选择结构和循环结构。因此,掌握这三种基本结构的使用方法,是学习和掌握高级程序设计语言课的基础。这三种基本结构中,顺序结构和选择结构和我们平常的思维习惯相似。因此,最容易理解和掌握;而循环结构是这三种基本结构中最复杂的一种结构,与我们日常的思维习惯不尽相同,因此理解起来相对来说比较困难。但是,几乎所有的程序都离不开循环结构,利用它可以简化程序、提高工作效率。因此,学习和应用高级程序设计语言的人又必须要掌握循环结构。但是,通过本人近几年的教学发现,大多数学生在学到循环结构一段时间后,干脆将这门课给放弃了,原因是他们觉得循环结构太难理解了。用顺序结构和选择结构做一个小程序还可以,用循环结构实在难理解。鉴于这个原因,本人将日常授课中总结出来的一点心得从初学者的角度写出来,希望能对即将和正在学习高级程序设计语言课的人有所帮助。当然,我们在这里是以C语言为例来说的,其实这方面的知识对其他语言比如Visual Basic语言等同样适用。
在C语言中,循环结构主要是由For语句、While语句、Do-While语句三种结构来实现的。而在这三种循环结构语句中又以for语句的应用更为广泛。因为for语句在其开头语句中就已经包含了循环变量的初始值、循环变量的终止值、循环的判断条件以及循环变量的变化趋势等这些内容,因此在编写其循环体时,只用考虑其循环体应该包含的主要功能就行了,而不用在For语句之前对循环变量的初始值进行过多地考虑,同样也不用在循环内部考虑其循环变量如何变化。对大多数有程序设计经验的人来说,使用for语句实现循环结构是一件轻而易举的事情。但是,对于没有经验的初学者来说,要想将for语句的作用及使用方法掌握住也不是一件容易的事情,更不用说While语句、Do-While语句的使用了。因此,本文从初学者的角度,阐述了C语言中循环结构的几种典型应用。
二、用循环结构输出几何图形
在教学过程中,不管开设哪一种高级程序设计语言课,只要一讲到循环结构,大多数老师几乎不约而同地选择输出简单的几何图形来作为讲解循环结构的最好实例。
对于这种类型的题目,初学者往往最容易想到的方法就是采用多条输出语句来完成程序的设计。虽然这种方法很快能够实现所要效果,但其缺陷也是很明显的:缺乏灵活性、程序修改起来不方便,也不符合程序设计的思想。比如,我想让大家输出8行,每行36个“*”。这个时候,我们就不得不在输入“*”的时候特别仔细,因为一不小心可能个数就不对了。
但是,这样的问题如果用循环语句来实现的话,程序不但可以简化多,并且可以很灵活地将其修改成我们想要的效果。
因此,在讲解这一类图形时,授课教师最好引导学生按照正常的程序设计思想,先分析图形的组成结构,找出其中变化的规律,然后按照所找到的规律用循环结构来编写出相对应的程序代码,这样一旦要求有一点点变化不用大篇幅地修改程序,而只用找到关键的几个地方修改一下就可以了。教师在讲解的过程中,可以举一反三,多次修改、让学生反复练习,直到他们理解为止。
现在,我们来具体分析一下该图形,看看它有什么样的特点,然后我们利用For循环将它的程序代码编写出来。
三、结束语
以上关于循环结构的使用基本上都是在程序设计教学过程中的一些体会与总结,可能比较肤浅,但是对于初学者来说,掌握这些知识还是有必要的。在进行课程教学的过程中,将自己在学习过程中得到的一些好的方法传授给学生,让他们从中去实践、体会,从而引起他们更大的学习兴趣是必要的。如何让一名初学者尽快摆脱日常的思维定式,更加透彻地理解和掌握程序设计中的基本思想,领会程序设计的精髓,是高级语言程序设计这门课程在讲授过程中,应该时刻注意的问题。更希望学生在学习的过程中不只是从老师这里拿一些现成的经验去使用,更重要的是让学生学会自己去发现问题、解决问题,总结出一些更好的程序设计方法,为以后进行软件开发与设计打下良好的基础。
参考文献:
[1]谭浩强.C程序设计(第三版)[M].清华大学出版社,2005.
[2]苏运霖.计算机程序设计艺术第1卷・基本算法[M].北京:国防工业出版社,2002.
[3]谭浩强.C语言程序设计(第二版)[M].北京:清华大学出版社,1999.
关键词:教学探索;程序设计;Scratch
中图分类号:G642 文献标识码:A
1 引言(Introduction)
1.1 基础薄弱
目前,中小学的信息化教育内容参差不齐,有的学校可能会有程序设计的教学,有的学校则以Word、Excel操作为主,对程序设计的入门不重视[1]。很多刚进入大学的学生在程序化的思维方式方面还比较弱,要入高级程序设计语言的门还有很长的路要走。
1.2 课时较少
通常程序设计入门以C语言或C++语言为教学内容。作为一种实践性较强的语言,在一个学期中要完成程序设计概念和语法的教学,又要在有限的时间里完成编程调试训练。如果学生没有一定的基础和自学能力,就很难适应这种节奏。
1.3 抽象带来的问题
语法、算法等抽象的教学内容将降低学生的学习兴趣,而学习兴趣对教授与学习两方面都非常重要。有的学生不能通过考核经常就跌入补考和重修的循环。程序设计入门作为核心课程,这个课程出了问题将给计算机专业的后续课程带来很多不好的影响,比如本专业学生对程序设计和其他专业技能缺乏信心以及实践能力。
2 程序设计课程的前导课程(Leading program of
programming classes)
学生在程序设计课程中,一方面要努力熟悉算法抽象、程序控制等一些全新的概念,一方面会遇到很多语法错误,必须要学习如何调试程序,理论加上实践可能都是前所未有的挑战。前导课程应带来有趣味的内容,为学生补充各种必要的基础概念,如抽象、逻辑、流程等,告诉学生如何在现实世界和计算机世界之间建立起一座桥梁。这样的课程会对程序设计教学有很大帮助。
3 Scratch简介(Introduction of scratch)
Scratch是美国麻省理工学院(MIT)媒体实验室开发的一套“程序语言”,利用这个软件可以轻轻松松地创造出互动式故事、动画、游戏、音乐等令人惊叹的作品,是一套简单又有趣的软件[2]。
Scratch采用拖曳、组合的方式来设计程序。它是可视化的程序语言,具有所见即所得的功能。设计Scratch作品的过程是学生学习用计算机进行思考、分析、解决问题的过程,还能进行团队建设方面的实践。
Scratch把程序命令归为几大部分:包括动作、外观、声音、画笔、变量、事件、控制等,并用颜色来分类。学生只需要了解各部分模块的功能,按照自己的想法拖到脚本窗口,并按一定规则堆积在一起,最后在浏览窗口就能根据命令脚本直接运行。通过可视化操作学生可以搭建起自己的程序,轻易地把自己的想法表达为计算机的程序。在这个抽象的过程中不用过分操心语法错误等问题。
图1为Scratch设计界面,左上为程序运行场景,左下为程序中设计的主体对象。一个项目可以有多个动画主体(可以是动物人物或其他一些对象),中间是可视化程序模块,右边是程序窗口,利用鼠标可以把中间的程序模块拖入右边的程序窗口,经过修改参数、安排程序模块的顺序和嵌套等工作,就完成了程序编制,接着程序可以在浏览器中执行。
4 Scratch对程序设计教学的支持(Supports to
programming classes)[3]
4.1 抽象
现实世界的问题如何抽象为计算机世界的模型?第一步可以从学习抽象为计算机里的对象开始。我们把需要处理的内容抽象为Scratch的动画主体,比如一个人物或一个物体。动画主体可以具有各种行为,比如在平面中移动。如图2是一个负责动作的程序模块,能控制动画主体平移到坐标(100,200)处,其中白色的部分为可以修改的坐标值。
4.2 结构化程序
Scratch具有可以拖曳的结构化模块。设计时候只需要把模块拖入场景中,就可以实现循环或选择的程序结构,并且能实现循环和选择的嵌套,制作需要的程序流程。图3演示了循环结构的程序模块,repeat后面的循环次数可以修改,可以看到循环程序模块和循环体中的其他程序模块的颜色是不同的,它们属于不同的功能分类。
Fig.4 Block to control choosing
其中使用的橙色模块i是Scratch的变量模块。Scratch程序能够使用数字和字符串变量。变量可用来控制某个图形的大小或个数,变量还能具有不同的作用域。由此我们向学生展示了变量存储值、变量值影响程序结果以及变量的作用域等概念。
Scratch具有列表的结构,列表可以存储数值或字符串。列表可以具有作用域,可以获得列表的长度。列表项具有添加、删除、插入等操作,并能通过下标获取特定的列表项。列表可以帮助学生学习数组的概念。
Scratch的结构化程序设计是可视化的,调试简单,能帮助学生把精力集中在程序结构上,而不需要为语法错误分心。
4.3 面向对象
Scratch能够设置动画主体,可以视为对象模块。不同的动画主体具有独特的属性,可操作自己的变量,能完成独特的任务。在后续课程中这些概念很容易引申为对象及其属性和行为的概念,这是面向对象程序设计的基础。图5为迷宫程序的设计,其中球体是一个对象,而终点方块的是另一个对象。我们可以利用键盘移动球体,当碰到方块对象时后者能做出赢得游戏的反应。球体对象在移动过程中碰到障碍则会产生反弹。
5 Scratch作为程序设计教学前导课程的实践
(Experiments in programming classes)
在参考文献[4]中提到的学校已经尝试使用Scratch平台作为计算机专业课程的前导课程。学校把学生分为两部分,一部分基础薄弱的学生在第一个学期先参加Scratch课程,到第二个学期才开始学习高级程序设计语言。而另一部分基础良好的学生则在第一个学期就开始学习高级程序设计。
最终学过Scratch的学生,尽管基础薄弱,他们的最终成绩在通过率和平均成绩方面都超过基础良好的学生,并且在精通程序、喜爱专业课程、参与专业实践等方面都有更好的表现。这些学生专业成绩更好,对专业更热爱,对程序设计更有信心。
6 结论(Conclusion)
程序设计是一种具有创造性的工作,它具有一定的抽象性,而且需要使用数学的方法去描述一些问题。这使得在语言程序设计的课程教学中,必须打破原有的教学模式和知识体系[5]。我们探索不同的方式帮助学生入门,Scratch可能是一个良好的平台,它的可视化特性,对结构化程序设计的支持,都能帮助学生在实践中培养计算机思维方式,为程序设计入门打下坚实基础,为后续课程的挑战做好准备。另一方面程序设计教学的困境也要需要在考核模式方面进行改革,激励学生重视创新和实践。
参考文献(References)
[1] 张传科.如何让抽象的设计变得精彩――LOGO程序设计与
Scratch[J].中国信息技术教育,2010,(5):29-31.
[2] 陈捷.Scratch语言简介及应用[J].电脑知识与技术,2009,5(26):
7439-7440.
[3] 朱,郑晓妹.C语言程序设计教学前导课程研究[J].软件导
刊,2014,13(4):160-162.
[4] M.Rizvi,T.Humphries,D.Major,M.Jones,and H.Lauzun.A
NewCS0 Course for At-Risk Majors[C].The Proceedings of
the 24th IEEE-CS Conference on Software Engineering
Education and Training,Honolulu,Hawaii,May 2011: 314-323.
[5] 刘兴林.大学工科C语言程序设计教学探索与实践――以五
邑大学为例[J].软件工程师,2014,17(5):39-40.
关键词:软件工程;结构化;面向对象;程序设计
中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)21-30451-02
In Programming Structurized Method and Object-oriented Method Comparison
FU Yu-jiang
(Hainan Software Professional Technology Institute,Qionghai 571400,China)
Abstract: The structurized method and the object-oriented method are 2 cores thought in the software development programming.These two programming method not only displays for in the program language, the analysis and the design difference, displays in the development thought and the development angle of view difference.
Keywords: Software Engineering; Structurization; Object-oriented; Programming
在计算机系统开发领域中存在各种各样的系统分析和设计方法,其中结构化方法与面向对象方法是软件开发程序设计中的2个核心思想。结构化方法来自于20世纪60年代流行的结构化设计语言,例如PASCAL、C语言等,经过几十多年的研究及应用,最为成熟且影响最大。而面向对象方法近10年来发展较快,被广泛应用于计算机软件的各个领域,如计算机仿真、系统设计、人工智能程序设计等各个方面,显示出了强大的生命力,现已呈现出取代结构化方法的趋势。本文具体分析了两者在系统分析设计中的差别及优劣。
1 结构化方法分析与设计
结构化方法承袭了传统的编程思想与编程方法,结构化方法只是对传统程序结构的改进。模块是结构化编程的基本单位,计算方法(简称为算法)是程序的核心,结构化分析和结构化设计是结构化方法软件开发最关键的两个时期。
1.1 结构化方法的基本思想
结构化方法程序设计的基本思想是:自顶向下,采用模块化技术,分而治之,逐步求精地将信息系统按功能分解为若干模块进行分析与设计,应用子程序实现模块化,模块内部由顺序结构、选择结构、循环结构等三大基本控制结构组成。即从代表目标系统整体功能的单个处理着手,自顶向下不断地把复杂的处理分解为子处理,这样一层一层地分解下去,直到仅剩下若干个容易实现的子处理为止,并写出各个最低层处理的描述。
1.2 结构化分析
结构化分析是一种面向数据流而基于功能分解的分析方法,在该阶段主要通过采用数据流程图、编制数据字典等工具,描述边界和数据处理过程的关系,力求寻找功能及功能之间的说明。通常所说的“结构化分析”就是“数据流分析”。
数据流分析的核心特征是“分解”与“抽象”。“分解”和“抽象”是两个相互有机联系的概念,下层是上层的分解,上层是下层的抽象。例如,假设系统很复杂,为了理解它,将它分成了5个子系统,如果子系统仍然比较复杂还可以再继续分解它,如此下去,直到每个子系统足够简单,能清楚地被理解和表达为止。
典型的结构化分析方法可以描述为:功能分解=功能+子功能+功能接口。问题域映射为功能和子功能,规格说明间接反映问题域。分析的结果是系统、子系统、功能、子功能层次结构的建立。
1.3 结构化设计
结构化设计通常与结构化分析方法衔接起来使用,以数据流图为基础,将数据流图表示的信息转换成程序结构的设计描述,在该阶段力求寻找功能的实现方法,完成软件层次图或软件结构图。
结构化设计通常表述为:结构图+关系数据模式,其中,结构图描述软件系统的程序结构,关系数据模式描述软件系统的数据库结构。因此,结构化设计工作主要包括程序结构设计和数据库结构设计。设计过程分两步完成,第一步构造出一个具体的系统设计方案,决定系统的模块结构(包括决定模块的划分、模块间的数据传递及调用关系);第二步在总体设计的基础上,将实体联系图转换成关系数据模式,确定每个模块的内部结构和算法,产生每个模块的程序流程图,最终在此基础上设计建立外模式。
1.4 结构化分析设计的局限
1)不能直接反映问题域:结构化分析方法以数据流为中心,强调数据的流动及每一个处理过程,不是以问题域中的各事物为基础,打破了各事物的界限,分析结果不能直接反映问题域,容易隐蔽一些对问题域的理解偏差。
2)数据和代码缺乏保护机制:一个特定全程数据既可以作这些数据的过程访问,也可以被其他过程访问,这给程序设计带来了不安定因素,一个不正常的数据修改或者过程调用可能会破坏正常的程序执行流程或结果。
3)分析和设计体系不一:结构化分析的结果是数据流图,结构化设计的结果是模块结构图。二者的表示体系不一致,分析文档很难与设计文档对应,所以从分析到设计的“转换”过程容易因理解上的错误而使得设计文档与用户的原本需求相差甚远。
4)开发过程复杂: 由于结构化方法将过程和数据分离为相互独立的实体, 程序员在编程时必须时刻考虑到所要处理的数据的格式。对于不同的数据格式做相同的处理或对于相同的数据格式做不同的处理都需要编写不同的程序,而且往往不能对数据的安全性进行有效的控制。如果程序进行扩充或升级,也需要大量修改函数,因此结构化程序的可重用性不好。要使数据与程序始终保持兼容,已成为程序员的一个沉重的负担。
2 面向对象分析与设计
2.1 面向对象的基本思想
面向对象方法的出发点是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界、解决问题的方法与过程,也就是使描述问题的问题空间与实现解法的求解空间在结构上尽可能一致。
面向对象是一种运用对象、类、继承、封装、聚合、消息传递、多态性等概念来构造系统的软件开发方法。它打破了传统的代码、数据分离做法,将一种数据结构和操作该数据结构的方法捆在一起,封装在一个程序内,实现了数据封装和信息隐藏,通过“操作”作为接口实现信息传递。对外部来说,只知道“它是做什么的”,而不知道“它是如何做的”,使得数据封装、信息隐藏、抽象代码共享等软件工程思想得到充分体现。
2.2 面向对象的重要特征
1)抽象:从许多事物中舍弃个别的、非本质的特征,抽取共同的、本质性的特征,就叫作抽象。抽象是形成概念的必须手段。
2)类和对象:“类”是面向对象语言中的一种抽象数据类型。面向对象方法认为客观世界是由各种对象组成的,复杂的对象可以由比较简单的对象以某种方式组合而成。例如人、车、学校、球场、商店、螺丝钉等都可以看做是对象。对象按照不同性质可以划分成各种对象类。“对象”可以理解为“类”的一个实例,每个对象都有自己的属性(状态和特征)和方法(行为)。
3)继承: 即特殊类的对象拥有其一般类的全部属性与服务。由于具有“继承”性这个特点,使得程序员对共同的属性以及方法只说明一次,并且在具体的情况下可以扩展细化或修改这些属性及方法。
4)封装:表示对象状态的数据和实现各个操作的代码,都被封装在对象里面,它与外界的联系是通过对象的对外接口(方法)实现。外界不需要关心对象是如何进行各种细节处理。
5)多态:指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。就如不同的对象,收到同一消息可以产生不同的结果。
2.3 面向对象分析(Object Oriented Analysis OOA)
面向对象分析是面向对象软件工程方法的第一个环节,OOA的任务是把对问题域和系统的认识理解,正确地抽象为规范的对象(包括类、继承层次)和消息传递联系,最终建立起问题域的简洁、精确、可理解的面向对象模型,为后续的面向对象设计和面向对象编程提供指导。面向对象分析方法可以描述为:OOA=对象+类+继承+消息传递。
面向对象分析通常建立三种模型:对象模型、动态模型、功能模型。其中,对象模型描述了系统的静态结构,在第一轮迭代中可能只确定类的名称和类间的关系。动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。功能模型表明了系统中数据之间的依赖关系,以及有关数据的处理功能,它有一组数据流图组成。
面向对象的分析过程实际上是依次建立对象模型、动态模型、功能模型,之后反复迭代,细化类的属性和服务(方法)。之后可以根据需要,再按此过程逐渐迭代细化。
2.4 面向对象设计(Object Oriented Design OOD)
1)OOA和OOD采用一致的概念、原则和表示方法,二者之间不存在鸿沟,不需要从分析文档到设计文档的转换,二者之间也不强调严格的阶段划分。能体现二者之间关系的是软件生命周期模型――喷泉模型(如图1),其中分析与设计没有严格的边界,它们是连续的、无缝的、允许有一定的相交。在分析阶段所获得的信息,不仅是设计阶段的输入,同时也是设计阶段的一个完整部分,分析得到对象及其相互关系,而设计则是解决这些对象及其相互关系的实现问题。
OOA与OOD的区别主要是,OOA与系统的问题域更加相关,OOD与系统的实现更加密切;OOD是对OOA所得出的对象模型的直接细化和抽象,得到可直接实现的类图。
2)面向对象设计可看作是面向数据流图与面向数据结构的结构化方法的统一,把数据及其操作封装,再取个名字为对象。对象是高性能的数据,整个程序的执行就是若干对象彼此通信。这种以对象为中心的模块,不但内聚、耦合性能良好,而且适于并发。这样,系统的设计就可看成把系统所要求解的问题解释为一些对象及对象间消息传递的过程。
2.5 面向对象方法的优点
面向对象技术较之与传统的结构化方法有其独到之处:
1)可重用性。可重用性是面向对象软件开发的一个核心思路。通过类的继承关系,使公共的特性能够共享,简化了对象、类的创建工作量,增加了代码的可重性。另外,重用经过测试的代码还可以使产生额外错误的可能性达到最小。
2)可扩展性。可扩展性是对现代应用软件提出的又一个重要要求。类的继承性使类能反映现实世界的层次结构,多态性反映了现实世界的复杂多样。类的继承性和多态性使软件编码具有良好的可重用性和可扩展性。无需修改源代码就可以使软件功能容易扩充和修改。
3)数据保护。数据和操作数据的算法不再分离,它们被封装在一起,对象内部的行为实现细节被隐藏。封装防止了程序相互依赖性而带来的变动影响。
4)可管理性。面向对象的开发方法采用类作为构建系统的部件,以对象作为系统的基本组成单元,使整个项目的组织更加合理、方便,因为归纳事物、划分成类进行管理符合人们在认识和管理客观世界的习惯思维方式。
3 结束语
结构化和面向对象是软件工程的程序设计方法中最本质的思想方法。结构化编程的基本思想就是把大的程序划分为若干个相对独立、功能简单的程序模块。它以过程为中心,强调的是过程,强调功能和模块化,通过一系列过程的调用和处理完成相应的任务。面向对象编程以对象为中心,是对一系列相关对象的操纵,发送消息给对象,由对象执行相应的操作并返回结果,强调的是对象。理论上,面向对象的程序设计方法将产生更好的模块内聚和耦合特性,使得软件更易于重用与维护。但在实践中程序设计方法关注软件生命周期的各个环节,从需求分析、总体设计到编码、测试和维护。同时设计方法在各个阶段需要工具和环境的支撑,因此在选择程序设计方法时,需要综合考虑这些因素。
参考文献:
[1] 郭溪川.对比分析面向对象方法与结构化方法[J].农业网络信息,2006(11).
[2] 郭燕慧.面向对象软件分析设计与测试[M].北京:科学出版社,2004.
[3] 王德军,郝永芳.结构化程序设计方法与面向对象的程序设计方法的比较[J].铁路计算机应用,2003,12(11).
关键词:专业课;常用软件;结构化;原型法;形式化;设计
中图分类号:G718.5;G710 文献标志码:A 文章编号:1008-3561(2016)36-0013-01
当前,普遍采用的软件设计方法有结构化分析与设计方法 (SD/SA)、Jackson(JSP/JSD)系统开发方法、原型法、生命周期方法等多种方法。为了更好地展现各种方法的特性,本文从设计思想、设计步骤或流程、优缺点等方面对各软件设计方法进行了相应对比和分析,为软件设计教学工作提供一定的参考。
一、结构化分析与设计方法(SD/SA)
结构化分析方法又称作SD方法或SA方法,它是通过把现实世界逐一描绘为各种数据在信息系统中的一种流动,同时在数据不断流动过程中进行数据和信息之间的转化。基本思想可描述为:基于一种将功能逐一分解的设计模式,不断把复杂和综合问题逐层进行分解,以便对问题进行简化――自顶向下,逐层细化,从而将复杂的程序结构划分为多个功能完全不相关或者独立的小模块,最终达到最简化的过程。优点:比较直观、应用简单、容易理解,目前已经获得了较为成功的实践经验,在市场推广方面有较大的优势。不足:首先,因为从抽象思维出发对模块进行细化,所以得到的子模块方案各异,共性较低;其次,由于对问题理解上的偏差,导致继承性较为困难;再次,该方法的自适应能力相对较弱,其设计的软件重用率不高,从而延缓了开发周期;最后,设计文档时常出现与表示体系不一致的现象。
二、Jackson(JSP/JSD)系统开发方法
Jackson开发方法分为JSP和JSD两种。(1)JSP开发方法。JSP方法是一种面向数据结构的程序设计方案。其基本思路是按照输入、输出和内部信息的三种数据结构形式进行设计,从而把对数据结构的描述转变成一种程序结构的描述方案,因此可实现通过数据结构来反映程序结构的方法。其基本思想可描述为:首先采用自顶向下的思想按功能对系统进行划分,并逐步求出各子问题的解,将软件开发流程视为软件的生命周期,最终建立一种所谓的瀑布模型。基本实现步骤可描述为:分析、设计、编码、测试、运行及后期维护。优点:简单易学;准入门槛底,对设计者的要求不高。不足:难以满足规模较大的软件系统设计,且JSP方法难以对付结构冲突问题。因此,该法仅适用于小型程序的开发。(2)JSD方法。此方法称作杰克逊系统开发方法,它以事件的驱动为中心,将相连的顺序组合构成程序进程,系统设计模型可进一步抽象成若干条以通信方式进行相联的进程。基本设计思想描述为:首先通过仿真来理解并描述客观事实,其次添加相应输出功能,最后通过某种收到实现系统间的转换。方法实现步骤为:实体的动作分析过程实体结构分析定义初始模型功能描述决定系统时间特性硬件和软件实现。优点:实现了同类软件和客观世界间的关系研究,并确定了各类软件系统和软件现实决策间的界限。不足:对客观现实同类软件间的相互关系认识不够完整,有待提升;构造的软件实现结构较为复杂,有待简化;对软件结构的相关描述不完善;JSD在实现阶段较为费时和复杂,且需要手动实现。
三、原型法
原型法可分为示例型和渐增型两大类。其实现思路为:利用设计程序自动生成软件工程运行环境,以便构造出简化的实际系统模型,从而便于软件开发人员和用户间进行有效交流,大大提高了设计的灵活性。该方法实现过程要求迅速,否则便失去了意义。开发基本步骤可大致分为四步:系统简化原型实现系统修改最终实现。优点:能适应各种模糊不清和变化不定的用户需求。不足:需要具备较强的知识理论基础,同时需要以相应的硬件环境作支撑。
四、生命周期法
生命周期法学也把软件开发过程分为若干独立阶段。在软件实现过程中,各阶段分别完成一定任务,并实现最终的软件配置程序/文档。在完成各阶段性任务过程中,可运用结构分析(SA)技术、结构设计(SD)技术和其他相关辅助工具。在编程过程中,使用了SP(结构化程序设计)语言,在各阶段结束时需要进行细致的复审过程,只有各项参数合格后才能进行下一步骤的工作。因此,该方法将软件的生命周期依次分为系统需求分析、系统设计、系统实现、系统测试、系统维护五大阶段。优点:该方法采取了自顶向下、逐步求精的设计思想;模块化设计过程中,运用了结构化程序设计方法,采用了严格的复审及测试程序,保障了软件的可维护性。不足:对时变系统不太适用,开发出的软件稳定性、可重用性和可维护性都比较差。
五、结束语
总之,以上各种软件设计方法均存在一定的优势和缺陷。因此,相关专业的师生在设计时,应根据设计的主客观条件进行相应的选择,提高设计能力,充分利用自身和环境优势完成软件的设计。
参考文献:
摘 要:Visual FoxPro是技工院校计算机专业的基础专业课程,也是开设最广泛的数据库类课程。通过这门课程的学习,可以为技校生获得就业必备的计算机等级证书以及具有相应的专业素质打下基础。因此,教师在实训教学过程中运用案例法进行教学具有特殊的现实意义。
关键词 :案例 数据库 应用
由于技工院校处于本科、高职院校与中专院校的夹层地带,教学理论的难度与深度不如本科与高职院校,单纯的实操能力培养不如中专院校。经过几年的实践,我们发现要使技工院校的计算机专业建设走出困境,就必须大胆进行课程体系改革,为此,笔者所在技师学院一方面不断根据招聘企业的专业技能要求调整计算机专业课程体系的内容,删除、淘汰一些过时的课程,增加一些新技术课程;另一方面在实训教学中引入案例法,从学生学习的兴趣点培养入手,在加强学生基本的实操能力训练的基础之上,逐步加大程序设计能力的培养,收到良好的教学效果。笔者就以Visual FoxPro6.0数据库技术与应用为例,简述案例法在教学中的实际运用。
一、案例教学法的内涵
案例教学法就是在教学过程中,教师通过设置一个难易适中的案例,引导学生循序渐进地展开探究活动,从而在活动的过程中潜移默化地培养学生发现问题、分析问题、解决问题的能力。这种教学方法对技校计算机专业教学来说具有特殊的意义,一是技校生受身心发展状况的制约,逻辑思维能力不强,而采用具体案例,就更加直观、形象,更容易激发学生的学习兴趣;二是便于教师组织、开展教学,教师通过案例,可以随时发现学生对于所讲授的内容掌握的情况,从而调整教学进度与难度,保证教学效果的优化;三是有利于学生程序设计能力的培养。学生通过一个具体案例问题的分析、解决,很容易举一反三,由此及彼,这样就刺激了学生的“发散思维”,这为他们今后走向企业必经的独立工作与独立思考打下了基础。
二、Visual FoxPro6.0数据库技术与应用课程的内容
数据库技术是从20世纪60年代末开始发展起来的计算机软件技术,随着网络技术、多媒体技术的不断发展,数据库技术在各领域得到越来越多地应用。Visual FoxPro作为20世纪90年代兴起的高级数据库管理软件,它是一种完善的编程及数据管理语言,在小型数据库系统开发中得到了广泛应用。而Visual FoxPro6.0是一种32位关系数据库管理系统,它在20世纪80年代流行的Xbase系列软件基础上增加了新的功能特性,性能不断完善,技术不断提高。作为关系数据库管理系统,Visual FoxPro6.0提供了一个集成化开发环境,使数据的组织和操作变得方便、简单,它不仅支持传统的结构化程序设计,还支持面向对象程序设计,适合开发小型数据库应用系统,适合计算机与非计算机专业学生学习。根据教育部计算机基础教育白皮书的要求,数据库应用技术不仅是计算机专业的必修课程,也是非计算机专业“1+X”课程体系中第二层次的重要方向之一。
三、案例法在Visual FoxPro实训教学中的实践探索
由于技工院校计算机专业数据库应用课程的教学目标定位于培养技校生信息技术应用素质,注重数据库基础知识和基本理论的融会贯通,强调数据库应用能力的培养。因此,案例教学法的采用必须兼顾科学性与实用性,一方面教学内容紧扣Visual FoxPro知识的体系结构,在介绍Visual FoxPro基础知识后,逐步深入地讲解数据库与表操作、查询与视图、SQL的应用、数据与数据运算、程序设计基础、表单及控件的应用、菜单设计、报表设计、项目管理等内容,深入浅出地向学生讲解程序、软件、软件开发方法、结构化程序设计、面向对象设计等概念,为学生的专业学习打下扎实的理论基础;另一方面将案例贯穿整个教学过程。在教学的第一个环节就引入案例—“学生管理系统”,后续的教学内容围绕该案例展开,最终完成整个案例的实现。这样就使教学充分体现了案例教学的特点。由于案例经过精心设计,选择学生比较熟悉,比较有代表性的“学生管理系统”,整个教学内容讲述这个综合应用的案例,每一个知识点提出具体的任务和要求,形成一个小的、具体的案例,这样就形成案例与任务共同驱动教学展开的良好情境,也更有利于技校生循序渐进地掌握数据库应用的相关知识。
四、小结
论文摘要 针对现阶段程序设计语言教学中存在的普遍问题,在对程序设计教学思想、程序设计能力认识分析的基础上,提出程序设计语言教学中的若干要点。
1 引言
在计算机专业和非计算机专业的计算机教学中,学校几乎都设置了高级语言程序设计课程。与一些应用软件或工具软件相比,编程课程的教学具有较大的灵活性。很多学生的学习能力较差,课后不肯花时间,久而久之,导致听不懂,给计算机编程语言课的教学带来一定的难度。采用何种教学模式进行教学就成为编程语言教学的一个关键。
2 现阶段程序设计语言教学中存在的普遍问题
根据以往的教学经验和通过与学生、同事之间的交流,得知部分学生反映上课时都能听懂讲解,可在涉及到具体的编程及上机操作时,往往会出现没有思路、无从下手或错误百出,不会调试程序等各种情况,究其原因,在教学方面可能存在以下2个问题。
2.1 过于注重对语句语法的讲解,缺乏以算法为核心的编程题教学教师钟情于举一反三地对使用语句、语法的深入教学,而不是有机地结合算法思想进行教学,贴近生活并引起学生兴趣的编程题讲得很少。由于教学不是站在如何应用计算机工具编程解决实际问题或实际项目的角度,就没有把逻辑与编程解题思路放在主体地位,也就没有很好讲解如何分析问题和解决问题。结果导致学生程序设计能力、上机解题能力训练不够,更谈不上引导学生进行课题研究和科研探索。
2.2 学生厌倦传统的课堂教学,缺乏师生之间的沟通交流学生对于先讲后编、先听后编这一传统的课堂教学方式有厌倦心理。课堂成了教师的“一言堂”,教与学不能衔接起来。有时教师为了赶进度,讲授法成了唯一的教学方法,师生之间缺乏足够的交流和沟通,学生没有有效、实用的学习辅助途径,也间接影响着学生的学习兴趣和学习效果。
3 程序设计教学思想解析
学生与教师的角色改变,就是教与学相互渗透的结果。教学中突出学生的主体能动性,是现代教学方法的核心。教学过程是教师根据教学的目的和任务以及学生身心发展的特点有计划地引导学生掌握知识、认识客观世界的过程,是通过知识的传授和掌握来促进学生身心全面发展的过程。而在教学过程中一定要按照教学规律,只有按照教学规律办事,才能提高教学质量,增强教学效果,并促进学生思维的拓展和能力的提高。
教学应该在理论与实际的结合过程中传授和学习基本知识,从而引导学生运用所掌握的知识去分析问题和解决问题,在动手实践中达到培养学生手脑并用能力的目的。除了进行一些必要的概念讲解之外,教师主要应该让学生通过上机实践的办法来掌握所学内容。一方面,通过上机实践可以加深对课堂理论内容的理解和掌握;另一方面,通过上机实践可以提高学生上机调试程序的能力,提高学生的编程能力,提高学生分析问题和解决问题的能力。
4 程序设计能力认识
程序是软件的本体,程序设计(Programming)是指设计、编制、调试程序的方法和过程。它应排除软件开发中的工程与管理因素,主要指软件开发过程中的技术因素,尤其是计算机技术因素。
根据调查分析,合格程序员必须具有:1)扎实的专业基础知识;2)很强的综合分析和解决问题的能力;3)熟练的编程调试能力;4)创新能力;5)团队合作能力;6)持续的自学能力;7)强烈的好奇心;8)较高的英语水平和软件工程的实践能力等。
应看到,程序设计能力,并非完全等价于程序员所应具备的专业素质,它还包括其他一些内容,如:1)理解问题,根据已知条件,找出求解该问题的数学方法或建立相应的数学模型;2)归纳程序的基本功能;3)设计数据结构和算法;4)用程序设计语言实现算法描述;5)编译与调试;6)测试程序,保证程序正常运行。
综上所述,可以将程序设计能力定义为:依据程序设计思想与观念,应用程序设计语言,采用相应程序开发技术和环境,进行程序设计并达到预计结果的程度。
5 程序设计语言教学要点分析
基于对程序设计教学思想、程序设计能力的认识,为使学生充分掌握程序设计的思想和方法,有效实现程序设计课程教学目标,我认为程序设计教学还应注意并强调以下几个基本的教学任务和要求。
5.1 程序设计基本概念的灌输在整个课程教学过程中,结合具体实例的演示,应向学生反复强调程序,注意学生程序设计中基本概念的理解。学生只有对程序设计基本概念有了正确的掌握,才会为以后课程学习打下基础,为学习兴趣培养埋下伏笔;同时程序设计作为一门特殊意义上的课程,包含了许多计算机用于数据处理的基本原理、基本过程和特点,这些知识蕴藏于程序的基本概念之中,同时这些概念也是程序设计思想与观念的载体。
5.2 结构化程序设计基本概念的培养结合控制语句结构和函数的学习,应着重培养学生的结构化程序设计的基本观念。结构化程序设计的基本思想是采用“自顶向下,逐步求精”的程序设计方法和“单入口单出口”的控制结构,它是程序设计的基本原理之一。贯彻课程始终、通过具体实例潜移默化地培养这一思想,比在软件工程中空洞的说教,更容易被学生理解和接收。
5.3 计算机算法观念的培养通过控制结构、函数等学习,初步培养学生在程序设计中的算法观念。如同数据结构观念培养一样,一则增强学生的程序设计观念,二则也为学生留下广阔的思考空间,以增强学习兴趣。再次,通过这种观念的培养,能够直接提高学生初步的程序设计能力。
5.4 通过优秀的有趣的实例,激发学生学习兴趣恩格斯说“兴趣与爱好是最好的老师”。为了使初学者能尽快地掌握计算机知识,进入计算机的应用领域,在课程讲授过程中,要特别注意培养学生的学习兴趣。学习兴趣就是学生在心理上对学习活动产生爱好、追求和向往的倾向,是推动学生积极主动学习的直接动力。学习兴趣直接关系到教学效果的好坏。为提高学生的学习兴趣,笔者归纳出6个办法:1)通过演示程序突出程序语言的实用性;2)通过简单的编程练习突出语言的易学性;3)运用恰当的类比使复杂问题形象化、简单化;4)做到一题多解;5)要善于举一反三;6)通过解决实际问题使学生乐学。
5.5 有选择地运用多媒体教学直观、形象、便捷的多媒体教学可以使学生在有限时间内迅速理解、掌握、获取更多知识和信息,在教学过程中,我们有选择地使用多媒体教学,将编程语言语法中的深奥理论和逻辑推理的内容,运用多媒体教学直观、形象地讲授给学生,加深其对问题的理解。这样的多媒体教学,收到了将抽象问题形象化、枯燥问题生动化的效果。对于多媒体教学不易实施的程序设计方法的讲解,我们可以采用传统的教学方法,教会学生如何思考、推理,如何用语句实现算法,培养了学生的抽象思维、逻辑推理能力。这样,将传统的教学方法与多媒体教学相结合,大大提高了学生的综合思维能力。
5.6 教师在教学过程中,应当注意设置疑难问题,引导学生思考和探索教学时发现,学生问不出问题的原因往往在于没有真正学好。实际上,问题是最好的老师,是学生学习的引导者,没有问题便没有深入。在教学过程中,引导学生在问题解决中学习,即提出问题,留给学生时间思考、讨论、解决问题,从而更深入地展开学习。实践证明,这种教学方法充分调动了学生学习的积极性和主动性。
5.7 充分利用上机实践程序设计语言,学生与教师在理论课与实践课的角色是不同的。教师从课堂上的教学组织者转变为上机操作的指导者。作为教学组织者,负责知识点的传授,此时教师有较充分的主动性,易于控制所传递的知识内容,可使学生在较短时间内获得较多的知识。但学生只是被动地接受知识,学生的积极参与少。上机操作是实现检验计算机编程语言课堂教学效果的重要方面。此时的教师是上机的辅导者,学生亲自动手、动脑参与教学活动。但是上机操作课对学生来说是轻松的,若教师管理不当,会造成学生无所事事的局面。上机课是对理论课的应用和检验,对教师有更高的要求,因此,上机操作前教师要根据知识点布置相应的练习任务,编程序或调试程序。同时学生要完成有针对性的上机报告,进一步巩固上机成果。
5.8 布置代表性的作业做作业是复习、练习的过程,也是继续和深入学习的过程。我们每次课后给学生布置一些有代表性、恰当的习题,以巩固课堂上所学的内容。也通过学生所做作业的好坏来了解学生对课程内容的掌握程度以及教师的教学效果。对作业中比较普遍出现的错误,我们都要在下节课上当堂讲解,因为那是在上节课没讲清楚所致。作业中表现出与众不同的、新颖的程序设计方法和思路,也要当堂宣讲或作业批注,以鼓励这种另辟新径的有创意的学风。
在程序设计语言教学中,尤其语言基本要素的讲解过程中,或隐或显地,把如上几点教学内容纳入到课堂中,程序设计语言教学必定会从一种就语言而教语言的呆板模式中走出来,充分发挥出其在程序设计能力培养中的作用。
关键词:C语言;实验;教学改革
作者简介:吕风杰(1973-),男,山东沾化人,滨州学院计算机科学技术系,讲师;马士明(1983-),男,山东滨州人,滨州学院计算机科学技术系,助教。(山东滨州256600)
基金项目:本文系滨州学院教学研究资助项目(项目编号:BZXYJYXM200737)的研究成果。
中图分类号:G642.423 文献标识码:A 文章编号:1007-0079(2012)10-0118-02
C语言以其结构化、灵活性好、可移植性强、效率高等优点被广大院校理工科专业选为程序设计的入门课程。[1]随着应用型人才培养改革的不断深入,学生培养目标和教育教学理念也不断更新,但自进入高校课堂20余年来,受传统应试教育的引导,大都将授课重点放在C语言的基本语法的理论讲授上,而实验教学大多用于C语言的语法规则的验证和说明,这种教学模式仅从语言的使用这个单一的角度进行教学而使得大多数学生在学完之后吃不透、用不活所学语言知识。面对这种形势,原先的实验教学计划已远不能满足要求,如何从培养学生能力的角度出发优化实验教学内容,使实验教学与理论教学形成一个目标明确、由浅入深、紧密联系的有机整体已成为当前C语言教学中的迫切性问题。本文从C语言的特点出发,对如何在当前课时、实验资源有限的情况下,通过实验教学促进、完善课堂教学效果,培养学生实践能力、创新能力和应用能力进行了深入的探讨与实践。
一、改革实验教学内容
在应用型人才培养模式下,实验教学的组织要兼顾实践性与创新性。我们在原有教学大纲的基础上,根据电子信息类专业的特点重新修订了实验大纲,教学内容中提高了设计性和综合性实验的比例。
1.改革实验内容组织结构
为了不影响专业教学计划,又能保证实验教学改革的顺利进行,我们结合理论教学进度,编写了相对开放的实验教学大纲和讲义,将实验分为基础性实验、设计性实验和综合性实验三个层次,又将每个层次的实验内容分为必做和选做两类,以供不同专业按要求进行灵活选择。根据理论教学进度安排基础性实验,让学生熟悉编程、调试环境,掌握基本指令并学会简单编程,加深对课堂理论教学内容的理解;在单元章节之后安排设计型实验,采用任务驱动教学法,验证性与应用性实验相结合,在完成基础性实验的基础上,逐步丰富功能要求,并要求学生在实验报告中加以总结归纳,培养学生的综合思维能力;综合型实验其实是一个开放性试验,安排于每个知识单元或模块(从知识的角度出发,独立于理论教材编排)完成之后,每一个项目只给出具体的功能及性能要求,对具体方法不作要求和指导,并将一个实验课题分为设计、调试、总结、改进等几个进程,先由学生根据题目要求完成功能设计并通过调试,再由教师根据学生的设计从功能及性能方面进行有针对性的分析讲解,进而提出设计建议,然后由学生完成设计改进并写出实验报告及分析总结,以达到实践性与创新性的同步提高。
2.创新实验内容
目前,高校教学过程中所用教材及参考书大都以普教为目标,极少有针对专业或行业的例题和习题出现,而各高校开设的C语言实验教学内容恰恰大多为所用教材或参考书的习题。这类经典习题专业针对性差,对学生来说缺乏趣味性,用以进行功能验证尚可,但对于能力提高或创新教育的确是勉为其难了。而且随着网络等学习资源的普及使得问题的解决极为简单,学生仅需上网搜索一下即可得到完整答案,于是实验课程就成了简单的验证,很难起到锻炼和提高的作用。
为此,我们专门针对电子信息类专业的特点精心设计了实验内容,基础性实验采用经典案例,针对性强,利于学生的入门学习;设计型和综合型实验尽量选择与学生专业相关的项目,如数字滤波的实现、数据分析与验证等。这样一方面能够贴近学生所学专业,使学生不但学会了C语言,而且使得C语言有了“用武之地”;另一方面,在实际学习过程中,能够将学过的其他专业知识融入进来,提高了学生的兴趣及学习积极性,对其他专业课程的学习以至学生的学习风貌与学习态度起到了积极的推动作用。
二、改革实验教学模式
随着各高校对高等教育应用型人才培养改革的不断深入,各专业的教学内容有了较大幅度的修改和增加,在实际教学安排中“C语言程序设计”的理论与实践课时都进行了一定程度的压缩,为保证实践教学效果,在组织教学时进行了一些改革。
1.推行任务推动教学
随着计算机技术的应用与发展,C语言作为各理工科专业的程序设计入门课程,其培养方向应该是掌握程序设计及调试的一般方法,所以在实验教学组织中应以程序设计为主线,有意识地淡化C语言本身语句、语法的介绍,并积极推行典型算法与案例教学相结合的方法,通过精心设计与编排,将复杂枯燥的语法知识分解到每个生动、有趣、实用的程序实例中,把软件工程学的思想贯穿于算法分析和程序设计的过程中。例如,在每个知识单元开始之前先提出一个典型问题,如“业绩提成计算”、“数据排序”等,从问题入手,然后循循善诱,通过任务的分解、解决、综合逐步加以解决,这样不但使学生在程序分析与解决中掌握了相关语法,而且程序设计和解决问题的能力也得到了极大的提高。[2-3]
2.突出结构化程序设计特点
结构化程序设计是C语言程序设计的一大特点,而在当前的教材中却极少涉及到相关的实例,从而使得结构化程序设计在C语言教学中成了一句实实在在的空话。有些学生平时学得很认真,对语法、语句等细节也很熟悉,但碰到稍微复杂一点的编程则无从下手。在教学中,教师应该将现代程序设计的相关理念传授给学生:一般来讲,一个较复杂的软件常可以按功能分割为若干个典型的小模块,每个小模块最终都成为功能单一、结构清晰、接口简单、容易理解和编写的小程序,而加工对象――“数据流”就是将这些模块串接起来的“主线”,只要让学生掌握了典型的算法就可将这些算法变成像搭积木一样组装成相应软件的算法。
如在学过数组部分后,教师给出一个由计时函数GetTickCount()、格式输出函数printf()函数、格式输入函数scanf()一起构成的能够测试人的反应时间的“反应计时器”函数。在此基础之上布置学生设计主函数和相关函数,通过调用“反应计时器”函数完成两个个体各一组样本的采集(如各采集并存储10个独立的反应时间),并计算各自平均值、标准差等指标;进而进行t检验,对个体差别进行分析验证。这样不但使学生学会了相应的算法实现,而且对结构化程序的灵活性和易于扩展等特点及工程应用中的程序设计方法有了较为深刻的理解,同时对工程数学中较为“死板”的统计与检验内容的实际应用有了一个感性的认识,达到了实践能力与创新能力共同提高的培养目标。
另外,在教学过程中,教师还应有意识地总结归纳一些典型算法,并作为验证型实验内容,要求学生熟练掌握,如累加、累乘、查找、排序等,在后续设计型和综合型实验中将相关内容加入,使得学生能够用会、用活,为以后的程序设计奠定基础。同时,典型算法的熟练掌握也可增加学生学习计算机语言的信心,并提高学习兴趣。[4]
3.充分利用多媒体及网络教学平台
多媒体课件具有演示直观、动态性强等特点,易于被学生所接受和理解,尤其对于实践教学,多媒体课件能够进行直观的演示与模拟,满足了实验教学的要求,把难以理解的内容或不容易观察到的事物用多媒体充分显示出来,调动学生的视觉直观功能,为突破难点创造出良好的氛围,有效地弥补传统教学的不足。
运用网络教学平台进行课后习题的布置与讨论,引导学生提出问题并找寻解决方案。一方面,充分节约了课堂教学时间,缓解了课时不足带来的影响;另一方面,能够将更多的学生吸引到问题的分析与讨论中,“讨论出真知”――相对课堂教学而言,网络讨论扩大了讨论的参与面,能够最大限度地穷尽并纠正学生在问题理解过程中可能出现的问题,极大地提高了学生的学习积极性与学习效果。
4.强化实验教学过程管理
C语言是一门实践性很强的课程,除了要把理论知识学好外,上机实践也是相当重要的一个关键环节。学习中存在的疑点或难点,学生可通过上机调试得到明确解答,同时也加深对学习内容的理解。对学生而言,在每一次的上机前应做好充分准备,编写好上机内容;对上机中出现的问题应能调试分析,编写实验报告,分析程序结果。学生只有反复上机操作才能对C语言有更深、更全面的认识和理解,逐步提高实际操作和学习的能力。对教师而言,应精心设计上机实验内容。设计上机内容时,尽量把所学的内容综合起来,达到知识的系统化。同时,也可布置一些趣味性较浓的内容,以提高学生的学习兴趣,变学生的被动学习为主动学习。另外,上机内容尽量结合学生专业,让学生觉得学有所用。
三、改革实验教学评价模式
注意综合素质的培养与评价,在“C语言程序设计”期末考核中采用实验与理论考核相结合、平时成绩与期终考核成绩相结合的综合考核评价方式,并采用实验教学成绩一票否决的形式,从而改变学生在以往课程学习中“重理论,轻实践”的思想,激发学生学习的积极性与自主性,尤其在创新性培养上。具体做法是摒弃原先那种以对错判分的一刀切的评价方式,在平时教学中对学生实验完成的成绩评判要采用个案分析的方法,在充分理解学生设计意图的基础上因势利导,对设计中的创新之处或闪光点要给予充分的肯定;对不足和错误之处要帮助学生仔细分析,然后由学生自己总结改正,以提高学生的自信心,保护其学习兴趣,最后根据学生的完成情况及钻研态度进行综合评判。
四、总结
任何一种程序设计语言都有其独有的语法特点,作为程序设计入门课程的“C语言程序设计”也不例外,但是,应该认识到在高校C语言教学中,学习语法不是学习程序设计语言的真正目的,而是应该在掌握语法的基础上,通过学习与实践,真正地学会使用C语言来解决各种实际问题,进而使学生掌握程序设计思想,真正成为学生进入程序设计领域的“敲门砖”、“导航灯”。通过对近两年的学生期终理论考试成绩对比分析发现,改革前后对于语法部分的得分率没有明显变化,而综合编程题的得分率比以前有了大约25%的提高,且学生学习的积极性比以前有较大的提高,课程结束后不少学生又通过计算机等级考试等各种形式进行了进一步的学习与提高,C语言实践教学改革取得了理想的效果。
参考文献:
[1]谭浩强.C程序设计[M].北京:清华大学出版社,2006.
[2]郑人杰,马素霞,殷人昆,等.软件工程概论[M].北京:机械工业出版社,2001.
关键词:抛锚式教学模式;面向对象程序设计;教学案例
抛锚式教学模式是基于真实或模拟情景的信息化教学模式,它通过情景产生学习需求,确定教学内容和教学进程(就像轮船被锚固定一样),通过镶嵌式教学和学生的主动学习,亲身体验识别解决问题,从而达到学习的目标。
面向对象程序设计是近年来迅速发展的软件设计思想和技术,它是在继承结构化程序设计技术的优点与长处的基础上产生的一种全新的程序设计思想和方法,在软件开发中有着广泛的应用。《面向对象程序设计》是高等学校计算机及相关专业必修的一门重要课程,研究如何在教学过程中运用信息化教学模式对于提高教学质量、培养学生掌握面向对象程序设计的知识和问题解决的能力具有一定的实践意义和价值。
1.《面向对象程序设计》教学的特点
把握课程的特点是开展教学的起点和选择合适教学模式的关键。面向对象程序设计是在继承传统的结构化程序设计的基础上发展而来的。因此,《面向对象程序设计》的教学重点应该包括面向对象程序设计的基本概念和结构化程序设计与面向对象程序设计的区别两个方面。
面向对象程序设计基于一种抽象的数据类型——类,和这种抽象数据类型的实例——对象[1]。对象是具有某些特性的具体事物的抽象,对象有属性和方法,分别用来表征对象的状态和行为,类是创建对象实例的模板,用来描述具有相同属性和方法的对象集合,它定义了集合中每个对象共有的属性和方法,对象是类的实例。事件是能被对象所识别的外部刺激,如单击鼠标。面向对象程序设计通过事件驱动机制处理事件,即只有在事件发生时程序才会运行,否则处于静止状态。图1表明了这几个概念之间的联系[2]:
图1 面向对象程序设计中基本概念的关系
2.《面向对象程序设计》教学中的抛锚式教学
2.1理论基础
抛锚式教学模式是指在多样化的现实生活背景中(或在利用技术虚拟的情境中)运用情境化教学技术以促进学生反思,提高迁移能力和解决复杂问题能力的一种教学方式[3]。所谓的“锚”,是指在情景中创设的事例和提出的问题。抛锚式教学模式是建构主义教学模式之一,建构主义主张学习者通过感受真实的环境达到对事物的本质及其相互之间的联系的认知。抛锚式教学模式以真实的事例或问题为锚,在问题背景中产生学习需求,通过主动学习、生成学习和与其他学习成员之间的交流与合作,亲历从识别目标到达成目标的全过程[4]。
抛锚式教学具有与传统的课堂教学不同的特征:通过真实或者设置的情景引出用作“锚”的问题或者实例;教师不再是传统教学中知识的传播者,而是学生学习的引导者、支持者和学习伙伴;学生通过自主和合作的方式进行学习;强调教学的无序性,也就是教学顺序与预先确定的教学设计不一致,无序性教学富有弹性,教学信息不确定,教学目标具有相对开放性,教学结果有弹性[5]。
2.2教学案例
以掌握面向对象程序设计的三大特性中的“继承”、“多态”及“接口”的概念教学为例,下面谈谈在面向对象程序设计教学中如何实施抛锚式教学,程序的实现使用C#语言。学习的前提是学生已经掌握面向对象的概念和“类”的概念,掌握构造类、属性和方法的知识。
“继承”、“多态”和“接口”之间既相互联系又有区别,为保持教学内容的连贯性和逻辑性,将本次教学分为2个单元,分别学习“继承”、“多态”和“接口”。
单元1:“继承”和“多态”
情境1:计算机动画展示:一只“喵喵”叫的“猫”和一只“汪汪”叫的“狗”,动画显示它们都属于“动物”。
问题1:“分别为猫和狗创建2个类‘Cat’和‘Dog’,这2个类都具有表示名字的属性‘name’和表示动物叫唤的方法‘shout’。建立主程序,在其中实例化猫和狗的对象,输出这2个对象的‘name’,执行‘shout’方法,分别输出‘喵’和‘汪’。”
问题1的提出是建立在学生已经掌握了“类”和“对象”的概念基础上。建立1个“Cat”类和一个“Dog”类,它们具有功能相同的属性和方法。学生根据自己掌握的面向对象的知识和对问题的理解,可以自己独立解决问题,也可以通过与其他同学交流协作的方式完成任务。
问题2:“问题1中创建了2个类,主程序中执行了一些操作,在这2个类和主程序中,许多代码是重复或相似的,这些代码被称为冗余代码,有什么方法将代码精简,实现代码的重用?”
如前所述,学生建立的2个类中具有形同功能的属性和方法,代码冗余度大,复用率低。面向对象程序设计允许通过类的“继承”实现代码的优化和复用。在解决问题2之前要让学生掌握“继承”的概念,并掌握以“继承”的方式建立新类的操作,然后着手解决问题2提出的问题。通过分析“Cat”和“Dog”两个类的共同点,建立一个“animal”类,该类有1个“name”属性和1个“shout”方法。重新构建“Cat”类和“Dog”类,让它们继承自“animal”类。重写主程序,输出“name”、执行“shout”方法。这时学生会发现出现新的问题:“Cat”对象和“Dog”对象执行“shout”方法输出的结果是相同的。由此引出问题3。
问题3:“为什么执行重构后的程序,‘Cat’对象和‘Dog’对象执行‘shout’方法得到相同的结果?这显然是不合实际的,如何解决?”
问题3引出了面向对象程序设计的另外一个重要属性“多态”。所谓多态,在面向对象程序设计中是指的同一个消息或者操作作用于不同的对象产生不同的结果。在解决问题3之前要让学生掌握“多态”的概念,然后着手解决问题。重构“animal”类,将“shout”方法改为没有方法体的抽象方法。重构“Cat”和“Dog”类,在其中重载“shout”方法,并分别实现各自的“shout”方法。修改主程序,使用“animal”类分别实例化一个“Cat”对象和一个“Dog”对象,它们执行“shout”方法后得到不同的结果。
单元2:“接口”
情景2:在情景1的基础上,计算机动画在“猫”的下方显示一只“机器猫”,“机器猫”一边“喵喵”叫,一边变魔术,变出一条鱼。接着在“狗”的下方出现一只“机器狗”,“机器狗”一边“汪汪”叫,一边变魔术,变出一根骨头。
问题4:“动画中我们看到‘机器猫’和‘机器狗’除了分别具有‘猫’和‘狗’的一般特征外,还具有普通猫和狗不具备的特征,请用程序分别输出‘机器猫’和‘机器狗’叫唤的声音‘喵’和‘汪’,并输出‘机器猫’和‘机器狗’变魔术的动作‘机器猫:变鱼’和‘机器狗:变骨头’。要求运用接口的知识解决该问题。”
“机器猫”和“机器狗”都要具有普通猫和狗的属性,它们应该分别派生于“Cat”类和“Dog”类。它们又要分别实现“变”这个动作,如果让2个派生类分别实现各自的“变”的动作,则显然又会显出代码的冗余。似乎可以像上面的“猫”和“狗”那样构造一个基类,让“机器猫”和“机器狗”继承基类。可是C#语言只允许单继承,“机器猫”和“机器狗”已经分别继承自“Cat”类和“Dog”类了,如何又能继承自其他类呢?解决问题的办法就是使用接口。接口是用来定义一种程序的协定。在面向对象程序设计中,接口主要用于行为跨越不同类的对象,使用接口可以很好地增强现有类的功能,保证在特定的环境下系统自动实现这些功能。
要解决问题4必须学习“接口”的相关知识,以及如何使用“接口”的操作。学生将在教师的引导下通过教师的讲解和自主学习掌握这些知识,然后解答问题4。创建接口“IChange”,使其具有“change”方法。分别从“Cat”类和“Dog”派生出两个类“CatMachine”和“DogMachine”,并且这两个类都要实现“IChange”接口的“change”方法,分别输出“机器猫:变鱼”和“机器狗:变骨头”字符串。由于“CatMachine”类和“DogMachine”类分别继承自“Cat”类和“Dog”类,它们的实例对象都可以实现普通“Cat”类和“Dog”类的功能,又实现了“IChange”接口,具有“变”的功能,并且代码复用率高,冗余度小。
3.教学反思
抛锚式教学密切联系了课程内容和日常生活,从学生已知的知识出发,运用形象生动的情景、实例或者问题设置好教学内容和教学进程,让学生从问题出发开展积极主动的学习。面向对象程序设计的思想是建立在对现实世界对象的基础上的,运用抛锚式教学模式能够很好地将面向对象的概念和操作与真实世界联系起来,充分利用知识之间的联系一步步地引导学生掌握面向对象程序设计的知识和相关操作。
参考文献:
[1]杨帆.面向对象程序设计基本结构和思想分析[J].黄石高等专科学校学报,2000,(2):30-34.
[2]邵结.面向对象程序设计教学初探[J].宁波大学学报,2002,(6):90-92.
[3]William R.Booth.Anchored instruction[EB/OL].coe.enco.edu/ET500/Booth/SL D002.HTM/,2004,7.