渭南技術(shù)學(xué)院 王 玲
我是一名中等職業(yè)技術(shù)學(xué)院講授Visual Basic(簡(jiǎn)稱VB)程序設(shè)計(jì)課程的教師。VB是一種面向?qū)ο蟮某绦蛟O(shè)計(jì)的高級(jí)語(yǔ)言,是目前最為流行的程序設(shè)計(jì)語(yǔ)言之一。它由Basic發(fā)展而來(lái),目前已進(jìn)入了VB.NET階段。
上個(gè)世紀(jì)50年代,當(dāng)計(jì)算機(jī)還處于第一代——即電子管計(jì)算機(jī)時(shí)代時(shí),為了使工程技術(shù)人員在科學(xué)計(jì)算中,能充分利用計(jì)算機(jī),人們?cè)谟?jì)算機(jī)的低級(jí)語(yǔ)言:機(jī)器語(yǔ)言和匯編語(yǔ)言之后,開(kāi)發(fā)了第一個(gè)適用于科學(xué)計(jì)算的程序設(shè)計(jì)高級(jí)語(yǔ)言——FORTRAN語(yǔ)言(Formuler Translation)。到了60年代,當(dāng)計(jì)算機(jī)上升為第二代——晶體管時(shí)代時(shí),為了普及計(jì)算機(jī)程序設(shè)計(jì),就誕生了第二個(gè)程序設(shè)計(jì)高級(jí)語(yǔ)言:基于初學(xué)者通用目的的符號(hào)指令代碼——Basic(Beginner’s ALL-puperse Symbolic Instruction Code)。在此之后各種面向過(guò)程的程序設(shè)計(jì)高級(jí)語(yǔ)言如雨后春筍般的被開(kāi)發(fā)了出來(lái),如70年代發(fā)展起來(lái)的C程序設(shè)計(jì)語(yǔ)言等。進(jìn)入80年代后,伴隨著計(jì)算機(jī)進(jìn)入了第三代(中小規(guī)模集成電路計(jì)算機(jī))、第四代(大規(guī)模集成電路計(jì)算機(jī)),微型計(jì)算機(jī)得到了空前的大普及。微機(jī)操作系統(tǒng)由磁盤(pán)操作系統(tǒng)DOS(Disk Operating System)被視窗操作系統(tǒng)Windows所取代。人們?cè)诿嫦蜻^(guò)程的程序設(shè)計(jì)基礎(chǔ)上,引入了可視化編程(Visual)的方法,并在程序設(shè)計(jì)中引入了類和對(duì)象、方法和事件驅(qū)動(dòng)等概念,程序設(shè)計(jì)逐漸由面向過(guò)程過(guò)渡到了面向?qū)ο蟆H缛藗冏畛S玫腣isual Basic、Visual C++、Visual J++、Visual FoxPro等。但既然是過(guò)渡,盡管人們進(jìn)入了面向?qū)ο蟮某绦蛟O(shè)計(jì)時(shí)代,但各種程序設(shè)計(jì)高級(jí)語(yǔ)言都不可避免地帶有面向過(guò)程的烙印。如程序的基本結(jié)構(gòu),都分為順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。
圖1 窗體界面
作為一名中等職業(yè)技術(shù)學(xué)院的計(jì)算機(jī)教師,面對(duì)的是一些理解力較差、概念較為模糊、基本功較低的學(xué)生。如何對(duì)這些學(xué)生講好程序設(shè)計(jì)課?如何使他們對(duì)程序設(shè)計(jì)產(chǎn)生興趣、提高學(xué)習(xí)積極性,學(xué)好程序設(shè)計(jì)課?幾年來(lái)在教學(xué)實(shí)踐中,總結(jié)正反兩方面的經(jīng)驗(yàn)和教訓(xùn),我深深地認(rèn)識(shí)到,要想真正上好面向?qū)ο蟮某绦蛟O(shè)計(jì)課,并非易事。必須在理論聯(lián)系實(shí)際,激發(fā)學(xué)生的學(xué)習(xí)興趣,提高他們的學(xué)習(xí)積極性上狠下功夫。只有千方百計(jì),通過(guò)挖掘選擇有趣的古今中外著名算例,聯(lián)系實(shí)際,深入淺出地進(jìn)行剖析,才能為學(xué)生講清講透程序設(shè)計(jì)語(yǔ)言中的數(shù)據(jù)類型、運(yùn)算符、表達(dá)式、基本結(jié)構(gòu)等基本概念,提高程序設(shè)計(jì)課的教學(xué)質(zhì)量,使學(xué)生在學(xué)習(xí)程序設(shè)計(jì)時(shí)少走或不走彎路,達(dá)到事半功倍的結(jié)果。
圖2 運(yùn)行結(jié)果1
在講VB程序設(shè)計(jì)時(shí),為了使學(xué)生能夠較深刻的理解不同數(shù)據(jù)類型所允許的運(yùn)算,不同運(yùn)算符的功能差異,學(xué)會(huì)正確使用基本結(jié)構(gòu)的嵌套,經(jīng)認(rèn)真篩選,我選擇了以中國(guó)古代算題“百錢(qián)買(mǎi)百雞”為例,引導(dǎo)學(xué)生設(shè)計(jì)解決該問(wèn)題的VB應(yīng)用程序。該題要解決的問(wèn)題是:
每只公雞5元錢(qián),每只母雞3元錢(qián),每3只小雞1元錢(qián)。今有100元錢(qián),要求必須且只能買(mǎi)100只雞。問(wèn)可買(mǎi)公雞、母雞、小雞各多少只。
這個(gè)問(wèn)題既可蛻變?yōu)橹袊?guó)民間婦孺皆知的“百僧分百饃”問(wèn)題,也和“百馬馱百擔(dān)”問(wèn)題類似,都是未知數(shù)的個(gè)數(shù)比方程的個(gè)數(shù)多1個(gè)不定解問(wèn)題。它可能無(wú)解,也可能只有一組解或多組解。
圖3 運(yùn)行結(jié)果2
同學(xué)們對(duì)此題非常感興趣,因?yàn)樗麄冊(cè)诤⑻釙r(shí)代就拼湊過(guò)“百僧分百饃”的古老算題,但只是拼出了答案:25個(gè)大和尚、75個(gè)小和尚,但卻說(shuō)不清楚是否還有別的解。此時(shí),看到要解決一直困擾他們的問(wèn)題了,學(xué)生們精神大振,動(dòng)腦筋分析問(wèn)題的積極性機(jī)靈型也大為提高。據(jù)此引導(dǎo)他們分析該題。
由于每只公雞(coke)5元錢(qián),所以100元全部用來(lái)買(mǎi)公雞,也最多一直能買(mǎi)20只。因此買(mǎi)公雞的可能是0只到20只;同理買(mǎi)母雞(hen)的可能是0只到33只;而買(mǎi)小雞(poult)的可能只能是100-公雞數(shù)-母雞數(shù)??梢?jiàn)這是一個(gè)典型的枚舉求解問(wèn)題,所以設(shè)計(jì)出了如圖1所示VB窗體界面,并未窗體中標(biāo)題為“計(jì)算開(kāi)始”的按鈕,設(shè)計(jì)出了單擊按鈕Command1_Click程序。它的VB程序源代碼如下:
程序運(yùn)行后,結(jié)果如圖2所示。這個(gè)結(jié)果無(wú)疑是正確的,因?yàn)橥ㄟ^(guò)核對(duì),不但雞的和為100個(gè),錢(qián)的和也是100元。該題的第一組接則是“百僧分百饃”的算題解。但當(dāng)我們將語(yǔ)句:
money=5*coke+3*hen+poult/3
中的除法運(yùn)算符“/”改為整除運(yùn)算符””時(shí),將會(huì)得到如圖3所示的運(yùn)行結(jié)果。顯然圖3的解比圖2的解多了3組:
分析這三組解,經(jīng)核對(duì)會(huì)發(fā)現(xiàn)盡管公雞、母雞、小雞的和是100只,但錢(qián)數(shù)卻不對(duì),這3組解,錢(qián)數(shù)分別為100.67,比限定的100元多出了0.67元,即隱藏著多買(mǎi)了2只小雞問(wèn)題。此時(shí)學(xué)生的興趣更濃,都急于想知道錯(cuò)在了什么地方。
此時(shí)引導(dǎo)學(xué)生進(jìn)一步分析產(chǎn)生錯(cuò)誤的原因。學(xué)生立即會(huì)聯(lián)想到,程序僅修改了一個(gè)算術(shù)運(yùn)算符,肯定是由于兩種除法運(yùn)算符的功能不同所導(dǎo)致的。
在正確的結(jié)果1中,使用了除法運(yùn)算符“/”。它是一個(gè)實(shí)型算子,該算子的特點(diǎn)是對(duì)實(shí)型數(shù)進(jìn)行運(yùn)算,運(yùn)算的結(jié)果也是實(shí)型數(shù)。如除數(shù)和被除數(shù)都是整型數(shù),系統(tǒng)會(huì)自動(dòng)將它們?nèi)繐Q算為對(duì)應(yīng)的實(shí)型數(shù),然后再進(jìn)行實(shí)型運(yùn)算,得到實(shí)型結(jié)果。例如:
77/3=25.67
此時(shí)表達(dá)式:
3*5+20*3+77/3的結(jié)果將是100.67,顯然這不符合錢(qián)數(shù)限定為100元的要求,它將被因錢(qián)數(shù)超出了0.67元而被排除,同樣其它兩組解也以同樣的理由被排除。
再分析在錯(cuò)誤結(jié)果2中,由于計(jì)算買(mǎi)小雞所用的錢(qián)數(shù)時(shí)使用了整除算子“”,而整除的結(jié)果是不帶小數(shù)的。當(dāng)結(jié)果有小數(shù)部分存在時(shí),將自動(dòng)被截去小數(shù)部分而僅保留整數(shù)部分。此時(shí)753、763、773均為25;783、793、803均為26;813、823、833均為27。正因?yàn)槿绱?,在上面三組解中,錢(qián)數(shù)計(jì)算的結(jié)果將都是100元,而并非100.67元,從而導(dǎo)致了錢(qián)數(shù)似乎符合100元限定的錯(cuò)誤結(jié)論,錯(cuò)誤的結(jié)論必然產(chǎn)生錯(cuò)誤的結(jié)果,從而認(rèn)為“錢(qián)數(shù)剛好”而作為是“正確解”輸出。
在學(xué)生明白了錯(cuò)誤產(chǎn)生的原因后,又通過(guò)引導(dǎo)學(xué)生探討如何避免此類錯(cuò)誤發(fā)生,使學(xué)生更進(jìn)一步拓寬了知識(shí)面。指出,在計(jì)算實(shí)際買(mǎi)小雞所花的錢(qián)時(shí),最好的方法的使用實(shí)型算子“/”,它方便快捷。但絕不能依次就得出不能使用整型算子“”的結(jié)論。事實(shí)上如使用了它,則只要將后面的:
則會(huì)排除掉上面錢(qián)數(shù)超限的三組解,從而取得于圖1完全一致的結(jié)果。其原因是,只有當(dāng)欲買(mǎi)小雞的只數(shù)是3的整數(shù)倍時(shí),poult/3才與poult3真正相等。只不過(guò)此時(shí)if語(yǔ)句中的條件表達(dá)式就成了復(fù)合條件表達(dá)式,它將徹底解決錢(qián)數(shù)超出的問(wèn)題。
這樣學(xué)生在實(shí)際案例中理解了VB除法算子和整除算子各自的功能和區(qū)別,學(xué)到了循環(huán)嵌套的有關(guān)知識(shí)。學(xué)生們普遍反映這的確是一個(gè)教授程序設(shè)計(jì)課好方法。
綜上所述,在程序設(shè)計(jì)中,正確選用一些古今中外有名的算例,聯(lián)系所講高級(jí)語(yǔ)言的數(shù)據(jù)類型、運(yùn)算符、語(yǔ)句語(yǔ)法等特點(diǎn),通過(guò)對(duì)算例的認(rèn)真剖析,一定會(huì)使枯燥艱澀的程序設(shè)計(jì)課程變得生動(dòng)活潑,使學(xué)生由怕程序設(shè)計(jì)變?yōu)閻?ài)程序設(shè)計(jì),從而調(diào)動(dòng)他們的學(xué)習(xí)程序設(shè)計(jì)的積極性,一定會(huì)在高級(jí)語(yǔ)言程序設(shè)計(jì)中達(dá)到事半功倍的良好效果。
[1]賈長(zhǎng)林等.可視化編程應(yīng)用——Visual Basic(第2版)[M].北京:高等教育出版社,2001.
[2]龔沛曾等.Visual Basic程序設(shè)計(jì)教程(6.0版)[M].北京:高等教育出版社,2000.