摘要:本文針對非計算機專業(yè)學生學習第一門程序設(shè)計語言的特點,總結(jié)了在“VB程序設(shè)計”課程教學中值得重視的兩大問題,并給出了具體的教學方法。
關(guān)鍵詞:程序設(shè)計;VB課程;非計算機專業(yè);教學方法
中圖分類號:G642文獻標識碼:B
1引言
對于初次學習程序設(shè)計語言的學生來說,要迅速掌握程序設(shè)計的正確思維方法和基本技能不是容易的事情。如何解決內(nèi)容多與學時少的矛盾?無疑只能從教學方法中找出路。我們認為,若干關(guān)鍵性的基礎(chǔ)問題和思維方法對學生程序設(shè)計技能的形成有至關(guān)重要的影響。因此,本文結(jié)合個人的實踐體會,介紹筆者在“VB程序設(shè)計”課程教學中兩點經(jīng)驗:一是圍繞如何使學生快速建立程序設(shè)計思維方法的問題,提出應(yīng)首先突破四個基礎(chǔ)性關(guān)鍵問題;二是針對初學者,就四類基本問題闡述了如何使用“從具體到抽象”的教學方法。望能拋磚引玉,并希望對其他程序語種的教學也能起到參考作用。
2快速建立程序設(shè)計思維方法
2.1理解事件驅(qū)動程序的機制
VB是采用事件驅(qū)動機制執(zhí)行程序的。為使初學者理解事件驅(qū)動程序的機制,筆者用通俗簡單的敘述方式,總結(jié)成如下幾個要點:①應(yīng)用程序基于對象組成,每個對象都有預(yù)先定義的事件。②對每種事件VB都有一個特定的關(guān)鍵詞來表示(如鼠標單擊事件的關(guān)鍵詞是Click,窗體加載事件是Load)。③一個具體對象的具體事件發(fā)生時就有一個對應(yīng)的程序單元的語句被執(zhí)行,這個程序單元叫做一個過程(由于“過程”的概念尚未學到,因此開始可以這樣通俗解釋之),一個事件過程的表示形式總是以固定格式的“Sub 對象名_事件關(guān)鍵詞( )”語句開頭(窗體對象例外,其對象名位置固定用Form表示),過程以固定的“End Sub”語句結(jié)束;過程的中間原來無任何內(nèi)容,而編程者可以在其中寫一些語句。④而一個事件的發(fā)生要依賴于一定的條件(用戶事件依賴用戶的驅(qū)動,系統(tǒng)事件依賴一定的時機)。⑤每個事件發(fā)生后系統(tǒng)如何響應(yīng)則取決于用戶給該事件過程編寫了什么代碼(若未寫任何代碼,則事件發(fā)生后程序無任何響應(yīng))。概括地說,由用戶控制事件的發(fā)生,而代碼做出響應(yīng),這就是事件驅(qū)動程序的機制。
2.2賦值語句與“=”號關(guān)系運算
賦值語句是程序最基本的語句,必須一開始就很好掌握。由于長期受數(shù)學課中等式、方程式的固化概念影響,初學者開始很難接受“x=x+1”這種程序語句的書寫形式。我們在教學中是這樣處理的:①這是一個賦值語句,賦值語句的左邊一定是一個變量,而右邊是一個表達式(變量、常量可看作特殊表達式)。②賦值語句的執(zhí)行是先右后左,即先求出右邊表達式的值;再將該值賦予左邊變量的內(nèi)存單元。③對于賦值符號左右兩邊出現(xiàn)同名變量的情況,左右兩邊的同名變量實際上代表同一變量在兩個不同時刻的值,右邊的變量名代表語句執(zhí)行之前變量內(nèi)存單元中的值(俗稱“老值”),左邊的變量名代表語句執(zhí)行之后變量內(nèi)存單元中的值(俗稱“新值”),“新老”交替反映了變量的值可變這一根本特性。賦值語句的執(zhí)行可以分解為三個階段,以“x=x+1”語句為例,假設(shè)執(zhí)行之前x的值為7,則該語句執(zhí)行的三階段如圖1所示。圖1中的執(zhí)行階段又包含三個動作:①取出變量原值;②進行運算;③運算結(jié)果送回變量內(nèi)存單元。
由于“=”符號在VB中身兼兩職,即除了表示賦值符號,有時是表示關(guān)系運算。在后面這種情況下,由“=”號及其兩邊的內(nèi)容組成了一個關(guān)系表達式,它最終代表一個邏輯值True或False。那末如何判斷“x=y”這種形式具體是表示賦值還是關(guān)系運算呢?有下面的原則:①若這種形式單獨出現(xiàn)且左邊是一個變量,則成為一條賦值語句;②若這種形式出現(xiàn)在判斷結(jié)構(gòu)或輸出語句中,則它是一個關(guān)系表達式,這時“=”號的左邊也可以是表達式。
2.3正確表達解決實際問題的操作順序
計算機程序強調(diào)嚴格的執(zhí)行順序,因此對一個實際問題的解決,寫成計算機程序時必須嚴格強調(diào)操作的先后順序。初學者對這個問題沒有深刻認識,寫程序時往往犯“本末倒置”的順序錯誤。在這一點上,我們以“溫度轉(zhuǎn)換”典型例題進行教學。
【例題1】 編一個轉(zhuǎn)換華氏溫度與攝氏溫度的程序,轉(zhuǎn)換公式是:
F=9/5*C+32(1) '將攝氏溫度轉(zhuǎn)換為華氏溫度,F(xiàn)為華氏溫度值
C=5/9*F-32(2) '將華氏溫度轉(zhuǎn)換為攝氏溫度,C為攝氏溫度值
要求:單擊“轉(zhuǎn)華氏”按鈕,則將攝氏溫度轉(zhuǎn)換為華氏溫度;單擊“轉(zhuǎn)攝氏”按鈕,則將華氏溫度轉(zhuǎn)換為攝氏溫度。界面見圖2。
教師先引導學生寫出“轉(zhuǎn)華氏”的程序單元,即填寫“Sub Command1_Click( )”過程中的語句:①定義變量F,C;②先獲得C的值,C的值從文本框2中來,所以有C=Text2;③計算F的值,用公式(1);④輸出結(jié)果F值,F(xiàn)值應(yīng)該送到文本框1中去,所以有Text1=F。在這個簡單程序中,過去常常有許多學生將語句順序搞顛倒,還有就是將第②、④步的語句錯寫為Text2=C;F=Text1;分不清“C值從哪里來”和“F值到哪里去”的表達方式。教師講完“轉(zhuǎn)華氏”的程序單元后,接下來要求學生獨立寫出“轉(zhuǎn)攝氏”的程序單元代碼,加以鞏固。
2.4以常用算法灌輸程序設(shè)計思維方法
掌握一些基本算法的實現(xiàn)不僅可以為學生今后解決實際問題打好基礎(chǔ),而且是建立程序設(shè)計思維方法的重要途徑。因此,教學過程中有必要精講部分常用算法。
① 累加求和與統(tǒng)計計數(shù)算法。強調(diào)的關(guān)鍵點有:存放累加和或統(tǒng)計計數(shù)值的變量初始化應(yīng)為0(如分別為s=0,n=0);程序結(jié)構(gòu)用到循環(huán),循環(huán)體關(guān)鍵語句是s=s+i或n=n+1,其中i是代表各加數(shù)的循環(huán)變量;n=n+1是在滿足計數(shù)條件下執(zhí)行的計數(shù)語句,該語句執(zhí)行一次,n值增1。
② 連乘算法。它是將若干個數(shù)乘起來的計算問題,若設(shè)這若干個數(shù)用變量i依次存放,用t存放連乘結(jié)果;則t值應(yīng)初始化為1,程序結(jié)構(gòu)用到循環(huán),循環(huán)變量為i。循環(huán)體關(guān)鍵語句是t=t*i??紤]到結(jié)果的數(shù)量巨大,為防止變量溢出,因此t的類型應(yīng)聲明為Double類型為好。
③ 窮舉算法。窮舉即是對實際問題中可能出現(xiàn)的所有排列組合情況進行列舉。對于包含巨大排列組合情況數(shù)目的問題,人工逐一列舉每種情況是不現(xiàn)實的;但借助計算機的高速處理能力常常是解決這類問題的有效方法。典型例題有“百元買百雞”問題[3,4]。
【例題2】 已知母雞、公雞、小雞各自的單價,求解所有購雞方案。此問題既可以用三重循環(huán)解決,也可以用二重循環(huán)解決;對比時間開銷,后者為優(yōu)。通過這種典型例題說明窮舉算法的程序一定是一個循環(huán)嵌套結(jié)構(gòu);而如果循環(huán)嵌套的層數(shù)可以降低,則應(yīng)盡可能采用較低的嵌套層數(shù)。
④ 遞推算法。遞推算法實際上是對一批有規(guī)律的數(shù)據(jù),如果知道其中一個,要求推算出其他所有數(shù)據(jù);也就是數(shù)值分析中的迭代算法。教學中我們?nèi)〖扔腥び值湫偷摹昂镒映蕴摇眴栴}為例[3,4]。
【例題3】 小猴在一天摘了若干個桃子,當天吃掉一半多一個;第二天接著吃了剩下的桃子的一半多一個;以后每天都吃尚存桃子的一半零一個,到第7天早上要吃時只剩下一個了,問小猴那天共摘了多少個桃子?
根據(jù)題意,不難列出相鄰兩天所剩桃子數(shù)的關(guān)系式是
xn-1=2*(xn+1) (*)
該問題要求從已知的第7天桃子數(shù)x7=1,推算出第1天桃子數(shù)x1。在程序中該關(guān)系式寫成賦值語句卻是
x=2*(x+1)(**)
讓x初值取1表示第7天的桃子數(shù),然后使(**)式表示的賦值語句循環(huán)執(zhí)行6次,就可以依次求出每一天的桃子數(shù)。此題關(guān)鍵要教會學生掌握將數(shù)學模型(*)式轉(zhuǎn)化為程序語句(**)式的技巧。
典型算法還有許多,要根據(jù)學時情況適當介紹。
3從具體到抽象的教學方法
從具體到抽象的教學方法實質(zhì)就是先通過具體實例說明,然后總結(jié)給出一般性規(guī)律。而許多教材常常相反,用從一般到具體的方法敘述一個問題。筆者認為前者方法對初學者更易接受。
3.1屬性的使用
先具體。如果要使用名稱為Label1的控件的Caption屬性,可以這樣使用:
Label1.Caption
后一般。如果要使用某控件的某屬性,一般形式如下:
控件名.屬性名
接下來只要分清楚屬性的使用包括“讀取”與“設(shè)置”兩種情況:要設(shè)置屬性,該屬性的使用形式出現(xiàn)在賦值語句左邊;出現(xiàn)在程序語句其他位置時都是讀取屬性。
3.2方法的使用
先具體。如果要使名稱為Text1的文本框得到焦點,可以對文本框Text1這樣使用SetFocus方法:
Text1. SetFocus
再具體。如果要在當前窗體Form1中打印文字”結(jié)果=”,同時還要輸出變量x的值,可以對窗體這樣使用Print方法:
Print ”結(jié)果=”; x
后一般。如果要使用某控件的某方法,一般形式如下:
[控件名.] 方法名 [參數(shù)列表]
接下來只要對照上面兩個實例解釋一般形式中的[]中內(nèi)容:加[]號的內(nèi)容有時是沒有的,或是可以省去的。
3.3函數(shù)的使用
先具體實例。如果要使輸入框以圖3形式出現(xiàn),且其左上角定位在屏幕坐標(100,200)處,而且用戶在不做任何修改的情況下單擊“確定”按鈕,就使變量x得到字符串”666”,則可以這樣使用InputBox函數(shù):
x=InputBox(\"請輸入一個數(shù)\",\"給x賦值\",\"666\",100,200)
后一般。InputBox函數(shù)的一般使用格式如下:
x=InputBox(提示內(nèi)容 [,標題] [,函數(shù)的默認值] [,x] [,y])
接下來只要對照上面實例解釋一般形式中的參數(shù)含義和可省參數(shù),學生就能馬上理解該函數(shù)的各參數(shù)含義。
3.4過程的使用
先具體實例。如果要以過程的形式使用MsgBox,使程序出現(xiàn)圖4形式的消息框,則可以這樣使用MsgBox過程:
MsgBox \"你輸入有誤!\", vbAbortRetryIgnore + vbCritical, \"報告消息\"
后一般。MsgBox過程的一般使用格式如下:
MsgBox 提示 [,按鈕及圖標] [,標題]
接下來只要對照上面實例解釋一般形式中的參數(shù)含義和可省參數(shù),并以表格形式列出“按鈕及圖標”部分參數(shù)有哪幾種,學生就能馬上理解該過程的各參數(shù)含義。
最近,筆者曾在本校大一2007級機械專業(yè)的VB課中做了一次小調(diào)查,即分別以“先一般后具體實例”和“先具體后一般總結(jié)”兩種教學方法,教學兩個同等難度的問題。然后讓學生舉手表決哪種方法易于理解,結(jié)果約75%以上的學生贊同“先具體后一般總結(jié)”的教學方法易于接受。
4結(jié)束語
筆者在教學實踐中注重上述兩方面問題,采用文中教學方法收效良好,表現(xiàn)在如下方面:
① 學生入門快,在實驗課上犯基本錯誤的人數(shù)隨教學進程發(fā)展而迅速減少;
② 課程通過率高,前幾屆學生該課程期末考試的及格率一般都超過95%;
③ 在后期的2周獨立課程設(shè)計中,前幾屆學生普遍表現(xiàn)出較強的綜合程序設(shè)計能力。本文提出的理論方法和實踐經(jīng)驗也可供其他計算機語言教學參考。
參考文獻:
[1] 宋志宏,賈冬梅. VB程序設(shè)計課“三階段教學法”探析[J]. 計算機教育,2007,(6).
[2] 謝紅霞,杜建生. “VB程序設(shè)計”教學與實踐[J]. 計算機教育,2007,(10).
[3] 朱從旭. Visual Basic程序設(shè)計綜合教程[M]. 北京:清華大學出版社,2005.
[4] 龔沛曾. Visual Basic程序設(shè)計簡明教程[M]. 北京:高等教育出版社出版,2002.
[5] 譚浩強. QBASIC程序設(shè)計(二級)教程[M]. 北京:清華大學出版社,2002.