摘要:本文針對非計算機專業學生學習第一門程序設計語言的特點,總結了在“VB程序設計”課程教學中值得重視的兩大問題,并給出了具體的教學方法。
關鍵詞:程序設計;VB課程;非計算機專業;教學方法
中圖分類號:G642文獻標識碼:B
1引言
對于初次學習程序設計語言的學生來說,要迅速掌握程序設計的正確思維方法和基本技能不是容易的事情。如何解決內容多與學時少的矛盾?無疑只能從教學方法中找出路。我們認為,若干關鍵性的基礎問題和思維方法對學生程序設計技能的形成有至關重要的影響。因此,本文結合個人的實踐體會,介紹筆者在“VB程序設計”課程教學中兩點經驗:一是圍繞如何使學生快速建立程序設計思維方法的問題,提出應首先突破四個基礎性關鍵問題;二是針對初學者,就四類基本問題闡述了如何使用“從具體到抽象”的教學方法。望能拋磚引玉,并希望對其他程序語種的教學也能起到參考作用。
2快速建立程序設計思維方法
2.1理解事件驅動程序的機制
VB是采用事件驅動機制執行程序的。為使初學者理解事件驅動程序的機制,筆者用通俗簡單的敘述方式,總結成如下幾個要點:①應用程序基于對象組成,每個對象都有預先定義的事件。②對每種事件VB都有一個特定的關鍵詞來表示(如鼠標單擊事件的關鍵詞是Click,窗體加載事件是Load)。③一個具體對象的具體事件發生時就有一個對應的程序單元的語句被執行,這個程序單元叫做一個過程(由于“過程”的概念尚未學到,因此開始可以這樣通俗解釋之),一個事件過程的表示形式總是以固定格式的“Sub 對象名_事件關鍵詞( )”語句開頭(窗體對象例外,其對象名位置固定用Form表示),過程以固定的“End Sub”語句結束;過程的中間原來無任何內容,而編程者可以在其中寫一些語句。④而一個事件的發生要依賴于一定的條件(用戶事件依賴用戶的驅動,系統事件依賴一定的時機)。⑤每個事件發生后系統如何響應則取決于用戶給該事件過程編寫了什么代碼(若未寫任何代碼,則事件發生后程序無任何響應)。概括地說,由用戶控制事件的發生,而代碼做出響應,這就是事件驅動程序的機制。
2.2賦值語句與“=”號關系運算
賦值語句是程序最基本的語句,必須一開始就很好掌握。由于長期受數學課中等式、方程式的固化概念影響,初學者開始很難接受“x=x+1”這種程序語句的書寫形式。我們在教學中是這樣處理的:①這是一個賦值語句,賦值語句的左邊一定是一個變量,而右邊是一個表達式(變量、常量可看作特殊表達式)。②賦值語句的執行是先右后左,即先求出右邊表達式的值;再將該值賦予左邊變量的內存單元。③對于賦值符號左右兩邊出現同名變量的情況,左右兩邊的同名變量實際上代表同一變量在兩個不同時刻的值,右邊的變量名代表語句執行之前變量內存單元中的值(俗稱“老值”),左邊的變量名代表語句執行之后變量內存單元中的值(俗稱“新值”),“新老”交替反映了變量的值可變這一根本特性。賦值語句的執行可以分解為三個階段,以“x=x+1”語句為例,假設執行之前x的值為7,則該語句執行的三階段如圖1所示。圖1中的執行階段又包含三個動作:①取出變量原值;②進行運算;③運算結果送回變量內存單元。

