张婧婧
(新疆农业大学计算机与信息工程学院,新疆 乌鲁木齐 830052)
在众多面向对象的程序设计语言当中,Java极具代表性[1]。与C和C++等高级语言一样,编程人员不必执着于计算机如何执行各种算法,只需专注于如何让算法更加巧妙和便利地表达[2-4]。目前Java常用的Eclipse开发工具支持用户进行面向对象的过程开发[5-6],因此初学者在学习Java过程中,由于编程经验的不足或还没有建立完整的面向对象的概念,容易堆砌出Java学习中的“短板”。
“木桶原理”、“短板效应”[7-8]本是哲学中引申出社会普遍存在而又常常被忽视的取长必先补短的问题。奥运会中不同国家、各个团队在各类集体项目的竞技中发现,胜算往往取决于本参赛队中最弱的组合或最不稳定队员的发挥情况。那么Java的学习中短板又在哪?
初学者使用Java绘制简单图形时可能会遇见如图1所示的命题。
图1 简单结构图形
如图1所示,对初学者来说,只要掌握简单的画矩形、加标签、画线语句,就能顺利完成此题,可能用到的语句包括:
从最朴素的描点、画线依次写入代码,此题需要写入70~80行代码,且矩形、线、标签的坐标计算不必通用,对初学者来说难度不大。然而当图1右边的线框增加为原来的4倍、8倍甚至更多,那么代码的长度可想而知。与“问题分解思想”更贴切的是另一种算法[9-11]。
首先,为具有相同规律的右边4个矩形设计循环:
最后,在循环中调用上述方法,顺序写入4个标签即可。整段程序近30行代码,且代码具有一定通用性。
通过两种算法的对比,呈现出挡在Java初学者面前潜在的“短板”。即从简单图形程序开始,初学者既可以采用顺序结构设计算法,也可以采用更好的循环结构和模块化的思想设计算法。缺乏对算法的更高要求,初学者错过的将不仅是对个别问题的思考,而是无法夯实Java编程学习的基础,随后遇到编写模块化算法的综合程序就会力不从心。
约瑟夫环是指有n个人围成一圈,按顺时针方向编号1到n。圈中从1到m报数,凡是到m的人先退出,下一个人接着从1开始报数,计算这n个人的出圈顺序[12-13],下面利用3种方法完成了命题。
约瑟夫环命题中主要涉及如何报数及出圈顺序的问题。利用静态数组旨在前一个人报数及出圈后剩下每个人接着报数并向前递补,主要利用嵌套循环实现数组长度的不断变化,部分参考代码如下:
在学习了Java的arrayList动态数组后,可以利用其自动修改数组长度的特性改写约瑟夫环的代码如下:
动态数组修改数组长度虽有便利,但重写数组势必降低效率,所以还可以尝试利用循环链表修改节点的方式设计算法,参考代码如下:
3段代码均较为简短,本文试图通过系统运算开销(如运算时间)[14]来为程序选择最为“经济”的算法,其中m值为3。3种算法在相同运算环境下的测试结论如图2所示。
图2 算法运算时间比较图
从图2中不难看出,在数据量不大的情况下,采用静态数组、动态数组、循环链表运行约瑟夫环的时间差别不大,那么选择静态数组的简单算法貌似合理;而随着数据量的不断增大,编写循环链表代码显示出的时间优势对程序员来说更为可贵。另外,循环链表及动态数组能够增加初学者对面向对象概念的思考,从而把相同的算法推广到相似的命题中,实现举一反三的效果。那么是否对此类命题的算法进行了分析也可能成为挡住Java初学者的另一块“短板”,它将决定初学者对不同问题建立模型的反应速度,甚至决定了所设计程序的生命力。
Java语言的编程既要求编程者设计优势的算法,又希望编程者尝试提高运算的效率,对初学者来说并不容易。但是随着初学者不断提高挡在前面的“短板”,相信在不断思考和编程积累后一定能体会到编程的真正乐趣。
[1]王莉莉,陈德运.面向就业的编程语言教学研究[J].科技与管理,2012,14(3):121-123.
[2]张剑飞.Java教学中提高学生应用能力的策略研究[J].高师理科学刊,2009,29(6):98-100.
[3]向模军,刘松青.Java教学的探讨和实践[J].计算机与信息技术,2008(3):104-105.
[4]张勇.“Java程序设计”课程教学改革研究[J].电脑知识与技术,2011(24):5980-5981.
[5]袁绍欣,等.Java面向对象程序设计[M].北京:清华大学出版社,2007.
[6]焦玲,王兴玲,杜树杰.Java程序设计[M].北京:中国铁道出版社,2006.
[7]杨光宇,曾东方,罗平.考虑短板效应的一种度量模型及其在软件可信性中的应用[J].计算机应用研究,2012,29(1):165-167.
[8]徐拾义.可信计算系统设计和分析[M].北京:清华大学出版社,2006.
[9]吴红亚.基于工作过程系统化的“Java语言程序设计”学习情境设计[J].中国电力教育,2011(35):150-151.
[10]邢国春,李紫薇.基于Java语言的项目驱动教学的透明性研究[J].长春师范学院学报:自然科学版,2010,29(3):132-134.
[11]何伟文.面向对象程序设计(Java)新教学模式的探索与实践[J].价值工程,2010(18):194.
[12]王永红.约瑟夫环经典问题的几种算法比较[J].现代计算机:专业版,2008(1):36-37,54.
[13]潘大志,刘志斌.递推算法在扩展约瑟夫环问题中的应用[J].计算机工程与应用,2010,46(34):62-63,106.
[14]陈新,黄永忠,鲍天明,等.Java服务主动容错模型分析与评估[J].计算机应用,2010,30(10):2741-2744.