




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
VB程序設計教程主編:陳素教授第三章VB程序結構控制VB程序設計采用結構化程序設計的思想,結構化程序設計的特點是程序結構清晰,易讀性強,并易于查錯糾錯。在VB中有三種根本的程序控制結構:順序結構、選擇結構和循環結構。VB所有的程序都可以由這假設干個這三種根本結構的組合,通過各種算法,以解決不同的實際問題。3VB程序結構控制3.1順序結構3.2選擇結構3.3循環結構3.4數組3.5常用算法3.1順序結構順序結構是一種線性結構,也是程序設計中最簡單、最常用的根本結構。它在程序運行過程中,按照語句出現的順序從上到下依此執行。順序結構流程圖如圖3-1所示,先執行語句A,再執行語句B。
賦值語句順序結構中主要的語句是賦值語句,通過賦值語句,可以在程序中改變變量的值,或改變對象屬性值。其語法格式為:
[Let]變量=表達式[Let]對象.屬性=表達式其中表達式中可以包含變量、常量、屬性。此時等號稱為賦值等號。例如:
DimAAsStringA=Text1.TextLabel1.Caption=A賦值語句說明:(1)賦值語句兼有計算和賦值雙重功能。(2)“=〞是賦值等號,與數學上的等號意義不同。(3)賦值等號兩邊的數據類型通常要求一致,但VB提供的對某些數據類型的自動轉換機制,可強制變量轉換為適當的數據類型。例如,當邏輯型賦值給數值型時,True轉換為-1,False轉換為0;反之,非0轉換為True,0轉換為False;(4)賦值等號左邊的只能是變量或對象的屬性,不能是常量、常數符號、表達式,否那么出錯。注釋、結束與暫停語句1.注釋語句注釋語句用于對程序的注解和說明。有兩種格式:格式1:Rem內容格式2:'內容格式1形成一個語句行。格式2使用一個撇號,可以用在語句行的末尾,也可以單獨占據一行。注釋語句不被編譯成二進制代碼,它只出現在源程序中。適量的注釋可以增加程序的可讀性。例如:Rem通過設置文本框的"Text"屬性用來顯示"Hello"TxtInput.Text="Hello,今天是"&Date'函數Date返回當前日期注釋、結束與暫停語句2.暫停語句暫停語句用于設置斷點,調試程序。格式:Stop說明:(1)可放置在過程中的任何地方,相當于在程序代碼中設置斷點,類似于執行“運行〞菜單中的“中斷〞命令。(2)執行Stop語句時,系統將自動翻開“立即窗口〞,方便程序員調試跟蹤程序。(3)程序調試結束后,生成可執行文件之前,應刪除代碼中的所有Stop語句。注釋、結束與暫停語句3.結束語句結束語句通常用來結束一個程序的執行。格式:End在不同環境下的用法不同:EndSub:結束一個Sub過程EndFunction:結束一個Function過程EndIf:結束一個If語句塊EndSelect:結束情況語句3.2選擇結構計算機智能化的標志之一就是具有邏輯判斷的能力;即針對不同的情況作出不同的選擇。在程序設計中,這一功能的實現是借助相應的選擇結構語句來完成的。選擇結構也稱為分支結構,其特點是根據給定的條件來選擇執行相應的程序語句。VB中提供的選擇結構語句主要有:If語句、Iif函數以及Select
Case語句。3.2.1If語句
1.If…Then…Else結構語法格式:If條件表達式Then語句序列1[Else
語句序列2]EndIf說明:(1)條件表達式可為關系表達式、邏輯表達式或數據表達式,但都要將其轉換為Boolean類型。(2)先對給定的條件表達式進行判斷,如果條件成立(即表達式的值為True),那么執行Then后的語句序列1,執行完畢再跳到EndIf后的其他語句。(3)如果條件不成立(即表達式的值為False),那么執行Else后的語句序列2,執行完畢再執行EndIf后的其他語句。(4)如果If語句中省略“Else語句序列2〞,那么是單分支語句,如圖3-2所示;否那么是雙分支語句,如圖3-3所示。3.2.1If語句3.2.1If語句【范例3-1】設計程序,對輸入的兩個整數a和b進行比較,并輸出其中較大的數〔用單分支語句實現〕。3.2.1If語句〔1〕設計用戶界面如圖3-4所示?!?〕設置界面對象屬性,如表3-1所示。3.2.1If語句〔3〕程序代碼設計如下:PrivateSubCommand1_Click()DimaAsInteger,bAsInteger,maxAsIntegera=Val(Text1.Text)b=Val(Text2.Text)max=aIfb>maxThenmax=bText3.Text=Str(max)EndSub3.2.1If語句【范例3-2】設計程序,對輸入的兩個整數a和b進行比較,并輸出其中較大的數〔用雙分支語句實現〕。將【范例3-1】程序代碼設計改為如下代碼即可。PrivateSubCommand1_Click()DimaAsInteger,bAsInteger,maxAsIntegera=Val(Text1.Text)b=Val(Text2.Text)Ifa>bThenmax=aElsemax=bEndIfText3.Text=CStr(max)EndSub3.2.1If語句2.If…Then…ElseIf結構語法格式:If條件表達式1Then語句序列1[ElseIf條件表達式2Then語句序列2……ElseIf條件表達式n-1Then語句序列n-1Else語句序列n]EndIf說明:〔1〕Else子句與ElseIf都是可選項,可以放置多個ElseIf子句,但必須在Else子句之前。〔2〕執行時先對條件表達式1進行判斷,如果條件成立,執行語句序列1;否那么依次測試ElseIf局部的條件,假設成立,那么執行相應的語句組;如果沒有一個條件成立的話,那么執行Else子句的語句序列n?!?〕不管有多少個分支,程序執行了一個分支后,其余分支不再執行,當多分支中有多個表達式同時滿足,那么只執行第一個與之匹配的語句序列?!?〕ElseIf不能寫成ElseIf。3.2.1If語句If…Then…ElseIf結構流程圖如圖3-5所示。3.2.1If語句【范例3-3】設計程序,輸入血壓舒張壓的值〔單位mmHg〕,判斷血壓是否正常,其中輸入值小于60,那么低血壓,輸入值60-90〔含60及90〕之間,那么正常;輸入值大于90,那么高血壓?!?〕設計用戶界面如圖3-6所示。3.2.1If語句〔2〕設置界面對象屬性,如表3-2所示。3.2.1If語句〔3〕程序代碼設計如下:PrivateSubCommand1_Click()DimaAsInteger,resultAsStringa=Val(Text1.Text)Ifa>90Thenresult="高血壓"ElseIfa>=60Thenresult="血壓正常"Elseresult="低血壓"EndIfText2.Text=resultEndSub3.2.1If語句【范例3-4】某藥品銷售管理系統中,要設置顧客的折扣值,并供查詢。規那么如下:假設顧客為VIP會員〔卡號首字母為V〕,折扣為90%;假設為普通會員〔卡號首字母為P〕,折扣為80%;非會員〔卡號首字母為N〕那么沒有折扣。〔1〕用戶界面如圖3-7所示,圖3-8所示。3.2.1If語句〔2〕設置界面對象屬性,如表3-3所示。3.2.1If語句〔3〕程序代碼設計如下:PrivateSubCommand1_Click()DimaAsString,bAsStringa=Text1.TextIfLeft(a,1)="V"Thenb="90%,歡送光臨!"Label2.Visible=TrueLabel3.Visible=TrueElseIfLeft(a,1)="P"Thenb="80%,歡送光臨!"Label2.Visible=TrueLabel3.Visible=TrueElseIfLeft(a,1)="N"ThenLabel2.Visible=FalseLabel3.Visible=Trueb="歡送光臨,您晢時沒有折扣。"Elseb="對不起,您還沒有注冊!"EndIfLabel3.Caption=bEndSub3.2.1If語句語法格式:If條件表達式1ThenIf條件表達式2Then……EndIf……EndIf說明:〔1〕對于嵌套結構,為了增強程序的可讀性,應該采用縮進形式書寫?!?〕If語句形式假設不在一行上書寫,必須與EndIf配對,多個if嵌套,EndIf與它最接近的EndIf配對。IF語句的嵌套流程圖如圖3-9所示。3.2.1If語句3.2.2IIf函數IIf函數可以用來執行簡單的條件判斷操作,它是“If…Then…Else〞結構的簡寫版本,是“ImmediateIf〞的縮略。語法格式:IIf〔條件表達式,條件成立時的返回值,條件不成立時的返回值〕說明:〔1〕條件表達式可以是關系表達式、邏輯表達式或數值表達式,假設為數值表達式,那么按照非0為真,0為假的規那么轉化為Boolean類型的值。〔2〕IIf函數的返回值可以為表達式、變量或其他函數?!?〕IIf函數中的3個參數都不能省略,而且要求返回值的類型及結果變量的類型一致。3.2.2IIf函數例如,當成績x>=60時為合格,否那么不及格,用If語句表示如下:Ifx>=60Thenr=〞合格〞Elser=〞不合格〞EndIf而用IIf函數來代替那么為:r=IIf(x>=60,〞合格〞,〞不合格〞)再看下面的例子:用IIf函數判斷數的奇偶性x是被判斷的整數,result為接收結果的字符串變量Result=IIf(xmod2=0,〞x是偶數〞,〞x是奇數〞)由上可見,對于一些簡單的選擇結構,用IIF函數可以使程序大大簡化。3.2.3Select
Case語句使用IF語句的嵌套可以實現多分支選擇,但對于多條件選擇時,使用SelectCase語句代碼效率更高,更易讀。語法格式:SelectCase表達式|變量
Case表達式列表1
語句序列1Case表達式列表2
語句序列2……Case表達式列表n-1
語句序列n-1[CaseElse
語句序列n]EndSelectSelectCase結構流程圖如圖3-10所示。3.2.3Select
Case語句3.2.3Select
Case語句說明:〔1〕“表達式〞可以是數值型或字符型〔2〕“表達式〞和“表達式列表〞的類型必須相同;〔3〕“表達式列表〞形式有以下3種:①一個表達式或用逗號隔開的假設干表達式例如:判斷10以內整數的奇偶性。x=inputbox("輸入一個整數")SelectCasexCase1,3,5,7,9Printx;"這是奇數"Case2,4,6,8,10Printx;"這是偶數"EndSelect②表達式1To表達式2例如:變量stringc中存放了一個字符,判斷該字符類型。SelectCasestringcCase"a"To"z","A"To"Z"Printstringc+"isaletter"Case"0"To"9"Printstringc+"isanumber"CaseElsePrintstringc+“isonlyachar"EndSelect
3.2.3Select
Case語句③Is關系表達式用Is關系表達式實現學生成績等次的評定。score=inputbox("輸入一個學生成績")SelectCasexCaseis>=90Printscore;"成績等次為:A"Caseis>=80Printscore;"成績等次為:B"Caseis>=70Printscore;"成績等次為:C"CaseElsePrintscore;"成績等次為:D"EndSelect
對于VB中的兩種選擇語句If語句和SelectCase語句的應用選擇,一般來說,SelectCase語句主要應用于對單一條件表達式的結果有多個判斷(因此也稱多分支語句)的情況,結構清晰;而If語句可以對多個條件表達式的結果進行判斷,應用更廣泛。一般情況下,能使用SelectCase語句來判斷的也可以使用If語句。3.3循環結構循環結構是程序設計中的一種根本結構。當程序中出現需要反復執行相同的代碼解決同一問題時,就可以用循環結構來實現。循環結構既可以簡化程序,又可以提高程序的效率。VB繼承了所有Basic語言中的各種循環語句,而且在VB中實現循環結構的語句最多。循環結構可分為計數型和條件型兩種根本的結構,實現計數型循環結構的語句是For…Next,而實現條件型循環結構的語句有Do…Loop及While…Wend。3.3.1For…Next語句For…Next語句按指定的循環次數或按變量變化的范圍執行循環體,在循環體中使用一個計數器來控制循環執行的次數。For…Next語句執行過程:開始時,循環控制計數器為初值。每執行完一次循環體內所有語句后,循環控制計數器自動增加一個步長值,然后與終值進行比較。如果循環控制變量小于終值,那么繼續循環,直到循環控制變量的值大于終值,才退出循環,去執行Next語句后的語句。在循環的過程中,可以使用Exit語句隨時退出循環。For…Next語句流程圖如圖3-11所示。3.3.1For…Next語句3.3.1For…Next語句語法格式:For計數器=初值To終值[Step步長]語句序列1[ExitFor]語句序列2Next[計數器]說明:(1)計數器一般為數值型。(2)步長一般為正值,初值小于終值;假設為負值,初值大于終值;缺省步長為1;循環次數=int〔〔終值-初值〕/步長+1〕。(3)語句序列可以是一個或多個語句,稱為循環體。(4)ExitFor是可選項,表示當程序執行過程中遇到該語句時,退出循環體,執行Next的下一句。3.3.1For…Next語句例如,計算1到100的和〔本例未使用循環退出語句ExitFor〕。Sum=0Fori=1To100step1Sum=Sum+iNextiPrintSum再如,計算1到100的和,當和大于2000時終止循環〔本例使用循環退出語句ExitFor〕。Sum=0Fori=1To100step1Sum=Sum+iIfSum>=2000ThenExitForNextiPrintSum3.3.1For…Next語句(5)退出循環后,計數器的值保持退出時的值。(6)在循環體內對計數器可屢次引用,但不要對其賦值,否那么影響循環執行的次數,從而影響程序運行結果。例如:PrivateSubCommand1_Click()Count1=0Fori=1To20Step2i=i+2Count1=Count1+1Print"第";Count1;"次循環i=";iNextiPrint"退出循環后i=";iEndSub以上程序循環的次數不是10次,而是5次,原因是代碼中的i=i+2改變了步長。程序運行結果如圖3-12所示。3.3.1For…Next語句3.3.1For…Next語句【范例3-5】設計程序,輸入一個班〔設全班人數不超過100人〕學生的VB學習成績,統計其中及格的學生人數,并計算出全班的平均分。由于學生人數不定,輸入負數時截止。〔1〕用戶界面及數據測試如圖3-13,3-14,3-15所示。3.3.1For…Next語句3.3.1For…Next語句〔2〕設置界面對象屬性,如表3-4所示。3.3.1For…Next語句〔3〕程序代碼設計如下:PrivateSubCommand1_Click()DimGradeAsSingle,PassCountAsInteger,totalAsIntegerDimiAsInteger,SumAsSingleSum=0PassCount=0Average=0total=0Fori=1To100'當輸入學生成績個數大于100時停止循環Grade=Val(InputBox("請輸入學生的VB成績:"))IfGrade<0Then'輸入負數時退出循環ExitForElseIfGrade>=60ThenPassCount=PassCount+1'計算及格學生人數total=total+1'計算總人數Sum=Sum+Grade'計算總分EndIfNextiIftotal<>0ThenAverage=Sum/total'防止用戶未輸入值時溢出Text1.Text=Str(total)Text2.Text=Str(PassCount)Text3.Text=Str(Average)EndSub3.3.2Do…Loop語句對于在程序中循環的次數事先不能確定的,不能使用For…Next語句實現循環,這時使用Do…Loop循環(條件循環)語句。Do…Loop語句有2種形式,即當型循環〔While結構〕和直到型〔DoWhile結構〕循環。當型循環結構流程圖如圖3-16所示,直到型循環結構流程圖如圖3-17所示。
3.3.2Do…Loop語句語法1(當型循環):DoWhile|Until條件表達式語句序列1[ExitDo]語句序列2Loop說明:(1)先測試條件表達式,當條件為True時就執行語句序列,否那么退出循環。(2)While循環在條件成立時執行循環體語句,否那么退出循環執行Loop后的語句。而Until循環相反,在條件不成立時進入循環,直到條件成立時才退出循環。(3)在程序執行過程中,假設遇到Exitdo語句時,表示退出循環,執行Loop后的語句。3.3.2Do…Loop語句例:用當型循環語句計算1到100的和DimSumasinteger,iasintegerSum=0:i=1DoWhilei<=100Sum=Sum+ii=i+1LoopPrintSum語法2(直到型循環):Do語句序列1[ExitDo]語句序列2LoopWhile|Until條件表達式說明:(1)先執行語句序列后判斷條件表達式,語句序列至少執行一次。(2)While循環在條件成立時執行循環體語句,否那么退出循環執行Loop后的語句。而Until循環相反,在條件不成立時進入循環,直到條件成立時才退出循環。(3)在程序執行過程中,假設遇到Exitdo語句時,表示退出循環,執行Loop后的語句。例:用直到型循環語句計算1到100的和DimSumasinteger,iasintegerSum=0:i=1DoSum=Sum+ii=i+1LoopWhilei<=100PrintSum3.3.3While…Wend語句對于循環次數不確定的情況下,除了可以使用Do…Loop語句外,還可以使用While…Wend語句。語法格式:While條件表達式語句序列1Wend說明:While…Wend的條件是以關系或邏輯表達式的形式直接出現在語句中的,如果要使循環有限次地執行,必須在While的循環體中改變條件。例如:測試計數器的值DimCounterAsintegerCounter=0WhileCounter<20'測試計數器的值Counter=Counter+1'將計數器的值+1Wend'當Counter>19時那么循環終止PrintCounter循環的嵌套循環的嵌套是指循環語句中又包含其他循環語句的情況,前面所述的幾種循環語句均可以互相嵌套,也可以在循環中嵌套選擇結構。要求:(1)多重循環中,各層循環變量不能重名。(2)內層循環必須完整地包含在外層循環中,不能交叉。例如下面的循環嵌套是錯誤的:Fori=1To100step1Forj=1To100step1……NextiNextj(3)在多重循環中的分支結構必須完全包含在里面,不能交叉。循環的嵌套【范例3-6】用循環的嵌套設計程序,實現如圖3-18所示的數字金字塔。循環的嵌套程序代碼設計如下:PrivateSubCommand1_Click()Fori=1To9Forj=1To28-3*iPrint"";NextjFork=1ToiPrintk;NextkFork=i-1To1Step-1Printk;NextkPrintNextiEndSub循環的嵌套下面對上述提到的循環語句作一比較,方便讀者進一步區分及應用。VB中循環結構有3種形式:For循環、While循環以及Do循環(可分為4種語句),它們的語句語法分別為:For…Next,DoWhile…Loop,DoUntil…Loop,Do…WhileLoop,Do…UntilLoop,While…Wend,其中除For…Next語句用于循環次數已經知道的循環,其它都是用于循環次數預先不知首,而由邏輯條件控制循環的循環。While循環是條件成立時循環,而Until循環是條件不成立時循環。DoWhile|Until…Loop語句是先判斷再執行,而Do…While|UntilLoop語句是先執行再判斷。While…Wend語句與DoWhile…Loop相同。下表3-5用不同的循環語句編寫程序,執行結果相同,均為10。循環的嵌套3.4數組
在處理具體問題時,常會涉及到批量數據的處理,例如:對一個班學生的成績排序,找出最高分,最低分,計算平均分等。使用定義多個變量的方法來記錄學生的成績,并不是最好的解決方法。在VB中,提供了數組這種特殊的數組類型,來表示類型相同的一批數據。而借助數組與循環,可以有效的處理批量數據。
數組的概念1.數組數組是一組邏輯上相互關聯的值的有序集合。所謂邏輯上相互關聯是指數組中的數據必須具有相同的類型。例如:(1,34,234,45,49,100)、(“abort〞,〞boat〞,〞car〞,〞zoo〞)都可以使用數組來表示。而〔12,〞ab〞,12.4,“abort〞〕那么不行。VB中可以定義任何類型的數組,包括用戶自定義的類型。數組名用于表示數組,其命名規那么遵循標識符的命名規那么。2.數組元素數組中每一個值稱為數組元素,使用數組名和一些稱為“索引〞或“下標〞的數字可以表示每一個數組元素。3.數組分類在VB中,根據數組長度來劃分,數組可以分為動態數組和靜態數組。而從維度上劃分那么可以分為一維數組和多維數組。靜態數組無論是靜態數組還是動態數組,都可以使用Dim語句來聲明數組變量。與普通變量定義不同的是,在數組變量名后面加上一對圓括號,以指示該變量將存儲數組而不是單個值。本節中所討論的靜態數組是指存放數組元素個數固定的數組。1.聲明語法[Public|Private|Dim]數組名(維數)As數據類型說明〔1〕方括號局部可以省略?!?〕數據類型可以是VB支持的根本數據類型,也可以是用戶自定義的類型?!?〕數組名的命名規那么參照標識符命名原那么?!?〕關于維數①數組的維數表示:[下界To]上界,其中下界必須小于等于上界。如果是多維數組,維數局部定義可以表示為([下界1To]上界1,[下界2To]上界2,……)例如:Dima(1To3)AsInteger‘定義一維整型數組Dimb(3)AsString‘定義一維整型數組Dimc(1To3,1to3)AsInteger‘定義二維整型數組Dimd(3,3,3)AsInteger‘定義三維整型數組②下界聲明可以省略,省略的話默認下界為0,OptionBase語句可以將數組的默認下界設置為1。OptionBase語句必須在通用模塊定義,語法格式為:OptionBase0|1。靜態數組圖3-19中設置數組的默認下標為1此時有下面聲明語句:Dimc(10)AsInteger那么數組c的下界為1,上界為10。靜態數組③當上下界是小數時系統會自動進行四舍五入?!?〕數組中元素個數的計算數組元素個數的計算可以用下面公式表示:〔上界1-下界1+1〕*〔上界2-下界2+1〕*……例如:Dima(1To10)AsInteger‘a數組的元素個數為10Dimb(1To2,3To5)asInteger‘b數組的元素個數為〔2-1+1〕*〔5-3+1〕=6靜態數組2.數組元素的表示數組中的每個元素使用數組名以及下標來表示。注意每一維下標的取值范圍是[每一維的下界,每一維的上界]。數組元素的表示:數組名〔下標1[,下標2,……]〕。根據以上的形式,對于常用的一維與二維數組,元素的表示方法為:〔1〕一維數組元素:數組名〔下標〕。例如:Dima(1to2)asinteger,那么a中的元素可以表示為a(1)、a(2)〔2〕二維數組元素:數組名〔下標1,下標2〕。例如:Dimb(1,1)asinteger,那么b中的元素可以表示為b(0,0)、b(0,1)、b(1,0)、b(1,1)靜態數組3.數組的賦值與輸出對于靜態數組,賦值與輸出常用的方法一是把數組元素當成普通變量對待,二是使用循環語句?!?〕一維數組的賦值與輸出【范例3-7】將10以內的奇數使用保存在數組中,并使用print語句輸出在窗體上。運行界面如圖3-20所示:靜態數組方法一:單擊按鈕Command1時運行程序:PrivateSubCommand1_Click()Dima(1To5)AsIntegera(1)=1a(2)=3a(3)=5a(4)=7a(5)=9Printa(1);a(2);a(3);a(4);a(5)EndSub方法二:使用循環語句實現PrivateSubCommand1_Click()Dima(1To5)AsIntegerDimiAsInteger,jAsIntegerj=1Fori=1To5a(i)=jj=j+2NextiFori=1To5Printa(i);NextiEndSub靜態數組〔2〕二維數組的賦值與輸出二維數組可以看成是一個矩陣,第一維的下標表示元素所在的行,第二維下標表示元素所在的列。例如:Dima(1To2,1To3)AsInteger‘a相當于一個2行3列的矩陣在實際的存儲中,二維數組還是按照行的順序存放的。一般可以采用二重循環的方法來處理二維數組中的元素。靜態數組【范例3-8】將一個矩陣存放在一個二維數組中,并在窗體上打印將其轉置的形式。運行界面如圖3-21所示:靜態數組程序設計代碼如下:PrivateSubCommand1_Click()Dima(1To5,1To2)AsInteger‘說明一個5行2列矩陣Print"原始矩陣"Fori=1To5‘使用二重循環為矩陣賦值Forj=1To2a(i,j)=jPrinta(i,j);Spc(5);NextjPrintNextiPrint"轉置矩陣"Forj=1To2‘先列后行的原那么輸出轉置形式Fori=1To5Printa(i,j);Spc(5);NextiPrintNextjEndSub靜態數組〔3〕ForEach…Next語句在用于處理數組或集合中的每一個元素時,ForEach…Next比For...Next語句更適合,因為在ForEach…Next語句中不必指定數組或集合的元素個數。語法:
ForEachelementIn數組
語句序列1
[EXITFOR]
語句序列2
NEXT[element]
說明:
〔1〕格式中的element是一個variant類型的變量,它代表數組中的每個元素,可以在循環體外定義?!?〕格式中的數組可以是一個已定義的數組變量?!?〕循環次數由VB在循環開始之前自動計算?!?〕ForEach循環可以嵌套。但每個循環必須具有唯一的element變量。靜態數組【范例3-9】求數組中所有元素的和。PrivateSubForm_Activate()Dima(1To5)AsIntegerDimxAsVariantDimiAsIntegerFori=1To5a(i)=iNextii=0ForEachxInai=x+iNextPrintiEndSub靜態數組4.靜態數組使用舉例
【范例3-10】設計一個程序,統計5個候選人的得票數。程序中使用InputBox接收投票,投票時輸入的是候選人的選號。一維數組P用于記錄得票數。程序代碼設計如下:PrivateSubForm_Activate()DimN,IAsIntegerDimP(5)AsInteger'聲明數組P記錄候選人得票數
PrintPrintForI=1To5N=Val(InputBox("請輸入候選人的選號","選舉投票",0))P(N)=P(N)+1'統計各候選人的選票
NextIForI=1To5'顯示所有候選人的票數
Print"第"&Str(I)&"個候選人的票數是:";P(I);PrintNextIEndSub靜態數組投票界面如圖3-22所示,當依次輸入數據1,1,1,2,3,那么程序運行結果如圖3-23所示。靜態數組【范例3-11】編程求一個3×4的矩陣中值最大的元素以及其所在的位置。程序設計如下:
PrivateSubForm_Activate()Dima(1To3,1To4)AsInteger'定義a數組存放矩陣DimiAsInteger,jAsIntegerDimmaxAsInteger,rAsInteger,cAsInteger'定義max存放最大值,r,c分別存放最大值最在的行和列RandomizePrint"A數組為:"PrintFori=1To3Forj=1To4a(i,j)=Int(30*Rnd())+1'使用隨機函數產生1-30之間的數
Printa(i,j);NextjPrintNextiPrint靜態數組max=a(1,1):r=1:c=1'假定a(1,1)為當前最大元素Fori=1To3'將數組元素與max比較Forj=1To4Ifa(i,j)>maxThen'找到新的最大數,那么保存在max中,并同時記錄位置max=a(i,j)r=i:c=jEndIfNextjNextiPrint"最大數是"&max&"它在第"&r&"行"&c&"列"EndSub靜態數組程序運行的界面如下:圖3-24范例3-11運行界面動態數組本節將討論如何創立和使用動態數組。1.聲明語法建立動態數組的方法是:利用Dim、Private、Public語句聲明括號內為空的數組,然后在過程中用ReDim語句指明該數組的大小。語法是:Dim數組名〔〕[As數據類型]ReDim[Preserve]數組名〔下標1[,下標2…]〕[As數據類型]其中下標可以是常量,也可以是有了確定值的變量,類型可以省略,假設不省略,必須與Dim中的聲明語句保持一致。例如:DimA〔〕AsSingleReDimA〔4,6〕說明〔1〕ReDim語句中的下標可以是常量、表達式,也可以是有了確定值的變量〔2〕在程序中可以屢次使用ReDim來改變數組的大小和維數?!?〕每次使用ReDim語句都會重新初始化原數組的值。例如將整型數組的值初始化為0??梢允褂肞reserve參數來保存數組的數據,但使用Preserve只能改變最后一維的大小。動態數組【范例3-12】動態數組的使用。PrivateSubForm_Activate()Dimarr()AsInteger'定義動態數組arrDimnAsIntegern=10ReDimarr(n)'重定義數組arr,將其大小定義為11Fori=0To10arr(i)=i:Printarr(i);NextPrintReDimPreservearr(15)'再次定義數組arr,保存之'前arr(0)~arr(10)的值Fori=0To15Printarr(i);NextEndSub動態數組程序運行的界面如下:圖3-25范例3-12運行界面假設語句ReDimPreservearr(15)去掉保存字Preserve,那么arr數組的元素值將被重置為0。數組相關函數1.Array函數語法:Array(參數表)功能:給一個Variant型的數組賦值。說明:參數表是一個用逗號隔開的值表,如果不提供參數,那么創立一個長度為0的數組。請看下面的語句:DimAAsVariantA=Array(10,20,30)在上面的例如中,第一條語句創立一個Variant的變量A。第二條語句將一個數組賦給變量A。動態數組2.IsArray函數語法:IsArray(變量名)功能:判斷一個指定的變量是否為數組。說明:如果待判斷的變量指向一個數組,那么IsArray函數返回true,否那么返回false。對于以下語句:Dima,bb=1a=Array(1,2,3,4,5)PrintIsArray(b),IsArray(a)程序運行結果為falsetrue數組相關函數2.動態數組使用舉例【范例3-13】打印裴波納契數列。裴波納契數列具有以下特點:它的第一個數為0,第二個數為1,第三個數以后的數是前兩個數的和。在程序中將使用InputBox輸入的值來確定要打印的數列項數,產生的數列存放在一維數組中。程序代碼如下:OptionBase1PrivateSubForm_Click()DimnAsInteger,mAsInteger,kAsInteger,f()AsLongm=InputBox("請輸入要打印的數列項數","輸入項數",10)ReDimf(m)f(1)=0:f(2)=1'給數組第1、2位元素賦值
Forn=3Tom'利用循環計算3-m位數組元素
f(n)=f(n-1)+f(n-2)NextnClsPrintTab(10);"裴波納契數列"Print數組相關函數k=1'給打印定位變量k賦初值
Forn=1Tom'利用循環打印數組元素
PrintTab(k*10);f(n);Ifk=4Then'每行打印4個數值后換行
Printk=0EndIfk=k+1'更改打印位置
NextnEndSub數組相關函數3.LBound函數語法:LBound(數組名[,dimension])功能:返回數組指定的維dimension的最小下標。說明:如果省略dimension參數,默認返回數組第一維的最小下標例如:DimaAsVariantDimb(1To3,2To4)AsIntegerDimc(-1To2,1To3)AsIntegera=Array(1,2,3,4,5)PrintLBound(a),LBound(b,2),LBound(c)運行的結果為02-1數組相關函數4.UBound函數語法:UBound(數組名[,dimension])功能:返回數組指定的維dimension的最大下標。說明:如果省略dimension參數,默認返回數組第一維的最大下標此函數與上述的Lbound函數一起使用可以確定一個數組的大小。例如:Dimb(1To3,2To4)AsIntegerPrint(UBound(b,1)-LBound(b,1)+1)*(UBound(b,2)-LBound(b,2)+1)程序將輸出9數組相關函數5.Erase函數語法:Erase(數組名1[,數組名2,…])功能:重新初始化靜態數組以及釋放動態數組對應的內存空間。說明:〔1〕對于靜態數組,Erase函數將按表3-5重新初始化數組的值。數組相關函數〔2〕對于動態數組,Erase釋放動態數組所使用的內存。在下次引用該動態數組之前,程序必須使用ReDim語句來重新定義該數組變量的維數。例如:DimaAsVarianta=Array(1,2,3,4,5)EraseaReDima(1,2)'語句APrintLBound(a)上述程序段,如果沒有語句A,編譯時就會出現下標越界的錯誤。用戶自定義類型除了Integer,String等標準的數據類型,VB還支持用戶自定義類型。所謂的自定義類型,類似于C語言中的結構〔struct〕,這種類型的數據由假設干個不同類型的根本數據組成。自定義類型由Type語句來實現:1.自定義類型的聲明形式Type類型名元素名1As類型名元素名2As類型名……元素名nAs類型名EndType用戶自定義類型例如要定義一個存放學生信息的類型,可以自定義類型student:TypeStudentNumAsLong‘學號NameAsString*10‘姓名,用長度為10的定長字符串來存儲SexAsString*5‘性別,用長度為5的定長字符串來存儲ScoreAsSingle‘得分,用單精度數來存儲EndType說明:〔1〕自定義類型一般在標準模塊中定義。〔2〕自定義類型變量的聲明,與普通變量一樣,使用Dim語句定義。例如使用上述的Student類型定義變量Stu,可以表示為:DimStuAsStudent。〔3〕要訪問自定義類型中的元素,應使用變量名.元素名的方法表示。例如要為上述的Stu變量中的Num賦值,可以寫成:Stu.Num="1"用戶自定義類型2.自定義類型數組的使用同樣可以使用自定義類型來定義數組。例如:Dima(1to10)asStudent。范例3-14說明了自定義類型數組的使用方法。用戶自定義類型【范例3-14】5種草藥的名稱、銷售量和單價,計算各種草藥的銷售額。定義一個類型Herb,它包含name,salenum,price,total等5個元素。使用Herb說明數組a,將草藥的信息存放在數組中。其中total元素的值通過計算得出,其他元素的值通過inputbox接收。程序代碼如下:PrivateTypeherb‘定義類型HerbnameAsStringsalenumAsIntegerpriceAsSingletotalAsSingleEndTypePrivateSubForm_Click()Dima(1To5)AsherbDimiAsInteger用戶自定義類型Fori=1To5‘為a數組的每個元素賦值a(i).name=InputBox("輸入草藥名","數據錄入","")a(i).salenum=InputBox("輸入銷售數量","數據錄入","")a(i).price=InputBox("輸入草藥單價","數據錄入","")a(i).total=a(i).salenum*a(i).priceNextPrint"草藥名";Tab(10);"銷售數量";Tab(30);"草藥單價";Tab(50);"總額"Fori=1To5Printa(i).name;Tab(10);a(i).salenum;Tab(30);a(i).price;Tab(50);a(i).totalNextEndSub用戶自定義類型程序運行的結果如下:圖3-26范例3-14運行界面:
控件數組控件數組是一組具有共同名稱和類型的控件。它們的事件過程也相同。在設計時,使用控件數組,可以讓一組類型相同的控件執行相同的代碼。1.控件數組的創立設計時可以使用以下方法創立控件數組:〔1〕對同一類型的控件使用相同的名字。創立步驟如下:①繪制控件數組中要添加的控件〔必須為同一類型的控件〕。②選擇其中一個作為第一個控件,并使用其名字命名其它控件。③在為其它控件輸入現有名稱時,VisualBasic將顯示一個對話框,要求確認是否要創立控件數組。例如:在窗體上放置假設干個CommandButton控件,將其中一個名稱改為bcmd,并將其它的控件名稱均改為bcmd,此時VB將自動創立控件數組〔2〕使用復制的方法添加控件。創立步驟如下:①繪制控件數組中的控件。②當控件獲得焦點時,選擇“編輯〞菜單中的“復制〞命令。③在“編輯〞菜單中,選擇“粘貼〞命令。VisualBasic將顯示一個對話框詢問是否創立控件數組??丶到M2.控件數組的使用舉例【范例3-15】設計圖3-27界面,實現單擊“重置〞按鈕時,實現清空所有Text控件的文本信息。圖3-27范例3-15界面設計控件數組程序實現步驟如下:〔1〕先在窗體上繪制一個TextBox控件?!?〕選擇TextBox控件,使用復制的方法再繪制另外兩個TextBox控件。在詢問是否創立控件數組時,選擇“是〞〔3〕在窗體上繪制CommandButton控件,并將Caption屬性設置為“重置〞。〔4〕在CommandButton控件的Click事件中參加以下代碼:PrivateSubCommand1_Click()ForEachxInText1x.Text=""NextxEndSub或者使用下面的代碼:PrivateSubCommand1_Click()Fori=0ToText1.Count-1Text1(i).Text=""NextiEndSub使用ForEach…Next語句不需要知道控件數組的元素個數,而使用For…Next語句那么必須通過訪問控件數組的Count方法獲得控件數組中元素的個數〔注意控件數組索引從0開始〕,并使用控件數組名〔下標〕方式訪問數組中每個元素。3.5常用算法在本節中,將介紹檢索以及排序中常用的算法。3.5.1檢索算法3.5.2排序算法檢索算法檢索是數據處理中經常使用的一種重要運算。所謂的檢索,就是根據給定的關鍵字,在指定的集合中找出值為關鍵字的過程。如果找到那么檢索成功,否那么檢索失敗。下面將介紹順序檢索以及二分檢索兩種算法。檢索算法1.順序檢索算法順序檢索的根本思想是:從集合的一端開始順序掃描,將集合中的元素與給定值比較,如果相等那么檢索成功,當掃描結束時,未找到給定值,那么檢索失敗?!痉独?-16】設計如圖3-28的界面,隨機產生10個1-20之間的整數,從鍵盤上輸入要查找的數,如果找到,那么顯示其位置??丶傩栽O置如表3-6所示。檢索算法檢索算法程序代碼如下:Dima(1To10)AsInteger'通用模塊中定義數組PrivateSubCommand1_Click()DimkeyAsInteger,IAsInteger,findAsIntegerkey=Val(Text1.Text)'key為要查找的數find=0'find值為1表示查找成功,為0表示失敗ForI=1To10Ifa(I)=keyThenLabel3.Caption="這個數在第"&I&"個位置上"find=1ExitForEndIfNextIIf(find=0)ThenLabel3.Caption="找不到"EndSubPrivateSubForm_Activate()RandomizeForI=1To10a(I)=Int(20*Rnd)+1'產生隨機數Label1.Caption=Label1.Caption&a(I)&","'在Label上顯示數組NextIEndSub檢索算法2.二分檢索算法二分檢索算法又稱為折半查找,這個算法要求檢索的集合是一個有序序列。算法的根本思想是:將給定的值與集合中間位置上的元素比較,如果相等,那么檢索成功。否那么,如果給定值比中間位置元素小,那么在集合的前半局部繼續檢索,否那么在集合后半局部檢索。這樣每次檢索縮小一半的查找范圍,重復這個過程,直到檢索成功或者失敗。例如:在有序集合〔1,4,10,20,25,30,32,45,56,57,60〕中查找數字20方括號表示查找范圍,帶下劃線的數字為中間位置元素。經過3次比較后檢索成功。查找過程如下:[1,4,10,20,25,30,32,45,56,57,60][1,4,10,20,25],30,32,45,56,57,601,4,10,[20,25],30,32,45,56,57,60假設查找數字37,經過4次比較后檢索失敗。查找過程如下:[1,4,10,20,25,30,32,45,56,57,60]1,4,10,20,25,30,[32,45,56,57,60]1,4,10,20,25,30,[32,45],56,57,601,4,10,20,25,30,32,[45],56,57,60檢索算法【范例3-17】使用二分檢索法在集合〔1,4,10,20,25,30,32,45,56,57,60〕中查找給定數字。界面設計參照范例3-16。程序代碼如下:DimaPrivateSubCommand1_Click()DimkeyAsInteger,IAsInteger,findAsIntegerDimlowAsInteger,highAsInteger,midAsIntegerkey=Val(Text1.Text)'key為要查找的數find=0'find值為1表示查找成功,為0表示失敗low=0:high=10'low,high表示查找范圍DoWhilelow<=highmid=(low+h
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 江蘇省蘇北地區達標名校2025屆初三5月聯考英語試題試卷試卷含答案
- 煙臺大學《系統空間設計》2023-2024學年第二學期期末試卷
- 銀川第二中學2024-2025學年高三五月中旬物理試題含解析
- 木工勞務分包合同
- 江蘇省鹽城市東臺第一教育集團2024-2025學年初三第十一模(最后一卷)英語試題含答案
- 山東工業職業學院《西醫臨床技能訓練》2023-2024學年第二學期期末試卷
- 信陽職業技術學院《現代農業技術導論(種植類)》2023-2024學年第二學期期末試卷
- 新疆維吾爾巴音郭楞蒙古自治州且末縣2025屆五年級數學第二學期期末檢測模擬試題含答案
- 云南省蒙自一中2025屆高三4月模擬考試(一模)語文試題含解析
- 上海市十一校2025年高三第一次調研考試英語試題理試題含解析
- 4.2實驗探究加速度與力質量的關系(課件)高中物理
- 產品標識和可追溯性管理培訓
- 施工環境保護培訓課件
- FBS-GC-001-分布式光伏施工日志
- 混凝土組織供應運輸售后服務方案
- 成人體驗館管理制度
- 馬克思的生平
- 慢性鼻竇炎的中醫護理查房課件
- 生理學面部肌膚皮膚管理基礎知識護膚種類介紹培訓成品模板兩篇
- 駕校訓練場地安全生產檢查表
- (完整版)混凝土樁鉆芯法檢測題庫
評論
0/150
提交評論