VB6 陣列與副程式

88
VB6 陣陣陣陣陣陣

description

VB6 陣列與副程式. 陣列 (Array). 假設,當我們要連續輸入全班 25 位同學的各科成績時,在之前教過的方法中,我們可以宣告單一變數的方式宣告 — 國文 chi ,英文 eng ,數學 math ;當輸入並計算完第一位同學的成績後,緊接著輸入第二位同學 … 第三位同學 … 一直到第 25 位同學,很高興都計算完,此時問題來了,倘若此時要你查詢某位同學的各科成績,並在螢幕上顯示出來,你該如何?. 請問第二位的成績在哪裡?. 陣列 ( 續 ). chi. eng. math. 陣列 ( 續 ). - PowerPoint PPT Presentation

Transcript of VB6 陣列與副程式

Page 1: VB6  陣列與副程式

VB6 陣列與副程式

Page 2: VB6  陣列與副程式

陣列 (Array)假設,當我們要連續輸入全班 25 位同學的各科成績時,在之前教過的方法中,我們可以宣告單一變數的方式宣告—國文 chi ,英文 eng ,數學 math ;當輸入並計算完第一位同學的成績後,緊接著輸入第二位同學…第三位同學…一直到第 25位同學,很高興都計算完,此時問題來了,倘若此時要你查詢某位同學的各科成績,並在螢幕上顯示出來,你該如何?

Page 3: VB6  陣列與副程式

陣列 ( 續 )1

Chi 90Eng 80Math 70

2Chi 80Eng 70Math 60

3Chi 70Eng 60Math 50

4Chi 60Eng 50Math 40

5Chi 50Eng 40Math 30

chi

eng

math

90

8070

80

7060

70

6050

60

5040

50

4030

請問第二位的成績在哪裡?

Page 4: VB6  陣列與副程式

陣列 ( 續 )為達目的,因此我們不擇手段地連續使用 chi1~chi5 、 eng1~eng5 、 math1~math5這些變數來儲存各項成績問題來了,雖然每個數值都存在記憶體中,要找第二個同學的成績時,程式設計又是一個繁複的問題

Chi1 90Eng4 50Chi3 70Math1

70

Eng1 80Eng2 70Math2

60

Eng3 60Chi2 80Math4

40

Eng5 40Math5

30

Chi4 60Math3

50

Chi5 50

Page 5: VB6  陣列與副程式

陣列 ( 續 )Select Case sel Case 1 Text1.Text=chi1 Text2.Text=eng1 Text3.Text=math1 Case 2 Text1.Text=chi2 Text2.Text=eng2 Text3.Text=math2 : : Case 5 Text1.Text=chi5 Text2.Text=eng5 Text3.Text=math5End Select

這樣的設計方式,是不是很驢? 5 個同學還好, 25 個同學或更多的話,程式何時了?

Text1.Text=chi(sel)Text2.Text=eng(sel)Text3.Text=math(sel)

不管有多少學生,能以 3 行程式就取代這麼驢的方式,何樂而不為?

Page 6: VB6  陣列與副程式

陣列 ( 續 )陣列就是

容許使用同一個名稱來處理多個數值一群性質相同的資料數值的集合亦即,其所含有之元素皆具有相同的型別,因此在一個陣列中同時含有整數與文字是不可能的所以,陣列為存放在連續記憶體中某一型態變數值的集合

chi(0) 90chi(1) 80chi(2) 70chi(3) 60chi(4) 50

math(0) 70math(1) 60math(2) 50math(3) 40math(4) 30

eng(0) 80eng(1) 70eng(2) 60eng(3) 50eng(4) 40

索引值

Page 7: VB6  陣列與副程式

陣列 ( 續 )陣列中的每個元件相當於一個變數,在陣列中存取變數只需要指定索引值即可陣列使用前是必須宣告的

語法

功能•宣告為所指定資料型態的一維(二維…)陣列

Dim 陣列名稱 ( 索引 1[, 索引 2[……]]) [As 資料型態 ]Dim chi(25),eng(25),math(25) As Integer Dim student(25,3) As Single