由于“=”符號在VB中身兼兩職,即除了表示賦值符號,有時是表示關系運算。在后面這種情況下,由“=”號及其兩邊的內容組成了一個關系表達式,它最終代表一個邏輯值True或False。那末如何判斷“x=y”這種形式具體是表示賦值還是關系運算呢?有下面的原則:①若這種形式單獨出現且左邊是一個變量,則成為一條賦值語句;②若這種形式出現在判斷結構或輸出語句中,則它是一個關系表達式,這時“=”號的左邊也可以是表達式。
2.3正確表達解決實際問題的操作順序
計算機程序強調嚴格的執行順序,因此對一個實際問題的解決,寫成計算機程序時必須嚴格強調操作的先后順序。初學者對這個問題沒有深刻認識,寫程序時往往犯“本末倒置”的順序錯誤。在這一點上,我們以“溫度轉換”典型例題進行教學。
【例題1】 編一個轉換華氏溫度與攝氏溫度的程序,轉換公式是:
F=9/5*C+32(1) '將攝氏溫度轉換為華氏溫度,F為華氏溫度值
C=5/9*F-32(2) '將華氏溫度轉換為攝氏溫度,C為攝氏溫度值
要求:單擊“轉華氏”按鈕,則將攝氏溫度轉換為華氏溫度;單擊“轉攝氏”按鈕,則將華氏溫度轉換為攝氏溫度。界面見圖2。

