《Visual Basic 2005 程序設(shè)計》第5章 數(shù)據(jù)結(jié)構(gòu)_第1頁
《Visual Basic 2005 程序設(shè)計》第5章 數(shù)據(jù)結(jié)構(gòu)_第2頁
《Visual Basic 2005 程序設(shè)計》第5章 數(shù)據(jù)結(jié)構(gòu)_第3頁
《Visual Basic 2005 程序設(shè)計》第5章 數(shù)據(jù)結(jié)構(gòu)_第4頁
《Visual Basic 2005 程序設(shè)計》第5章 數(shù)據(jù)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩117頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第5章數(shù)據(jù)結(jié)構(gòu)1本章主要內(nèi)容:結(jié)構(gòu)類型的定義和使用。使用數(shù)組。常用的排序算法。使用ListBox列表框控件和ComboBox下拉列表框控件。數(shù)組列表定義與使用。集合定義及使用。枚舉類型定義及使用。2前面介紹和使用的Boolean類型、Integer類型、Double類型、String類型等數(shù)據(jù)都是簡單類型,通過定義的變量來存取相應(yīng)類型的數(shù)據(jù)。但在一些復(fù)雜的應(yīng)用中,這些簡單類型在組織和處理一些數(shù)據(jù)時可能不是很有效。比如計算機學(xué)院2007級有500名學(xué)生的信息需要處理,而每個學(xué)生的信息包括其學(xué)號、姓名、年齡、家庭住址和E-mail,如果使用簡單類型的變量,則需要聲明500×5=2500個不同名稱的變量!可以想象,要實現(xiàn)對如此龐大數(shù)量的變量進行準確引用,即使對于經(jīng)驗豐富的程序設(shè)計人員,也將是一個巨大的挑戰(zhàn)!3其實,我們分析一下上述需求可以看出,每個學(xué)生的信息包括5部分,可以把這5部分關(guān)聯(lián)在一起形成一個整體(在VisualBasic2005中可以聲明成結(jié)構(gòu)或類),即構(gòu)造一個新的“復(fù)合數(shù)據(jù)類型”。如果以復(fù)合數(shù)據(jù)類型聲明描述學(xué)生信息的變量,則處理500名學(xué)生的信息只需要500個變量即可。由于每個學(xué)生的信息具有相同的關(guān)聯(lián)成員,因此把500個復(fù)合數(shù)據(jù)類型變量可以組織成一個在物理存儲上連續(xù)的列表,這樣只要知道了第一個變量的存儲地址,其它變量的存儲地址也就容易計算得出,進而可以訪問存儲地址中學(xué)生的信息。由此可見,在程序設(shè)計中,需要根據(jù)所處理數(shù)據(jù)的特點,構(gòu)建一定的數(shù)據(jù)結(jié)構(gòu),實現(xiàn)對數(shù)據(jù)有效的描述、組織和存儲,便于對數(shù)據(jù)進行快速訪問操作和靈活引用!4提示:數(shù)據(jù)結(jié)構(gòu)(DataStructure)主要是指對數(shù)據(jù)的組織和處理,主要包括三個方面的含義:①數(shù)據(jù)之間的邏輯關(guān)系;②數(shù)據(jù)在計算機中的存儲;③對數(shù)據(jù)的操作處理。55.1結(jié)構(gòu)結(jié)構(gòu)是VisualBasic支持的用戶定義類型(UDT)之一,其中包含一個或多個關(guān)聯(lián)的元素,這些元素是結(jié)構(gòu)類型的一部分,可以是基本數(shù)據(jù)類型變量,也可以是已經(jīng)定義的其它結(jié)構(gòu)類型。65.1.1聲明結(jié)構(gòu)聲明一個結(jié)構(gòu)類型的基本語句格式為:PublicStructurestructureName

datamemberdeclarationsEndStructure其中PublicStructure和EndStructure是關(guān)鍵字,是結(jié)構(gòu)聲明的開始和結(jié)束。structureName是聲明的結(jié)構(gòu)類型的名字,在程序中通過structureName使用該結(jié)構(gòu)類型。Datamemberdeclarations是結(jié)構(gòu)中的數(shù)據(jù)成員(元素)的聲明部分,聲明格式和前面介紹的通過Dim聲明變量的方式一樣。7結(jié)構(gòu)只是用戶自定義的一個類型,結(jié)構(gòu)中的數(shù)據(jù)成員只是說明該結(jié)構(gòu)關(guān)聯(lián)的變量名稱和類型,在聲明結(jié)構(gòu)時系統(tǒng)并不為數(shù)據(jù)成員分配存儲空間,因此數(shù)據(jù)成員不能有初始值。例如聲明如下結(jié)構(gòu):PublicStructureInfoStruDimMessageAsString=“Good”……EndStructureVisualBasic2005通過智能感知,在錯誤窗口中提示DimMessageAsString=“Good”的錯誤信息。8只有聲明該結(jié)構(gòu)類型的變量時,系統(tǒng)才為該變量(即結(jié)構(gòu)中的所有數(shù)據(jù)成員)分配存儲空間。例如:DimobjStuAsStudent'聲明結(jié)構(gòu)變量objStu系統(tǒng)為objStu分配存儲空間,其大小為結(jié)構(gòu)Student中所有數(shù)據(jù)成員的大小。95.1.2訪問結(jié)構(gòu)變量的數(shù)據(jù)成員訪問結(jié)構(gòu)變量的數(shù)據(jù)成員的方式為:結(jié)構(gòu)變量.數(shù)據(jù)成員10例5.1聲明一個學(xué)生信息結(jié)構(gòu),通過文本框顯示學(xué)生信息結(jié)構(gòu)變量數(shù)據(jù)成員的值。具體操作過程:⑴新建項目,選擇“Windows應(yīng)用程序”,項目名稱為“學(xué)生信息”。⑵在解決資源管理器中把“Form1.vb”文件名改為“學(xué)生信息.vb”。⑶打開窗體設(shè)計視圖,選擇Form1窗體,在屬性框中修改窗體的屬性:Name為“frmStu1”;StartPosition為“CenterScreen”;Text為“顯示學(xué)生信息”。⑷為窗體添加5個Label控件,Text分別為“學(xué)號:”、“年齡:”、“姓名:”、“地址:”、“E-mail:”。⑸為窗體添加5個TextBox控件,Name分別為“txtNo”、“txtAge”、“txtName”、“txtAddress”、“txtEmail”。11⑹為窗體添1個Button控件,Name為“btnShowStudent”,Text為“顯示學(xué)生信息”。⑺添加學(xué)生信息結(jié)構(gòu)的聲明:在解決方案資源管理器中用鼠標右鍵單擊項目名“學(xué)生信息”,在彈出的上下文菜單中選擇“添加”,并從“添加”菜單的子菜單中選擇“類”。如圖5-1所示。圖5-1通過解決方案資源管理器添加類的聲明12在彈出的添加新項對話框中,在“名稱”后的文本框中輸入“student.vb”,單擊“添加”,則在代碼編輯器中編輯student.vb,用下面的代碼替換現(xiàn)有代碼:'聲明學(xué)生信息結(jié)構(gòu)StudentPublicStructureStudentDimNoAsString'學(xué)號