Page 8: VB6  陣列與副程式

陣列 ( 續 )如果我這樣宣告,記憶體會如何配置?

Height(0)

165.2

Height(1)

173.5

Height(2)

182.7

Height(3)

159.1

Height(4)

166.4

Height(5)

177.3

Dim height(5) As Single

實際上在主記憶體裡配置了連續 6 個連續位置來存放 height(0)到 height(5) 元件

Page 9: VB6  陣列與副程式

陣列 ( 續 )前一張投影片告訴我們,一維陣列宣告後,其索引值是從 0 開始,有些人並不習慣這要的開頭,既然宣告陣列大小為 5 ,又何必預留 6 個位置?假如從 1 開始到5 ,不是正好符合我們的宣告大小嗎?

Option BaseOption Base 0Dim p(3)

p(0), p(1), p(2), p(3)

Option Base 1Dim p(3)

p(1), p(2), p(3)

Page 10: VB6  陣列與副程式

陣列 ( 續 )

Dim 陣列名稱 ( 上界 To 下界 [, 上界 To 下界… ]) [As 資料型態 ]

x -5 -4 -3 -2 -1 0 1 2 3 4 5

Y 25 16 9 4 1 0 1 4 9 16 25

如果這樣表示上表,會不會覺得很彆扭?Dim X(10) As IntegerX(0)=25, X(1)=16, X(2)=9, X(3)=4, …, X(10)=25

Dim X(-5 To 5) As IntegerX(-5)=25, X(-4)=16, X(-3)=9, X(-2)=4, …, X(5)=25

順眼多了吧 !

Page 11: VB6  陣列與副程式

陣列 ( 續 )宣告陣列後,若要指定起始值給陣列,可以用右列的方法或是

Array 函數

Dim name(5) As Stringname(0)=“ 蘇光裕”name(1)=“ 蘇光志”name(2)=“ 蘇光旭”name(3)=“ 蘇光遠”name(4)=“ 蘇光武”name(5)=“ 蘇靜怡”

Dim name As Variantname=Array(“ 蘇光裕” , “ 蘇光志” , “ 蘇光旭” , “ 蘇光遠” , “ 蘇光武” , “ 蘇靜怡” )

自由型態變數

Dim student As Variantname=Array(“ 蘇光裕” , 173, 75.6)

既然是自由型態變數,資料型態就可跳脫陣列中只能儲存相同型態資料的限制

Page 12: VB6  陣列與副程式

陣列 ( 續 )For Each … Next 陣列迴圈

語法

功能• 以所指定的陣列元件數目,重複執行某個敘述區段

For Each 變數 In 陣列名稱 [ 敘述區段 ] [Exit For]Next

Dim name As Variantname=Array(“ 蘇光裕” , “ 蘇光志” , “ 蘇光旭” )For i=0 to 2 Print name(i)Next i

Dim name As Variantname=Array(“ 蘇光裕” , “ 蘇光志” , “ 蘇光旭” )For Each i In name Print iNext i

左右兩種寫法結果是相同的

Page 13: VB6  陣列與副程式

陣列 ( 續 )二維陣列

一個陣列若具有兩個索引稱為二維陣列常用於數學的矩陣、學生成績單、各式報表…可將其視為由列 (row)及行 (column)組合而成的資料表單

語法• Dim 陣列名稱 ( 索引 1, 索引 2) [as 資料型態 ]

功能• 宣告為二維陣列

國文 英文 數學 總分第一位學生 90 80 70 240第二位學生 80 70 60 210第三位學生 70 60 50 180第四位學生 60 50 40 150

Page 14: VB6  陣列與副程式

陣列 ( 續 )有時候在程式執行了一段時間後,才能決定陣列的大小,無法在程式一開始執行時決定,此時該如何是好?動態陣列宣告•在程式未執行前並未配置任何記憶體給該陣列,而是等到程式執行到該宣告時,才會要求系統配置記憶體給該陣列使用

