VB常見錯誤和難點分析
1.在選擇結構中缺少配對的結束語句
對多行式的If塊語句中,應有配對的End If語句結束。否則,在執行時系統會顯示”塊 If沒有End If”的編譯錯誤。同樣對Select Case語句也應有與其相對應的End Select語句。
2.多邊選擇ElseIf關鍵字的書寫和條件表示式的表示
多邊選擇ElseIf子句的關鍵字ElseIf之間不能寫有空格,即不能寫成Else If。
在多個條件表示式的表示時,應從最小或最大的條件依次表示,以避免條件的過濾。例如,已知輸入某課程的百分制成績mark,要求顯示對應五級制的訐定,評定條件如下:
有以下幾種表示方式,語法上都沒有錯,但執行後結果有所不同,請分析哪些正確? 哪些錯誤?
下面給出的答案中,方法一、二、五正確,其餘錯誤,請分析各自的原因。
3.Select Case語句的使用
(1) “表示式列表i” 中不能使用”變數或表示式”中出現的變數。
例如,上述多邊選擇的例子改為Select Case語句實現,方法一Case子句中出現變數mark,執行時不管mark的值多少,始終執行Case Else子句,執行結果不正確;方法二、方法三正確。
(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書寫也錯誤。
第四章 常見錯誤和難點分析
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()
For i=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
Next I
第五章 常見錯誤和難點分析
1.Dim陣列宣告
有時使用者為了程式的通用性,宣告陣列的上界用變數來表示,如下程式段:
n=InputBox("輸入陣列的上界")
Dim a(1 To n) As Integer
程式執行時將在Dim語句處顯示”要求常數表示式”的出錯資訊。即Dim語句中宣告的陣列上,下界必須是常數,不能是變數。
解決程式通用的問題,一是將陣列宣告的很大,這樣浪費一些儲存空間;二是利用動態陣列,將上例改變如下:
Dim a() 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=3 To 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,下表列出了三種錯誤及相應正確的賦值方法。
Aarry函式表示方法
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 (下標)
程式在執行到上述賦值語句時顯示”不能給陣列賦值”的出錯資訊。
第五章 數 組
5.1 知識要點
1.陣列的概念
陣列:存放具有相同性質的一組資料,也就是陣列中的資料必須是同一個型別和性質。
陣列元素:陣列中的某一個數據項。陣列元素的使用同簡單變數的使用。
2.靜態陣列的宣告
靜態陣列:在宣告時已確定了陣列元素個數。
宣告形式:Dim陣列名([下界To]上界[,[下界To]上界[,…]])As 型別
此語句聲明瞭陣列名、陣列維數、陣列大小、陣列型別。
[注意] 下界、上界必須為常數,不能為表示式或變數:省略下界,預設為0,也可用Option Base語句重新設定下界的值。
3.動態陣列的宣告
宣告形式: Dim陣列名 ()
ReDim [Preserve]陣列名([下界To]上界[,[下界To]上界[,…]])
[注意]
此時的上界、下界可以是賦了值的變數或表示式。若有Preserve關鍵字,表示當改變原有陣列最末尾的大小時,使用此關鍵字可以保持陣列中原來的資料。
4.控制元件陣列
即相同型別的控制元件組成的陣列。
控制元件陣列的建立:在設計時的窗體上,通過對某控制元件的複製和貼上操作:在程式執行時通過Load方法實現。
控制元件陣列元素:由控制元件的Index屬性值表示陣列的F標。
5.陣列的操作
應掌握的基本操作有:陣列初始化、陣列輸入、陣列輸出、求陣列中的最大(最小)元素及下標、求和、平均值、排序和查詢等。
5.2 常見錯誤和難點分析
1.Dim陣列宣告
有時使用者為了程式的通用性,宣告陣列的上界用變數來表示,如下程式段:
n=InputBox("輸入陣列的上界")
Dim a(1 To n) As Integer
程式執行時將在Dim語句處顯示”要求常數表示式”的出錯資訊。即Dim語句中宣告的陣列上,下界必須是常數,不能是變數。
解決程式通用的問題,一是將陣列宣告的很大,這樣浪費一些儲存空間;二是利用動態陣列,將上例改變如下:
Dim a() 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=3 To 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,下表列出了三種錯誤及相應正確的賦值方法。
Aarry函式表示方法
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 (下標)
程式在執行到上述賦值語句時顯示”不能給陣列賦值”的出錯資訊。
申明
非源創博文中的內容均收集自網上,若有侵權之處,請及時聯絡,我會在第一時間內刪除.再次說聲抱歉!!!
博文歡迎轉載,但請給出原文連線。
轉自:http://wwww.hyit.edu.cn/edu/vb/study/index.htm