DimNameAsString'姓名

DimAgeAsByte'年齡

DimAddressAsString'地址

DimEmailAsString'E-mail地址EndStructure這時在解決方案資源管理器中出現(xiàn)結(jié)構(gòu)的聲明文件student.vb。13⑻雙擊“顯示學(xué)生信息”按鈕,在代碼編輯器中添加對該按鈕Click事件響應(yīng)的代碼:

PrivateSubbtnShowStudent_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnShowStudent.Click'聲明結(jié)構(gòu)變量

DimobjStuAsStudent

'為結(jié)構(gòu)變量中的數(shù)據(jù)成員賦值

objStu.No="49012011"

objStu.Age=17

objStu.Name="李剛"

objStu.Address="陜西省西安市長安南路199號"

objStu.Email="cssnnu@"14

'通過文本框輸出結(jié)構(gòu)變量(數(shù)據(jù)成員)的內(nèi)容

txtNo.Text=objStu.No

txtAge.Text=objStu.Age

txtName.Text=objStu.Name

txtAddress.Text=objStu.Address

txtEmail.Text=objStu.EmailEndSub155.2數(shù)組每名學(xué)生的信息使用相同的結(jié)構(gòu)進行描述。為了存儲500名學(xué)生的信息,同時又要便于對單一學(xué)生的信息進行處理,在VisualBasic2005中,使用數(shù)組是解決方案之一。165.2.1數(shù)組聲明與引用聲明數(shù)組的基本語句格式為:DimArrayName(MaxIndex)AsDataType其中ArrayName是數(shù)組名,MaxIndex是數(shù)組的索引上限,即數(shù)組中所包含的元素的最大下標,數(shù)組元素的最小下標是0,這樣,聲明的數(shù)組中共包含MaxIndex+1個元素,而且每個元素都存儲DataType類型的數(shù)據(jù)。17可以通過ArrayName(Index)的形式訪問數(shù)組中的元素,這里Index是數(shù)組中元素的索引值,其取值范圍是[0,MaxIndex],由于只使用一個下標Index索引數(shù)組中的元素,因此這種格式聲明的數(shù)組又稱為一維數(shù)組。一維數(shù)組元素及索引下標如圖5-3所示??梢钥闯?,聲明一個數(shù)組,就像聲明了一批存儲空間連續(xù)的變量,只不過這些變量的名稱由兩部分組成:數(shù)組名和索引下標。圖5-3一維數(shù)組示意圖(0)(1)(2)(3)(4)(5)18例5.2試設(shè)計一個簡單的學(xué)生信息管理程序,要求:①列出所有學(xué)生的名字;②選擇學(xué)生的名字,通過如例1的形式輸出學(xué)生的信息。分析:要列出所有學(xué)生的名字,可以通過ListBox控件實現(xiàn)。19具體操作過程:⑴新建項目,選擇“Windows應(yīng)用程序”,項目名稱為“學(xué)生信息管理”。⑵在解決方案資源管理器中把“Form1.vb”文件名改為“學(xué)生信息管理.vb”。⑶打開窗體設(shè)計視圖,選擇Form1窗體,在屬性框中修改窗體的屬性:Name為“frmStudents”;StartPosition為“CenterScreen”;Text為“學(xué)生信息管理”。⑷為窗體添加5個Label控件,Text分別為“學(xué)號:”、“年齡:”、“姓名:”、“地址:”、“E-mail:”。⑸為窗體添加5個TextBox控件,Name分別為“txtNo”、“txtAge”、“txtName”、“txtAddress”、“txtEmail”。⑹為窗體添加ListBox控件,Name為“l(fā)stStuName”。20⑺為窗體添1個Button控件,Name為“btnInputStudents”,Text為“導(dǎo)入學(xué)生信息”。窗體中控件的布局如圖5-4所示。圖5-4學(xué)生信息管理程序窗體設(shè)計21⑻導(dǎo)入學(xué)生信息結(jié)構(gòu)的聲明:在解決方案資源管理器中用鼠標右鍵單擊項目名“學(xué)生信息管理”,在彈出的上下文菜單中選擇“添加”,并從“添加”菜單的子菜單中選擇“現(xiàn)有項”。在彈出的文件管理對話框中找到例5.1對應(yīng)的目錄“學(xué)生信息/學(xué)生信息”,選擇文件student.vb,單擊“添加”按鈕,則student.vb添加到當前解決方案中。22⑼在代碼編輯器中,在“PublicClassfrmStudents”后為類添加成員:PublicClassfrmStudents'聲明結(jié)構(gòu)變量數(shù)組,最多可以保存500名學(xué)生的信息

PrivateobjStu(500)AsStudent'intStuNum記錄數(shù)組中已經(jīng)保存學(xué)生信息的個數(shù)PrivateintStuNumAsInteger23⑽為了便于向結(jié)構(gòu)變量數(shù)組添加數(shù)據(jù),在⑼步聲明的變量的后面定義下面的過程:

PrivateSubCreateStuInfo(ByValnoAsString,ByValnameAsString,_

ByValageAsByte,ByValaddressAsString,ByValemailAsString) 'intStuNum是數(shù)組中已經(jīng)記錄學(xué)生信息的個數(shù),也是數(shù)組中下一個空閑位置的索引下標

'把學(xué)生信息保存到數(shù)組中

objStu(intStuNum).No=no'保存學(xué)號

objStu(intStuNum).Name=name'保存姓名

objStu(intStuNum).Age=age'保存年齡

objStu(intStuNum).Address=address'保存地址

objStu(intStuNum).Email=email'保存E-mail '數(shù)組中已保存學(xué)生信息的個數(shù)加1

intStuNum+=1EndSub24⑾定義顯示學(xué)生信息的過程:

'顯示學(xué)生信息

PrivateSubShowStuInfo(ByVal

stuAsStudent)'通過文本框輸出結(jié)構(gòu)變量(數(shù)據(jù)成員)的內(nèi)容

txtNo.Text=stu.No

txtAge.Text=CStr(stu.Age)

txtName.Text=stu.Name

txtAddress.Text=stu.Address

txtEmail.Text=stu.EmailEndSub25⑿雙擊“導(dǎo)入學(xué)生信息”按鈕,在代碼編輯器中添加對該按鈕Click事件響應(yīng)的代碼:

PrivateSubbtnInputStudents_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnInputStudents.Click'清除數(shù)組中已經(jīng)保存學(xué)生信息的個數(shù),確保沒有重復(fù)導(dǎo)入學(xué)生信息

intStuNum=0'調(diào)用過程CreateStuInfo為結(jié)構(gòu)數(shù)組元素的數(shù)據(jù)成員賦值

CreateStuInfo("49012011","李剛",17,"西安市長安南路199號","cssnnu@")CreateStuInfo("49012012","王濤",18,"西安市長安南路199號","wtsnnu@")CreateStuInfo("49012013","張其",17,"西安市長安南路199號","zhqsnnu@")26

'如果列表框中的內(nèi)容非空,先清除列表框中的內(nèi)容

If(lstStuName.Items.Count())Then

lstStuName.Items.Clear()EndIf'把數(shù)組中元素Name成員的值添加到列表框中

ForintCAsInteger=0TointStuNum-1

lstStuName.Items.Add(objStu(intC).Name)Next'ListBox列表框的第項處于選中狀態(tài)

lstStuName.SelectedIndex=0EndSub27⒀當列表框中的項被選中時,在文本框中顯示被選中學(xué)生的信息,為此,需要添加列表框中的項被選中事件SelectedIndexChanged的響應(yīng)代碼:

PrivateSublstStuName_SelectedIndexChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandleslstStuName.SelectedIndexChanged'讀取列表框被選中項的索引下標

DimintIndexAsInteger=lstStuName.SelectedIndexIfintIndex<0Then'如果沒有選中任何項

ExitSubEndIf'顯示選中的學(xué)生的信息

ShowStuInfo(objStu(intIndex))EndSub28提示:ListBox控件用于顯示一個文本項目列表,用戶可以選擇一個或多個項,進而觸發(fā)SelectedIndexChanged事件。ListBox控件列表框中的內(nèi)容通過集合Items進行組織管理,一些常用方法的含義:lstStuName.Items.Count():返回列表框?qū)ο髄stStuName中項的個數(shù)。lstStuNameItems.Clear():清除列表框?qū)ο髄stStuName中的內(nèi)容。29lstStuName.Items.Add(objStu(intC).Name):把數(shù)組元素objStu(intC)的Name成員的值添加到ListBox控件對象lstStuName中。lstStuName.SelectedIndex:返回列表框?qū)ο髄stStuName中選中的項的索引值(項的索引值從0開始),如果沒有選中任何項,則lstCityName.SelectedIndex的返回值為-1。還可以通過lstCityName.SelectedItem得到選中的項的對象的引用。如果要刪除項,可以通過ListBox控件的Remove方法實現(xiàn),如要刪除列表框?qū)ο髄stStuName選中的一個項,語句為:lstStuName.RemoveAt(lstCityName.SelectedIndex)。30例5.2中,聲明數(shù)組后為數(shù)組中的元素進行了賦值。還可以在聲明數(shù)組的同時為數(shù)組中的元素賦初始值。例如:

DimstrCity()AsString={"北京","西安","蘭州","天水","上海"}聲明數(shù)組并為數(shù)組元素賦初始值時,不需要指定數(shù)組索引下標的上限,因為初始值的個數(shù)確定數(shù)組元素下標的上限。上述語句聲明了一個數(shù)組strCity,其中共有5個元素。31如果要遍歷上述5個元素,可以使用For…Next循環(huán):

ForintCAsInteger=0TostrCity.Length-1……'遍歷數(shù)組中的元素