– 以 Dim 來宣告空維數陣列– 再以 ReDim 來宣告大小以配置元件的數目

Dim height() As Single

ReDim height(n) As Single

n 為任意整數

Page 15: VB6  陣列與副程式

陣列 ( 續 )清除陣列

以往清除陣列的方式

以 Erase清除陣列內容•語法

– Erase 陣列名稱•功能

– 使用 Erase 可將動態陣列釋放掉或將靜態陣列清為預設值

For i=0 to 10 aa(i)=0Next i

Erase aa

Page 16: VB6  陣列與副程式

牛刀小試 (1)設計一程式,完成兩個陣列相加的動作

必須是相同規格的陣列才可進行相加的動作

A 1 2 3

1 10 20 30

2 15 25 35

3 20 30 40

B 1 2 3

1 11 22 33

2 13 26 39

3 22 32 42

+ =

C 1 2 3

1 21 42 63

2 28 51 74

3 42 62 82

+

Page 17: VB6  陣列與副程式

牛刀小試 (1)— 續Text1(0)~Text1(8)

Text2(0)~Text2(8)

Text3(0)~Text3(8)Command1

偷懶的寫法

Page 18: VB6  陣列與副程式

牛刀小試 (2)設計一程式,完成兩個陣列相加的動作

Page 19: VB6  陣列與副程式

牛刀小試 (2)— 續A 1 2 3

1 10 20 30

2 15 25 35

3 20 30 40

B 1 2 3

1 11 22 33

2 13 26 39

3 22 32 42

+ =

C 1 2 3

1 21 42 63

2 28 51 74

3 42 62 82

i i i

j

C(1,1)=A(1,1)+B(1,1) C(1,2)=A(1,2)+B(1,2) C(1,3)=A(1,3)+B(1,3)

C(2,1)=A(2,1)+B(2,1) C(2,2)=A(2,2)+B(2,2) C(2,3)=A(2,3)+B(2,3)

C(1,1)=A(3,1)+B(3,1) C(3,2)=A(3,2)+B(3,2) C(3,3)=A(3,3)+B(3,3)

i j i j i j i j i j i j i j i j i j

j 的值比 i 的值先變,所以j 要放在內層迴圈, i 要放在外層迴圈

Page 20: VB6  陣列與副程式

牛刀小試 (2)— 續宣告未知大小的三個陣列 A, B, C 並輸入陣列的行、列大小,重新宣告陣列 A, B, C

以 InputBox依序輸入陣列 A 的值,並將其值列印於 Form 上

以 InputBox依序輸入陣列 B 的值,並將其值列印於 Form 上

將陣列 A 與陣列 B 相同位置的值相加後,其值指派給陣列 C 的相同位置上,並將其值列印於 Form 上

Page 21: VB6  陣列與副程式

牛刀小試 (3)設計一程式,完成兩個陣列相乘的動作

A 、 B 兩陣列要能相乘,必須令 A 的行與 B的列相等,亦即 A(i,j)*B(j,k)=C(i,k)

4 5 67 8 91 2 3

7 21 85 3

* = 63 66102 105 24 27

4*7+5*1+6*5=28+5+30=63

++

Page 22: VB6  陣列與副程式

牛刀小試 (3)--- 續

4 5 67 8 91 2 3

7 21 85 3

* = 63 66102 105 24 27

i*j j*k

i k i j j k i j j k i j j k m3[0][0]=m1[0][0]*m2[0][0]+m1[0][1]*m2[1][0]+m1[0][2]*m2[2][0]

m3[0][1]=m1[0][0]*m2[0][1]+m1[0][1]*m2[1][1]+m1[0][2]*m2[2][1]

: :

m1 m2 m3

i*k

j先變, k次之, i最後變

Page 23: VB6  陣列與副程式

牛刀小試 (3)--- 續

Page 24: VB6  陣列與副程式

牛刀小試 (3)--- 續宣告未知大小的三個陣列 A, B, C 並輸入陣列的行、列大小,重新宣告陣列 A, B, C

