Transcript 費氏數列
程式設計-使用Visual Basic 2010
第7章
陣列
陣列
陣列是將相同資料型別的多個變數結合在一起,每個陣
列元素皆可視為變數使用,佔有連續的記憶體空間。
陣列提供索引值(index)存取陣列內個別元素,陣列第
一個元素其索引值為0,第二個元素其索引值為1,第三
個元素其索引值為2,依此類推,n個元素的陣列,存
取陣列最後一個元素其索引值為n-1,每個索引值對應
唯一陣列元素
我們只要指定陣列與索引值就可以存取該元素,如成績
陣列的索引值為0的元素,就可以存取成績陣列的第一
個元素。
陣列的宣告與初始化
程式中使用陣列需先宣告,宣告為指定陣列名稱與陣
列的元素個數,初始化意指指定陣列每個元素的值
陣列宣告語法(一):個別設定
陣列的宣告與初始化
我們來看看上述程式範例陣列A的記憶體狀態,如下
圖。
陣列宣告語法(二):使用大括號,可以在宣告陣列程
式中初始化,也可以於宣告時同時初始化,如下表。
陣列的宣告與初始化
初始化方式三:使用迴圈
陣列與迴圈
利用迴圈變數與陣列索引值結合,經由控制陣列索引
值可以存取陣列中所有元素
計算成績陣列的總分(
ch7\計算總分\)
將成績資料置於陣列中,再利用迴圈存取陣列中每一
個元素進行加總,當每個元素都存取到時就可以得到
成績的加總。
流程圖表示
計算成績陣列的總分(
ch7\計算總分\)
預覽結果
按下「計算總分」按鈕,結果顯示在TextBox1中。
計算成績陣列的總分(
表單配置
在表單中新增一個
TextBox與一個Button。
屬性設定
物件
Button1
TextBox1
TextBox1
TextBox1
屬性
Text
Multiline
ScrollBars
Size
設定值
計算總分
True
Both
240,200
ch7\計算總分\)
計算成績陣列的總分(
ch7\計算總分\)
程式碼新增與解說
點選「計算總分」按鈕,新增程式碼在Button1_Click函式中,
如下方程式區塊。
行號 程式碼
1
2
3
4
5
6
7
8
9
10
11
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim sum As Integer = 0
Dim score() = {90, 90, 90, 80, 80, 80}
For i = 0 To 5
sum = sum + score(i)
TextBox1.Text = TextBox1.Text & "score(" & i & ")=" & score(i) & vbNewLine
TextBox1.Text = TextBox1.Text & "sum=" & sum & vbNewLine
Next
End Sub
End Class
計算成績陣列的總分(
ch7\計算總分\)
解說
第3行:宣告sum為整數變數,並初始化為0。
第4行:宣告score為整數陣列,且初始化score陣列的第1個元素
為90、第2個元素為90、第3個元素為90、第4個元素為80、第
5個元素為80、第6個元素為80。
第5~9行:使用For迴圈計䂫 算成績陣列score加總,計算過程
中使用變數sum暫存成績加總值(第6行),印出陣列score的每個
值到TextBox1(第7行),並印出每加一個成績後變數sum的值到
TextBox1(第8行)。
計算成績陣列的總分(
ch7\計算總分\)
迴圈中i值變化與sum值的對應,如下表。
計算成績陣列的總分(
ch7\計算總分\)
score(i)的i值可由迴圈控制,當i=0,score(i)相當於
為score(0),指向score陣列的第一個元素;當i=1,
score(i)相當於score(1),指向score陣列的第二個元素
,依此類推。
費氏數列(
ch7\費氏數列\)
費氏數列有一特性是第3項為第1項與第2項相加,且
費氏數列的第1項為1,且第2項為1。第4項為第2項與
第3項相加,依此類推。陣列可以儲存資料與索引值
存取的特性,非常適合計算出費氏數列。
解法:使用陣列F,且初始化F(0)=1,F(1)=1,當n大
於等於2時,使用以下公式F(n)=F(n-1)+F(n-2),也就
是將陣列F的第n-1項加陣列F的第n-2項,存入陣列F
的第n項。
費氏數列(
流程圖表示
ch7\費氏數列\)
費氏數列(
ch7\費氏數列\)
預覽結果
按下「求費氏數列」按鈕,結果顯示在TextBox1中。
費氏數列(
表單配置
在表單中新增一個TextBox
與一個Button。
屬性設定
物件
屬性
設定值
求費氏數
Button1 Text
列
TextBox1 Multiline True
TextBox1 ScrollBars Both
TextBox1 Size
250,200
ch7\費氏數列\)
費氏數列(
ch7\費氏數列\)
程式碼新增與解說
點選「求費氏數列」按鈕,新增程式碼在Button1_Click函式中
,如下方程式區塊。
行號 程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim fib(15) As Integer
fib(0) = 1
fib(1) = 1
For i = 2 To 15
fib(i) = fib(i - 1) + fib(i - 2)
Next
For i = 0 To 15
TextBox1.Text = TextBox1.Text & "fib(" & i & ")=" & fib(i) & vbNewLine
Next
End Sub
End Class
費氏數列(
ch7\費氏數列\)
解說
第3行:宣告陣列fib有16個整數元素,陣列索引值可以由0變化
到15。
第4~5行:設定陣列fib第一個元素為1且陣列fib第二個元素為1
。
第6~8行:變數i䂫 為迴圈變數,其變化由2到15,每個元素由
前兩個元素相加獲得,例如:fib(2)=fib(1)+fib(0)。
第9~11行:變數i為迴圈變數,變化由0到15,印出陣列f i b中每
個元素值到TextBox1。
費氏數列(
ch7\費氏數列\)
迴圈中i值變化與fib(i)值的對應,如下表。
全校成績分數統計(
ch7\計算級距\)
要計算全校資訊科期末考試各級距
人數統計,全校成績由程式隨機產
生0~100分數,產生1000個成績,
級距如下表,請計算各級距的人數。
解法:隨機產生1000個成績儲存在
陣列score,利用迴圈檢查每個成績,
根據成績將對應的陣列num加1,
直到檢查所有元素後,陣列num
即為級距人數統計結果。
全校成績分數統計(
流程圖表示
ch7\計算級距\)
全校成績分數統計(
ch7\計算級距\)
預覽結果
按下「計算級距」按鈕,結果顯示在TextBox1中。
全校成績分數統計(
ch7\計算級距\)
表單配置
在表單中新增一個TextBox與一個Button。
全校成績分數統計(
屬性設定
物件
Button1
TextBox1
TextBox1
TextBox1
屬性
Text
Multiline
ScrollBars
Size
設定值
計算級距
True
Both
250,200
ch7\計算級距\)
全校成績分數統計(
ch7\計算級距\)
程式碼新增與解說
點選「計算級距」按鈕,新增程式碼在Button1_Click函式中,
如下方程式區塊。
行號 程式碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Randomize()
Dim score(999) As Integer
Dim num(11) As Integer
Dim j As Integer
For i As Integer = 0 To 999
score(i) = CInt(Int(101 * Rnd()))
j = score(i) / 10
num(j) = num(j) + 1
Next
For i As Integer = 0 To 10
TextBox1.Text = TextBox1.Text & num(i) & vbNewLine
Next
End Sub
End Class
全校成績分數統計(
ch7\計算級距\)
解說
第3行:初始化隨機函式。
第4行:宣告陣列score䂫 有1000個整數元素,用於儲存全校成
績。
第5行:宣告陣列num有10個整數元素,用於儲存各級距人數。
第6行:宣告變數j,用於級距的分組。
第7~10行:變數i為迴圈變數,變化由0到999,新增隨機產生的
分數介於0到100,儲存入陣列score中索引值為i的元素(第8行)
,產生成績的同時將分組級距統計出來,計算所屬級距j,j為分
數除以10,因為j為整數,分數除以10後小數點以下自動忽略,
依據j值將對應的陣列num(j)加1(第9~10行)。
第12~14行:變數i為迴圈變數,變化由0到10,印出陣列num中
每個元素值到TextBox1。
全校成績分數統計(
ch7\計算級距\)
分數與對應的陣列元素如下表,例如:隨機產生分數
若介於40到49,則對應的陣列元素num(4)加1。
樂透開獎(
ch7\樂透開獎\)
請製作一個樂透開獎程式,隨機產生六個介於1到48之間
的號碼,且號碼不能重複,若有重複,則再產生一個號
碼,直到不重複為止。
解法:
宣告整數變數count為目前已經開獎的號碼數。
宣告整數變數pz為新產生的得獎號碼。
宣告陣列prize(6)儲存目前開獎的號碼。
宣告旗標陣列repeat(48)儲存該數字是否已經開過獎,當repeat(i)等於0
表示號碼i未開獎;當repeat(i)等於1表示號碼i已開獎。
當count小於等於6時,繼續隨機產生開獎號碼儲存到pz,檢查repeat(pz)
是否有開獎過,若為0,表示號碼pz未開獎;repeat(pz)改為1,表示號碼
pz已開出,並將號碼pz儲存入陣列prize(count)中,變數count遞增1;若
repeat(pz)為1,則表示已開過獎,需重新隨機產生隨機號碼。
樂透開獎(
流程圖表示
ch7\樂透開獎\)
樂透開獎(
預覽結果
按下「樂透開獎」按鈕,
結果顯示在TextBox1中。
表單配置
在表單中新增一個
TextBox與一個Button。
ch7\樂透開獎\)
樂透開獎(
屬性設定
物件
屬性
Button1
Text
TextBox1 Size
設定值
樂透開獎
268,22
ch7\樂透開獎\)
樂透開獎(
ch7\樂透開獎\)
程式碼新增與解說
點選「樂透開獎」按鈕,新增程式碼在Button1_Click函式中,
如下方程式區塊。
行號 程式碼
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Randomize()
Dim prize(6) As Integer
Dim pz As Integer
Dim repeat(48) As Integer
Dim count As Integer = 1
Do While (count <= 6)
pz = CInt(Int(48 * Rnd() + 1))
If (repeat(pz) = 0) Then
repeat(pz) = 1
prize(count) = pz
count = count + 1
TextBox1.Text = TextBox1.Text & pz & " "
Else
Continue Do
End If
Loop
樂透開獎(
ch7\樂透開獎\)
解說
第3行:初始化隨機變數。
第4行:宣告陣列prize。
第5行:宣告變數pz。
第6行:宣告陣列repeat。
第7行:宣告變數count,初始化為1。
第8~18行:Do-While迴圈結構,變數count為迴圈變數,變化
由1到6,變數count到達6表示已經產生6個不重複的隨機變數。
第9行:隨機產生號碼。
第10~17行:由陣列repeat判斷是否䂫 有重複號碼,若未重複(
第10行),則陣列repeat設為已經開獎過(第11行),將開獎號碼
放入陣列prize(第12行),變數count加1(第13行),開獎號碼印出
到元件TextBox1(第14行);否則號碼有重複,繼續產生隨機號
碼(第16行)。