Next注意:strCity.Length返回數(shù)組strCity中元素的個數(shù),由于元素的索引下標從0開始,因此數(shù)組strCity的最大索引下標是strCity.Length-1。提示:訪問數(shù)組元素時,如果ArrayName(Index)的下標Index不在[0,MaxIndex]范圍之內(nèi),則會出現(xiàn)異常!32如果要遍歷數(shù)組中的所有元素,還可以使用ForEach…Next循環(huán),這種遍歷方式由于不使用下標,可以防止數(shù)組元素下標越界,F(xiàn)orEach…Next循環(huán)的基本語句格式為:ForEachelement[Asdatatype]Ingroup語句塊Next[element]33其中element的數(shù)據(jù)類型和group中元素的數(shù)據(jù)類型一致。ForEach…Next循環(huán)的執(zhí)行過程和前面講述的For運行一樣,只是控制循環(huán)的部分改變?yōu)槊看闻袛嗉现械南乱粋€元素是否存在。例如遍歷strCity數(shù)組中的元素的代碼可可變更為:ForEachstrCityNameAsStringInstrCity……'遍歷數(shù)組中的元素Next345.2.2二維數(shù)組使用一維數(shù)組保存的計算機學(xué)院2007級500名學(xué)生的信息可以看成是一行,每個學(xué)生的信息通過唯一的下標索引進行訪問。如果在學(xué)生信息管理程序中,不但要保存2007級學(xué)生的信息,還要保存2005和2006級學(xué)生的信息,這樣訪問某一學(xué)生的信息時,則需要兩個索引值,一是學(xué)生所在的年級索引,二是在該年級學(xué)生的索引。為此,可以使用VisualBasic中的二維數(shù)組實現(xiàn),如圖5-6所示。35可以看出,同一行中的學(xué)生具有相同的年級索引(第一個索引值相同),但在同一年級,每個學(xué)生又有不同的索引(第二個索引值),這兩個索引值構(gòu)成一個二元組,可以唯一標識每一個學(xué)生。聲明和引用二維數(shù)組和一維數(shù)組在格式上類似,只是在維數(shù)上不同。(0,0)(0,2)(0,1)(1,0)(1,2)(1,1)(2,0)(2,2)(2,1)圖5-6二維數(shù)組示意圖年級索引同一年級學(xué)生索引(0,y)(1,y)(2,y)(x,0)(x,1)(x,2)36例5.3在例5.2的基礎(chǔ)上增加學(xué)生信息管理程序的功能,要求:①列出指定年級學(xué)生的名字;②選擇學(xué)生的名字,通過如例1的形式輸出學(xué)生的信息。分析:列出年級名稱通過ComboBox下拉列表實現(xiàn)。為了實現(xiàn)當選中的年級名稱變化時列表框中學(xué)生的名字也隨之變化,需要在ComboBox下拉列表框的SelectedIndexChanged事件中更新ListBox列表框的內(nèi)容。37具體操作過程:新建項目的⑴-⑻步和例5.2相同,為了區(qū)別,把該項目的“名稱”修改為“學(xué)生信息管理2”,并將Form1窗體屬性的Text改為“學(xué)生信息管理(2)”。該項目需要新添的內(nèi)容有:⑼為窗體添加ComboBox控件,Name為“cbxGrade”。窗體中控件的布局如圖5-7所示。圖5-7學(xué)生信息管理2程序窗體設(shè)計38⑽在代碼編輯器中,在“PublicClassfrmStudents”后為類添加成員:

'聲明結(jié)構(gòu)變量二維數(shù)組,行為年級索引,列為同一年級學(xué)生的索引

PrivateobjStu(2,2)AsStudent注意:本例中假定共有3個年級,每個年級有3名學(xué)生。39⑾在“PublicClassfrmStudents”中定義下面的過程:PrivateSubCreateStuInfo(ByVal

intGradeAsInteger,ByVal

intCAsInteger,_ByValnoAsString,ByValnameAsString,ByValageAsByte,_ByValaddressAsString,ByValemailAsString)'intGrade為學(xué)生所在年級的索引,intC為同一年級中學(xué)生的索引

'把學(xué)生信息保存到二維數(shù)組元素中

objStu(intGrade,intC).No=no

objStu(intGrade,intC).Name=name

objStu(intGrade,intC).Age=age

objStu(intGrade,intC).Address=address

objStu(intGrade,intC).Email=emailEndSub40⑿同例5.2的⑾步。⒀雙擊“導(dǎo)入學(xué)生信息”按鈕,在代碼編輯器中添加對該按鈕Click事件響應(yīng)的代碼:

PrivateSubbtnInputStudents_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnInputStudents.Click'調(diào)用過程CreateStuInfo為結(jié)構(gòu)數(shù)組元素的數(shù)據(jù)成員賦值

CreateStuInfo(0,0,"40612011","劉智",17,"西安市長安南路199號","lzsnnu@")CreateStuInfo(0,1,"40612012","張瑞",18,"西安市長安南路199號","zhrsnnu@")CreateStuInfo(0,2,"40612013","李欣",17,"西安市長安南路199號","lixsnnu@")CreateStuInfo(1,0,"40712011","李剛",17,"西安市長安南路199號","cssnnu@")CreateStuInfo(1,1,"40712012","王濤",18,"西安市長安南路199號","wtsnnu@")CreateStuInfo(1,2,"40712013","張其",17,"西安市長安南路199號","zhqsnnu@")CreateStuInfo(2,0,"40812011","魏其",17,"西安市長安南路199號","wqisnnu@")CreateStuInfo(2,1,"40812012","古德",18,"西安市長安南路199號","gudesnnu@")CreateStuInfo(2,2,"40812013","王奇",17,"西安市長安南路199號","wangqsnnu@")41

'如果ComBox下拉列表框中的內(nèi)容非空,先清除列表框中的內(nèi)容

If(cbxGrade.Items.Count())Then

cbxGrade.Items.Clear()EndIf'把年級名稱添加到ComBox下拉列表框中

ForintCAsInteger=0To2cbxGrade.Items.Add(2006+intC)Next'設(shè)置默認選中的項目索引為

cbxGrade.SelectedIndex=0'使ComboBox下拉列表框的第一個項處于選中狀態(tài)42

'設(shè)置默認選中的項目索引為

cbxGrade.SelectedIndex=0'使ComboBox下拉列表框的第一個項處于選中狀態(tài)

'如果List列表框中的內(nèi)容非空,先清除列表框中的內(nèi)容

If(lstStuName.Items.Count())Then

lstStuName.Items.Clear()EndIf'默認把行號是的數(shù)組中元素Name成員的值添加到列表框中()ForintCAsInteger=0To2lstStuName.Items.Add(objStu(0,intC).Name)Next'設(shè)置默認選中的項目索引為

lstStuName.SelectedIndex=0'使ListBox列表框的第一個項處于選中狀態(tài)EndSub43⒁當ComboBox下拉列表框中選中項(年級名稱)發(fā)生改變時,需要更新ListBox列表框中學(xué)生的名字和輸出文本框中學(xué)生的信息,為此,需要添加ComboBox下拉列表框中項被選中事件SelectedIndexChanged的響應(yīng)代碼:

PrivateSubcbxGrade_SelectedIndexChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlescbxGrade.SelectedIndexChanged'讀取ComoBox下拉列表框被選擇項的索引下標DimintGradeAsInteger=cbxGrade.SelectedIndexIfintGrade<0Then'如果沒有選中任何項intGrade=0'設(shè)置為默認選中項目的索引為cbxGrade.SelectedIndex=0'使ComoBox下拉列表框第一個項處于選中狀態(tài)EndIf44'根據(jù)ComboBox下拉列表框的選中項的索引intGrade,更新ListBox列表框的內(nèi)容'清除ListBox列表框的內(nèi)容lstStuName.Items.Clear()'在ListBox下拉列表框添加年級索引為intGrade的學(xué)生的名字ForintSAsInteger=0To2lstStuName.Items.Add(objStu(intGrade,intS).Name)NextlstStuName.SelectedIndex=0'使ListBox列表框的第一個項處于選中狀態(tài)DimintCAsInteger=lstStuName.SelectedIndex'顯示選中的學(xué)生的信息ShowStuInfo(objStu(intGrade,intC))EndSub45⒂當ListBox列表框中的項被選中時,在文本框中顯示被選中學(xué)生的信息,為此,需要添加列表框中的項被選中事件SelectedIndexChanged的響應(yīng)代碼:

PrivateSublstStuName_SelectedIndexChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandleslstStuName.SelectedIndexChanged'讀取ComBox下拉列表框被選擇項(年級)的索引下標

DimintGradeAsInteger=cbxGrade.SelectedIndexIfintGrade<0Then'如果沒有選中任何項

intGrade=0'設(shè)置為默認選中項目的索引為

cbxGrade.SelectedIndex=0'使ComboBox下拉列表框的第一個項處于選中狀態(tài)

EndIf46

'讀取ListBox下拉列表框被選擇項的索引下標

DimintCAsInteger=lstStuName.SelectedIndexIfintC<0Then'如果沒有選中任何項

intC=0'設(shè)置為默認選中項目的索引為

lstStuName.SelectedIndex=0'使ListBox列表框的第一個項處于選中狀態(tài)

EndIf

'顯示選中的學(xué)生的信息

ShowStuInfo(objStu(intGrade,intC))EndSub475.2.3多維數(shù)組如果在學(xué)生信息管理程序中,不同的學(xué)生屬于不同的院系,同一院系的學(xué)生又屬于不同的年級,同一年級的學(xué)生又有不同的索引,即每一個學(xué)生需要三個索引值。為此,可以通過VisualBasic中的三維數(shù)組實現(xiàn),如圖5-9所示。48圖5-9三維數(shù)組示意圖年級索引同一年級學(xué)生索引(x,0,z)(x,1,z)(x,2,z)(x,y,0)(x,y,1)(x,y,2)(2,0,0)(2,0,2)(2,0,1)(0,1,0)(2,1,2)(0,1,1)(0,2,0)(2,2,2)(0,2,1)(1,0,0)(1,0,2)(1,0,1)(0,1,0)(1,1,2)(0,1,1)(0,2,0)(1,2,2)(0,2,1)(0,0,0)(0,0,2)(0,0,1)(0,1,0)(0,1,2)(0,1,1)(0,2,0)(0,2,2)(0,2,1)(0,y,z)(1,y,z)(2,y,z)院系索引495.2.4改變數(shù)組的大小在某一過程中,如果某個已聲明的數(shù)組包含的元素太多、或包含的元素太少,可以使用ReDim語句來更改該數(shù)組的一個或多個維度的大小。更改數(shù)組大小的基本語句格式為:ReDim[Preserve]ArrayName(boundlist)[,name(boundlist)[,...]]其中ArrayName是需要被更改大小的數(shù)組的名稱。VisualBasic2005執(zhí)行ReDim語句時,首先根據(jù)boundlist所描述的數(shù)組各個維度的大小創(chuàng)建一個新數(shù)組,如果有Preserve,表示需要把原數(shù)組的內(nèi)容復(fù)制到新數(shù)組,最后釋放原數(shù)組的存儲空間。50如果boundlist所描述的數(shù)組各個維度元素個數(shù)大于原數(shù)組,則新添加的元素的值為相應(yīng)數(shù)據(jù)類型的默認值;如果boundlist所描述的數(shù)組各個維度元素個數(shù)小于原數(shù)組,則有可能原數(shù)組的部分內(nèi)容會丟失。51例如:DimintArray(10,10,10)AsInteger'創(chuàng)建新數(shù)組,且每一層每一行的結(jié)尾比原數(shù)組多10列,新列中的元素初始化為0(數(shù)組元素類型'Integer的默認值);并復(fù)制原有元素的內(nèi)容。ReDimPreserveintArray(10,10,20)'創(chuàng)建新數(shù)組,且每一層每一行的結(jié)尾比原數(shù)組減少5列,并復(fù)制沒有被減掉的元素的內(nèi)容。ReDimPreserveintArray(10,10,15)'創(chuàng)建新數(shù)組,且每一層每一行的結(jié)尾比原數(shù)組減少5列,不復(fù)制原數(shù)組任何元素內(nèi)容,將所有元素'還原為原始默認值0。ReDimintArray(10,10,10)52提示:ReDim

語句無法更改數(shù)組變量或其元素的數(shù)據(jù)類型。ReDim

語句無法為數(shù)組元素提供新的初始化值。ReDim

