程序设计的结构范文
时间:2023-07-13 17:32:07
导语:如何才能写好一篇程序设计的结构,这就需要搜集整理更多的资料和文献,欢迎阅读由公文云整理的十篇范文,供你借鉴。

篇1
0、引言
程序设计基础与数据结构是计算机类专业的两门专业基础课,在计算机类专业教学中具有举足轻重的作用,都旨在培养学生的编程能力和计算思维能力,并为后续课程打下坚实的专业基础,但在这两门课程的教学过程中,存在一系列问题,严重影响课程的教学效果。笔者分析和研究产生这些实际问题的原因,对这两门课程的知识融合、内容衔接以及教学实践等进行探讨,提出切实可行的解决方案,更好地实现两门课程的教学目标。
1、课程教学内容和教学目标
程序设计基础课程是学生接触的第一门专业基础课,也是进行计算机编程的入门课程。课程的教学目标是使学生掌握程序设计的基本方法,培养其拥有良好的程序设计风格、较强的软件开发能力以及一定的计算思维能力,为后续课程打下良好的基础。
数据结构是继程序设计基础课程之后的一门综合专业基础课,是计算机类专业的核心课程之一,具有举足轻重的作用。它是程序设计基础课程所讲知识的自然延伸和具体应用。对数据结构的理解、掌握和应用拓展,将对学生解决具体实际问题时的数据分析、数据组织、数据处理和编程能力有着深远的影响。课程的教学目标是培养学生缜密的逻辑思维和数据抽象能力以及学生在软件设计领域中科学的计算思维能力,帮助学生将数据结构和算法与具体的编程实现相结合并灵活地应用到实践和工程实际中。
2、两门课程间的关系
从程序与数据结构本身的关系来说,一个好的程序离不开合适的数据结构,而数据结构中算法的实现离不开具体的程序设计。在计算机类专业的课程体系中,数据结构和程序设计基础课程虽然独立开设,但是它们之间的联系是紧密的。在课程设置上,程序设计基础是数据结构的前导课程,两门课程一脉相承,不可分割。
学生对程序设计基础课程的掌握程度、具备的计算思维和编程能力,直接关系到以程序设计语言实现算法的数据结构课程的教学效果。数据结构课程通过创造性思维的训练,重点突出数据抽象与程序抽象能力的培养,从而进一步提升学生的计算思维能力和编程能力,但两门课程在实际教学中存在一些问题,主要原因是课程设置、教学内容、教学方法和教学实践方式等多方面存在缺陷。经分析,对程序设计基础和数据结构课程进行知识整合和内容衔接,采用适当的教学方式,改进教学实践是探讨和研究的主要内容。
3、两门课程在实际教学中存在的衔接问题
3.1 两门课程教学内容的脱离
目前,在实际教学中,程序设计基础和数据结构课程虽然关系紧密,但是一直被设定为两门完全独立的课程,而且教师在制订教学大纲和教学目标时容易忽视两门课程问的联系,在教学过程中出现一些盲区,要么两门课程在教学内容上出现不同程度的交叉,要么出现知识衔接的断层,令学生对两门课程的内在联系没有整体概念和认识,从而导致不能深入系统地学习相关知识。尤其是先行课程序设计基础的教学内容和课程案例完全脱离了数据结构课程,使数据结构中最频繁使用的知识和内容在程序设计基础课程中甚少提及,不能为数据结构课程的讲解打下扎实的程序设计基础。
3.2 程序设计编程语言与数据结构实现语言不一致
程序设计基础课程所教授的编程语言与数据结构教材或实验所使用的实现语言不一致,如将C++语言作为程序设计基础的教授语言,而在数据结构的实现上选择c语言或Java语言,以至于数据结构的理论教学与具体上机编程实现脱节,严重影响了上机实验和课程设计环节。
3.3 程序设计方法与数据结构实现方法不一致
程序设计基础课程中或注重面向过程的程序设计方法,或注重面向对象的程序设计方法,但在数据结构课程中却很难利用前导课程中学到的程序设计方法实现相关的数据结构和算法,从而影响了学生对数据结构课程知识的应用与实现。另一方面,学生在学习过程中没有充分理解数据结构课程的作用和实际意义,以至于在实际项目和问题中不知使用什么方法(面向过程或面向对象)分析解决问题,不知如何运用数据结构知识解决实际问题。
3.4 前导课程对后续课程实践环节的影响
数据结构实验环节相对课堂理论环节较薄弱。此问题的存在多半是因为数据结构具体实现的关键技术在程序设计基础课中未被讲解或强调,在进行数据结构算法从理论到伪代码、再由伪代码到真代码转换的过程中难以真正编程实现,使学生对数据结构的理解和掌握仅停留在抽象层、概念层、理论层,难以上升到实现层,从而影响学生的学习兴趣和积极性。同时,课程中的实践项目过于单一且相对独立,使实践环节与实际项目的联系过于松散,学生运用所学知识解决实际问题的能力和实际工程能力很难得以锻炼。
3.5 缺少计算思维能力的培养,缺乏理论知识与实际应用的联系
提高学生计算思维能力是程序设计基础和数据结构课程共同的目标。计算思维是抽象的多个层次上的思维,而抽象是表达实际的方法。然而,现行教学方法过多关注程序设计和数据结构知识点的讲解,缺乏对学生思维能力的培养。
如果缺乏理论联系实际,那么将影响学生计算思维的培养。数据结构中的知识又太抽象,如果缺乏相应的实际案例对抽象知识加以应用,那么就会导致学生不知道怎样将所学的知识应用到实际中,缺乏具体问题具体分析和解决的能力。
3.6 教师本身知识结构欠缺,上机实践指导教师数量不足
授课教师知识结构的缺乏将导致一些现实问题:如果程序设计基础的教师不懂数据结构,那么其自然不会将相关知识引入课堂,同时也缺乏用所教授的语言具体实现数据结构中结构和算法的能力;如果数据结构的教师缺乏相关编程语言知识,那么就会给上机辅导带来困难。同时,两门课程具有很强的实践性,若上机实践辅导教师不足,将不利于学生编程能力的提升以及相关软件大赛学生的培养和辅导。
针对以上实际教学中存在的问题,可知为提高程序设计基础与数据结构课程的教学效果,根据计算机类专业这两门课程教学内容和目标,对两门课程进行知识整合和内容衔接的必要性,对课程衔接的方法和思路等进行探讨势在必行。同时,课程教学不仅要关注知识的传授,还要培养学生主动获取知识并综合已有知识创造新知识的能力。
4、程序设计基础和数据结构课程衔接的新方法和思路
4.1 做好两门课程教学内容的融合和衔接
教师需紧密结合计算机类专业的培养目标,精心设计程序设计基础和数据结构课程的教学内容,既要满足课程的专业基础性,又要满足后续课程学习的需要,严密制订教学大纲,做好程序设计基础与数据结构教学内容的衔接以及相关教材的选定。
在程序设计基础课程教学中,教师需要关注学生计算思维能力的培养,将重点放在讲解思路上,教学生如何对问题进行抽象,还要介绍一些简单的基础算法和数据结构。程序设计与数据结构的联系过程必须做到循序渐进,若引入的数据结构相关知识过难,会打击学生的学习积极性。例如,教师讲数组时可引入几种数据结构中简单的排序算法冒泡排序、选择排序等;讲完指针和结构体后可引入最基本的数据结构――链表;讲完嵌套函数调用后可引入“递归”,它是数据结构中解决问题的常见思想和算法,可以通过简单的递归函数帮助学生理解递归思想和递归调用过程,这些是理解数据结构中复杂递归函数的基础。在程序设计基础教学中,只讲递归函数的简单应用,而在数据结构教学中,需要介绍递归函数的复杂应用:栈、树、八皇后问题、N个数的全排列等。围绕“递归”这一重要知识点,从易到难并结合课程本身特点进行理论分析,将有益于整合课程教学内容,引导学生循序渐进地学习和思考。
针对在程序设计基础课程中不重要但在数据结构及算法中被广泛使用的知识点,教师需要在讲解程序设计课程时将其点出并告诉学生此知识在后续数据结构课中的重要性,引起学生对该知识点的兴趣和重视,如指针的灵活使用、结构体类型的复杂应用、类型重命名、类的拷贝构造函数(深拷贝)、函数模板、类模版等。
同时,教师要对程序设计基础课程内容进行适当补充和扩充,如增加c++函数模板、类模板的相关知识,为将泛型程序设计、c++的STL引人数据结构课程奠定知识基础,缩小教学知识与实际运用的距离,提高学生的动手编程能力和知识运用能力。
4.2 保证程序设计编程语言与数据结构实现语言的一致
程序设计基础课程所教授的编程语言要与数据结构教材或实验所使用的编程语言一致,这样不仅能大大提高学生的编程能力,还有利于数据结构课程的上机实现。
4.3 将面向对象思想引入程序设计与数据结构中
随着程序设计方法从传统的结构化程序设计演化到面向对象程序设计,数据结构在面向对象程序设计中也将成为面向对象的数据结构,且将随着程序设计理论和技术的发展而不断变化发展。在程序设计基础课程中讲授面向对象的编程语言如c++语言,既可以实现面向过程的数据结构,又能实现面向对象的数据结构。数据结构课程采用面向对象的观点讲授并以C++语言作为算法的描述工具,从而强化数据结构基本知识和面向对象高级程序设计基本能力的双基训练以及实际动手能力培养。在设计数据结构实践项目时,将面向对象的程序设计思想、面向对象的程序设计语言和数据结构课程教学内容恰当地融合,有效整合两门课程中的重叠部分,突出各自的侧重点,符合当前软件设计思想和软件开发趋势。
4.4 加强课程中计算思维能力的培养
在程序设计和数据结构的教学方法上,将面向语法为中心的教学逐渐转变为面向问题求解的教学,从问题出发采用适当的数据结构,将其抽象成解决问题的算法描述,用程序设计语言实现问题求解,使课程从过去的仅讲授孤立的知识点,转变为讲授计算思维和问题求解的过程,从而达到突出思维方法训练的目的。在程序设计基础和数据结构授课时尽量将理论联系实际,将知识点解释和应用为身边容易理解的真实案例。例如,讲“图”时,可以把现在流行的复杂网络、社交网络引入其中;讲解“队列”时,可将春节买票引入其中,让学生从身边的例子理解理论知识的具体应用。对有些案例可以提倡“一题多解”,不局限于一种数据结构、解题思路和实现方法,通过一题多问、一题多解带动学生探索、比较、寻求更好的解决途径,达到学生分析解决问题能力的提高和计算思维能力的培养。
4.5 提升教师能力,配备充足的上机辅导教师
学校要加强程序设计基础与数据结构课程相关授课教师整体能力的提升。教师不仅要掌握自己所教授课程的知识,还要对该课程的前续及后续课程内容有所了解,便于维护教学的整体秩序和融合学生的知识体系。同时,教师要积极参与各种软件大赛和企业培训,将教授的理论知识和实际项目相结合,达到应用知识解决复杂问题的目的。此外,两门课程的上机实践环节要配备足量的辅导教师,不让学生输在编程入门的起跑线上。
4.6 依托程序设计竞赛,提高学生的编程能力
依托全国软件大赛、ACM大赛等程序设计竞赛,将竞赛题目引入程序设计基础和数据结构课堂中。此类题目强调考查学生对各种算法的应用能力,综合性较强,非常适合辅助学生学习和体会数据结构的妙用,提升学生分析和解决实际问题的能力,引导学生将所学知识准确而灵活地运用到实际生活中,大大提高学生的实践动手和程序设计能力,促进其知识的融会贯通。另外,通过竞赛等多种活动可以为学生提供展现程序设计能力的舞台,激发学生学习的主动性,培养其计算思维能力。
例如,在教授程序设计基础时,讲完逻辑表达式和多重循环结构后,可以将大赛中的逻辑推理题目引入教学中并引出常见的解题方法和思路一枚举法,从而加深对枚举法的认识。通过采用数据结构中的双向链表和线性数组两种方式实现大赛中常见的约瑟夫环问题。
4.7 引入OJ平台。加强课程实践环节
引人在线判题(Online Judge,oJ)系统,提高学生的实践能力。能力需要以丰富的知识作为支撑,而实践是能力赖以生长的土壤。在OJ系统中,学生可以在线提交程序源代码,系统对源代码进行编译和执行并通过预先设计的测试数据检验程序源代码的正确性。引入0J系统不仅可以辅助教师批改作业,减轻教师工作压力,还可以促使学生加强平时上机编程练习,通过编程排名方式提高学生的学习兴趣。OJ系统中拥有大量题库,可以让学生进行上机实践,培养自身的计算思维能力,提高编程能力。0J系统不仅可以作为程序设计基础课程的实践平台,还可作为数据结构课程的实践平台。
篇2
关键词:结构化程序设计 数据结构 算法 设计技巧
近年来,计算机程序设计技术已从结构化程序设计技术逐步向对象程序设计技术过渡,特别是当设计一个较大规模的应用程序时,面向对象设计思路成为首选。纵观计算机软件技术的发展,在局部功能的实现上及功能模块的设计上,结构化程序设计仍然有其不可替代的独特魅力。在结构化程序设计中(以C语言为例),巧妙地运用一些设计技巧,对增强程序的稳定性和可靠性,简化程序操作步聚,提高程序的运行效率十分有效。
结构化程序设计的概念最初是由荷兰学者E・W・DUKSTRA等人在20世纪60年代提出的,它的基本思路是:以模块化设计为中心,将原来较为复杂的问题简化为一系列简单模块的设计,也就是将一个大的计算任务划分为若干个较小的任务,这些小任务均由函数来完成。函数既可以是C语言定义的标准库函数,也可以是自定义函数。在实际应用程序中,一个具备一定规模的C语言程序往往由多个函数组成,其中必有一个命名为main的主函数,由main来调用其他函数。必要时,其他函数还可以调用另外的函数,同一函数可以被一个或多个函数调用一次或多次。
结构化程序设计把程序归结为用顺序结构、选择结构和循环结构等三种基本结构来描述的逻辑问题。顺序结构的程序流程是按语句的书写顺序依次执行;在C语言中,有4种语句是顺序执行的:即空语句、表达式语句、函数调用语句及复合语句;选择结构是对给定条件进行判断,根据判断结果决定执行两分支中的一个分支或多分支中的一个分支,选择语句有if语句和switch语句;循环结构是在给定条件成立的情况下,反复执行某个程序段,循环语句有for,while和do-while语句以及一些辅助流程转向语句如continue,break,go to等等。以上三种结构通过流程控制语句来实现。流程控制语句在程序设计中起着十分重要的作用,通过三种基本控制结构的合理调配使结构化程序具有唯一的入口和出口,不会出现死循环,而且程序的静态形式与动态执行形式之间具有良好的对应关系。
从以上结构化程序的基本特点分析,结构化程序设计主要强调的是程序。程序=算法+数据结构+程序设计方法+语言工具和环境,其中算法是灵魂,是解决“做什么”和“怎么做”的问题;数据结构是加工对象;语言是工具;编程需要采用合适的方法。具体解决主要问题包含以下几个步骤:
分析问题,找出解决问题的模型根据模型设计出适合计算机特点的处理方法即算法进行编程程序,以实现算法上机编辑(.c)、编译(.obj)、连接(.exe)、运行所编制的程序,直到得出正确结果对结果进行分析,整理出文字材料。
程序设计的任务不只是编写出一个能得到正确结果的程序,还应考虑程序的质量,否则编写的程序就会出现质量低下、可靠性差、开发周期长、维护费用高等不良后果,即所谓的的“软件危机”,它会严重阻碍计算机应用的发展。由于大多高级语言都支持结构化程序设计方法,其语法上都含有表示三种基本结构的语句,所以用结构化程序设计方法设计的模块从结构到程序的实现是直接转换的,只需用相应的语句结构代替标准的控制结构即可。笔者在实际应用中,总结出以下几点实用技巧。
一、通过引申法廓清思路,选准目标
“引申法”就是通过对某一结论的合理引申,结合已经解决的问题,因势利导,在此基础上解决相关联的其他问题。“引申法”可以培养人们在程序设计方面的发散思维,提高程序设计的应变能力。问题是活的,但程序是有章可循的;语法是有限的,可解决的问题是无限的。程序设计相当一部分工作是分析问题,找到解决问题的方法,再以相应的语言写出代码。要熟练掌握一些简单的算法,根据不同的问题,再灵活应用。如用100元钱买100只鸡,公鸡、母鸡、小鸡分别是5元、3元、1元一只。在数学上解三元一次方程,三个未知数,两个方程好像解不出来。通过“穷举法”,我们要费好大一番工夫才能算出结果,但是通过计算机“引申”编程运算却不用一秒钟即可解决问题。只有在分析实际向题的基础上,以清晰的思路去设计算法,才能举一反三,以不变应万变。通过“引申”法,我们可使初学者对函数设计的关键问题有清晰的认识,利于从统筹全局的角度去考虑问题,体现了程序设计逐步求精的思路。
二、利用框架法培养全局思维和算法的整体设计能力
其具体体现在两方面。一是在有了一点编程基础后要利用伪代码或流程图,从算法设计的角度讲解编程思路,而不应拘泥于语法细节,不分主次、逐条语句地讲解代码。这样可以层次分明,突出算法设计的关键,利于培养编程思路。二是在学习重点章节函数时,由于新的算法已很少,主要是学习用函数调用的方法来重新编制以前所熟悉的程序,我们可以把着眼点放在函数的设计框架上,体现参数设计、返回值设计等关键问题,而无需细讲函数体的实现细节。结构化构造减小了程序的复杂性,提高了可靠性、可测试性和可维护性,使用少数的基本结构,就可使程序逻辑结构清晰,易读易懂,并且容易验证程序的正确性。
三、借助求异法引导新思路,启迪新思维
结构化程序设计方法的基本思路是:把一个复杂的问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。一个固定的问题,解决的方法可能不唯一,如果能启发人们多角度、多侧面去寻求解决问题的办法,则可激发思考的积极性,提高其学习兴致。对一个初学计算机语言的人来说,最重要的就是要有正确的程序流程概念,不仅要懂得,而且要灵活应用。由此可见,用结构化方法设计的结构是清晰的,有利于编写出结构良好的程序。在C语言中一题多解的情况有很多,有意识地引导新思路,鼓励新方法,以培养人们在编程中的求异思维,而不是死记硬背,墨守成规。结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。
四、选准切入口,合理划分功能模块“分而治之”
结构化程序设计的关键在于功能模块的选定和划分。模块化设计的思想实际上是一种“分而治之”的思想,把一个大任务分为若干个子任务,每一个子任务的划分以相对简单为前提。划分子模块时我们应注意模块的独立性,即:使一个模块完成一项功能,耦合性愈少愈好。具体应用时从问题本身入手,自顶向下,逐步细化,精益求精,将解决问题的步骤分解为由基本程序结构模块组成的通过程序流程图、N-S图、PAD图表格等表示的结构化程序框图。在实践应用中往往会出现以下几个问题:一是用户要求难以在系统分析阶段准确定义,致使系统在交付使用时产生许多问题。二是用系统开发每个阶段的成果来进行控制,不能适应事物变化的要求。三是系统的开发周期较长。
为解决这些问题,我们要求模块的设计要简洁明了,语句的选用要直观,不要拖泥带水。下面是一段小程序,从中可以看出一些语句选用的技巧。
某淘宝商城为鼓励更多网友光临本店,对新老网友给出如下优惠:凡是购买10件以上者,打9折;20件以上者,8.5折优惠;30件以上者,8折优惠,40件以上者,7.5折优惠。如用习惯上的if嵌套语句编写程序如下:
Main()
{float x,y;
printf(“请输入优惠购额款X:\n”);
scanf(“%f”,&x);
if(x
y=x;
else if(x
y=0.9*x;
else if(x
y=0.85*x;
else if(x
y=0.8*x;
else
y=0.75*x;
printf(“网友应付优惠后款额Y为:y);}
显然,这段程序冗长,一旦情况有变化,难以扩展。转换为switch语句结构后,程序就变得相对简单:
Main()
{float x,y;
Int t;
Printf(“请输入优惠购额款X:\n”);
Scanf(“%f”,&x);
If(x>=40)
t =4;
elst
t=(in)(x/10);
switch(t)
{case 0:y=x;break;
case1:y=0.9*x;break;
case2:y=0.85*x;break;
case3:y=0.8*x;break;
case4:y=0.75*x;break;}
printf(“网友应付优惠后款额Y为:y);}
两种方法可谓异曲同工,但是对于程序的调试性和可维护性却有天壤之别。在结构化程序的编程实践中,我们要查找某些错误比较困难,所以要尽可能避免出现这些问题。编程技巧需要在编制和调试结构化程序时不断总结和完善,力求找出最简便、最直观的方法。
总之,结构化程序设计方法在实际应用中有许多技巧可以合理运用,这需要我们对算法和数据结构展开深入分析,寻找最佳结合点,有的放矢,对症下药;更需要在实践中不断总结和积累。在编写过程中我们觉得有些程序没什么问题,但是一上机调试,就出现这样或那样的问题,这说明程序还不完善,还需要调整或改进。当今,高效率和快节凑的生活与工作方式对程序的设计提出了更高的要求和更苛刻的标准,我们只有不断创新设计理念和方法,才能编制出更多高质量、高性能、低故障的优质程序。
参考文献:
[1]林锐等编著.高质量程序设计指南[M].北京:电子工业出版社,2002.
篇3
(河北师范大学数学与信息科学学院,河北石家庄050024)
摘要:针对计算机类本科专业数据结构课程与Java面向对象程序设计课程之间的衔接问题,分析数据结构中集合、线性表、树和图等知识点与Java Collections框架之间的映射关系,提出按照数据结构中学生建立的知识体系组织Collections框架的教学,说明面向数据结构知识体系的Java课程教学实施方法。
关键词 :数据结构;Java;Collections框架;课程衔接
文章编号:1672-5913(2015)15-0082-03
中图分类号:G642
基金项目:河北省精品课程建设项目“数据结构”。
作者简介:董东,男,副教授,研究方向为数据挖掘及应用,dongdong@hebtu.edu.cn。
0 引 言
数据结构是计算机类本科专业核心课程之一,其后继课Java面向对象程序设计也是重要的专业课程之一。通过对数据结构的学习,学生初步掌握了为实现问题求解所需要的基本逻辑结构、存储结构和常见的算法。Java面向对象程序设计则从面向对象程序设计的范式出发,试图使学生理解如何通过对象以及对象间的通信实现问题求解。在Java教学实践中,我们发现存在如下两个问题:①学生无法直接感受到数据结构与Java面向对象程序设计之间的关系,体会不了数据结构的重要性,无法体验选择合适的数据结构和算法对实现问题求解的成就感。②由于JDK开发的历史原因,Java JDK中提供的数据结构与算法的实现并没有与数据结构课程具有对应关系。例如,在Java中,队列(Queue)和线性表( List)都是Collection的子接口,而数据结构认为队列是一种特殊的线性表。
根据在教学中发现的这些问题,我们在Java Collection框架部分的讲授中采取了如下措施:①按照数据结构中学生建立的知识体系组织Collection、Set、List、Queue、Stack等内容的讲授,而不是按照Java API中的继承关系来介绍。②在课程设计实践环节,通过“先动手写自己的算法实现”,然后“阅读并分析JDK相关算法源代码”,通过对照,使学生发现自己在程序设计方面的不足,从而得到在数据结构课程中所学知识的应用体验。
1 JDK中的数据结构
数据结构是数据元素之间的关系。从概念和实现两个角度,可将数据结构分为数据的逻辑结构和数据的存储结构。按照数据元素之间前驱和后继关系来分,数据的逻辑结构可分为以下4种:集合( Set)、线性表(List)、树(Tree)和图(Graph)。数据的存储结构主要包括数据元素本身的存储以及数据元素之间关系表示。数据元素之间的关系在计算机中主要有两种不同的表示方法:顺序映像和非顺序映像,并由此得到两种不同的存储结构:顺序存储结构和链式存储结构。
Java JDK为常用的数据结构定义了一些接口( Interface)和实现(Implementation)。这些接口、实现类以及常用的排序、查找等算法统称为JavaCollections框架(Java Collections Framework).Collections框架的设计目的是要满足如下目标:高性能、一致性、扩展性和轻松编程。Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用即可‘3]。Java中把一组对象称为Collection,也就是说,Collection是对象的容器。Java对Collection中的对象没有任何前驱、后继以及重复性的约束,只是约束了对象类型E。
Collection接口定义了其上的3类操作:针对单个元素的基本操作、迭代器和Collection对象之间的批量操作。基本操作包括增加、删除、判断是否包含某个元素、判断是否为空、容器中当前元素的个数、清空等。批量操作包括:合并两个Collection容器、从一个容器中移走一些元素、保留两个容器中相同的元素、判断一个容器中的元素是否完全包含在另外一个容器中等。
接口Collection<E>的子接口有Set<E>和List<E>。集合(Set)在Collection的基础之上增加了“不允许重复元素”的约束;而List则在Collection基础之上增加了“元素之间具有前驱、后继关系”的约束:除了第一个元素外,所有元素具有唯一的前驱;除了最后一个元素外,所有元素具有唯一后继。
如果仅关心数据元素是否出现,而不关心数据元素之间的次序,则应使用Set<E>。Java为集合接口提供了两个基本的实现:HashSet<E>和Tree<Set>。HashSet<E>是Set<E>接口的典型实现,大多使用集合的场合就是使用这个实现类。HashSet实现类按哈希算法来存储集合中的元素,因此具有很好的查找性能。HashSet不能记忆元素之间的顺序,包括插入顺序。其子类LinkedHashSet<E>也是根据元素hashCode值来决定元素存储位置,但它同时使用链表维护元素的次序,这样使得能够记忆插入顺序。由于LinkedHashSet需要维护元素的插入顺序,所以性能略低于HashSet,但遍历集合里的全部元素性能较好。
实现类TreeSet<E>可以确保集合元素处于排序状态,TreeSet并不是根据元素的插入顺序进行排序,而是根据元素的实际值来进行排序的。TreeSet采用红黑树的数据结构对元素进行排序,并要求添加进TreeSet中的对象必须实现CompareTo<E>接口。
List<E>接口作为Collection<E>接口的子接口,可以使用Collection接口中的全部方法。但是List接口中定义了元素位置和元素范围的概念,使得List可以根据元素位置索引(index)来插入、替换、删除集合元素以及查找指定对象的位置。ArrayList<E>实现类基于数组实现了List接口,其内部封装了一个动态再分配的数组。每个ArrayList对象都有一个capacity属性,这个属性表示它们所封装的数组的长度,当添加元素超过长度时,capacity会自动增长,其默认值为10。LinkedList<E>内部以链表来保存集合中的元素,因此随机访问容器时的性能较差,但在插入、删除元素时性能较好。
Queue<E>接口用于定义队列这种数据结构,队列是“先进先出”的容器,通常不允许随机访问其中的元素。Java中的队列接口Queue<E>没有继承List接口,而是直接继承了Collection接口。如果使用具有固定容量的队列,则应使用offer()来加入元素,使用poll()来获取并移出元素,因为add()和remove()方法在因容量原因失败时抛出异常。如果只是访问队首而不移出该元素,使用element()或者peek()方法。LinkedList<E>类实现了Queue<E>接口,因此我们可以把LinkedList当成Queue来用。PriorityQueue是一个比较标准的队列实现类,它并不是按加入队列的顺序,而是按队列元素的大小来记忆队列元素的顺序。因此当调用peek方法或者poll方法来取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。
Stack<E>实现了List<E>接口,提供了push和pop操作限制线性表中元素的插入和删除只能在线性表的同一端进行。JDK l.6引入的ArrayDequ<E>实现类被优先推荐作为栈使用。ArrayDeque<E>实现了Deque<E>接口。Deque<E>接口定义了双端队列,双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
Java JDK中没有直接提供树和图的接口和实现类,但是可以通过研究TreeMap的源代码学习操作树的一般编写模式。综上,数据结构与Java面向对象程序设计两门课程内容的衔接见表1。
2 面向数据结构衔接的java课程实施方案
Java面向对象程序设计为1学期的课程。总课时为讲授54学时、实验32学时。其中,与数据结构知识点紧密相关的Java Collections框架部分为讲授6学时、实验4学时。在讲授环节,按照表1列出的顺序进行。在实验环节完成与授课内容相关的验证性实验。在课程设计实践环节,要求学生使用Java设计常见算法,然后阅读JDK提供的源代码进行对照。具体方案如图1所示。
比如,在java.util.Collections类中提供了数据结构中学生已经学过的常见算法,如二分查找、计算元素频数、查找最大/最小元素、反转线性表、按照指定距离旋转线性表、随机排列线性表、交换指定位置上的两个元素以及排序等。注意,在Java 6中Collections.sort()使用的是MergeSort;而在Java 7中,内部实现换成了TimSort。
要求学生按照这些API文档说明,首先按照数据结构课程中的知识设计自己的算法实现,然后与API源代码进行比较。由于学生使用C语言版的数据结构教材,所以在面向Collection编程之前,作为过渡,先让学生面向数组编程。
哈希表是一种重要的数据结构,也是实现集合的基本途径之一。通过研究HashSet的源代码,可以让学生理解为什么每个对象都要有hashcode()方法,以及哈希表的编码特点。由于HashSet的实现是基于HashMap的,所以研究HashSet就要研究HashMap。
Map是一种典型的名值对类型,它提供一种Key-Value对应保存的数据结构。客户程序通过Key值来访问对应的Value,这个接口并没有继承Collection这接口;而其他的类或者接口,不管是List、Set、Stack等都继承或实现了Collection。
TreeMap和HashMap算是Java集合类里面比较有难度的数据结构。HashMap元素存取的时间复杂度一般是O(l),而TreeMap内部对元素的操作复杂度为O(logn)。TreeMap记忆了顺序,TreeSet内部的实现使用了TreeMap。
3 结语
数据结构与程序类课程的关系问题愈来愈引起关注,我们提出面向数据结构知识体系的Java课程教学与数据结构课程的衔接方案。这个教学方案已经在河北师范大学本科计算机专业实施三届,取得了较好的效果,学生对算法的理解加深了,解决问题的自信心增强了,也建立了工程意识。
参考文献:
[1]教育部高等学校计算机科学与技术教学指导委员会,高等学校计算机科学与技术专业公共核心知识体系与课程[M].北京:清华大学出版社,2008: 110-111
[2]严蔚敏,吴伟民,数据结构(C语言版)[M].北京:清华大学出版社,1997: 5-7.
[3]扎克霍尔.Java语言导学[M].北京:人民邮电出版社,2008: 293-294.
[4]沈华.数据结构、算法和程序之间关系的探讨[J].计算机教育,2013(4): 58-61.
[5]智慧来,智东杰.Java教学与数据结构教学的衔接与融合之我见[J].计算机教育,2012(14): 81-82.
篇4
【关键词】 闸门 结构设计 计算 程序
1 前言
水电站金属结构中平面闸门的设计计算,由于受专业面窄,使用情况特殊等影响,目前尚无任何软件公司进行程序开发设计,设计单位要么按相近条件套用图纸,要么用传统的计算方式进行设计计算,一套平面闸门的结构设计,计算得费时十天半月甚至更多,且人工操作误按误删,计算错误难以避免,假如错误未被发现和纠正,其产成品有可能酿发严重事故。
有鉴于此,我们在早前的闸门设计工作中,业余花费大量时间和精力,开发了本“平面钢闸门结构设计计算程序(以下简称‘程序’)”,经过反复调试、修改,已成功完成多座水电站的工作闸门、尾水检修闸门等多套闸门的设计成果,每套闸门的程序计算,一个小时不到,即可完成。其产成品投运效果一直良好正常,可以说,本程序填补了水电站金属结构设计领域的一项空白,颇具商业价值。
2 程序开发
值得一提的是,我们研制开发的这套程序,仅限于冗繁复杂的门叶结构的设计计算。所谓门叶结构,系指平面闸门门叶除去面板、止水装置及零部件(行走装置、吊耳吊轴等)的框架梁系结构,一般包括水平次梁、竖直次梁、主梁、顶梁、底梁及边梁等。开发该程序,我们是按以下思路和原则进行的。
(1)确定该程序的使用范围或服务对象是计算水工(包括水利水电)平面钢闸门中相对冗繁复杂的门叶结构设计。内容包括各梁体的力学计算、截面特性计算、强度校核计算等。
(2)要求该程序在平面钢闸门设计中,具有实用性和通用性。如一般水平次粱梁体为槽钢梁或工字钢等型钢梁,其跨度作成3~5跨,就必须要求程序能进行各种跨数的力学计算,并根据使用者指令选择槽钢或工字钢的截面特性计算。又如,要求程序能进行各类主梁(包括组焊的实腹梁和箱型梁以及等截面、变截面梁等)的力学计算和截面特性计算。
(3)选择通俗易懂、人机对话丰富的BASIC语言作为本程序语言,当然,也可将该语言转换为更流行、更简洁的C语言等其他语言。并且选取的变量函数要满足使用者辨认理解和计算机辨识的要求。其实,丰富的人机对话功能在本程序中非常有用,如水压力输入、梁体截面参数输入,KN;=KN输入水平梁跨数,LN;=LN输入指定语句等。
(4)为使编程者思路清晰,程序操作者使用方便,该程序采用了模块化设计,程序共分六大功能模块,包括p0:通用校核;p1:水平次梁;p2:竖直次梁;p3:主(顶)梁;p4:底次梁;p5:边梁。因一般设计中,顶、主梁结构完全相同,差异只是是否承受梁顶水柱压力,故程序将主梁和顶梁合并在一个模块中。
每一模块的初始语句均为清除语句,模块相互独立,互不干扰,方便调试、使用和错误查找及修改。p1~p5任意模块程序运行、完成相关力学计算和截面特性计算后,都自动转入p0进行校核计算,直至结束。
文中给出p2和p0源程序以飨读者,“平面钢闸门结构设计计算程序”完整的源程序从略。
3 p2和p0源程序
(1)p2竖直次梁程序
205:CLEAR
210:INPUT“QQ=”;QQ,“PW=”;PW,“L0=”;L0,“N=”;N, “EX=”;EX, “EY=”;EY
212:LPRINT“q=”;QQ:LPRINT “L0=”;L0:PRINT “PW=”;PW
215:Z=QQ*L0:R1=(2*Z+PW)/2:LPRINT “R1=R2=”;R1
220:QA=R1:LPRINT“Qmax=”;QA
225:MA=R1*L0-Z*L0/2:LPRINT “Mmax=”;MA:MX=MA-N*EY
230:INPUT “BM=”;BM,“D9=”;D9,“H2=”;H2,“DF=”;DF,“H3=”;H3,“T3=”;T3
235:AJ=BM*D9+H2*DF+H3*T3,Y0=(BM*D9*(H2/2+D9/2)+H3*T3*(H2/2+T3/2))/AJ: LPRINT“y0=”;Y0
240:YI=H2/2-Y0+D9
245:YA=H2/2+Y0+T3
250:IX=BM*D9*(YI-D9/2)∧2+H2∧3*DF/12+H3*T3*(YA-T3/2)∧2+H2*DF*Y0∧2
252:LPRINT “I×=”;IX
253:X0=0,IY=(BM∧3*D9+DF∧3*H2+H3∧3*T3)/12
254:LPRINT “X0=”;X0:LPRINT “Iy=”;IY
255:S=DF*(YA-T3)∧2/2+H3*T3*(YA-T3/2):LPRINT“Sx=”;S
260:IM=IX
265:GA=(2*L0)∧3*(PW/48+10*Z/384)/(2.1E6)
270:GOTO 1000
(2)p0通用校核程序
1000:INPUT “LN=”;LN
1002:R9=ABS(N/AJ+(MA-N*EY)*YA/IX+N*EX*X1/IY)
1003:R8=ABS(N/AJ-(MA-N*EY)*YA/IX-N*EX*X2/IY)
1004:IF R9>R8THEN1007
1005:R9=R8
1007:IF R9>1600 THEN LN
1010:LPRINT“R9=”;R9
1015:T9=QA*S/(IX*DF)
1020:IF T9>950 THEN LN
1025:LPRINT “T9=”;T9
1030:S9=SQR(R9∧2+3*T9∧2)
1035:IF S9>1760 THEN LN
1040:LPRINT “S9=”;S9
1045:FA=GA/IM
1050:INPUT “K0=”;K0
1055:IF FA>K0*L0 THEN LN
1060:LPRINT “fmax=”;FA:END
4 程序运用(实际算例)
笔者已将本程序成功用于多处水库和水电站的各类平面闸门(工作闸门和检修闸门)的设计计算,参见图1、2下列截图。
5 结语及其他
(1)该程序是一套成熟的平面钢闸门门叶结构设计计算程序,可以大幅度提高设计精度和效率,并且让繁杂枯燥的设计计算变得轻松快捷。
篇5
采用多维分析法和时空分析法。多维分析法认为,事物有若干性质,并由这些性质构成,分析事物的变化和发展,就是分析事物的性质。作为一种方法,其将对事物的分析等价为对事物多质的分析,没有交叉互质的一个性质就是一个维,对事物多质的分析方法就是多维分析。任何事物都拥有自身的时空,事物性质的变化都必然是在事物的时空内变化和发展,对事物性质分析最本质的方法就是在时空维上的分析。以计算机设计课程群为例,从时间维来看,问题分阶段逐步展开、逐步解决。分阶段即分程序设计课程、面向对象程序设计课程、数据结构课程;逐步则是指从简单到复杂,从语言到程序阅读,再到程序设计的过程。在时间维上,程序设计问题的解有一个重要的观察点,即程序阅读。从空间维来看,程序设计=数据+算法+语言。其中,数据+算法为程序设计的核心[1]。空间维是两维的,即数据维与算法维。程序设计课程解决离散数据与结构化算法的设计问题,面向对象程序设计课程解决对象数据与对象互动算法,数据结构课程解决数据结构与算法。算法是数据的操作过程。计算机设计课程群中的课程数据形态具有差异,算法是对其一定形态数据的加工。从空间来看,程序设计问题的解有两个重要观察点:数据和算法。
2时间维分析
程序设计问题在课程群的时间维上,一般都能体现从简单到复杂。在数据上从简单的无结构数据到有结构的数据,从简单的无操作数据到有操作的对象数据。在程序设计上,从不可分解问题的简单设计到可分解问题的复杂设计,从语言学习到程序设计学习。程序设计问题解在课程群各自独立的课程的时间维上,没有得到足够和充分的展现,严重影响了学生对问题的认识,以至于学生无法掌握程序设计能力。如同要有充分的文学阅读,才能为文学创作奠定基础,由于程序设计的复杂性,从语言学习再到程序设计学习,才会使程序设计学习简单化,程序设计问题解的学习也是能力的学习,而非理论知识系统的学习,需要有能解决实际问题的经验。经验分为直接经验和间接经验,程序设计的间接经验是他人设计的程序。阅读程序就是学习程序设计的间接经验。阅读程序作为程度设计的重要过渡桥梁,使学生在符合认识与学习规律的条件下,充分掌握程序设计能力。程序设计的学习过程划分为:语言、程序阅读、程序设计。在解程序设计的过程中,将程序阅读作为新的观察点和分析平台。程序阅读就是对已知程序或程序段的阅读,程序阅读又分为3个步骤:理解程序结构、模拟计算机执行程序、上机验证。程序阅读有3种层次:第一种是能读懂程序中所有语句和数据,这是基础层次,是其它层次掌握的条件和前提,属于计算机语言;第二种是能读懂程序设计中的技巧和方法;第三种是能读懂程序设计中的设计思想[2]。
3空间维分析
3.1课程群的解空间与各课程的子空间
计算机设计课程群的解空间可即程序设计解空间分解为:结构化的程序设计课子空间、面向对象程序设计课子空间、数据结构课子空间,如图1所示。计算机设计类课程群的解空间与它的三个子空间是整体与部分的关系。因此,一方面课程群的解空间由3门课程的解空间构成。另一方面课程群的解空间具有抽象性和普遍性,3门课程的解空间呈现泛化。课程群的解空间具有程序设计最本质的意义,对课程群中各门课程有着本质的指导意义。课程群的解空间有数据维和算法维,程序设计课的解空间是由离散数据维和结构化算法维构成;面向对象程序设计课的解空间由对象数据维和对象互动的算法维构成;数据结构课的解空间由结构数据维和结构数据的算法维构成。程序实质就是对已知数据进行加工得到结果数据,是数据与加工过程的相互作用。相比较程序设计解的二维而言,数据维是处于主要和核心位置,程序设计就是围绕数据的加工处理。程序设计课与面向对象程序设计课的加工处理方式有所区别,程序设计采用结构化的处理方法,如顺序结构、选择结构、循环结构;面向对象程序设计采用对象方法,如继承、事件、多态等。对数据的分析至关重要,离散数据是与运算是分离的,主要分析数据的形态,即常量、变量、表达式。其中变量是重点,体现了数据与存储空间的联系;面向对象程序设计的数据是对象的一部分,即数据成员;数据结构程序设计的数据有结构,且重点在结构上。
3.2各课程的数据分析
在结构化的程序设计中,数据变量对应一个存储单元,有三层含义:一是表达物理存储单元;二是表达存储单元的存储内容;三是存储内容的读写性质。必须全面完整理解和掌握此3个含义。例:intx数据变量定义,分配一个存储单元;x=0;x<=10,数据变量体现存储单元的存储内容:x++;cout<<x,数据变量读写反映了数据变量内容的变化。关于面向对象程序设计(C#语言)的程序重点关注和描述对象数据成员的构成、内容变化和访问限制。只有关注和分析有关联的对象数据成员的关联情况、对象数据成员与存储空间的关系,以及与对象数据成员的一切有联系的内容,才能实现对数据的全面掌握。在此基础上,了解和掌握以数据为加工处理的算法过程,才合乎程序设计能力培养的逻辑[4]。数据结构(C语言)程序的重点是数据的逻辑结构及定义性描述。例如:顺序表就是利用连续存储空间的线性关系来实现连续存储空间中数据元素的线性关系,只有先从数据的逻辑结构上理解,才能理解存储实现,分析数据的物理结构以及两者之间的关系,如图3所示。数据定义是对实现数据逻辑结构的计算机语言代码的描述,在算法设计之前须要有充分的分析、表现、描述,以使算法设计有依据和目标。在程序设计中,首先要分析数据,充分、全面、清晰地分析数据后,再作算法分析和设计。在数据与算法的二维空间中,基于数据加工处理的算法才会自然合乎逻辑地体现出其过程。
4结语
篇6
关键词:认知教学;组织;粒化;因果;计算机程序设计
作者简介:彭珍(1981-),女,山东东明人,华北科技学院计算机学院,讲师。(北京 101601)吴立锋(1978-),男,河北隆尧人,首都师范大学信息工程学院,讲师。(北京100048)
基金项目:本文系华北科技学院教育科学研究2011年指导类课题“计算机程序设计课程教学方法的研究”、华北科技学院试题库项目“《C++与面向对象程序设计》试题库建设”、首都师范大学青年教师教学研究项目“以培养能力为核心的《ACCESS 数据库》课程教学方法的研究与探索”的研究成果。
中图分类号:G642 文献标识码:A 文章编号:1007-0079(2012)11-0059-02
目前已有的问题教学、[1]任务驱动教学、[2]案例教学、[3]引导教学等都侧重于教学形式与手段的变新与改革,[4]很少从教授内容的本质出发,研究教学内容的认知规律。为此,本文基于教学赖以存在和发展的认知机理,提出一种新的认知教学方法,条理地、逻辑地、系统地组织教学内容,符合学生学习思维的逻辑认知过程。
“程序设计”是计算机领域中一门重要的软件技术,是其他软件技术的基础。“程序设计”课程是伴随着计算机应用和程序设计语言的发展而发展起来的一门重要学科,已发展成为计算机专业中重要的专业必修课程,在高等教育中确立了不可缺少的公共基础课的地位。作为使用和开发计算机的重要工具,程序设计课程具备统一的抽象与规律。
本文将这种认知教学应用于“计算机程序设计”课程的教学过程中,有组织、有规律地将该课程的教学内容贯穿始终,为学生掌握程序设计方法、提高学生程序设计能力与逻辑思维能力打下坚实基础。
一、认知教学的概述
本文提出的认知教学是基于Zadeh的认知原理,Zadeh将人类的认知概括为:[5]组织(organization)、粒化(granulation)和因果(causation)。“组织”指从部分合并为整体,“粒化”指将整体分解为部分,“因果”指原因和结果的关联。前两者可看作互拟的过程,因果结构是一切知识的共性,它是对知识的一种本质抽象,因果有直接因果关系和间接因果关系,也有潜在因果关系和真实因果关系。所谓潜在因果关系是指一个具有普遍适应范围的概括性的因果规律,表示给定一定的条件,原因X的满足将引起结果Y的满足;而真实的因果关系则是在一个特定情形下实际发生的事实,即X和Y事实上发生了,而且是因果相关的。在知识表示的层次上,教师所研究的是潜在因果关系,真实因果关系可以看作是潜在因果关系在某一特定情形下的一个实例。人类认知事物是从事物的不同侧面、不同层次上认知事物的本质,将复杂的信息结构化(粒化),然后研究在不同结构层次上新事物具有的特性和不同侧面或层次上新事物特征之间的关系,进而从本质上全面认知事物。
认知教学,就是按照人类认知事物的规律进行教授知识,即将教学知识组织、粒化、因果化,从而使得学生抓住知识的本质、全面地掌握知识。这里,组织可以理解为对知识宏观的掌控,粒化是对知识微观的演化,因果则是知识之间的关联。因此,认知教学能够条理地、逻辑地、系统地组织教学内容,是一种符合学生学习逻辑认知过程的科学方法。
二、计算机程序设计课程
几乎所有高等学校的每个专业的学生都要学习诸如C、VB或VF语言这样的程序设计课程(必修课程),而且随着各具特色的高级程序设计语言(C++、Java等)及网页程序设计语言(JSP、等)的不断涌现,程序设计课程是高等教育中不可缺少的公共基础课,而且已成为计算机专业的一门独立必修专业课程。程序设计是大学生必备的一种计算机技能,更重要的是对其思维的特殊训练和对其智慧的重大挑战。
“计算机程序设计”课程主要是学习如何用某种计算机语言编写程序来解决问题。程序=数据结构+算法,所以程序设计的本质就是设计出合理的数据结构与算法。
根据软件工程理论,[6]程序设计大致可以分为结构化程序设计(Structured Programming,SP)、面向对象程序设计(Object-Oriented Programming,OOP)、面向数据结构的程序设计(Jackson System Development,JSP),国内主要用的是前两种程序设计方法。
同一类型的计算机程序设计有若干不同程序设计语言,同一类型的语言采用的数据结构大致相同,比如结构化程序设计语言采用的数据结构绝大多数是基本数据类型,还有其他构造类型如结构体等;面向对象程序设计语言主要采用的数据结构则是类,其中还涉及继承机制等。因此,程序设计课程首先介绍的都是数据结构,在程序中体现在数据的定义上。
算法的设计与具体问题有着密切的关系,但无外乎是对数据结构的操作,比如输入、计算与输出。其中计算最为复杂,可能是函数,或标准的表达式语句,或带有顺序、选择、循环结构的混合。因此,程序设计课程中的重点和难点都在算法部分。
三、认知教学在计算机程序设计课程中的应用
根据计算机程序设计课程的抽象特征,拟从以下几个方面将认知教学应用于计算机程序设计课程中。
按照数据结构+算法的思路将计算机程序设计教学知识合理组织在一起,形成程序设计知识的宏观体系结构;对宏观架构中的每一个知识点进行细化,即构建出每一知识点的微观结构;搭建宏观知识点之间、微观知识点之间以及相互的关联。
以“C程序设计”课程为例,[7]图1概括了C程序设计的所有知识点,形成了一个多层次、逐层深入的组织结构。每一层次可以看作其上层的粒化,每一层次与其上层和下层都有直接或间接的因果关系,同层次知识点之间也存在因果关系。比如定义数据、输入数据、计算数据和输出数据构成了程序的基本步骤,前一步是后一步的基础和条件;比如定义数据中的基本数组类型是所有定义的基础,为了存储多个有序数据(同一类型)形成了构造性数据即数组;为了存储不同类型的数据才有了构造型数据即结构体和共用体;为了便于表达更为复杂的数据结构及方便有效地使用数据提出了指针,所以在定义数据中各部分之间存在着关联。
最底层中的知识点还可以进一步深入细化。“C程序设计”课程中,有关数组的认知体系以包含10个整型数据的一维(10*10二维)数组、字符数组为例,如图2所示。数组认知按照数组的组成和编程的思路分别从纵向和横向展开。纵向坐标:一维数组、二维数组和字符数组,一维数组是二维与字符数组的基础,二维数组又是二维字符数组的基础;横向坐标:定义、输入、计算和输出数组。特别地,(一维)字符数组的输入/输出的因果关系来看,它采用类似于一维数组的输入/输出方法,将输入/输出格式中的%d改为%c,进一步可以简单地采用%s格式输入/输出(去除了循环结构),更进一步采用函数gets/puts调用来完成。
四、结束语
科学的教学方法应该遵循教学赖以存在和发展的认知机理和学生学习思维的逻辑认知过程,认知教学即从牢牢抓住教学本质出发,深化知识的组织、粒化与因果关系,将所有知识融为一体,尤其对于程序设计,这类逻辑性强的课程,该方法更适合。本文以“C程序设计”课程为例,阐述了认知的应用,并通过实际教学,验证了该方法的有效性。
参考文献:
[1]罗祖兵.教育学问题教学:涵义、价值与操作[J].高等教育研究,2010,31(3):71-75.
[2]王春婷.浅谈任务驱动教学法在计算机教学中的应用[J].太原大学教育学院学报,2011,(2):103-105.
[3]赵月坤,高常.案例教学法在数学教学实践中的应用[J].中国成人教育,2011,(15):162-163.
[4]陈越,何钦铭.计算机专业研究型课程教学模式与创新能力培养的探索[J].计算机教育,2009,(24):99-101.
[5]Zadeh L.Some reflections on soft computing,granular computing and their roles in the conception,design and utilization of information/intelligent systems[J].Soft Computing,1998,(2):23-25.
篇7
关键词:高级程序设计;专业课程;教学
中图分类号: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.
篇8
表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后的余数,即:
篇9
关键词:算法;结构化程序设计;模块化教学;任务化
中图分类号:G712 文献标识码:B 收稿日期:2015-12-29
一、教学现状
“C语言程序设计基础”整个课程分为基础知识和程序设计两个大的模块:基础知识属于纯理论部分,主要介绍C语言的使用规则以及语法;程序设计部分需要通过实训的模块化教学来讲解。C语言知识点很多,很琐碎,用模块化理念来开展教学,学生会感到知识点集中并且思路清晰。
二、模块展示
整个课程是以模块化设计为中心,将原来较为复杂的问题化简为一系列简单模块的设计,也就是将―个大的计算任务划分为一个个比较小的任务。在教学中,要注重把教学重心放在解决问题的算法分析上,培养学生分析与解决问题的能力,也注重培养学生养成规范代码行文。
1.基础篇
首先是引入,在这里运行几个有趣的小程序以提高学生的兴趣;其次要告诉学生C语言这门课程的重要性,即其为后续课程Java的基础。在这个模块主要是语法规则的讲授,多采用案例和计算方法讲授运算符和表达式,用贴近生活的案例来引出算法的应用。在学生具备一定的程序设计能力的基础上,有意识地在程序中有意识的错误设置,强调调试程序的重要性,让学生充分体验与掌握调试程序的方法,逐步提高学生独立调试程序,并在调试过程中发现问题、解决问题的能力。
2.结构化程序设计篇
对程序设计的三大结构――顺序结构、选择结构、循环结构分模块讲授,每一个模块讲授完成,就配合做该模块的练习题,并且进行必要的程序设计。整个实践过程由浅入深、由简单到复杂。在Visual Studio C++环境下,举出几个简单的小程序例子演示给学生看,并逐一讲解,引导学生自己去发现程序中存在的缺陷以及改进的方式。从熟悉C语言源程序到可执行文件的整个操作流程,让学生仿照所列举的几个程序模仿着编一个小程序。学生在正确完成程序设计算法的过程中,不但体会到了成就感,也丰富了自己的知识。
3.数据对象构造
讲授完经典三大结构以后,就对数组、函数、指针三个模块进行讲授。讲授数组模块的过程先给出若干程序案例,分析实现功能的算法,讲授时以读程序为主。解决的方法可能不唯一,如果能启发学生多角度、多侧面去寻求解决问题的办法,则可激发学生思考的积极性,提高其学习兴致。在C语言中一题多解的情况有很多,有意识地引导学生采用新思路和新方法解题,以培养学生在编程中的求异思维,而不是死记硬背,墨守成规。习题课采用读程序与编写程序相结合的方法,让学生熟悉数组的使用和算法实现的相关知识。
函数模块的讲授以自定义函数为重点,讲授其定义使用的语法,要求学生会编写简单的自定义函数。
指针模块对程序设计没有过多要求,只要求读程序。讲授最基本的指针定义和使用。重点突出指针在数组指向的时候的应用。
最后一个模块就是文件,主要讲授文件的打开和访问方式即可。并且案例化讲授使用文件的代码使用方法即可,对学生的编写不作要求。
三、探索结论
对于高职新生,实现C语言教学的基础化、实用化就可,不需要讲授过多复杂和难以理解并且实用性不强的功能。有些知识点只需要理解,有些知识点必须掌握,按照模块化基础教学方案,学生思路清晰,易于掌握。C语言程序设计的教学要讲究方法,通过这门课的学习,不仅要让学生掌握语言的基本规则,而且要切实培养学生分析问题、解决问题的能力,最终使学生明白,语法是有限的,可解决的问题是无限的。只有在分析实际向题的基础上,以清晰的思路去设计算法,才能举一反三,以不变应万变。程序设计的任务不只是编写出一个能得到正确结果的程序,还应考虑程序的质量。
参考文献:
[1] 张正琼,黄文胜.C语言程序设计基础教程[M].重庆:重庆大学出版社,2014.
篇10
软件测试思维程序设计基础教学改革《程序设计基础》是各高校计算机专业开设的专业基础课之一,大多数高校通过讲授C或C++ 语言来锻炼培养学生的逻辑思维能力、计算能力和编程能力,为以后学生学习其他程序设计类课程打下坚实的基础。探讨如何通过软件测试思维的引入提高学生的编程兴趣,增强领域知识对教学具有实际意义。
一、“程序设计基础”课程教学现状分析
当前,大多数教师在教授该门课程时只重视语法和算法的讲授,而不注重程序设计的综合能力的培养,学生没有学习兴趣,教学效果不好。分析造成该状况的原因主要有以下三点:(1)缺乏融合软件工程思维的程序设计基础教材。经调查发现,大多数的面向普通本科的C/C++教材的内容的编排都是传统模式,以讲解语法为主,在讲解循环结构、结构体、链表等章节时融入了数据结构、算法的知识,只有近几年年出版的个别教材对内容进行了改革,从案例角度、软件工程的角度、算法的角度来进行讲解,但这种教材使用范围较小。(2)教师讲授该课程的知识体系和思想意识落后。很多教师不喜欢改变原有的知识体系,因循守旧,只考虑把课程教完就万事大吉,而没有从学生角度考虑问题。(3)部分教师自身知识体系不完整。由于高校教师除了从事日常教学外还承担着科研的任务,每个人都有自己的研究领域,所以对自身不擅长的领域内容欠缺或忽视,这也直接体现本门课程的教学中。
众所周知,程序是构成软件的重要的组成部分,程序的正确性、健壮性问题关系到整个软件的质量。所以应该培养学生编程能力的同时加强对软件测试能力的培养,增强对软件和程序的宏观认识。
二、融入软件测试思维的“程序设计基础”课程教学改革措施
首先,教师在教学过程中应将软件工程中强调的“5W+1H”的思想注入到学生的思想意识中,在此可解释为Why(程序的作用)、What(程序的功能)、Who(开发者)、When(开发时间)、Where(开发地点)、How(程序的算法),使学生建立软件的概念,强调在编写完程序后要选用恰当的测试数据,进行足够多的测试,保证程序的正确性、健壮性,当测试达到要求后才能够提交程序。
其次,将软件测试的思想、方法融入到程序设计基础课程的讲授中。部分软件测试思想与C/C++各知识点的结合列举如下:
(1)将黑盒、白盒测试技术融入到选择、循环结构内容中。白盒测试重点测试程序的内部结构是否正确,C/C++课程中的选择结构和循环结构有多条路径,在判定节点拥有多个判定条件,在讲解该结构时应将白盒测试中的逻辑覆盖思想融入其中。在完善程序时可采用等价划分和边界值分析两种思想选取测试数据,利用等价划分技术分析数据有利于提高程序的健壮性。
(2)单元测试、集成测试与函数的结合。可以将C语言中的函数理解成模块,每一个函数完成一个独立的功能,编写由多个函数构成的程序时,应该对每个函数进行单元测试,确认每个函数的正确性,然后逐一集成,最终完成整个程序的测试。
(3)编写程序时应融入的软件测试意识:在编写C/C++程序时要让学生知道绝对正确的程序是不存在的,再小的程序也存在着错误;在学生编写完程序后应让学生组成小组,互相测试对方的程序,这也是软件测试中第三方测试的作用;鼓励创造性思维,提出不合理数据进行软件测试。
三、教学效果分析
该教学思想已经应用于长春建筑学院14级信息安全专业学生的“程序设计基础”课程教学。该课程开设于第一学期,学时均为84学时,其中理论42学时,上机42学时,选用的教材相同。信息1401为改革班,信息1402为传统班。在2014-2015学年一学期《程序设计基础》期末考试中,信息1401平均分73.3分,优秀率6%,及格率72%;信息1402平均分54.71分,优秀率0%,及格率52%。在2014-2015学年二学期的《程序设计基础》课程设计中,信息1401优秀4人,良好8人,中等15人,及格3人,不及格0人;信息1402优秀2人,良好5人,中等17人,及格5人,不及格0人。
以上数据说明将软件测试思想融入到程序设计课程的教学中可以提高教学效果,增强学生的学习兴趣和学生解决问题的能力,尤其在第二学期的程序设计基础课程设计中,信息1401班学生更能够从整体上考虑整个系统功能的划分,完成各部分程序的设计,整个系统的功能和性能更好,系统更稳定。
四、结论
以上改革实践证明,在讲授程序设计基础课程时,除了讲授语法、算法之外,还应该有意识的培养学生的测试能力,使学生对程序有更完整的认识。在将软件测试思想融入课程教学的同时要注意循序渐进,不能够喧宾夺主,让软件测试的思想不知不觉进入到学生的意识中。希望的这种教学思想能够为程序设计基础课程教学注入新的活力。
参考文献:
[1]田红磊.基于计算思维的计算机程序设计课程教学改革.[J].课程教育研究,2015,(3):73-74.
[2]沈济南,梁芳.程序设计类课程实践教学方式改革研究[J].教育论坛,2014,(52):99-100.
[3]张进,叶慧婷.程序设计新型教学方法研究[J].中国现代教育装备,2015,(1):104-106.