VB 程式語言 本節重點: 演算法 陣列 副程式 排序與搜尋
演算法簡介 演算法(algorithm): 一組用來解決特定問題的有限指令或步驟。 演算法的特性: 演算法特性 條件 輸入(input) 輸出(output) 有限性(finiteness) 明確性(definiteness)有效性(effectiveness) 說明 演算法中經常需要輸入資料,但並非絕對必要 演算法至少要有一個以上的輸出資料 演算法應該在有限的處理步驟後得到結果 演算法的每個步驟都必須嚴謹,而不能有模稜兩可的情況 演算法中的每個步驟都必須是可執行的
演算法的實例 計算聯考成績總分的演算過程: 讀入原始資料 1. 讀入一筆學生的考試成績資料 2. 加總各科考試成績 准考證號碼 國文 英文 數學 專業科目(一) 專業科目(二) 總分 計算聯考成績總分的演算過程: 1101001 75 74 68 80 73 1101002 62 72 77 82 76 1101003 78 89 74 88 90 … … … … … … 讀入原始資料 1. 讀入一筆學生的考試成績資料 2. 加總各科考試成績 3. 輸出各科考試成績(含加總成績) 4. 重覆步驟1~3,直到所有考生的成績資料都處 理完畢 輸出原始資料並填入總分 准考證號碼 國文 英文 數學 專業科目(一) 專業科目(二) 總分 1101001 75 74 68 80 73 370 1101002 62 72 77 82 76 369 1101003 78 89 74 88 90 419 … … … … … … …
演算法的表示(1/3) 流程圖符號與說明: 常用的流程圖符號與說明 代表意義 符號 作用 開始或結束 螢幕 輸入或輸出 處理符號 決策或判斷 流向符號 連接符號 副程式符號 列印符號 磁碟符號 表示流程圖的 表示將資料輸 出於螢幕上 表示資料的輸 入或輸出 表示執行某些 工作 表示以符號內 的條件式作判 斷,決定執行 的流向 表示程式的執 行方向和順序 出口或入口 表示執行副程 式 表示資料由印 表機輸出 表示由磁碟輸 或輸出資料
演算法的表示(2/3) 流程圖表示法:透過簡明的圖示符號來表達解決問題步驟的示意圖。 1. 到商場購物 敘述表示法:利用語言敘述的方式來表達演算法的處理步驟 1. 到商場購物 判斷是否使用信用卡付費?如果是,就在簽帳單上簽名;否則就付現金 3. 拿發票離開 開始 是否 刷卡消費 在簽帳單上簽名 付現 購物 拿發票 結束 T F
演算法與程式設計的關係 撰寫程式碼 設計演算法 或 虛擬碼 流程圖
程式語言簡介 本節重點: 程式語言的類別 程式的翻譯
程式語言的類別(1/8) 程式語言的分類:以接近人類語言的程度分為低階語言與高階語言。 程式語言 應用軟體語言,如VBA、JavaScript 、ActionScript…等 低階語言 高階語言 機器語言 組合語言 程序性語言,如FORTRAN、COBOL、Pascal…等 物件導向語言,如Visual Basic.NET 、C++、Java等 程式語言
程式語言的類別(2/8) 低階語言: 機器語言: 唯一不需經由翻譯,電腦就能直接執行的語言。 以0與1兩種符號組合而成。 此為某種機器語言的程式範例 低階語言: 機器語言: 唯一不需經由翻譯,電腦就能直接執行的語言。 以0與1兩種符號組合而成。
程式語言的類別(3/8) 低階語言: 組合語言: 以一種稍接近人類語言的字組,來代替以0與1表示的機器語言符號。 須經過組譯器翻譯成機器語言之後,電腦才能執行。 126E:0000 LDA 1000 126E:0001 SUB 1001 126E:0010 ADD 1010 126E:0011 PSC 0000 126E:0100 STA 1111 126E:0101 HTL 0000 126E:0110 ES; 126E:0111 ES; 126E:1000 DW 0100 126E:1001 DW 0010 126E:1010 DW 0110
程式語言的類別(4/8) 高階語言: 比較接近人類語言的程式語言。 須經過編譯器或直譯器等軟體翻譯成機器語言指令後,電腦才能執行。 機器語言程式指令N 翻譯 機器語言程式指令1 一個高階語言程式敘述
程式語言的類別(5/8) 低階語言與高階語言的比較: 高階語言與低階語言的比較 高階語言 較容易 較大 較高 項目 程式的撰寫 可攜性 佔用記憶體的空間 可讀性 學習難易度 除錯 維護 低階語言 較困難 較小 較低
程式語言的類別(6/8) 高階語言: 程序性語言: 依照程式敘述的先後順序及流程來執行的語言。 必須利用程式敘述來告知電腦要完成什麼工作及完成這些工作的流程。 常見的程序性語言簡介 適用的領域 適合科學及工程方面的計算 適合程式設計教學 適合用來開發系統軟體及一般應用程式 程式語言 FORTRAN BASIC Pascal C
程式語言的類別(7/8) 高階語言: 物件導向語言: 以設計個別物件功能的方式來開發程式的語言。 具有封裝、繼承、多型等三種特性。 常見的物件導向語言簡介 適用的領域 適合用來開發視窗應用程式 適合用來開發各種系統軟體及應用軟體 適合用來開發網際網路的應用程式 程式語言 Visual Basic.NET C++ Java
十五、物件導向語言的特性 物件導向語言的三種特性 可以簡化程式的開發流程、降低程式的複雜度,及避免重覆撰寫相同的程式碼 封裝(encapsulation) 繼承(inheritance) 多型(polymorphism) 可以簡化程式的開發流程、降低程式的複雜度,及避免重覆撰寫相同的程式碼
讀取下一行程式敘述,直到每一行程式都翻譯、執行完為止 程式的翻譯(1/3) 高階語言的翻譯方式有直譯與編譯兩種。 直譯:將高階語言所撰寫的原始程式碼逐行翻譯成機器語言指令,並立即執行。 原始程式 直譯 機器語言指令 執行 每次一行程式敘述 讀取下一行程式敘述,直到每一行程式都翻譯、執行完為止
程式的翻譯(2/3) 高階語言的翻譯方式有直譯與編譯兩種。 編譯:將高階語言所撰寫的整個程式翻譯成機器語言指令,但不會立即執行。 編譯後的機器語言程式,還須使用連結程式來連結與該程式相關的檔案。 原始程式 編譯 機器語言程式 (目的碼) 連結 可執行的目的碼 程式庫 (函數、副程式)
程式的翻譯(3/3) 高階語言的翻譯方式有直譯與編譯兩種。 經編譯、連結後的程式,當要執行時,尚需透過作業系統的載入程式,將可執行的目的碼載入到主記憶體內執行。 可執行的目的碼 載入 可執行的程式 (在主記憶體中) 執行
陣列的宣告 Dim 陣列名稱(N) As 資料型別 或 Dim 陣列名稱+型別宣告符號(N) Dim Y(10) As Integer ’ 宣告一個含有11個元素的陣列而每 ’ 一個陣列元素的資料型別都是整數 Dim Z$(9) ’ $ 是字串的型別宣告符號,所以這個 ’敘述宣告了 10 個字串元素的陣列
使用陣列 在術語上,陣列中的每一項資料叫做一個元素(element),而用來指定某一個元素的 0、1、2、…順序叫做註標(subscript),如下: X(0) X(1) X(2) X(3) X(4) 陣列 X 陣列元素 X(0)~X(4) 陣列註標 0~4 名稱 資料順序 資料內容 1 2 3 4
陣列的優點 -- 實例練習 輸入5份數值資料,輸入完畢之後,將最大值及最小值顯示出來。 Dim X(4) For I = 0 To 4 X(I) = Val(InputBox("請輸入第 " & I & " 份資料")) Next Min = X(0) ' 先假設第0份資料為最小值 Max = X(0) ' 先假設第0份資料為最大值 For I = 1 To 4 ' 然後從第1份資料開始比較 If X(I) < Min Then Min = X(I) If X(I) > Max Then Max = X(I) Next Print "最大值 = ";Max, "最小值 = ";Min
註標範圍的設定 以「Dim 陣列名稱(N)」敘述所宣告的陣列, 其註標範圍是0~N,其中起始註標是固定的 (等於0),而終止註標則由宣告時的N值決定。 另外還有一種宣告格式則可設定非0的起始註 標,其格式如下: 註 :N 必須 ≧ M Dim 陣列名稱 ( M To N) 設定起始註標,若省略則等於 0
註標範圍的設定 例如: Dim X(4)‘ 等於 Dim X(0 To 4) ’ 如果前面有設定option base 1則等於Dim X(1 to 4) Dim A(-4 To 5)' 註標範圍從 -4 到 5, 共 5-(-4)+1=10 項資料
註標範圍的讀取 陣列的註標範圍可以設定,也可以讀取,其方法是呼 叫 Lbound 及 Ubound 函數: 例如: V1 = LBound(陣列名稱) ' 讀取起始註標 V2 = UBound(陣列名稱) ' 讀取終止註標 Dim A(-4 To 5) Print LBound(A) ' 印出 -4 Print UBound(A) ' 印出 5
註標範圍讀取 -- 實際應用 For I = 0 To 4 Print X(I) Next I Lbound 與 Ubound 若應用在程式中,可增加程式的彈性, 舉例來說,前面有一段列印陣列所有資料的程式,如下: 這個程式的缺點是:當我們修改陣列 X 的註標範圍時,必 須跟著修改 For 敘述中的 0 及 4。如果把它改成: 則將來即使註標範圍有所改變,我們也不必修改這段程式。 For I = 0 To 4 Print X(I) Next I For I = LBound(X) To UBound(X) Print X(I) Next I
可改變大小陣列 -- 保留陣列元素的值(1) ReDim Preserve 陣列名稱 (M To N) 表示保留原陣列中的資料 可改變大小陣列 -- 保留陣列元素的值(1) 請注意利用ReDim調整大小的陣列,原陣列中的所有資料都會被清成0或空值,如果想保留原陣列中的資料,則要在ReDim之後加上Preserve保留字,格式是: ReDim Preserve 陣列名稱 (M To N) 表示保留原陣列中的資料
二維陣列 除了一一排列的資料之外,我們也可能會處理表格式的資料,例如: 第0行 第1行 第2行 第3行 第0列 打擊者 長打率 上壘率 打擊率 第1列 Bill 0.5 0.42 0.387 第2列 David 0.453 0.39 0.333 第3列 Norman 0.36 0.34 第4列 Walter 0.392 0.32
二維陣列(2) 以這個表格為例,計有5列、4行,所以共有5×4 項資 料,如果我們想用陣列來儲存這個表格,則可以這樣 宣告: 像這樣含有兩個註標的陣列,稱為二維陣列,而存取 二維陣列的資料也會使用到兩個註標,例如: Dim X(4,3) 註標範圍: 0~3 0~4 列 行 X(1, 2) = 0.42 ' 將第 1 列、第 2 行的資料指定成 0.42 Print X(3, 2) ' 印出第 3 列、第 2 行的資料
二維陣列(3) 如果我們將整個陣列的註標標示出來,則是: 第0行 第1行 第2行 第3行 第0列 (0,0) (0,1) (0,2) (0,3) 第1列 (1,0) (1,1) (1,2) (1,3) 第2列 (2,0) (2,1) (2,2) (2,3) 第3列 (3,0) (3,1) (3,2) (3,3) 第4列 (4,0) (4,1) (4,2) (4,3)
多維陣列(1) 除了一維跟二維陣列之外,我們也可宣告一個任意維數的陣列,如下: Dim 陣列名稱 ( M, N, L, … ) [As 資料型別 ] 維數就看這裡有幾個註標
多維陣列(2) 例如: Dim Z(3, 4, 5, 6, 9) '宣告一個五維陣列,可儲存的資料數共有: ' (3+1)(4+1)(5+1)(6+1)(9+1)=8400
Array:讓「變數」變成「陣列」的函數(1) VB 提供了一個有趣的函數 Array,可以讓變數 變成陣列,例如: 結果顯示出來的內容分別等於 "春"、"夏"、"秋 "、"冬",證明X是一個陣列。 Dim X ‘ X 是一個不定型變數 X = Array("春", "夏", "秋", "冬") Print X(0), X(1), X(2), X(3) ' 檢驗X的值
Array:讓「變數」變成「陣列」的函數(2) Array 最方便的地方在於可以一次指定多個元素,以上 面的程式為例,如果不使用 Array 函數,則程式必須 寫成: 在書寫上確實比較不方便。 Dim Y(3) Y(0) = "春" Y(1) = "夏" Y(2) = "秋" Y(3) = "冬"
陣列的應用-資料排序 認識資料排序 排序是指利用「比較」與「交換」的方法,將資料依特定的順序(例如由小到大)予以排列。 氣泡排序法的原理是逐次比較相鄰的兩個資料,並依照由大到小或由小到大的排序條件交換資料的位置,直到所有資料排序完成。
氣泡排序法:N個資料從大排到小 每回合做N-I個比較 共需N-1個回合 22 17 63 5 14 35 FOR I=1 TO N-1 NEXT I FOR J=1 TO N-I NEXT J 63 17 14 5 5 35 IF N(J)<N(J+1) THEN TEMP=N(J) N(J)=N(J+1) N(J+1)=TEMP ENDIF 17 14 14 35 5 63 22 63 22 17 35 14 5 63 22 22 35 17 14 5 17 14 5 22 35 63
比較次數 N-1 次 比較次數=(N-1)+(N-2)+……..+2+1 N-2 次 =(((N-1)+1)*N)/2 =N2/2 2 次 1 次
陣列的應用-資料搜尋 … 3 1 2 認識資料搜尋 搜尋是指依照特定的條件及方法,在一群資料中尋找符合條件的資料。 例如統一發票對獎就是循序搜尋法的生活實例。 說明:在一疊發票中找出與頭獎號碼(40130146)相同的發票。 … Step 以此類推,直到對中頭獎號碼,或比對完畢確定未中獎時,結束搜尋 3 Step 比對第一張發票號碼是否與頭獎號碼相同 1 Step 比對第二張發票號碼是否與頭獎號碼相同? 2
陣列的應用-資料搜尋 二元搜尋法:適合用來在已排序的資料列中,尋找某一資料。 二元搜尋法的範例(找出 "L"): 1 2 3 Step 找出中央位置的序號4(=(1 + 7) / 2),比較兩字母(G < L),捨棄前半段 1 4 G 1 2 3 5 6 7 序號 A C E H K L 字母 Step 找出中央位置的序號6(=(5 + 7) / 2),比較兩字母(K < L),捨棄前半段 2 K 6 1 2 3 4 5 7 序號 A C E G H L 字母 Step 找出中央位置的序號7(=(7 + 7) / 2),比較兩字母(L = L),找到目標資料,搜尋結束 3 7 L 1 2 3 4 5 6 序號 A C E G H K 字母
陣列的應用-資料搜尋(3/3) 二元搜尋法的程式範例: 搜尋目標 30 L R M N(M) 1 6 3 20 1 2 1 40 已排序的資料(存放於陣列變數N (1) ~ N (6)中) 二元搜尋法的程式範例: 40 30 20 15 10 5 搜尋目標 30 : 210 Target = 30 220 L = 1: R = 6: Result = "找不到": T = 0 230 While L <= R And Result = "找不到" 240 M = (L + R) \ 2 250 T = T + 1 '計算搜尋的次數 260 If N(m) = Target Then 270 Result = "找到了" 280 Else 290 If N(m) > Target Then 300 L = M + 1 310 Else 320 R = M - 1 330 End If 340 End If 350 Wend L R M N(M) 1 6 3 20 使用二元搜尋法找尋目標資料的程式碼 1 2 1 40 2 2 2 30 顯示搜尋結果 第3次搜尋比對時找到目標資料30
88 77 73 ………… 12 8 3 N個資料 第1次找到的資料 最多1次找到的資料 1個 第2次找到的資料 最多2次找到的資料 3個 第3次找到的資料 最多3次找到的資料 7個 第4次找到的資料 最多4次找到的資料 15個 第5次找到的資料 最多5次找到的資料 16個 31個 32個 最多6次找到的資料 第6次找到的資料 63個 …… 2^(T-1)個 …… 第T次找到的資料 最多T次找到的資料 (2^T)-1個 如果有N個資料最多要找幾次? LOG2(N+1)
結構化程式設計的概念 結構化程式設計:一種可使程式的設計與維護較易於進行的程式設計技術。 未使用結構化程式設計的程式 副程式b : End b a goto b c goto d b goto e d goto a e goto c 主程式 呼叫副程式a 呼叫副程式b 副程式a End a 未使用結構化程式設計的程式 使用結構化程式設計的程式
結構化程式設計的概念 由上到下的程式設計:先由整個程式的主要功能開始設計,再依序往下設計各個子功能。 ~ 統一入學測驗成績處理系統 計分處理 成績統計 榜單服務 卡片讀取 分數計算 … 分數排序 級距統計 榜單列印 榜單查詢 ~ 檢查 記錄 比較 交換 顯示
結構化程式設計的實作 副程式: 一段獨立的程式區塊,由Sub與End Sub之間的程式敘述所組成。 使用呼叫(call)的方式來執行副程式。 . Call 副程式A Sub 副程式A End Sub 呼叫 返回 執行 主程式 副程式
結構化程式設計的實作 副程式: 語法說明: 呼叫副程式的語法: 副程式的語法: Call 副程式名稱(參數1, 參數2,…) Sub 副程式名稱(參數1 As 資料型別, 參數2 As 資料型別,…) 程式敘述區塊 End Sub
結構化程式設計的實作 副程式: 副程式的範例: 呼叫 Sub SUM_N(M As Integer) Dim I As Integer Dim Sum As Integer Sum = 0 For i = 1 To M Sum = Sum + i Next i Print "1 + 2 +… + " & M_ & "=" & Sum End Sub . N = InputBox("請輸入N_ 值:") Call SUM_N(N) 返回 主程式 副程式
結構化程式設計的實作 自定函數:由Function與End Function之間的程式敘述所組成。 . V = 自定函數A( ) Function 自定函數A( ) As Integer 自定函數A( ) = 100 End Function 將值100傳回給變數V 呼叫 返回 執行 主程式 自定函數
結構化程式設計的實作(7/10) 自定函數: 語法說明: 呼叫自定函數的語法: 自定函數的語法: 變數名稱 = 自定函數名稱名稱(參數1, 參數2,…) 自定函數的語法: Function 自定函數名稱(參數1 As 資料型別, 參數2 As 資料型別,…) As 資料型別 程式敘述區塊 自定函數名稱 = 傳回值 End Function
結構化程式設計的實作 自定函數: 自定函數的範例: 主程式 自定函數 . Functon r_area(r) As Double . area = r_area(10) Print "圓面積為" & area Functon r_area(r) As Double Const pi As Double = 3.14159 r_area = pi * r ^ 2 End Function 呼叫 返回 主程式 自定函數