張婧婧
(新疆農(nóng)業(yè)大學(xué)計(jì)算機(jī)與信息工程學(xué)院,新疆 烏魯木齊 830052)
在眾多面向?qū)ο蟮某绦蛟O(shè)計(jì)語言當(dāng)中,Java極具代表性[1]。與C和C++等高級(jí)語言一樣,編程人員不必執(zhí)著于計(jì)算機(jī)如何執(zhí)行各種算法,只需專注于如何讓算法更加巧妙和便利地表達(dá)[2-4]。目前Java常用的Eclipse開發(fā)工具支持用戶進(jìn)行面向?qū)ο蟮倪^程開發(fā)[5-6],因此初學(xué)者在學(xué)習(xí)Java過程中,由于編程經(jīng)驗(yàn)的不足或還沒有建立完整的面向?qū)ο蟮母拍睿菀锥哑龀鯦ava學(xué)習(xí)中的“短板”。
“木桶原理”、“短板效應(yīng)”[7-8]本是哲學(xué)中引申出社會(huì)普遍存在而又常常被忽視的取長(zhǎng)必先補(bǔ)短的問題。奧運(yùn)會(huì)中不同國家、各個(gè)團(tuán)隊(duì)在各類集體項(xiàng)目的競(jìng)技中發(fā)現(xiàn),勝算往往取決于本參賽隊(duì)中最弱的組合或最不穩(wěn)定隊(duì)員的發(fā)揮情況。那么Java的學(xué)習(xí)中短板又在哪?
初學(xué)者使用Java繪制簡(jiǎn)單圖形時(shí)可能會(huì)遇見如圖1所示的命題。
圖1 簡(jiǎn)單結(jié)構(gòu)圖形
如圖1所示,對(duì)初學(xué)者來說,只要掌握簡(jiǎn)單的畫矩形、加標(biāo)簽、畫線語句,就能順利完成此題,可能用到的語句包括:
從最樸素的描點(diǎn)、畫線依次寫入代碼,此題需要寫入70~80行代碼,且矩形、線、標(biāo)簽的坐標(biāo)計(jì)算不必通用,對(duì)初學(xué)者來說難度不大。然而當(dāng)圖1右邊的線框增加為原來的4倍、8倍甚至更多,那么代碼的長(zhǎng)度可想而知。與“問題分解思想”更貼切的是另一種算法[9-11]。
首先,為具有相同規(guī)律的右邊4個(gè)矩形設(shè)計(jì)循環(huán):
最后,在循環(huán)中調(diào)用上述方法,順序?qū)懭?個(gè)標(biāo)簽即可。整段程序近30行代碼,且代碼具有一定通用性。
通過兩種算法的對(duì)比,呈現(xiàn)出擋在Java初學(xué)者面前潛在的“短板”。即從簡(jiǎn)單圖形程序開始,初學(xué)者既可以采用順序結(jié)構(gòu)設(shè)計(jì)算法,也可以采用更好的循環(huán)結(jié)構(gòu)和模塊化的思想設(shè)計(jì)算法。缺乏對(duì)算法的更高要求,初學(xué)者錯(cuò)過的將不僅是對(duì)個(gè)別問題的思考,而是無法夯實(shí)Java編程學(xué)習(xí)的基礎(chǔ),隨后遇到編寫模塊化算法的綜合程序就會(huì)力不從心。
約瑟夫環(huán)是指有n個(gè)人圍成一圈,按順時(shí)針方向編號(hào)1到n。圈中從1到m報(bào)數(shù),凡是到m的人先退出,下一個(gè)人接著從1開始報(bào)數(shù),計(jì)算這n個(gè)人的出圈順序[12-13],下面利用3種方法完成了命題。
約瑟夫環(huán)命題中主要涉及如何報(bào)數(shù)及出圈順序的問題。利用靜態(tài)數(shù)組旨在前一個(gè)人報(bào)數(shù)及出圈后剩下每個(gè)人接著報(bào)數(shù)并向前遞補(bǔ),主要利用嵌套循環(huán)實(shí)現(xiàn)數(shù)組長(zhǎng)度的不斷變化,部分參考代碼如下:
在學(xué)習(xí)了Java的arrayList動(dòng)態(tài)數(shù)組后,可以利用其自動(dòng)修改數(shù)組長(zhǎng)度的特性改寫約瑟夫環(huán)的代碼如下:
動(dòng)態(tài)數(shù)組修改數(shù)組長(zhǎng)度雖有便利,但重寫數(shù)組勢(shì)必降低效率,所以還可以嘗試?yán)醚h(huán)鏈表修改節(jié)點(diǎn)的方式設(shè)計(jì)算法,參考代碼如下:
3段代碼均較為簡(jiǎn)短,本文試圖通過系統(tǒng)運(yùn)算開銷(如運(yùn)算時(shí)間)[14]來為程序選擇最為“經(jīng)濟(jì)”的算法,其中m值為3。3種算法在相同運(yùn)算環(huán)境下的測(cè)試結(jié)論如圖2所示。
圖2 算法運(yùn)算時(shí)間比較圖
從圖2中不難看出,在數(shù)據(jù)量不大的情況下,采用靜態(tài)數(shù)組、動(dòng)態(tài)數(shù)組、循環(huán)鏈表運(yùn)行約瑟夫環(huán)的時(shí)間差別不大,那么選擇靜態(tài)數(shù)組的簡(jiǎn)單算法貌似合理;而隨著數(shù)據(jù)量的不斷增大,編寫循環(huán)鏈表代碼顯示出的時(shí)間優(yōu)勢(shì)對(duì)程序員來說更為可貴。另外,循環(huán)鏈表及動(dòng)態(tài)數(shù)組能夠增加初學(xué)者對(duì)面向?qū)ο蟾拍畹乃伎?,從而把相同的算法推廣到相似的命題中,實(shí)現(xiàn)舉一反三的效果。那么是否對(duì)此類命題的算法進(jìn)行了分析也可能成為擋住Java初學(xué)者的另一塊“短板”,它將決定初學(xué)者對(duì)不同問題建立模型的反應(yīng)速度,甚至決定了所設(shè)計(jì)程序的生命力。
Java語言的編程既要求編程者設(shè)計(jì)優(yōu)勢(shì)的算法,又希望編程者嘗試提高運(yùn)算的效率,對(duì)初學(xué)者來說并不容易。但是隨著初學(xué)者不斷提高擋在前面的“短板”,相信在不斷思考和編程積累后一定能體會(huì)到編程的真正樂趣。
[1]王莉莉,陳德運(yùn).面向就業(yè)的編程語言教學(xué)研究[J].科技與管理,2012,14(3):121-123.
[2]張劍飛.Java教學(xué)中提高學(xué)生應(yīng)用能力的策略研究[J].高師理科學(xué)刊,2009,29(6):98-100.
[3]向模軍,劉松青.Java教學(xué)的探討和實(shí)踐[J].計(jì)算機(jī)與信息技術(shù),2008(3):104-105.
[4]張勇.“Java程序設(shè)計(jì)”課程教學(xué)改革研究[J].電腦知識(shí)與技術(shù),2011(24):5980-5981.
[5]袁紹欣,等.Java面向?qū)ο蟪绦蛟O(shè)計(jì)[M].北京:清華大學(xué)出版社,2007.
[6]焦玲,王興玲,杜樹杰.Java程序設(shè)計(jì)[M].北京:中國鐵道出版社,2006.
[7]楊光宇,曾東方,羅平.考慮短板效應(yīng)的一種度量模型及其在軟件可信性中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究,2012,29(1):165-167.
[8]徐拾義.可信計(jì)算系統(tǒng)設(shè)計(jì)和分析[M].北京:清華大學(xué)出版社,2006.
[9]吳紅亞.基于工作過程系統(tǒng)化的“Java語言程序設(shè)計(jì)”學(xué)習(xí)情境設(shè)計(jì)[J].中國電力教育,2011(35):150-151.
[10]邢國春,李紫薇.基于Java語言的項(xiàng)目驅(qū)動(dòng)教學(xué)的透明性研究[J].長(zhǎng)春師范學(xué)院學(xué)報(bào):自然科學(xué)版,2010,29(3):132-134.
[11]何偉文.面向?qū)ο蟪绦蛟O(shè)計(jì)(Java)新教學(xué)模式的探索與實(shí)踐[J].價(jià)值工程,2010(18):194.
[12]王永紅.約瑟夫環(huán)經(jīng)典問題的幾種算法比較[J].現(xiàn)代計(jì)算機(jī):專業(yè)版,2008(1):36-37,54.
[13]潘大志,劉志斌.遞推算法在擴(kuò)展約瑟夫環(huán)問題中的應(yīng)用[J].計(jì)算機(jī)工程與應(yīng)用,2010,46(34):62-63,106.
[14]陳新,黃永忠,鮑天明,等.Java服務(wù)主動(dòng)容錯(cuò)模型分析與評(píng)估[J].計(jì)算機(jī)應(yīng)用,2010,30(10):2741-2744.