資源簡介 第5講 算法在數(shù)據(jù)管理中的應(yīng)用考試內(nèi)容考試要求VB訪問數(shù)據(jù)庫c算法與數(shù)據(jù)管理c一、VB訪問數(shù)據(jù)庫1.ADO訪問Access數(shù)據(jù)庫ADO是微軟公司提供的一種應(yīng)用程序訪問數(shù)據(jù)庫的編程接口。該接口包含了多個對象,其中Connection對象用于和數(shù)據(jù)庫建立連接,在建立連接后,用Recordset對象獲取數(shù)據(jù)表中的數(shù)據(jù)。2.通過Connection連接數(shù)據(jù)庫在用Connection建立和數(shù)據(jù)庫的連接時,需要設(shè)置ConnectionString屬性的值(即連接字符串),以指定連接數(shù)據(jù)庫所用的驅(qū)動程序、數(shù)據(jù)源名稱、用戶名和密碼。下列語句定義一個Connection對象的實例conn,并設(shè)置conn的連接字符串:Dim conn As New ADODB.Connectionconn.ConnectionString=“Provider=Microsoft.ACE.OLEDB.12.0;DATA Source=”&App.Path&“Contacts.accdb”其中,參數(shù)“Provider”用于指定連接的提供者(Microsoft.ACE.OLEDB.12.0可以訪問Access2010數(shù)據(jù)庫);DATA Source用于指定數(shù)據(jù)庫的文件名(含絕對路徑);App.Path返回當前應(yīng)用程序所在的絕對路徑。Connection對象具有Open、Close等方法,其中Open方法用于打開到數(shù)據(jù)源的連接,Close方法用于關(guān)閉連接。3.通過Recordset對象獲取數(shù)據(jù)表中的數(shù)據(jù)在用Recordset對象從數(shù)據(jù)庫中獲取數(shù)據(jù)時,要設(shè)置ActiveConnection屬性的值。語句Set rs.ActiveConnection=conn,使Recordset對象的實例rs與Connection對象的實例conn建立關(guān)聯(lián)。在與conn建立關(guān)聯(lián)后,可用Recordset對象的Open方法獲取數(shù)據(jù)表中的數(shù)據(jù)。下列語句用于打開記錄集,將SQL語句的查詢結(jié)果保存到記錄集rs中:rs.Open“SELECT*FROM info”該語句執(zhí)行后,記錄集rs中的數(shù)據(jù)為SQL語句“SELECT * FROM info”查詢到的結(jié)果。打開Recordset時,若Recordset非空,當前記錄位于第一條記錄。Recordset對象的Close方法用于關(guān)閉對象。Recordset對象的Fields集合用于返回當前記錄中的數(shù)據(jù)。如:rs.Fields(“fName”)返回當前記錄中“fName”字段的值;rs.Fields(0)返回當前記錄中第一個字段的值,如果第一個字段名為“fName”,rs.Fields(0)與rs.Fields(“fName”)返回值相同。Recordset對象的MoveNext方法用于把當前移動到下一條記錄。若到結(jié)尾處還繼續(xù)向下移動,程序會出錯,因此在使用MoveNext時要判斷Recordset的EOF屬性,判斷是不是到達結(jié)尾處。EOF屬性取值為“True”或“False”。4.Select語句Select語句是結(jié)構(gòu)化查詢語言SQL中最常見的語句,主要用于從數(shù)據(jù)表中查詢數(shù)據(jù)。如語句“SELECT * FROM info”表示查詢數(shù)據(jù)表“info”中的全部數(shù)據(jù)。二、算法在數(shù)據(jù)管理中的綜合應(yīng)用VB程序獲取到的Access數(shù)據(jù)庫中的數(shù)據(jù),可采用數(shù)組等方式進行存儲,并可以通過編程對這些數(shù)據(jù)進行各種加工處理,如統(tǒng)計、分析、查找、排序等。一、VB訪問數(shù)據(jù)庫VB訪問Access數(shù)據(jù)庫,從數(shù)據(jù)表中讀取相關(guān)數(shù)據(jù),并存儲在數(shù)組中。【典例1】 讀取Access數(shù)據(jù)庫“student.accdb”的數(shù)據(jù)表“xsinfo”中讀取記錄,并分別顯示在相應(yīng)位置。程序運行時,單擊“顯示記錄”按鈕Command1,并在文本框Text1、Text2、Text3中顯示第一條記錄的信息,單擊“下一條”按鈕Command2,將顯示下一條記錄。程序運行效果如下圖所示:實現(xiàn)上述功能的VB程序如下,請在劃線處填入合適的代碼。Dim conn As New ADODB.ConnectionDim rs As New ADODB.RecordsetPrivate Sub Command1_Click() conn.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & “____①____” conn.Open Set rs.ActiveConnection = conn rs.Open “SELECT * FROM ____②____” Text1.Text = rs.Fields(“姓名”) Text2.Text = rs.Fields(“班級”) Text3.Text = rs.Fields(“性別”)End SubPrivate Sub Command2_Click() rs.MoveNext ′移動到下一條記錄 If Not rs.EOF Then ′判斷是否已到記錄集的最后一條記錄 Text1.Text = rs.Fields(“姓名”) Text2.Text = rs.Fields(“班級”) Text3.Text = rs.Fields(“性別”) Else MsgBox (“記錄已全部顯示完畢!”) rs.Close conn.Close Set rs = Nothing Set conn = Nothing End IfEnd Sub解析 本題主要考查的是VB訪問數(shù)據(jù)庫的相關(guān)知識。劃線①處為訪問的數(shù)據(jù)庫的名稱,從題中可知數(shù)據(jù)庫名稱為“student.accdb”;劃線②處為數(shù)據(jù)表的名稱,從題中可知數(shù)據(jù)表名稱為“xsinfo”。答案 ①student.accdb ②xsinfo【方法總結(jié)】 VB訪問數(shù)據(jù)庫時,需要知道正確的數(shù)據(jù)庫名稱和數(shù)據(jù)表的名稱。二、數(shù)據(jù)分析【典例2】 讀取Access數(shù)據(jù)庫“student.accdb”的數(shù)據(jù)表“xsinfo”中讀取記錄,將記錄顯示在列表框中,并統(tǒng)計女生的人數(shù)。程序運行時,單擊“顯示記錄”按鈕Command1,將記錄信息分別存儲在數(shù)組a、b、c中,并顯示在列表框List1中,單擊“統(tǒng)計”按鈕Command2,將女生人數(shù)顯示在標簽Label1中。程序運行效果如下圖所示:實現(xiàn)上述功能的VB程序如下,請在劃線處填入合適的代碼。Dim b(1 To 100) As StringDim c(1 To 100) As StringPrivate Sub Form_Load() conn.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & “student.accdb” conn.Open Set rs.ActiveConnection = conn rs.Open “xsinfo” p = 0 Do While ____①____ ____②____ a(p) = rs.Fields(“姓名”) b(p) = rs.Fields(“班級”) c(p) = rs.Fields(“性別”) rs.MoveNext Loop rs.Close conn.Close Set rs = Nothing Set conn = NothingEnd SubPrivate Sub Command1_Click() Dim i As Integer List1.AddItem “姓名” + “班級” + “性別” For i = 1 To p List1.AddItem a(i) + “ ” + b(i) + “ ” + c(i) Next iEnd SubPrivate Sub Command2_Click() Dim i As Integer Dim count As Integer For i = 1 To p If ____③____ Then count = count + 1 Next i Label1.Caption = “共有女生數(shù):” + Str(count)End Sub解析 本題主要考查的是VB訪問數(shù)據(jù)庫,將進行簡單的統(tǒng)計分析。劃線①處表示將數(shù)據(jù)表中的每一條記錄存儲在數(shù)組中,讀取記錄時需判斷當前位置是否已到達記錄集的最后一條記錄,否則將會出錯,因此①處代碼為Not rs.EOF;②處代碼表示統(tǒng)計記錄的個數(shù),用變量p進行計數(shù),因此②處代碼為p=p+1;③代碼表示統(tǒng)計女生的人數(shù),性別存儲在數(shù)組c中,因此③處代碼為c(i) = “女”。答案 ①Not rs.EOF ②p = p + 1 ③c(i) =“女”【方法總結(jié)】 將數(shù)據(jù)庫中數(shù)據(jù)存儲在數(shù)組中,可對數(shù)組中數(shù)據(jù)進行統(tǒng)計分析。某同學設(shè)計了一個用于查詢學考成績的查詢系統(tǒng),要求如下:(1)輸入某個等級(分為A、B、C、D、E五個等級),就能查詢出該等級的所有學生考號與姓名,并統(tǒng)計出該等級學生的總?cè)藬?shù)。(2)學生成績信息存儲在數(shù)據(jù)庫“TechGrade.accdb”中一張數(shù)據(jù)表中,該數(shù)據(jù)表的結(jié)構(gòu)如圖1所示;(3)程序運行界面如圖2所示,在文本框“Text1”中輸入要查詢的等級,單擊“查詢”按鈕“Command1”,在列表框“List1”中顯示所有該等級的學生考號與姓名,并按照考號從小到大排序,并在標簽“Label3”處顯示該等級學生人數(shù),如果該等級學生人數(shù)為“0”,則“List1”列表框顯示“沒有該等級的學生!”。(1)學生成績信息(考號、姓名、等級)來源于數(shù)據(jù)庫TechGrade.accdb中________數(shù)據(jù)表。(2)實現(xiàn)上述功能的VB程序如下,請在劃線處填入合適的代碼。Private Sub Command1_Click() Dim snum(1 To 1000) As String ′數(shù)組snum存放學生的考號 Dim sname(1 To 1000) As String ′數(shù)組sname存放學生的姓名 Dim n As Integer, i As Integer, j As Integer, k As Integer Dim tnum As String, tname As String grade = Text1.Text Dim Conn As New ADODB.Connection Dim RsAs New ADODB.Recordset Conn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” + App.Path + “Techgrade.accdb” Conn.Open Set Rs.ActiveConnection = Conn Rs.Open “SELECT * FROM tech where 等級=′” +________①________ + “′” n = 0 Do While Not Rs.EOFn = n + 1snum(n) = Rs.Fields(“考號”)sname(n) = Rs.Fields(“姓名”)Rs.MoveNext Loop Rs.Close Conn.Close List1.Clear ′清除列表框 If n < > 0 Theni = 1Do While ________②________ k = i For j = i + 1 To n If ________③________ Then k = j Next j If k < >i Then tnum = snum(i): snum(i) = snum(k): snum(k) = tnum tname = sname(i): sname(i) = sname(k): sname(k) = tname End If i = i + 1LoopFor i = 1 To nList1.AddItem snum(i) + “ ” + sname(i) Next i ElseList1.AddItem “沒有該等級的學生!” End If Label3.Caption = grade + “等學生共有” + Str(n) + “名”End Sub解析 (1)本題主要考查的是數(shù)據(jù)庫中的數(shù)據(jù)表。從語句“Rs.Open “SELECT * FROM tech where 等級=′” + grade + “′””可知,考生信息來源于數(shù)據(jù)表tech;(2)劃線①處循環(huán)表示讀取數(shù)據(jù)表中等級為grade的記錄,并存儲在相應(yīng)數(shù)組中,循環(huán)條件表示記錄還沒讀完時,即當前位置還未到達數(shù)據(jù)表的末尾,因此①處代碼為grade;劃線②處的循環(huán)表示將學生信息按考生升序排序,這里使用的是選擇排序, 劃線②處表示n個數(shù)進行排序,共需進行n-1趟,因此②處代碼為i<=n-1或isnum(j)或snum(j)答案 (1)TECH (2)①grade ②i<=n-1或i③snum(k)>snum(j)或snum(j)基礎(chǔ)鞏固1.小王準備編寫一個依據(jù)技術(shù)學考、加試成績進行賦分的VB程序,需對成績進行預處理。預處理算法的基本思想:先從數(shù)據(jù)庫中讀取考生的考號、學考、加試成績,然后進行排序,排序規(guī)則是按學考+加試的總分降序,若總分相同按加試成績降序排列。再根據(jù)排序結(jié)果給出名次,同分同名,學考、加試成績相同,則名次相同。程序運行時,學生數(shù)據(jù)顯示在列表框List1中,單擊“計算”按鈕Command1,計算結(jié)果顯示在列表框List2中,程序運行界面如圖所示。實現(xiàn)上述功能的VB程序如下,請回答下列問題:(1)如圖所示,學生總數(shù)為1500人,排名前1%的學生可賦分為100,則共有________名學生可賦分為100。(2)分析數(shù)據(jù),可知存放學生成績的數(shù)據(jù)庫文件為________。(3)請在劃線處填入合適的代碼。Dim kh(1 To 1500) As String ′存放學生考號Dim a(1 To 1500) As Integer ′存放學考成績Dim b(1 To 1500) As Integer ′存放加試成績Dim pm(1 To 1500) As Integer ′存放排名Dim n As Integer ′存放總?cè)藬?shù)Private Sub Form_Load()Dim conn As New ADODB.ConnectionDim rs As New ADODB.Recordsetconn.ConnectionString = “Provider = Microsoft.ace.OLEDB.12.0;DATA Source=” + App.Path + “cj.accdb”conn.OpenSet rs.ActiveConnection = connrs.Open “select * from stu_cj”List1.AddItem “ 考號 ” & “ 學考 ” & “加試”n = 0Do While Not rs.EOF ′到記錄集最后一條記錄后退出循環(huán)n = n + 1 ′計數(shù)kh(n) = rs.Fields(“考號”)a(n) = rs.Fields(“學考成績”)b(n) = rs.Fields(“加試成績”)List1.AddItem kh(n) & “ ” & Str(a(n)) & “ ” & Str(b(n)) ____①____Looprs.Closeconn.CloseSet rs = NothingSet conn = NothingEnd SubPrivate Sub Command1_Click() Dim i As Integer, j As Integer, t As Integer, k As String For i = 1 To n - 1 For j = n To i + 1 Step -1If a(j) + b(j) > a(j - 1) + b(j - 1) Or ____②____Then t = a(j): a(j) = a(j - 1): a(j - 1) = t t = b(j): b(j) = b(j - 1): b(j - 1) = t k = kh(j): kh(j) = kh(j - 1): kh(j - 1) = kEnd If Next j Next i pm(1) = 1 For i = 2 To nIf a(i) = a(i - 1) And b(i) = b(i - 1) Then ____③____Elsepm(i) = iEnd If Next List2.Clear List2.AddItem “排名” & “考號” & “ 學考” & “加試” For i = 1 To nList2.AddItem pm(i) & “ ” & kh(i) & “ ” & a(i) & “ ” & b(i) Next iEnd Sub解析 本題考查VB程序的綜合能力。(1)1500人的1%為15名之前,從圖中可知為17人。(2)本小題主要考查VB連接數(shù)據(jù)庫的知識,從代碼中可知數(shù)據(jù)庫cj.accdb。(3)本小題閱讀程序代碼可知采用冒泡排序。①空處程序的功能是讀完一條記錄后,光標移到下一條記錄,因此代碼為rs.MoveNext;排序時,若第一關(guān)鍵詞相同,則按第二關(guān)鍵詞進行排序,若總分相同按加試成績降序,所以②空答案為a(j) + b(j) = a(j - 1) + b(j - 1) And b(j) > b(j - 1)。③空位置程序段為進行排名,若a(i) = a(i - 1) And b(i) = b(i - 1),也就是第i個學生的學考和加試與第i-1個學生的成績完全相同,則名次相同,pm(i) = pm(i - 1),否則第i個學生排名在第i位,pm(i) = i。答案 (1)17 (2)cj.accdb (3)①rs.MoveNext ②a(j)+b(j)=a(j-1)+b(j-1) And b(j)> b(j-1) ③pm(i) = pm(i - 1)2.某校開展“七選三”選課調(diào)查,選課數(shù)據(jù)存數(shù)據(jù)庫文件“student.accdb”中,如圖a所示。“選課”字段存儲7位“0”、“1”組成的數(shù)串,每位對應(yīng)一個科目,從左往右依次為“物化生政史地技”,“1”表示選擇,“0”表示未選擇,如“1110000”表示選擇科目“物化生”。小吳設(shè)計了一個VB程序統(tǒng)計全校選課情況,功能如下:程序啟動時從數(shù)據(jù)庫中讀入全校學生的學籍輔號、姓名、班級、選課信息,處理后在列表框List1中顯示,單擊“選課統(tǒng)計”按鈕Command1,在列表框List2中按選課人數(shù)從高到低輸出各選課組合及人數(shù)。程序界面如圖b所示(學籍輔號和姓名的部分內(nèi)容不顯示)。圖a圖b實現(xiàn)上述功能的VB程序如下,請回答下列問題:(1)若某記錄“選課”字段值為“1100001”,則該生的選課科目是________________。(2)請在劃線處填上合適的代碼。Const max = 1000Const s = “物化生政史地技”Dim n As Integer ′存放學生人數(shù)Dim xjfh(1 To max) As String, xm(1 To max) As String ′數(shù)組xjfh、xm分別存儲學籍輔號和姓名Dim bj(1 To max) As Integer, xk(1 To max) As String ′數(shù)組bj、xk分別存放班級和選課標志Dim zh(1 To 35) As String, tj(1 To 35) As Integer′數(shù)組zh存儲不同選課組合,數(shù)組tj存儲某一組合選課的學生數(shù)Function adj(a As String, n As Integer) As String ′函數(shù)功能:在被顯示數(shù)據(jù)之后添加上合適的空格,代碼略End FunctionFunction convert(x As String) As String Dim i As Integer, st As String st = “ ” For i = 1 To Len(x)If Mid(x, i, 1) = “1” Then st = st + Mid(s, i, 1) Next i convert = stEnd FunctionPrivate Sub Form_Load() Dim i As Integer, km As String Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordsetconn.ConnectionString = “provider=microsoft.ace.oledb.12.0;data source=” + App.Path + “student.accdb”conn.Open Set rs.ActiveConnection = conn rs.Open “select * from stu_info” n = 0 Do While Not rs.EOF n = n + 1xjfh(n) = rs.Fields(0):xm(n) = rs.Fields(1)bj(n) = rs.Fields(2):xk(n) = rs.Fields(3)①____List1.AddItem xjfh(n) + adj(xm(n), 4) + adj(Str(bj(n)), 4) + adj(km, 6)rs.MoveNext Loop ′剩余部分代碼略 功能:產(chǎn)生35種選課組合的“0”、“1”數(shù)串,存數(shù)組zh,;數(shù)組tj各元素初始化為0。End SubPrivate Sub Command1_Click() Dim i As Integer, j As Integer, temp2 As Integer, temp1 As Integer For i = 1 To 35For j = 1 To n If xk(j) = zh(i) Then ____②____Next j Next i For i = 1 To 34For j = 35 To i + 1 Step -1 If ____③____Thentemp1 = zh(j): zh(j) = zh(j - 1): zh(j - 1) = temp1temp2 = tj(j): tj(j) = tj(j - 1): tj(j - 1) = temp2 End If Next j Next iFor i =1 To 35 List2.AddItem Str(i) + adj(convert(zh(i)), 6) + adj(Str(tj(i)), 6)Next iEnd Sub解析 (1)“選課”字段值為“1100001”,7選3科目順序為“物化生政史地技”,因此可知所選科目為物化技。(2)自定義函數(shù)convert(x)的功能是將選科標志轉(zhuǎn)換為對應(yīng)的科目,學生的選科標志存放在數(shù)組xk中,數(shù)組元素xk(n)表示第n位學生的選科標志,科目信息存儲在變量km中,因此①處代碼為km = convert(xk(n));②處代碼表示統(tǒng)計各選科組合的人數(shù),因此②處代碼為tj(i) = tj(i) + 1;③處代碼表示采用冒泡排序按各組合的人數(shù)降序排序,因此代碼為tj(j) >tj(j - 1)。答案 (1)物化技 (2)①km = convert(xk(n)) ②tj(i) = tj(i) + 1 ③tj(j) >tj(j - 1)能力提升3.小林和小王合作編寫了一個查詢英語單詞的VB程序:小林編寫一個過程,單擊“讀取數(shù)據(jù)庫”按鈕Command1,從一個數(shù)據(jù)庫中讀取英語單詞和中文含義,分別保存在a數(shù)組和b數(shù)組中,并顯示在List1中;小王編寫另一個過程,在文本框Text1中輸入要查詢的單詞,單擊“查詢”按鈕Command2,將查詢單詞的中文含義顯示在Text2中,程序界面如圖所示。(1)分析程序,“英語單詞”和“中文含義”被保存在數(shù)據(jù)表________中。(2)實現(xiàn)上述要求的VB程序如下,請在劃線處填入合適的代碼。Const n=3500′存儲單詞的總數(shù)Dim a(1 To n) As String′依次存儲每個英語單詞Dim b(1 To n) As String′依次存儲每個英語單詞的中文含義Private Sub Command1_Click() Dim conn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strSQL As String conn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data source=” &App.Path& “dictionary1.accdb” strSQL = “select * from list” conn.Open Set rs.ActiveConnection = conn rs.Open strSQL num = 0 Do While Not rs.EOFnum = num + 1a(num) = rs.Fields(“word”)b(num) = rs.Fields(“mean”)rs.MoveNext Loop rs.Close conn.Close Set rs = Nothing Set conn = Nothing For i = 1 To nList1.AddItem a(i) + “ ” + b(i) Next iEnd SubPrivate Sub Command2_Click() Dim s As String s = Text1.Text If search(s) = -1 ThenText2.Text=“找不到該單詞” ElseText2.Text=______①______ End IfEnd SubFunction search(key As String) As Integer Dim i, j As Integer Dim mid1, mid2 As Integer i = 1: j = n search = -1 Do While i<= jmid1 = Int(i + (j - i) / 3)mid2 = Int(j - (j - i) / 3)If key = a(mid1) Then search = mid1 Exit DoElseIf key j = mid1 - 1ElseIf key = a(mid2) Then search = mid2 Exit DoElseIf key >a(mid2) Then i = mid2 + 1Else i = mid1 + 1______②________End If LoopEnd Function解析 (1)本小題主要考查的是數(shù)據(jù)表。從語句“strSQL = “select * from list””可知數(shù)據(jù)表名稱為list。(2)①處代碼為調(diào)用自定義函數(shù)search,自定義函數(shù)search(key)使用三分查找的思想來數(shù)組元素中查找單詞key,若能找到,則返回函數(shù)值為單詞在數(shù)組中的位置,若找不到,則返回的函數(shù)值為-1;②處代碼表示要想找的單詞在中間段中,因此將分別修改查找范圍的起點i和終點j的值。答案 (1)list (2)①b(search(s)) ②j=mid2-14.醫(yī)院每天提前發(fā)放100個預約號。考慮到老人身體原因,預約病人按照以下規(guī)則進行就診:①老年人(年齡>=60)比非老年人優(yōu)先就診。②老年人按年齡從大到小的順序就診,年齡相同的按預約號順序就診。③非老年人按預約號順序就診。小王根據(jù)以上規(guī)則編寫了一個VB程序,通過引入索引數(shù)組temp,進行排序,使得age(temp(1))≥age(temp(2))≥age(temp(3))……≥age(temp(n))。示例如圖a所示。程序運行時,病人數(shù)據(jù)顯示在列表框List1中,單擊“”就診排序按鈕Command1,排序結(jié)果顯示在列表框List2中,程序運行界面如圖b所示。圖b實現(xiàn)上述功能的VB程序如下,請回答下列問題:(1)分析程序,可知程序中讀取的病人名單來自________數(shù)據(jù)庫中的________數(shù)據(jù)表中的________字段(填寫具體的名稱)。(2)請在劃線處填入合適的代碼。Dim pname(1 To 100) As String, age(1 To 100) As Integer Dim n As Integer, num(1 To 100) As Integer Private Sub Form_Load() dim conn as New ADODB.Connection,rs As New ADODB Recordset conn.ConnectionString = “Provider=Microsoft.ACE.OLEDB.12.0;Data Source=” & App.Path & “pdxt.accdb” conn.open Set rs.ActiveConnection = conn rs.open “select * from jzmd” n = 0 List1.AddItem “就診號 名單 年齡” Do While Not rs.EOF ______①____ num(n) = n pname(n) = rs.Fields(“l(fā)ist”) age(n) = n pname(n) = rs.Fields(“age”) List1.AddItem Str(num(n)) & “ ” & pname(temp2(n)) & “ ” & Str(age(n)) rs.movenext Loop rs.Close: conn.Close Set rs = Nothing: Set conn = Nothing End Sub Private Sub Command1_Click() Dim temp1(1 To 100) As Integer, temp2(1 To 100) As Integer Dim i As Integer, j As Integer, k1 As Integer, k2 As Integer, t As Integer k1 = 0: k2 = 0 For i = 1 To n If age(i) < 60 Then k1 = k1 + 1 temp1(k1) = num(i) Else k2 = k2 + 1 temp1(k2) = num(i) End If Next i For i = 1 To k2 - 1 For j = k2 To i + 1 Step -1 if ____②____ then t = temp2(j): temp2(j) = temp2(j - 1): temp2(j - 1) = t End If Next j Next i List2.Clear List2.AddItem “就診號 名單 年齡” For i = 1 To k2 List2.AddItem Str(i) & “ ” & pname(temp2(i)) & “ ” & Str(age(temp2(i))) Next i For j = 1 To k1 List2.AddItem ____③____ & “ ” & pname(temp2(j)) & “ ” & Str(age(temp2(j))) Next j End Sub解析 (1)本小題主要考查的VB訪問數(shù)據(jù)庫的相關(guān)知識。(2)變量n表示讀取的記錄數(shù),每讀取一條記錄,則進行計數(shù),因此①處為n=n+1;②處代碼的功能是使用冒泡排序按年齡大小降序排序,存放年齡的數(shù)組為age,下標為temp2(j),因此②處代碼為age(temp2(j))答案 (1)pdxt.accdb jzmd list (2)①n=n+1 ②age(temp2(j))課件19張PPT。第5講 算法在數(shù)據(jù)管理中的應(yīng)用一、VB訪問數(shù)據(jù)庫1.ADO訪問Access數(shù)據(jù)庫ADO是微軟公司提供的一種應(yīng)用程序訪問數(shù)據(jù)庫的編程接口。該接口包含了多個對象,其中Connection對象用于和數(shù)據(jù)庫建立連接,在建立連接后,用Recordset對象獲取數(shù)據(jù)表中的數(shù)據(jù)。2.通過Connection連接數(shù)據(jù)庫在用Connection建立和數(shù)據(jù)庫的連接時,需要設(shè)置ConnectionString屬性的值(即連接字符串),以指定連接數(shù)據(jù)庫所用的驅(qū)動程序、數(shù)據(jù)源名稱、用戶名和密碼。下列語句定義一個Connection對象的實例conn,并設(shè)置conn的連接字符串:Dim conn As New ADODB.Connectionconn.ConnectionString=“Provider=Microsoft.ACE.OLEDB.12.0;DATA Source=”&App.Path&“Contacts.accdb”其中,參數(shù)“Provider”用于指定連接的提供者(Microsoft.ACE.OLEDB.12.0可以訪問Access2010數(shù)據(jù)庫);DATA Source用于指定數(shù)據(jù)庫的文件名(含絕對路徑);App.Path返回當前應(yīng)用程序所在的絕對路徑。Connection對象具有Open、Close等方法,其中Open方法用于打開到數(shù)據(jù)源的連接,Close方法用于關(guān)閉連接。3.通過Recordset對象獲取數(shù)據(jù)表中的數(shù)據(jù)在用Recordset對象從數(shù)據(jù)庫中獲取數(shù)據(jù)時,要設(shè)置ActiveConnection屬性的值。語句Set rs.ActiveConnection=conn,使Recordset對象的實例rs與Connection對象的實例conn建立關(guān)聯(lián)。在與conn建立關(guān)聯(lián)后,可用Recordset對象的Open方法獲取數(shù)據(jù)表中的數(shù)據(jù)。下列語句用于打開記錄集,將SQL語句的查詢結(jié)果保存到記錄集rs中:rs.Open“SELECT*FROM info”該語句執(zhí)行后,記錄集rs中的數(shù)據(jù)為SQL語句“SELECT * FROM info”查詢到的結(jié)果。打開Recordset時,若Recordset非空,當前記錄位于第一條記錄。Recordset對象的Close方法用于關(guān)閉對象。Recordset對象的Fields集合用于返回當前記錄中的數(shù)據(jù)。如:rs.Fields(“fName”)返回當前記錄中“fName”字段的值;rs.Fields(0)返回當前記錄中第一個字段的值,如果第一個字段名為“fName”,rs.Fields(0)與rs.Fields(“fName”)返回值相同。Recordset對象的MoveNext方法用于把當前移動到下一條記錄。若到結(jié)尾處還繼續(xù)向下移動,程序會出錯,因此在使用MoveNext時要判斷Recordset的EOF屬性,判斷是不是到達結(jié)尾處。EOF屬性取值為“True”或“False”。4.Select語句Select語句是結(jié)構(gòu)化查詢語言SQL中最常見的語句,主要用于從數(shù)據(jù)表中查詢數(shù)據(jù)。如語句“SELECT * FROM info”表示查詢數(shù)據(jù)表“info”中的全部數(shù)據(jù)。二、算法在數(shù)據(jù)管理中的綜合應(yīng)用VB程序獲取到的Access數(shù)據(jù)庫中的數(shù)據(jù),可采用數(shù)組等方式進行存儲,并可以通過編程對這些數(shù)據(jù)進行各種加工處理,如統(tǒng)計、分析、查找、排序等。一、VB訪問數(shù)據(jù)庫VB訪問Access數(shù)據(jù)庫,從數(shù)據(jù)表中讀取相關(guān)數(shù)據(jù),并存儲在數(shù)組中。【典例1】 讀取Access數(shù)據(jù)庫“student.accdb”的數(shù)據(jù)表“xsinfo”中讀取記錄,并分別顯示在相應(yīng)位置。 程序運行時,單擊“顯示記錄”按鈕Command1,并在文本框Text1、Text2、Text3中顯示第一條記錄的信息,單擊“下一條”按鈕Command2,將顯示下一條記錄。程序運行效果如下圖所示:實現(xiàn)上述功能的VB程序如下,請在劃線處填入合適的代碼。Dim conn As New ADODB.ConnectionDim rs As New ADODB.RecordsetPrivate Sub Command1_Click() conn.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & “____①____” conn.Open Set rs.ActiveConnection = conn rs.Open “SELECT * FROM ____②____” Text1.Text = rs.Fields(“姓名”) Text2.Text = rs.Fields(“班級”) Text3.Text = rs.Fields(“性別”)End Sub?Private Sub Command2_Click() rs.MoveNext ′移動到下一條記錄 If Not rs.EOF Then ′判斷是否已到記錄集的最后一條記錄 Text1.Text = rs.Fields(“姓名”) Text2.Text = rs.Fields(“班級”) Text3.Text = rs.Fields(“性別”) Else MsgBox (“記錄已全部顯示完畢!”) rs.Close conn.Close Set rs = Nothing Set conn = Nothing End IfEnd Sub解析 本題主要考查的是VB訪問數(shù)據(jù)庫的相關(guān)知識。劃線①處為訪問的數(shù)據(jù)庫的名稱,從題中可知數(shù)據(jù)庫名稱為“student.accdb”;劃線②處為數(shù)據(jù)表的名稱,從題中可知數(shù)據(jù)表名稱為“xsinfo”。答案 ①student.accdb ②xsinfo【方法總結(jié)】 VB訪問數(shù)據(jù)庫時,需要知道正確的數(shù)據(jù)庫名稱和數(shù)據(jù)表的名稱。二、數(shù)據(jù)分析【典例2】 讀取Access數(shù)據(jù)庫“student.accdb”的數(shù)據(jù)表“xsinfo”中讀取記錄,將記錄顯示在列表框中,并統(tǒng)計女生的人數(shù)。 程序運行時,單擊“顯示記錄”按鈕Command1,將記錄信息分別存儲在數(shù)組a、b、c中,并顯示在列表框List1中,單擊“統(tǒng)計”按鈕Command2,將女生人數(shù)顯示在標簽Label1中。程序運行效果如下圖所示:實現(xiàn)上述功能的VB程序如下,請在劃線處填入合適的代碼。Dim b(1 To 100) As StringDim c(1 To 100) As StringPrivate Sub Form_Load() conn.ConnectionString = “Provider = Microsoft.ACE.OLEDB.12.0;DATA Source=” & App.Path & “student.accdb” conn.Open Set rs.ActiveConnection = conn rs.Open “xsinfo” p = 0 Do While ____①____ ____②____ a(p) = rs.Fields(“姓名”) b(p) = rs.Fields(“班級”) c(p) = rs.Fields(“性別”) rs.MoveNext Loop rs.Close conn.Close Set rs = Nothing Set conn = NothingEnd SubPrivate Sub Command1_Click() Dim i As Integer List1.AddItem “姓名” + “班級” + “性別” For i = 1 To p List1.AddItem a(i) + “ ” + b(i) + “ ” + c(i) Next iEnd SubPrivate Sub Command2_Click() Dim i As Integer Dim count As Integer For i = 1 To p If ____③____ Then count = count + 1 Next i Label1.Caption = “共有女生數(shù):” + Str(count)End Sub解析 本題主要考查的是VB訪問數(shù)據(jù)庫,將進行簡單的統(tǒng)計分析。劃線①處表示將數(shù)據(jù)表中的每一條記錄存儲在數(shù)組中,讀取記錄時需判斷當前位置是否已到達記錄集的最后一條記錄,否則將會出錯,因此①處代碼為Not rs.EOF;②處代碼表示統(tǒng)計記錄的個數(shù),用變量p進行計數(shù),因此②處代碼為p=p+1;③代碼表示統(tǒng)計女生的人數(shù),性別存儲在數(shù)組c中,因此③處代碼為c(i) = “女”。答案 ①Not rs.EOF ②p = p + 1 ③c(i) =“女”【方法總結(jié)】 將數(shù)據(jù)庫中數(shù)據(jù)存儲在數(shù)組中,可對數(shù)組中數(shù)據(jù)進行統(tǒng)計分析。 展開更多...... 收起↑ 資源列表 第5講 算法在數(shù)據(jù)管理中的應(yīng)用.doc 第五單元第5講 算法在數(shù)據(jù)管理中的應(yīng)用.pptx 縮略圖、資源來源于二一教育資源庫