馬建軍 張利波
循環(huán)結(jié)構(gòu)是程序設(shè)計(jì)的重要組成部分,也是程序設(shè)計(jì)的重點(diǎn)和難點(diǎn)。重點(diǎn)在于循環(huán)結(jié)構(gòu)能使程序變得簡潔明了,編程思想更具結(jié)構(gòu)化;難點(diǎn)在于初學(xué)者很難厘清循環(huán)結(jié)構(gòu),無法總結(jié)循環(huán)結(jié)構(gòu)的一般范式。
華師大王榮良教授提出,“從計(jì)算思維教育的角度出發(fā),其關(guān)鍵在于能對(duì)需要解決的問題進(jìn)行抽象,形成計(jì)算機(jī)能夠理解的形式化表達(dá),并且讓計(jì)算機(jī)自動(dòng)地去計(jì)算?!北举|(zhì)上,循環(huán)結(jié)構(gòu)是順序結(jié)構(gòu),它讓順序結(jié)構(gòu)變得簡潔明晰,是一種形式化表達(dá),便于人的思維呈現(xiàn)和表達(dá)。這種形式化的表達(dá),將人的思維過程與計(jì)算機(jī)執(zhí)行過程有機(jī)聯(lián)結(jié)起來。一方面,形式化表達(dá)是為了讓計(jì)算機(jī)更好地服務(wù)于人類,用簡約方式告訴計(jì)算機(jī),讓計(jì)算機(jī)明確知道做什么;另一方面,形式化的表達(dá)普遍要求具有高度精確的要素,比如循環(huán)體和循環(huán)條件,對(duì)于初學(xué)編程的學(xué)生來說,精確的形式化表達(dá)具有一定的難度。
如何讓學(xué)生準(zhǔn)確理解循環(huán)思想,寫出言簡意賅、準(zhǔn)確到位的循環(huán)結(jié)構(gòu)?如果實(shí)現(xiàn)循環(huán)結(jié)構(gòu)的建模,學(xué)生有范式可以參照,那么結(jié)構(gòu)化循環(huán)結(jié)構(gòu)更易實(shí)施了。
終于,經(jīng)過實(shí)踐探究,我們提出“L-O-A-C” 范式,即List-Observe-Analyze- Conclude,將循環(huán)結(jié)構(gòu)由內(nèi)向外打破,實(shí)現(xiàn)循環(huán)從具體到一般的思維過程,將循環(huán)問題進(jìn)行抽象并建立可操作范式。
以打印下圖為例,我們依次剖析其中可以展現(xiàn)的思維。
第一,當(dāng)我們打印這類圖案時(shí),幾乎極少有人會(huì)采用純手工方式實(shí)現(xiàn)。學(xué)生亦如此,他們總是努力想著如何讓計(jì)算機(jī)幫助實(shí)現(xiàn)。這就說明首先是人的需求,計(jì)算機(jī)只不過是一個(gè)實(shí)現(xiàn)的工具而已,或者說是計(jì)算機(jī)為我們服務(wù)。因此,最后通過編程的方式實(shí)現(xiàn)了,是計(jì)算機(jī)完成的,但歸根結(jié)底還是人的思維起著主導(dǎo)作用。這說明計(jì)算思維并不是機(jī)器的思維,本質(zhì)上是人的思維。
第二,此題中的圖案打印,初看只是星號(hào)的打印。一般我們首先會(huì)關(guān)注每行星號(hào)的個(gè)數(shù),這是人的思維方式以及圖像優(yōu)先決定的。然后,我們發(fā)現(xiàn)除了考慮每行星號(hào)個(gè)數(shù),還需要考慮位置。這說明人的思維方式是以點(diǎn)帶面,逐漸考慮完善。那么位置怎樣實(shí)現(xiàn)呢?這時(shí),我們又發(fā)現(xiàn)了隱形的信息,即星號(hào)前面的空格逐漸浮出水面。這種由此及彼、跳躍式或鏈接式的方式也是人的思維所特有的。
第三,此題圖案實(shí)現(xiàn)方法不止一種,比如可以采用一維數(shù)組方式實(shí)現(xiàn),即“3空1星(換行)、2空3星(換行)、1空5星(換行)……”;也可以采用二維數(shù)組實(shí)現(xiàn),即依據(jù)行列方陣實(shí)現(xiàn)。同時(shí),我們看到行列方陣實(shí)現(xiàn)方法也不唯一,可以使用空格等“硬方式”,也可以使用場(chǎng)寬等“軟方式”。因此,當(dāng)我們面對(duì)具體問題進(jìn)行分析時(shí),首先要告訴學(xué)生“問題的解決方法不止一種”,最后落實(shí)到其中一種,往往經(jīng)歷了比較、篩選、綜合考量。因此,人的思維具有發(fā)散性,可以對(duì)同一問題展開多角度、多層面的分析,同時(shí)人的思維又具有收斂性,針對(duì)實(shí)際需要,優(yōu)選其中較合適的方法。比如本題中一維數(shù)組方式顯得迂回,二維數(shù)組方式直觀清晰,因此優(yōu)選二維數(shù)組。
第四,在面向圖形輸出等涉及二維數(shù)據(jù)的處理過程,“L-O-A-C”范式充分顯示其優(yōu)勢(shì)。一般的,人們?cè)诮鉀Q問題時(shí)總是希望將問題變得一般化、可操作化和可結(jié)構(gòu)化。一般化表現(xiàn)在學(xué)生可以根據(jù)范式要點(diǎn),一步一步地實(shí)現(xiàn)循環(huán)語句的編寫,讓學(xué)生感覺編程本來就是一件普通的事情,樹立人人可編程的理念;可操作化表現(xiàn)在只要依據(jù)范式的過程都可以編寫成功,強(qiáng)調(diào)操作中的時(shí)序問題,即每一步做到位方可進(jìn)行下一步,步步成功才能最后成功,這說明編程本來就不是一蹴而就、一步登天的事情,需要一步一步踏實(shí)地走下去。而這種一般化、可操作化的實(shí)施,是計(jì)算機(jī)實(shí)現(xiàn)自動(dòng)計(jì)算的前提。自動(dòng)化是計(jì)算思維的主要內(nèi)容之一??山Y(jié)構(gòu)化表現(xiàn)在對(duì)該問題的編程實(shí)現(xiàn)不是作為最終目標(biāo),而是通過此問題的分析研究進(jìn)一步歸納總結(jié),實(shí)現(xiàn)由此及彼的類推,從而實(shí)現(xiàn)解決一個(gè)問題到解決另一個(gè)問題,或者解決一批問題,本質(zhì)上,這是一種抽象與建模的過程,從具體到一般的建模。
List:依次羅列循環(huán)中的每個(gè)步驟及相應(yīng)操作
一般的,每行采用“空格+星號(hào)”的組合輸出,其中星號(hào)的位置由空格的數(shù)量決定,此處只需統(tǒng)計(jì)“*”的數(shù)量即可。涉及行列輸出,我們構(gòu)建一張如表1的二維表。
Observe:觀察這些行列參數(shù)與輸出字符個(gè)數(shù)、位置的相關(guān)性
我們將原始表進(jìn)行微處理:選取每一行字符的起點(diǎn)數(shù)據(jù)、終點(diǎn)數(shù)據(jù),羅列如表2。
Analyze:分析每項(xiàng)操作參數(shù)與動(dòng)作的內(nèi)在聯(lián)系
即在①②③④處填寫關(guān)于i的一般通式。此為二重循環(huán)中內(nèi)循環(huán)的關(guān)鍵信息,只要決定了內(nèi)循環(huán)中的初值與終值,那么打印的圖案也就明確了。
Conclude:總結(jié)寫出操作參數(shù)與動(dòng)作的一般關(guān)系式
一般關(guān)系式即循環(huán)體。經(jīng)過如上分析,不難填寫初值和終值,如表3。
“L-O-A-C”方法采用列表手段進(jìn)行程序的前期分析,顯露學(xué)生思考痕跡,提高學(xué)生前期編程分析的有效性;這說明計(jì)算思維往往基于數(shù)理思維,此題中寫出i的關(guān)系式,初中學(xué)生易于實(shí)現(xiàn),因此本節(jié)課的探究并沒有喧賓奪主將程序設(shè)計(jì)課變成數(shù)學(xué)課。同時(shí)這種方式將循環(huán)體由內(nèi)向外打破,形成自然、規(guī)范的循環(huán)編程方法,促進(jìn)學(xué)生分析思考的可靠性。這說明程序設(shè)計(jì)本身就是一件嚴(yán)謹(jǐn)?shù)氖虑?,任何關(guān)鍵信息的填寫都需有理有據(jù),單純地依靠經(jīng)驗(yàn)主義編程往往很難走遠(yuǎn)。
1.打破經(jīng)驗(yàn)式編程壁壘
“L-O-A-C”重點(diǎn)運(yùn)用列表,采用逐個(gè)離析的方式,清晰地推導(dǎo)出數(shù)據(jù)之間的關(guān)系。這種方法雖有繁瑣,但對(duì)于初學(xué)者很適用,效果良好。隨著學(xué)習(xí)的深入,面對(duì)復(fù)雜題目,學(xué)生運(yùn)用示例方法進(jìn)行分析問題、解決問題,顯得更加得心應(yīng)手,嫻熟自信。
2.促進(jìn)結(jié)構(gòu)化編程分析
很多時(shí)候,大家都喜歡用經(jīng)驗(yàn)的方式寫循環(huán),往往形成一種“循環(huán)體合成”的思維模式,即關(guān)注循環(huán)體結(jié)果,而非循環(huán)體產(chǎn)生的來龍去脈。這種通常的學(xué)習(xí)模式,反映在很多人身上。因此,不少學(xué)生在寫循環(huán)語句時(shí),并不是通過具體分析來推導(dǎo)出的。這種學(xué)習(xí)方式,在遇到排序等稍微復(fù)雜的編程時(shí)會(huì)凸現(xiàn)弊端:程序段初看好像對(duì)的,一旦調(diào)試,數(shù)據(jù)走向與預(yù)料的不同。因此,編程過程,前期的分析比后期的調(diào)試更為重要。重視前期結(jié)構(gòu)化分析,也是良好的編程習(xí)慣之一。
3.形成嚴(yán)謹(jǐn)型編程思維
程序設(shè)計(jì)目的在于提供一種抽象方法來解決現(xiàn)實(shí)中的問題。編程的難點(diǎn)在于用判斷邏輯抽象出一般方法。一般循環(huán)編程的例子,我們看到的都是一個(gè)個(gè)具體化的動(dòng)作,編程的過程就是將具體轉(zhuǎn)換成一般,或者將具體化的內(nèi)容映射到一般化的表達(dá)。運(yùn)用“L-O-A-C”,我們?cè)诰幊谭治鰰r(shí),每個(gè)關(guān)鍵參數(shù)做到有理有據(jù),有利于形成嚴(yán)謹(jǐn)?shù)木幊趟季S。
4.聯(lián)結(jié)自動(dòng)化計(jì)算思維
計(jì)算思維的本質(zhì)是抽象和自動(dòng)化。編程中重要的思想是復(fù)用,循環(huán)結(jié)構(gòu)是學(xué)生最早接觸到的復(fù)用。當(dāng)然還有函數(shù)、模版庫、類庫,再到更上層的公共組件等,都體現(xiàn)復(fù)用的思想。復(fù)用與自動(dòng)化是相輔相成、相伴而生的。自動(dòng)化體現(xiàn)在計(jì)算機(jī)可以自動(dòng)化地進(jìn)行大量運(yùn)算和處理,從抽象中去發(fā)現(xiàn)和發(fā)覺一種可自動(dòng)化的循環(huán),這正是程序的強(qiáng)項(xiàng)。任何人都應(yīng)該有這種自動(dòng)化的計(jì)算思維。
作者單位:浙江慈溪市教育局教研室 浙江慈溪實(shí)驗(yàn)中學(xué)