語句無法更改數(shù)組的維數(shù)。535.2.5使用Array.Sort對基本數(shù)據(jù)類型一維數(shù)組元素排序VisualBasic2005提供的Array.Sort方法對基本數(shù)據(jù)類型數(shù)組元素排序的基本調(diào)用格式為:Array.Sort(ArrayName,[LowIndex[,HighIndex]])Array.Sort對數(shù)組ArrayName中索引從LowIndex到其中HighIndex的元素進行排序。如果省略LowIndex和HighIndex,則對數(shù)組中的所有元素進行排序。54例5.4對一組城市的名稱分別按升序和降序排序,并通過文本框輸出。具體操作過程:⑴新建項目,選擇“Windows應(yīng)用程序”,項目名稱為“一維數(shù)組排序”。⑵在解決資源管理器中把“Form1.vb”文件名改為“一維數(shù)組排序.vb”。⑶打開窗體設(shè)計視圖,選擇Form1窗體,在屬性框中修改窗體的屬性:Name為“frmArraySort”;StartPosition為“CenterScreen”;Text為“一維數(shù)組排序演示”。⑷為窗體添加1個TextBox控件,Name改為“txtOutput”,Multiline改為“True”,ScrollBars改為“Vertical”。55⑸為窗體添1個Button控件,Name為“btnDemo”,Text為“演示”。雙擊“演示”按鈕,在代碼編輯器中添加對該按鈕Click事件響應(yīng)的代碼:

PrivateSubbtnDemo_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesbtnDemo.Click'聲明一維數(shù)組

DimstrCity()AsString={"Beijing","Xi'an","Lanzhou","Tianshui","Shanghai","Guangzhou","Chengdu"}'通過文本框輸出數(shù)組strCity的內(nèi)容

txtOutput.Text="數(shù)組的原始內(nèi)容:"&vbCrLf56

ForEachstrCityNameAsStringInstrCity

txtOutput.Text=txtOutput.Text&strCityName&""Next

txtOutput.Text=txtOutput.Text&vbCrLf&vbCrLf'調(diào)用下面的過程,實現(xiàn)對strCity數(shù)組元素內(nèi)容的排序

MySort(strCity)57

'通過文本框輸出數(shù)組strCity的內(nèi)容

txtOutput.Text=txtOutput.Text&"使用Array.Sort方法進行遞增排序結(jié)果:"&vbCrLfForEachstrCityNameAsStringInstrCity

txtOutput.Text=txtOutput.Text&strCityName&""Next

txtOutput.Text=txtOutput.Text&vbCrLf&vbCrLf58

'使用VisualBasic2005提供的Array.Sort方法反轉(zhuǎn)數(shù)組內(nèi)容

Array.Reverse(strCity)'通過文本框輸出數(shù)組strCity的內(nèi)容

txtOutput.Text=txtOutput.Text&"使用Array.Reverse方法反轉(zhuǎn)數(shù)組內(nèi)容(遞減排序)結(jié)果:"&vbCrLf59

ForEachstrCityNameAsStringInstrCity

txtOutput.Text=txtOutput.Text&strCityName&""Next

txtOutput.Text=txtOutput.Text&vbCrLf&vbCrLfEndSub60如果使用VisualBasic2005提供的Array.Sort方法進行排序,在PublicClassfrmArraySort后為過程MySort添加代碼:

PrivateSubMySort(ByVal

str()AsString)'調(diào)用VisualBasic2005提供的Array.Sort方法進行排序

Array.Sort(str)EndSub615.2.6用戶自定義排序算法對基本數(shù)據(jù)類型一維數(shù)組元素排序常見的用戶自定義的排序算法有冒泡排序,選擇排序等,每種排序算法在空間、時間復(fù)雜度上有所不同。作為示例,下面主要討論冒泡排序算法的實現(xiàn)。同時介紹其它排序算法的思想及其示例代碼。62⑴冒泡排序算法冒泡排序算法的基本思想是:將待排序的元素看作是豎著排列的“氣泡”,較小的元素比較輕,從而要往上浮。對于有n個元素的排序過程,需要進行n-1次掃描(第n次掃描只有1個元素,所以也就不需要掃描了),第1次掃描找出最小的元素,通過元素比較交換上浮到倒數(shù)第1個位置,第2次掃描找出次小的元素,通過元素比較交換上浮到倒數(shù)第2個位置,依次類推,當掃描n-1次后,所有的元素也就按從大到小的次序排列了。當然,也可以讓最大的元素上浮,這樣進行n-1次掃描后,所有的元素也就按從小到大的次序排列了。63比如要對4個數(shù)1,3,2,4使用冒泡排序算法進行排序,排序過程如圖5-12所示。在圖5-12中,共進行了3次掃描,第1次掃描進行了3次交換操作,第2次掃描進行了2次交換操作,第3次掃描進行了1次交換操作。第3次掃描的結(jié)果即為排序的結(jié)果。64第1次掃描342132413241312413244321第3次掃描3421第2次掃描32413214結(jié)果第3次比較第2次比較第1次比較65從冒泡排序算法基本思想的描述和圖5-12的示例可以看出,要實現(xiàn)冒泡排序算法,需要兩重循環(huán),外循環(huán)控制是第幾次掃描,而內(nèi)循環(huán)控制是本次掃描的第幾次比較。同時,從圖5-12可以看出,隨著掃描次數(shù)的遞增,每次掃描中比較的次數(shù)在依次減少,這是因為每完成一次掃描,就有一個位置的數(shù)據(jù)在最終的排序結(jié)果中確定,已經(jīng)確定位置的數(shù)據(jù)將不再參與比較。冒泡排序算法的流程圖如圖5-13所示,得排序的元素保存在數(shù)組str(n)中,其中n為數(shù)組中元素的個數(shù)。66開始j=0i=0j<=n-1str(i)<=>str(i+1)i=i+1是圖5-13冒泡排序算法流程圖是是i<=n-1-j-1str(i)>str(i+1)否否j=j+1否結(jié)束67

'str為待排序的字符串數(shù)組,n為字符串的個數(shù)

'使用冒泡排序法進行排序

PrivateSubBubbleSort(ByVal

str()AsString,ByValnAsInteger)Dimi,jAsInteger'定義控制循環(huán)的變量

DimstrtmpAsString'定義臨時字符串變量,用于字符串進行交換操作68

Forj=0Ton-1Fori=0To(n-1)-j-1Ifstr(i)>str(i+1)Then'字符串進行交換

strtmp=str(i)