以 InputBox依序輸入陣列 A 的值,並將其值列印於 Form 上

以 InputBox依序輸入陣列 B 的值,並將其值列印於 Form 上

將陣列 A 與陣列 B 相關位置的值相乘後,其值指派給陣列 C 的相關位置上,並將其值列印於 Form 上

Page 25: VB6  陣列與副程式

牛刀小試 (4)設計一程式,完成兩個陣列相乘的動作

Page 26: VB6  陣列與副程式

牛刀小試 (4)--- 續

0 1 2 3 4 5 6 7 8

i 0 3 6

k 0 1 2 3 4 5 6 7 8

m 012 012 012 345 345 345 678 678 678

j 036 147 258 036 147 258 036 147 258

Page 27: VB6  陣列與副程式

牛刀小試 (5)設計一程式,可輸入全班同學成績,並計算平均與總分

Page 28: VB6  陣列與副程式

牛刀小試 (5)--- 續

Picture1 的屬性 AutoRedraw=True

Label*6

TextBox*6(Text1*1, Text3*5)

PictureBox*1

Page 29: VB6  陣列與副程式

牛刀小試 (5)--- 續宣告一個未知大小的陣列 list及學生編號的變數 snum

程式一執行先令 snum=0

當 Text1 的內容輸入後按下 Enter鍵時,重新宣告 list 為二維變數,型態為自由型態,讓 Text3(0)~(4) 的 Enabled屬性設為 True ,控制權交給 Text3(0)

當 Text3 的內容輸入後按下 Enter鍵時,依序將控制權交給下一個 Text3 陣列,直到“數學”輸入完後,作動 Command1 ,並將控制權交給 Command1

Page 30: VB6  陣列與副程式

牛刀小試 (5)--- 續

當成績輸入完按下 Command1 後,將資料記錄於 list 的二維陣列中 (包含座號、姓名、各科成績、總分及平均 ) ,同時讓 Command1停止作動功能。記錄完後清空所有 Text3 文字盒的內容,並將控制權交給 Text3(0) 亦即,代表座號的文字盒

用 Print 方法將成績結果顯示於Picture1 上

假如要查詢學生成績時,輸入學號後,先判段是否有此學號,若有,則將此學生的成績顯示於 Text3(0)~(4) 的 Text屬性中

Page 31: VB6  陣列與副程式

副程式 (Subprogram)撰寫程式時,將某一段具有特定功能的敘述區段單獨抽取出來,另行編寫成程式單元,給予特定名稱,以方便其他程式的呼叫使用種類內建函數 (Built-in Function)程序 (Procedure)

• 事件程序• 一般程序

– Sub … End Sub– Function … End Function

次常式 (GoSub…Return)

Page 32: VB6  陣列與副程式

副程式 ( 續 )Sub 程序

語法[Private | Public][Static] Sub 程序名稱 [( 引述串列 )]     : : [ 程式區段 ]     : : [Exit Sub] :End Sub

Public Sub Sqrt(a As Integer, b As Single) b= a ^.5End Sub

Page 33: VB6  陣列與副程式

副程式 ( 續 )呼叫副程式

Call 敘述•語法

1. Call 程序名稱 [( 引述串列 )] Call Sqrt(25,y)2. 程序名稱 [( 引述串列 )] Sqrt(25,y)

Priavate Sub Command1_Click() Call Sqrt(25,y) Print yEnd Sub

Public Sub Sqrt(ByVal a As Integer, ByVal b As Single) b= a ^.5End Sub

Page 34: VB6  陣列與副程式

牛刀小試 (6)試設計一程式,以副程式方式設計九九乘法表

Page 35: VB6  陣列與副程式

牛刀小試 (6)--- 續

Page 36: VB6  陣列與副程式

副程式 ( 續 )Function 程序

語法[Private | Public][Static] Function 函數名稱 ([ 引述串列 ])[As 資料型態 ]      : : [ 程式區段 ]     : : [Exit Function] :End Function

Page 37: VB6  陣列與副程式

