VB新手入門之二

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.實參與形參類型對應問題

在地址傳遞方式時,調用過程實參與形參類型要一致。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章