str(i)=str(i+1)

str(i+1)=strtmpEndIfNextiNextjEndSub69過程MySort的代碼修改為:

PrivateSubMySort(ByVal

str()AsString)'調(diào)用用戶自定義的排序過程進行排序

BubbleSort(str,str.Length)EndSub70⑵選擇排序算法選擇排序算法的基本思想:對于有n個元素的排序過程,需要進行n-1次掃描(第n次掃描只有1個元素,所以也就不需要掃描了)。第1次掃描找出最小(或最大)的元素的位置,然后和待排序數(shù)組中的第1個元素進行交換;第2次掃描找出次?。ɑ虼未螅┑脑?,然后和待排序數(shù)組中的第2個元素進行交換;依次類推,當掃描n-1次后,所有的元素也就有序了。71

'str為待排序的字符串,n為字符串的個數(shù)

'使用選擇排序法進行排序

PrivateSubSelectionSort(ByVal

str()AsString,ByValnAsInteger)Dimi,jAsInteger'定義控制循環(huán)的變量

DimstrtmpAsString'定義臨時字符串變量,用于字符串進行交換操作

DimpositionAsInteger'定義變量,用于記錄待交換的元素的位置72

Forj=0Ton-1position=j'待交換元素位置的初始值即為當前需要交換位置的值

Fori=j+1Ton-1Ifstr(i)<str(position)Then'如果條件成立,則記錄新的位置

position=iEndIf'如果最小元素的位置和當前需要交換的位置不是同一位置,則進行交換

Ifposition<>jThen

strtmp=str(j)

str(j)=str(position)

str(position)=strtmpEndIfNextiNextjEndSub73提示:選擇排序和冒泡排序的最大差別是:冒泡排序在一次掃描中可能進行多次交換數(shù)組元素值的操作,而選擇排序在一次掃描中最多進行一次交換數(shù)組元素值的操作。745.2.7使用Array.Sort對用戶自定義數(shù)據(jù)類型一維數(shù)組元素排序使用Array.Sort方法對數(shù)組元素進行排序時,需要比較兩個數(shù)組元素的大小,VisualBasic2005已經(jīng)提供了針對基本數(shù)據(jù)類型的比較運算規(guī)則。但對于用戶自定義的數(shù)據(jù)類型,如Student結(jié)構(gòu)類型,比較兩個Student結(jié)構(gòu)的對象時必須按照對象中的指定數(shù)據(jù)成員進行比較,兩個單純的Student結(jié)構(gòu)對象由于有多個數(shù)據(jù)成員,在沒有指定進行比較的數(shù)據(jù)成員前,無法進行比較。為此,使用Array.Sort方法對自定義數(shù)據(jù)類型數(shù)組元素進行排序時,必須明確指定按照那個或那些數(shù)據(jù)成員進行比較。75對于用戶自定義數(shù)據(jù)類型數(shù)組元素的比較,通過VisualBasic2005提供的接口IComparer創(chuàng)建比較器接口,實現(xiàn)對用戶自定義數(shù)據(jù)類型元素的比較,基本實現(xiàn)框架為:76PublicClassCompareName:ImplementsIComparer'實現(xiàn)Compare方法,實現(xiàn)確定的比較含義

FunctionCompare(ByValaAsObject,ByValbAsObject)AsInteger_ImplementsSystem.Collections.IComparer.Compare

具體比較語句

EndFunctionEndClass77Array.Sort方法對用戶自定義數(shù)據(jù)類型數(shù)組元素排序的基本調(diào)用格式為:Array.Sort(ArrayName,[LowIndex[,HighIndex]],NewCompareName())CompareName是用戶自定義的比較器接口類,通過NewCompareName()創(chuàng)建CompareName對象實現(xiàn)對ArrayName數(shù)組中用戶自定義數(shù)據(jù)類型的比較。78例5.5在例5.2的基礎(chǔ)上,實現(xiàn)ListBox列表框中的學(xué)生能夠分別按學(xué)生的學(xué)號、姓名和年齡排序。具體操作過程,前7步同例5.2,為了區(qū)別,把項目名稱改為“學(xué)生信息管理4”,并將Form1窗體屬性的Text為“學(xué)生信息管理(4)”。。⑻為窗體添加一個Panel控件,并為Panel添加三個RadioButton控件,Name分別為“rdbNo”、“rdbAge”、“rdbName”,Text分別為“學(xué)號”、“年齡”、“姓名”。rdbNo的Checked為True。⑼在代碼編輯器中,在PublicClassfrmStudents類定義代碼EndClass之后分別創(chuàng)建三個比較器類:sortByAge比較器接口類定義:79'實現(xiàn)接口IComparer,創(chuàng)建通過年齡(Age)比較兩個Student類型變量值的大小PublicClasssortByAge:ImplementsIComparer'實現(xiàn)Compare方法,指定根據(jù)Student中的Age進行比較

FunctionCompare(ByValaAsObject,ByValbAsObject)AsIntegerImplements_

System.Collections.IComparer.Compare Dimc1AsStudent=CType(a,Student) Dimc2AsStudent=CType(b,Student)

If(c1.Age>c2.Age)Then Return1 EndIf If(c1.Age<c2.Age)Then Return-1 Else Return0 EndIf EndFunctionEndClass80sortByNo比較器接口類定義:'實現(xiàn)接口IComparer,創(chuàng)建通過學(xué)號(No)比較兩個Student類型變量值的大小PublicClasssortByNo:ImplementsIComparer'實現(xiàn)Compare方法,指定根據(jù)Student中的No進行比較

FunctionCompare(ByValaAsObject,ByValbAsObject)AsIntegerImplements_

System.Collections.IComparer.CompareDimc1AsStudent=CType(a,Student)Dimc2AsStudent=CType(b,Student)If(c1.No>c2.No)ThenReturn1EndIfIf(c1.No<c2.No)ThenReturn-1ElseReturn0EndIfEndFunctionEndClass81sortByName比較器接口類:'實現(xiàn)接口IComparer,創(chuàng)建通過(姓名)比較兩個Student類型變量值的大小PublicClasssortByName:ImplementsIComparer'實現(xiàn)Compare方法,指定根據(jù)Student中的Name進行比較

