費氏數列

Download Report

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行)。