副程式 ( 續 )呼叫函數

變數名稱 = 函數名稱 ([ 引數串列 ])

Page 38: VB6  陣列與副程式

三角函數的使用VB 所提供的三角函數

Sin(弳度 )Cos(弳度 )Tan(弳度 )

角度轉換為弳度的公式

弳度 =(角度 ) ×( / 180 )

角度 弳度 30o 30*(3.14159/180)0.523598

Page 39: VB6  陣列與副程式

副程式 ( 續 )次常式 (Subroutine)

語法

呼叫次常式

標記 : [ 敘述區域 ]Return

行號 [ 敘述區域 ]Return

GoSub {標記 | 行號 }

Page 40: VB6  陣列與副程式

牛刀小試 (7)試以次常式方式設計一繪製同心圓個數的程式

Page 41: VB6  陣列與副程式

參數傳遞的方式傳值呼叫 (Call by Value)

2351

2351

AB

CD :

A=23:B=51Call nn(A,(B)) :

Private nn(ByVal C As Integer, D As Integer)

Page 42: VB6  陣列與副程式

參數傳遞的方式 ( 續 )傳址呼叫 (Call by Address/Reference)

2351

AB

CD

1000

1002

1004

1006

1008

1010

:A=23:B=51Call nn(A,B) :

Private nn(ByRef C As Integer, ByRef D As Integer)

Page 43: VB6  陣列與副程式

牛刀小試 (8)

Page 44: VB6  陣列與副程式

範例一 (選擇排序法 )是目前最簡單的排序方法之一步驟

從全部 N 個資料中,選取最小的一個將它與陣列中第一個位置的數字交換從剩下的 N-1 個資料中,選取最小的一個將它與陣列中第二個位置的數字交換從剩下的 N-2 個資料中,選取最小的一個將它與陣列中第三個位置的數字交換…一直做到只剩下一個資料為止

Page 45: VB6  陣列與副程式

範例一 ( 續 )minimum List(1) List(2) List(3) List(4) List(5)

3 2 5 1 4

3 2 3 5 1 4

2 2 3 5 1 4

2 1 3 5 2 4

1 1 3 5 2 4

3 1 3 5 2 4

3 1 2 5 3 4

2 1 2 5 3 4

5 1 2 3 5 4

3 1 2 3 5 4

5 1 2 3 4 5

Page 46: VB6  陣列與副程式

範例一 ( 續 )

將所輸入的數列列印於螢幕上

宣告空陣列 List ,決定數列中的數字個數,重新宣告 List 陣列,並依序輸入數列數值

呼叫選擇排序副程式

將排序後的數列列印於螢幕上

令數列的第 i 個值為最小值

依序拿 i+1及其後的數值與最小值比較假如小於最小值,則最小值更換為此數並與第 i 個數值互換

Page 47: VB6  陣列與副程式

範例二 (泡沫排序法 )最簡單的一種排序方法步驟

從第一個數字開始,依序將兩個相鄰的數值兩兩互相比較大小如果前一個比後一個大,互相交換位置一直做到每一對相鄰的數字都比較過後才結束這一輪工作回到第一步,再做新一輪的比較工作,如果有 N 個數字要來排序,就必須重複 N-1次的掃描工作

Page 48: VB6  陣列與副程式

範例二 ( 續 )數列 3 2 5 1 4

第一輪

第一次 2 3 5 1 4

第二次 2 3 5 1 4

第三次 2 3 1 5 4

第四次 2 3 1 4 5

第二輪第一次 2 3 1 4 5

第二次 2 1 3 4 5

第三次 2 1 3 4 5

第三輪第一次 1 2 3 4 5

第二次 1 2 3 4 5

第四輪 第一次 1 2 3 4 5

Page 49: VB6  陣列與副程式

範例二 ( 續 )考慮

第一輪

第一次 1 與 2比, 1 大於 2則交換

第二次 2 與 3比, 2 大於 3則交換

第三次 3 與 4比, 3 大於 4則交換

第四次 4 與 5比, 4 大於 5則交換