FunctionCompare(ByValaAsObject,ByValbAsObject)AsIntegerImplements_

System.Collections.IComparer.CompareDimc1AsStudent=CType(a,Student)Dimc2AsStudent=CType(b,Student)If(c1.Name>c2.Name)ThenReturn1EndIfIf(c1.Name<c2.Name)ThenReturn-1ElseReturn0EndIfEndFunctionEndClass82⑽在代碼編輯器中“導(dǎo)入學(xué)生信息”按鈕Click事件響應(yīng)的代碼中,在ListBox列表框添加內(nèi)容之前,添加對數(shù)組中的內(nèi)容按學(xué)號(No)排序的代碼:'判斷并清除列表框內(nèi)容的代碼'對數(shù)組中的內(nèi)容按學(xué)號(No)進行排序'NewsortByNo()為按照學(xué)號排序的比較器接口對象Array.Sort(objStu,0,intStuNum,NewsortByNo())

'把數(shù)組中元素Name、No成員的值添加到列表框中代碼83⑾雙擊rdbNo單選框按鈕,在編輯器中添加對CheckedChanged

事件響應(yīng)的代碼:

PrivateSubrdbNo_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbNo.CheckedChanged'對數(shù)組中的內(nèi)容按學(xué)號(No)進行排序

Array.Sort(objStu,0,intStuNum,NewsortByNo())'更新列表框的內(nèi)容

lstStuName.Items.Clear()ForintCAsInteger=0TointStuNum-1

lstStuName.Items.Add(objStu(intC).Name&""&objStu(intC).No)NextEndSub84同樣,雙擊rdbName和rdbAge,添加對其CheckedChanged

事件響應(yīng)的代碼,對數(shù)組中的內(nèi)容分別按姓名(Name)和年齡(Age)排序的代碼分別是:

'對數(shù)組中的內(nèi)容按姓名(Name)進行排序

Array.Sort(objStu,0,intStuNum,NewsortByName())'對數(shù)組中的內(nèi)容按年齡(Age)進行排序

Array.Sort(objStu,0,intStuNum,NewsortByAge())855.2.8用戶自定義排序算法對用戶自定義數(shù)據(jù)類型一維數(shù)組元素排序如果用用戶自定義的冒泡排序算法實現(xiàn)對objStu數(shù)組中結(jié)構(gòu)體元素進行排序,則在冒泡排序算法中需要指定按什么數(shù)據(jù)成員進行排序。代碼如下:

86'obj為待排序的學(xué)生結(jié)構(gòu)體數(shù)組,n結(jié)構(gòu)體數(shù)組中元素的個數(shù)

'使用冒泡排序法進行排序PrivateSubBubbleSort_Structure(ByVal

obj()AsStudent,_ByValnAsInteger,ByValjudgeAsString)Dimi,jAsInteger'定義控制循環(huán)的變量

DimobjtmpAsStudent'定義臨時字符串變量,用于字符串進行交換操作

DimexchangeAsBoolean'用來標示是否需要交換相鄰元素87

Forj=0Ton–1Fori=0To(n-1)-j-1exchange=FalseSelectCasejudge.ToLower()'把字符串judge轉(zhuǎn)換成小寫字符進行比較

Case"name"'按姓名進行比較

Ifobj(i).Name>obj(i+1).NameThenexchange=TrueEndIfCase"age"'按年齡進行比較

Ifobj(i).Age>obj(i+1).AgeThenexchange=TrueEndIfCase"no"'按學(xué)號進行比較

Ifobj(i).No>obj(i+1).NoThenexchange=TrueEndIfEndSelect88

'如果需要交換,則交換相鄰元素的值

IfexchangeThen

objtmp=obj(i)

obj(i)=obj(i+1)

obj(i+1)=objtmpEndIfNextiNextjEndSub89把rdbName,rdbNo和rdbAge對應(yīng)的CheckedChanged

事件響應(yīng)代碼中使用Array.Sort的代碼分別替換成如下代碼,調(diào)用用戶自定義的排序算法進行排序:

'調(diào)用BubbleSort_Structure對學(xué)生數(shù)組中的元素按學(xué)生結(jié)構(gòu)體的姓名(Name)進行排序

BubbleSort_Structure(objStu,intStuNum,"Name")'調(diào)用BubbleSort_Structure對學(xué)生數(shù)組中的元素按學(xué)生結(jié)構(gòu)體的學(xué)號(No)進行排序

BubbleSort_Structure(objStu,intStuNum,"No")'調(diào)用BubbleSort_Structure對學(xué)生數(shù)組中的元素按學(xué)生結(jié)構(gòu)體的年齡(Age)進行排序

BubbleSort_Structure(objStu,intStuNum,"Age")905.2.9數(shù)組列表用VisualBasic2005提供的ArrayList類,可以創(chuàng)建可變長度的數(shù)組列表,這種數(shù)組的數(shù)據(jù)類型為Object,因此在數(shù)組元素中可以存放任何類型的數(shù)據(jù)。聲明數(shù)組列表的基本格式為:DimArrayNameAsNewArrayList()91數(shù)組列表提供的屬性有:Count:獲取數(shù)組列表中當前數(shù)組元素的個數(shù)。Item:設(shè)置或獲取索引所指的數(shù)組元素的內(nèi)容。92數(shù)組列表提供的主要方法有:Add:將對象加入到數(shù)組列表的最后。Insert:將對象插入到數(shù)組指定索引的位置。Remove:刪除數(shù)組列表中第一個符合指定對象的數(shù)組元素。Clear:清除數(shù)組列表中所有的數(shù)組元素。IndexOf:返回數(shù)組列表中第一個符合指定對象的數(shù)組元素的索引值,若找不到,返回一個負值。Sort:將數(shù)組列表中的元素按遞增的方式排序。Reverse:將數(shù)組列表中的元素反轉(zhuǎn)。Bi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論