教師先引導學生寫出“轉華氏”的程序單元,即填寫“Sub Command1_Click( )”過程中的語句:①定義變量F,C;②先獲得C的值,C的值從文本框2中來,所以有C=Text2;③計算F的值,用公式(1);④輸出結果F值,F值應該送到文本框1中去,所以有Text1=F。在這個簡單程序中,過去常常有許多學生將語句順序搞顛倒,還有就是將第②、④步的語句錯寫為Text2=C;F=Text1;分不清“C值從哪里來”和“F值到哪里去”的表達方式。教師講完“轉華氏”的程序單元后,接下來要求學生獨立寫出“轉攝氏”的程序單元代碼,加以鞏固。
2.4以常用算法灌輸程序設計思維方法
掌握一些基本算法的實現不僅可以為學生今后解決實際問題打好基礎,而且是建立程序設計思維方法的重要途徑。因此,教學過程中有必要精講部分常用算法。
① 累加求和與統計計數算法。強調的關鍵點有:存放累加和或統計計數值的變量初始化應為0(如分別為s=0,n=0);程序結構用到循環,循環體關鍵語句是s=s+i或n=n+1,其中i是代表各加數的循環變量;n=n+1是在滿足計數條件下執行的計數語句,該語句執行一次,n值增1。
② 連乘算法。它是將若干個數乘起來的計算問題,若設這若干個數用變量i依次存放,用t存放連乘結果;則t值應初始化為1,程序結構用到循環,循環變量為i。循環體關鍵語句是t=t*i??紤]到結果的數量巨大,為防止變量溢出,因此t的類型應聲明為Double類型為好。
③ 窮舉算法。窮舉即是對實際問題中可能出現的所有排列組合情況進行列舉。對于包含巨大排列組合情況數目的問題,人工逐一列舉每種情況是不現實的;但借助計算機的高速處理能力常常是解決這類問題的有效方法。典型例題有“百元買百雞”問題[3,4]。
【例題2】 已知母雞、公雞、小雞各自的單價,求解所有購雞方案。此問題既可以用三重循環解決,也可以用二重循環解決;對比時間開銷,后者為優。通過這種典型例題說明窮舉算法的程序一定是一個循環嵌套結構;而如果循環嵌套的層數可以降低,則應盡可能采用較低的嵌套層數。
④ 遞推算法。遞推算法實際上是對一批有規律的數據,如果知道其中一個,要求推算出其他所有數據;也就是數值分析中的迭代算法。教學中我們取既有趣又典型的“猴子吃桃”問題為例[3,4]。
【例題3】 小猴在一天摘了若干個桃子,當天吃掉一半多一個;第二天接著吃了剩下的桃子的一半多一個;以后每天都吃尚存桃子的一半零一個,到第7天早上要吃時只剩下一個了,問小猴那天共摘了多少個桃子?
根據題意,不難列出相鄰兩天所剩桃子數的關系式是
xn-1=2*(xn+1) (*)
該問題要求從已知的第7天桃子數x7=1,推算出第1天桃子數x1。在程序中該關系式寫成賦值語句卻是
x=2*(x+1)(**)
讓x初值取1表示第7天的桃子數,然后使(**)式表示的賦值語句循環執行6次,就可以依次求出每一天的桃子數。此題關鍵要教會學生掌握將數學模型(*)式轉化為程序語句(**)式的技巧。
典型算法還有許多,要根據學時情況適當介紹。
3從具體到抽象的教學方法
從具體到抽象的教學方法實質就是先通過具體實例說明,然后總結給出一般性規律。而許多教材常常相反,用從一般到具體的方法敘述一個問題。筆者認為前者方法對初學者更易接受。
3.1屬性的使用
先具體。如果要使用名稱為Label1的控件的Caption屬性,可以這樣使用:
Label1.Caption
后一般。如果要使用某控件的某屬性,一般形式如下:
控件名.屬性名
接下來只要分清楚屬性的使用包括“讀取”與“設置”兩種情況:要設置屬性,該屬性的使用形式出現在賦值語句左邊;出現在程序語句其他位置時都是讀取屬性。
3.2方法的使用
先具體。如果要使名稱為Text1的文本框得到焦點,可以對文本框Text1這樣使用SetFocus方法:
Text1. SetFocus
再具體。如果要在當前窗體Form1中打印文字”結果=”,同時還要輸出變量x的值,可以對窗體這樣使用Print方法:
Print ”結果=”; x
后一般。如果要使用某控件的某方法,一般形式如下:
[控件名.] 方法名 [參數列表]
接下來只要對照上面兩個實例解釋一般形式中的[]中內容:加[]號的內容有時是沒有的,或是可以省去的。
3.3函數的使用
先具體實例。如果要使輸入框以圖3形式出現,且其左上角定位在屏幕坐標(100,200)處,而且用戶在不做任何修改的情況下單擊“確定”按鈕,就使變量x得到字符串”666”,則可以這樣使用InputBox函數:
x=InputBox(\"請輸入一個數\",\"給x賦值\",\"666\",100,200)

后一般。InputBox函數的一般使用格式如下:
x=InputBox(提示內容 [,標題] [,函數的默認值] [,x] [,y])
接下來只要對照上面實例解釋一般形式中的參數含義和可省參數,學生就能馬上理解該函數的各參數含義。
3.4過程的使用
先具體實例。如果要以過程的形式使用MsgBox,使程序出現圖4形式的消息框,則可以這樣使用MsgBox過程:
MsgBox \"你輸入有誤!\", vbAbortRetryIgnore + vbCritical, \"報告消息\"

后一般。MsgBox過程的一般使用格式如下:
MsgBox 提示 [,按鈕及圖標] [,標題]
接下來只要對照上面實例解釋一般形式中的參數含義和可省參數,并以表格形式列出“按鈕及圖標”部分參數有哪幾種,學生就能馬上理解該過程的各參數含義。
最近,筆者曾在本校大一2007級機械專業的VB課中做了一次小調查,即分別以“先一般后具體實例”和“先具體后一般總結”兩種教學方法,教學兩個同等難度的問題。然后讓學生舉手表決哪種方法易于理解,結果約75%以上的學生贊同“先具體后一般總結”的教學方法易于接受。
4結束語
筆者在教學實踐中注重上述兩方面問題,采用文中教學方法收效良好,表現在如下方面:
① 學生入門快,在實驗課上犯基本錯誤的人數隨教學進程發展而迅速減少;
② 課程通過率高,前幾屆學生該課程期末考試的及格率一般都超過95%;
③ 在后期的2周獨立課程設計中,前幾屆學生普遍表現出較強的綜合程序設計能力。本文提出的理論方法和實踐經驗也可供其他計算機語言教學參考。
參考文獻:
[1] 宋志宏,賈冬梅. VB程序設計課“三階段教學法”探析[J]. 計算機教育,2007,(6).
[2] 謝紅霞,杜建生. “VB程序設計”教學與實踐[J]. 計算機教育,2007,(10).
[3] 朱從旭. Visual Basic程序設計綜合教程[M]. 北京:清華大學出版社,2005.
[4] 龔沛曾. Visual Basic程序設計簡明教程[M]. 北京:高等教育出版社出版,2002.
[5] 譚浩強. QBASIC程序設計(二級)教程[M]. 北京:清華大學出版社,2002.