第二輪

第一次 1 與 2比, 1 大於 2則交換

第二次 2 與 3比, 2 大於 3則交換

第三次 3 與 4比, 3 大於 4則交換

第三輪第一次 1 與 2比, 1 大於 2則交

第二次 2 與 3比, 2 大於 3則交換

第四輪 第一次 1 與 2比, 1 大於 2則交換

For i=n-1 To 1 Step –1 For j=1 To i If list(j)>list(j+1) Then temp=list(j) list(j)=list(j+1) list(j+1)=temp End If Next jNext i

n=5 1 2 3 4 5

數列值 3 2 5 1 4

Page 50: VB6  陣列與副程式

範例二 ( 續 )程式的精神所在

Private Sub Bubble_Sort( list() as Single ) For i=1 To n-1 Step -1 For j=1 to i If list(j) > list(j+1) Then temp=list(j) list(j)=list(j+1) list(j+1)=temp End If Next j Next iEnd Sub

6 3

j j+1list

3 6

j j+1list

6

6

temp

temp

1

2

3

Page 51: VB6  陣列與副程式

程式 ( 一 )

Page 52: VB6  陣列與副程式

程式 ( 二 ) 使用副程式

Page 53: VB6  陣列與副程式

程式 ( 三 )

Page 54: VB6  陣列與副程式

範例三 (魔術方陣 )

6 1 87 5 32 9 4

Page 55: VB6  陣列與副程式

何謂魔術方陣將 1, 2, 3, … ,n2填入 n*n 的陣列中,使得每一列、 每一行、 兩對角線的和均相等

6 1 8

7 5 3

2 9 4

15

15 15

15

15

15 1515

Page 56: VB6  陣列與副程式

規則此程式只討論奇數方陣問題填奇數方陣的規則把 1 放在第一列的正中間位置將下一個數字放在目前位置的左上方格子內

• 假如左上方格子內已有數字存在,則改放在目前位置的正下方格子內,倘若正下方已超出格子範圍,則放在正上方最上面的格子內

• 假如左上方已超出格子範圍– 若目前位置是在方陣最左上方的格子內,則將下一個數字填入目前位置的正下方格子內

– 否則,若是超出上界範圍,則將數字填入目前位置的左邊一行的最下面格子內

– 否則,若是超出左界範圍,則將數字填入目前位置的上邊一列的最右邊格子內

Page 57: VB6  陣列與副程式

規則 ( 續 )

1

234

567

8

9

Page 58: VB6  陣列與副程式

規則( 續 )

7 2 98 6 1 83 7 5 3

2 9 4

若是超出上界範圍,則將數字填入目前位置的左邊一行最下面格子內

若是超出左界範圍,則將數字填入目前位置的上邊一列最右邊格子內

若目前位置是在方陣最左上方的格子內,則將下一個數字填入目前位置的正下方格子內

Page 59: VB6  陣列與副程式

程式說明

Page 60: VB6  陣列與副程式

程式說明 ( 續 )

Page 61: VB6  陣列與副程式

程式說明

(續)

Page 62: VB6  陣列與副程式

Print 這道指令Tab 函數

語法  Tab(n)由目前游標所在那一行的最前面開始起算,將游標往右移 n 個位置

Page 63: VB6  陣列與副程式

Print 這道指令 ( 續 )Spc 函數

語法  Spc(n)由目前游標所在位置插入指定的 n 個空格

Page 64: VB6  陣列與副程式

範例四 (求質數 )兩千多年前,古希臘數學家歐幾里得就已經證明了質數有無限多個同時代的數學家埃拉托斯芬更發明了『篩除法』,依次將 2 的倍數、 3 的倍數、 5 的倍數…篩除,最後留下的就是質數除了自己本身和 1 之外,沒有其他數能整除的數稱為質數

Page 65: VB6  陣列與副程式

方法由 2 開始當除數,只要被除盡就不是質數如果不能被 2除盡,則繼續把 3 當作除數依此類推,一直試到除數的平方大於被除數才停止所求得的數即是質數

