1. 程式人生 > >VB常見錯誤和難點分析

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