lt;數字類型變數>,值為1的傳回值,值為2的傳回值…)
Switch(<條件運算式1>,條件運算式1為True時的值
[,<條件運算式2>,條件運算式2為True時的值…])
3.3 常見錯誤和痛點分析
1.在選擇結構中缺少配對的結束語句
對多行式的If塊語句中,應有配對的End If語句結束。否則,在運行時系統會顯示"塊 If沒有End If"的編譯錯誤。
同樣對Select Case語句也應有與其相對應的EndSelect語句。
2.多邊選擇Else If關鍵字的書寫和條件運算式的表示
多邊選擇Else If子句的關鍵字Else If之間不能寫有空格,即不能寫成Else If。
在多個條件運算式的表示時,應從最小或最大的條件依次表示,以避免條件的過濾。例如,已知輸入某課程的百分製成績mark,要求顯示對應五級制的訐定,評定條件如下:
有以下幾種表示方式,文法上都沒有錯,但執行後結果有所不同,請讀者分析哪些正確?哪些錯誤?
下面給出的答案中,方法一、二、五正確,其餘錯誤,請讀者分析各自的原因。
方法一: 方法二: 方法三:
If mark>=90Then If mark<60Then If mark>=60Then
Print"優" Print"不及格" Print"及格"
ElseIf mark>=80Then ElseIf mark<70Then ElseIf mark>=70Then
Print"良" Print"及格" Print"中"
ElseIf mark>=70Then ElseIf mark<80Then Elselfmark>=80Then
Print"中" Print"中" Print"良"
ElseIfmark>-60Then ElseIf mark<90Then Elselfmark>=90Then
Print"及格" Print"良" Print"優"
Else Else Else
Print"及格" Print"優" Print"不及格"
End If End If End If
方法四: 方法五:
If mark>=90Then If mark>=90Then
Print"優" Print"優"
ElseIf80<=mark<90Then ElseIf80<=mark And mark<90 Then
Print"良" Print"良"
ElseIf70<=mark<80Then ElseIf70<=mark And mark<80Then
Print"中" Print"中"
ElseIf60<=mark<70Then ElseIf60<=mark And mark<70Then
Print"及格" Print"及格"
Else Else
Print"不及格" Print"不及格"
End If End If
3.Select Case語句的使用
(1)"運算式列表i"中不能使用"變數或運算式"中出現的變數。例如,上述多邊選擇的例子改為Select Case語句實現,方法一Case子句中出現變數mark,運行時不管mark的值多少,始終執行Case Else子句,運行結果不正確;方法二、方法三正確。
方法一: 方法二: 方法三:
Select Case mark Select Case mark Select Case mark
Case mark>=90 Case Is>=90 Case Is>=90
Print"優" Print"優" Print"優"
Case mark>=80 Casels>=80 Case 80To 89
Print"良" Print"良" Print"良"
Casemark>=70 Case Is>=70 Case 70To 79
Print"中" Print"中" Print"中"
Case mark>=60 Case Is>=60 Case 60TO 69
Print"及格" Prim"及格" Print"及格"
Case Else Case Else Case Else
Print"不及格" Print"不及格" Print"不及格"
End Select End Select End Select
(2)在"變數或運算式"中不能出現多個變數。實驗三第5題對三門課程獎學金的判斷,只能用If語句的多邊選擇,而不能用SelectCase語句實現。例如,有些讀者用如下語句表示:
Select Case markl,mark2,mark3
Case(markl+mark2+mark3)/3>=95
Print"一等獎"
End Select
這樣就會在"Select Case markl,mark2,mark3"語句行出現編輯錯誤:同時Case(markl+mark2 +mark3)/3>=95書寫也錯誤。
第四章 迴圈結構
4.1 知識要點
1.For … Next迴圈結構形式和使用
For<迴圈變數>=<初值>To<終值>[Step<步長>]
<迴圈體>
Next<迴圈變數>
常用於已知迴圈次數的場合。步長可正可負,可為整數,也可為實數。掌握迴圈次數的計算: ,當迴圈變數(步長為正)大於終值,迴圈終止。
例如,程式段都是以每100顯示sin的值:
(1)Fori=0 To 360 Stepl0 (2)For x=0To 6.28 Step 6.28/36
Print sin(i*3.14/180) Print sin(x)
NextiNextx
(3)For j=360 To 0 Step-10
Print sin((360-j)*3.14/180)
Next j
2.Do…Loop迴圈結構形式和使用
根據不同組合,有5種形式:
1)無條件迴圈 2)當條件為真迴圈 3)當條件為真不迴圈 4)先迴圈再判斷 5)先迴圈再判斷
Do Do While<條件> Do Until<條件> Do Do
<迴圈體> <迴圈體> <迴圈體> <迴圈體> <迴圈體>
Loop Loop Loop Loop While<條件> LoopUntil<條件>
3.迴圈的嵌套及注意事項
迴圈體內又出現迴圈結構稱迴圈的嵌套或多重迴圈。計算多重迴圈的迴圈次數由每一重迴圈次數的乘積。
外循體內要完整地包含內迴圈結構,不能交叉。
4.其他輔助語句
Eixt For退出For迴圈語句、Exit Do退出Do迴圈、GoTo五條件轉向語句、End程式運行結束語句、With語句。
4.3 常見錯誤和痛點分析
1.不迴圈或死迴圈的問題主要是迴圈條件、迴圈初值、迴圈終值、迴圈步長的設定有問題。例如,以下迴圈語句不執行迴圈體:
For i=10 To 20 Step-1 ' 步長為負,初值必須大於等於終值,才能迴圈
For i=20 To10 ' 步長為正,初值必須小於等於終值,才能迴圈
Do While False ' 迴圈條件永遠不滿足,不迴圈
例如,以下迴圈語句死迴圈:
For i=10 To 20 Step 0 ' 步長為零,死迴圈
Do While 1 ' 迴圈條件永遠滿足,死迴圈
2.迴圈結構中缺少配對的結束語句
For…Next語句沒有配對的Next語句;Do語句沒有一個終結的Loop語句等。
3.迴圈嵌套時,內外迴圈交叉:
For I=1 to 4
For j=1 to 5
…
Next i
Next j
上述迴圈的交叉運行時顯示"無效的Next控制變數引用"。
4.累加、連乘時,存放累加、連乘結果的變數賦初值問題
(1)一重迴圈
在一重迴圈中,存放累加、連乘結果的變數初值設定應在迴圈語句前。
例如,求1~100的3的倍數和,結果放入Sum變數中,如下程式段,輸出結果如何?
Private SubForm_Click()
Fori=3 To 100 Step 3
Sum=0
Sum=Sum+i
Next i
Print Sum
End Sub
要得到正確的結果,應作如何改進?
(2)多重迴圈
在多重迴圈中,存放累加、連乘結果的變數初值設定放在外迴圈語句前,還是內迴圈語句前,這要視具體問題分別對待。
例如,期末30位學生參加三門課程的考試,求每個學生的三門課程的平均成績如下程式能否實現,應如何改進?
aver=0
For i=1 To 30
For j=1 To 3
m=InputBox("輸入第"&j&"門課的成績")
aver=aver+m
Next j
aver=aver/3
Print aver
Nexti
第五章 數 組
5.1 知識要點
1.數組的概念
數組:存放具有相同性質的一組資料,也就是數組中的資料必須是同一個類型和性質。
數組元素:數組中的某一個資料項目。數組元素的使用同簡單變數的使用。
2.靜態數組的聲明
靜態數組:在聲明時已確定了數組元素個數。
聲明形式:Dim數組名([下界To]上界[,[下界To]上界[,…]])As 類型
此語句聲明了數組名、數組維數、數組大小、數群組類型。
[注意]
下界、上界必須為常數,不能為運算式或變數:省略下界,預設為0,也可用Option Base語句重新設定下界的值。
3.動態數組的聲明
聲明形式: Dim數組名 ()
ReDim [Preserve]數組名([下界To]上界[,[下界To]上界[,…]])
[注意]
此時的上界、下界可以是賦了值的變數或運算式。若有Preserve關鍵字,表示當改變原有數組最末尾的大小時,使用此關鍵字可以保持數組中原來的資料。
4.控制項數組
相同類型的控制群組成的數組。
控制項數組的建立:在設計時的表單上,通過對某控制項的複製和粘貼操作:在程式運行時通過Load方法實現。
控制項數組元素:由控制項的Index屬性值表示數組的F標。
5.數組的操作
應掌握的基本操作有:數組初始化、數組輸入、數組輸出、求數組中的最大(最小)元素及下標、求和、平均值、排序和尋找等。
5.3 常見錯誤和痛點分析
1.Dim數組聲明
有時使用者為了程式的通用性,聲明數組的上界用變數來表示,如下程式段:
n=InputBox("輸入數組的上界")
Dim a(1 To n)As Integer
程式運行時將在Dim語句處顯示"要求常數運算式"的出錯資訊。即Dim語句中聲明的數組上,下界必須是常數,不能是變數。
解決程式通用的問題,一是將數組聲明的很大,這樣浪費一些儲存空間;二是利用動態數組,將上例改變如下:
Dima()As Integer
n=InputBox ("輸入數組的上界")
ReDim a(1 To n)As Integer
2.數組下標越界
引用了不存在的數組元素,即下標比數組聲明時的下標範圍大或小。例如,要形成有如下30項的斐波那契數列:
1,1,2,3,5,8,13,21,34,…,317811,514229,832040
正確的程式段如下:
Dim a(1 To 30) As Long, i%
若將For i=3To 30改為For i=1 To 30,程式運行時會顯示"下標越界"的出錯資訊,因為開始迴圈時i=l,執行到迴圈體語句a(i)=a(i-2)+a(i-1),數組下標i-2、i-1均小於下界1。
同樣若將上例:a(i)+a(i-2)+a(i-1)語句改為:a(i+2)=a(i)+a(i+1)
程式運行時也會顯示"下標越界"的出錯資訊,這時是數組下標大於上界30。
3.數組維數錯
數組聲明時的維數與引用數組元素時的維數不一致。例如,下程式段為形成和顯示3×5的矩陣:
Dim a(3,5) As Long
For i=1 To 3
For j=1 To 5
a(i)=i*j
Print a(i);"";
Next j
Print
Next i
程式運行到a(i)=i*j語句時出現"維數錯誤"的資訊,因為在Dim聲明時是二維數組,引用時的一個下標。
4.Aarry函數使用問題
Aarry函數可方便地對數組整體賦值,但此時只能聲明Variant的變數或僅由括弧括起的動態數組。賦值後的數組大小由賦值的個數決定。
例如,要將1,2,3,4,5,6,7這些值賦值給數組a,表2.5.1列出了三種錯誤及相應正確的賦值方法。
表2.5.1 Aarry函數表示方法
錯誤的Aarry函數賦值 改正的Aarry函數賦值
Dim a(1 To 8)a=Array(1,2,3,4,5,6,7,8) Dim a( )a=Array(1,2,3,4,5,6,7)
Dim a As Integera=Array(1,2,3,4,5,6,7) Dim aa=Array(1,2,3,4,5,6,7)
Dim aa()=Array(1,2,3,4,5,6,7) Dim aa=Array(1,2,3,4,5,6,7)
5.如何獲得數組的上界、下界
Aarry函數可方便地對數組整體賦值,但在程式中如何獲得數組的-上界、下界,以保證訪問的數組元素在合法的範圍內,可使用UBound和LBound函數來決定數組訪問。
在上例中,若要列印a數組的各個值,可通過下面程式段實現:
For i=Lbound(A) To Ubound(A)
Print a(i)
Next l
6.給數組賦值
VB6.0提供了可對數組整體賦值的新功能,方便了數組對數組的賦值操作。但真正使用不那麼方便,有不少限制。數組賦值形式如下:
數組名2=數組名1
我們就此形式作討論:這裡的數組名2,實際上在前面的數組聲明時,只能聲明為Varian的變數,賦值後的數組2的大小、維數、類型同數組名1;否則,若聲明成動態或靜態數組,例如:
Dim數組名2()或Dim數組名2 (下標)
程式在運行到上述指派陳述式時顯示"不能給數組賦值"的出錯資訊。
所以,為了程式的安全、可靠,建議讀者還是忍痛割愛,少用VB6.0的這一新功能,使用傳統的迴圈結構來給數組賦值。基於此原因,我們也就在教程中不作展開。
第六章 過 程
6.1 知識要點
1.過程的概念
VB的程式是由一個個過程構成的,除了VB系統提供了大量使用的內建函式過程和事件程序外,VB系統還允許使用者根據各自需要自訂過程。使用過程的好處:使程式簡練、高效、便於程式的調試和維護。本節涉及的過程主要指的是使用者自訂的子過程和函數過程。
2.兩類流程定義與調用
(1)子過程
定義形式:Sub<子過程名>[(形參表)]
…
End Sub
特點:子過程名無值,無類型。
調用形式:Call<子過程名>[(實參表)]
或:<子過程名>[(實參表)]
特點:是一句獨立的語句。
(2)函數過程
形式:Function<函數過程名>([形參表])
…
<函數過程名>=<運算式>
…
End Sub
特點:函數過程名有值、有類型,在過程體內至少賦值一次。
調用形式:<函數過程名> ([實參表])
特點:不能獨立存在,必須參加運算式的運算。
3.參數傳遞
(1)傳值方式是將實參的具體值傳遞給形參。
傳值方式是形參前加ByVal關鍵字,表示值傳遞。這種傳遞方式是一種單向的資料傳遞,即調用時只能由實參將值傳遞給形參;調用結束不能由形參將操作結果返回給實參。實參可以是常數或運算式。
(2)傳地址
傳地址方式(ByRet)是將實參在記憶體的地址傳遞給形參,也就是實參、形參共用記憶體內的"地址"。
這種傳遞方式是一種雙向的資料傳遞,即調用時實參將值傳遞給形參:調用結束由形參將操作結果返回給實參。當實參要得到返回的結果時,實參只能是變數,不能是常數或運算式。
在過程中具體用傳值還是傳地址,主要考慮的因素是:若要從程序呼叫中通過形參返回結果,則要用傳地址方式;否則應使用傳值方式,減少過程間的相互關聯,便於程式的調試。數組、記錄類型變數、物件變數只能用地址傳遞方式。
在VB中,預設是傳地址方式。
4.變數的範圍
全域變數:Public關鍵字開頭的變數為全域變數,在整個工程中都有效。
表單、模組層級變數:在通用聲明段用Dim或Private關鍵字聲明的變數,在該表單或模組內有效。
局部變數:在過程中聲明的變數,在該程序呼叫時分配記憶體空間並初始化,程序呼叫結束,回收分配的空間。
使用規則見表2.6.1所示。
表2.6.1 變數的範圍
使用範圍 局部變數 表單/模組層級變數 全域變數
表單 標準模組
聲時方式 Dim, tatic Dim,Private
聲明位置 在過程中 表單/模組的通用聲明段 表單/模組的通用聲明段
能被本模組的其他過程存取 不能 能 能
能被其他模組存取 不能 不能 能,但在變數名前加表單名 能
靜態變數:局部變數聲明前加Static關鍵字,在程式啟動並執行過程中始終保值。
5.過程的遞迴調用
在調用一個子過程或函數過程中又調用自己,稱為遞迴調用,這樣的子過程或函數過程稱為遞迴子過程或遞迴函式,簡化稱為遞迴過程。
構成遞迴過程的條件:遞迴結束條件及結束時的值:能用遞迴形式表示,並且遞迴向終止條件發展。
6.常用演算法
對數值計算方面要求掌握:求最大值(最小值)及下標位置、求和、平均值、最大公約數、最小公倍數、素數、數制轉換、高次方程求根(迭代法、二分法)、定積分(矩形法、梯形法、辛蔔生法、蒙特卡洛法)。
非數值計算:常用字串處理函數、排序(選擇法、冒泡法、插入法、合并排序)、尋找(順序、二分法)。
6.3 常見錯誤和痛點分析
1.程式設計演算法問題
該章程式編寫難度較大,主要是演算法的構思有困難,這也是程式設計中最難學習的階段。經驗告訴每一位程式設計的初學者,沒有捷徑可走,多看、多練、知難而進。上機前一定要先編寫好程式,仔細分析、檢查,才能提高上機調試的效率。每當一個程式通過艱苦的努力調試通過時,那苦盡甘來的喜悅令你一言難盡。
2.確定自訂的過程是子過程還是函數過程
實際上過程是一個具有某種功能的獨立程式單位,供多次調用。子過程與函數過程的區別是前者子過程名無值:後者函數過程名有值。若過程有一個傳回值,則習慣使用函數過程;若過程無傳回值,則使用子過程:若過程返回多個值,一般使用子過程,通過實參與形參的結合帶回結果,當然也可通過函數過程名帶回一個,其餘結果通過實參與形參的結合帶回。
3。過程中形參的個數和傳遞方式的確定
對初學者,在定義過程時不能確定形參的個數和傳遞方式。
過程中參數的作用是實現過程與調用者的資料通訊。一方面,調用者為子過程或函數過程提供初值,這是通過實參傳遞給形參實現的:另一方面,子過程或函數過程將結果傳遞給調用者,這是通過地址傳遞方式實現的。因此,決定形參的個數就是由上述兩方面決定的。對初學者,往往喜歡把過程體中用到的所有變數命作為形參,這樣就增加了調用者的負擔和出錯機率:也有的初學者全部省略了形參,則無法實現資料的傳遞,既不能從調用者得到初值,也無法將計算結果傳遞給調用者。
VB中形參與實參的結合有傳值和傳地址兩種方式。區別如下:
(1)在定義形式上前者在形參前加即Val關鍵字。
(2)在作用上值傳遞只能從外界向過程傳入初值,但不能將結果傳出:而地址傳遞既可傳入又可傳出。
(3)如果實參是數組、自訂類型、物件變數等,形參只能是地址傳遞。
4.實參與形參類型對應問題
在地址傳遞方式時,調用過程實參與形參類型要一致。