Page 66: VB6  陣列與副程式

程式執行說明

Page 67: VB6  陣列與副程式

函數 (Function)獨立的程式單元可將大型計算工作分解成若干較小型的工作可很容易運用別人或自己之前寫好的函數,不必再從頭寫起恰當的函數會將運算細節隱藏起來,使用此函數的人不必知道其細節,即可運用適當使用函數可使程式簡潔清晰,也較易於修改

Page 68: VB6  陣列與副程式

函數類型內建函數亂數

• Rnd, Randomize數值

• Fix, Int, CInt, Abs, Sgn, Sqr, Sin, Cos, Tan轉換

• Asc, Chr, Val, Str字串

• Len, LCase, Ucase, Left, Right, Left, Ltrim, Rtrim, Trim, String, Space

日期時間• Date, Time, Now, Year, Month, Weekday, Day, Hour, Mi

nute, Second,Timer…

Page 69: VB6  陣列與副程式

函數類型 ( 續 )自訂函數

不存在於庫存函數中,需自行依需求設計

內建函數

自訂函數

Page 70: VB6  陣列與副程式

程式說明為避免輸入的起始值大於最終值,致使程式無法執行,因此加上此段程式碼,將起始值與最終值互換

j : 用以累計每列列印的數字個數  ( 預計每列印 11 個數字 )findprime : 是一個布林變數,承接  prime 函數回傳的值 (True/False)prime : 自訂函數,將 i 值傳遞至函 數中運算後再回傳一個布林值

呼叫函數的用法,將 i 值透過呼叫函數的方式傳給 prime 函數,當 prime 函數執行完後,回傳一個 True 或False 值給 findprime 變數(True 表示 i 是質數, False表示 i非質數 )

Page 71: VB6  陣列與副程式

程式說明 ( 續 ) hasfactor 用以檢視數字是否有因數,先假定欲檢測的數字沒有因數起始設定以 2 當做除數

當檢測不含因數,且除數的平方不大於被除數時,執行迴圈

假如被除數可被除數整除,表示此除數為此被除數的因數之一,因此,將 hasfactor 設為 True ,既然已測得有因數,表示此被除數並非質數,不必再花時間測試了,直接跳出迴圈

倘若除數並非被除數的因數,再檢測下一個除數是否為被除數的因數當 hasfactor 為 True 時表

示此數值並非質數,因此,prime應為 Fasle ,反之,當 hasfactor 為 False 時表示此數值為質數,因此,prime應為 True

Page 72: VB6  陣列與副程式

1

2

3

4

5

Page 73: VB6  陣列與副程式

範例五 (打蛋蛋 )

Page 74: VB6  陣列與副程式

範例五 ( 續 )PictureBox*9

Timer*1

Label*3

CommandButton *2

Page 75: VB6  陣列與副程式

範例五 ( 續 )屬性設定

PictureBox (Picture1(0)~(8)) • AutoSize: True

Label (Label1(0)-(1) 、 Label2)• Caption Label1(0) : 孵出 Label1(1) : 隻小雞• Font:標楷體 18號字

CommandButton (Command1~2)• Caption

– Command1:開始遊戲– Command2:結束

Page 76: VB6  陣列與副程式

範例五 ( 續 )準備圖案

eggf.jpg eggb.jpg

Page 77: VB6  陣列與副程式

範例五 ( 續 )

當按下“開始遊戲”後,以系統時間為亂數種子啟動亂數產生器,設定每秒驅動一次 Timer1 ,並令 Label2 的起始顯示為 0(未有雞蛋被打破 ) ,遊戲開始時間設為目前系統時間;遊戲結束時間設為目前系統時間後的 60秒

宣告遊戲起始時間與最終時間變數

當按下 Command2 後詢問是否離開程式

Page 78: VB6  陣列與副程式

範例五 ( 續 )

假如仍在遊戲時間內的話,清空 Picture1(0)~(8)的內容,並令其 Tag 為 0 ( 表示沒有雞蛋顯示 )

以亂數取 0~2間的任意整數給變數 a以亂數取 0~8間的任意整數給變數 b

a決定此次該出現多少雞蛋, b決定此次該哪幾個PictureBox 顯示完整的雞蛋圖形,並令其 Tag 為 1

假如時間到,顯示遊戲結束、時間到的警示

當點選 PictureBox 時,假如此 PictureBox 的 Tag 為1( 表示有雞蛋 ) ,顯示孵出小雞的圖案,並累計擊中的雞蛋個數,同時令 Tag回復為 0

Page 79: VB6  陣列與副程式

範例六 (神秘的測心術 )

Page 80: VB6  陣列與副程式

範例六 ( 續 ) Label * 9

CommandButton * 3

Image * 1

Timer * 1

Frame * 1

PictureBox*98

Page 81: VB6  陣列與副程式

範例六 ( 續 )屬性設定

PictureBox (Picture1(0)~(97))• Appearance: 0 – 平面• AutoSize: True

Image (Image1) • Strecth: True

Frame (Frame1)• BorderStyle: 0 – 沒有框線• BackColor:任意選擇一種顏色

Timer (Timer1)• Enabled: False• Interval: 2000

Page 82: VB6  陣列與副程式

範例六 ( 續 )準備圖案

1.bmp 2.bmp 3.bmp 4.bmp 5.bmp

6.bmp 7.bmp 8.bmp 9.bmp

Page 83: VB6  陣列與副程式

範例六 ( 續 )揭開神秘測心術的面紗請任意選擇一個二位數 (10~99 78)將此二位數減去十位數 (78-7=71)再減去個位數 (71-8=63)將此結果對應於螢幕上相對的數字編碼圖案注視此圖案五秒鐘按下按鍵結果出來了 ( 不可思議 )

Why ?

Page 84: VB6  陣列與副程式

範例六 ( 續 )任意的二位數減去十位數及個位數的結果就是關鍵的所在

67-6-7=54

38-3-8=27

81-8-1=7212-1-2=9竟然都是 9 的倍數

Page 85: VB6  陣列與副程式

範例六 ( 續 )管你亂數怎麼亂,圖案怎麼放,只要是 9的倍數,圖案就是一致,怎樣?

1 2 3 4 5 6 7 8 9 10 11 12 13 14

15 16 17 18 19 20 21 22 23 24 25 26 27 28

29 30 31 32 33 34 35 36 37 38 39 40 41 42

43 44 45 46 47 48 49 50 51 52 53 54 55 56

57 58 59 60 61 62 63 64 65 66 67 68 69 70

71 72 73 74 75 76 77 78 79 80 81 82 83 84

85 86 87 88 89 90 91 92 93 94 95 96 97 98

Page 86: VB6  陣列與副程式

範例六 ( 續 )宣告 count1 變數用以控制提示訊號的滯留時間a 變數則是以亂數選取 1~9間的任意整數轉換成的字串

程式一開始先讓 count1等於 0 ,“請按我”的按鈕及“你的答案是不是”的 Frame先行隱藏,緊接著呼叫副程式 draw_symbol ,同時啟動 Timer1

當按下“請按我”的按鈕後,讓此鈕隱藏, Frame1 顯現,同時讓 Frame1 上的 Image1 顯示變數 a 相對的圖案

當按下“重猜”的按鈕後,重新呼叫 Form_Load ,並讓 Frame1隱藏

當按下“結束”的按鈕後,結束程式執行

Page 87: VB6  陣列與副程式

範例六 ( 續 )Timer1啟動後,每 2秒進行一次 count1 的累加,依 count1的值顯示各項提示語,直到 count1=12 時,讓 Command1顯現,當 count1=13 時, count1歸 0 , Timer1停止作動

啟動亂數產生器,以亂數產生一個介於 1~9間的任意整數,將 9 的倍數相對應的 PictureBox 顯示相同的圖案,其餘的 PictureBox 皆以亂數顯示相對的圖案

Page 88: VB6  陣列與副程式

本章結束 The End