500 likes | 587 Views
語法複習. 任課老師:江啟惠. 1. 選擇結構. 循序結構 設計程式時都是一行陳述式接一行陳述式由上 往下 逐行執行,每次執行都得到相同的結果。 選擇結構 較複雜的程式會應程式的需求,按照所給予條件的 不同而執行不同的程式碼,此種因條件而改變程式 執行的流程,而得到不同的結果。 VB 2005 提供的選擇陳述式有下列三種: If… Then... Else( 雙重或單一選擇 ) Select …Case ( 多重選擇兩種以上 ). 雙重選擇 If… Then... Else 陳述式. If Then Else 陳述式只有一個條件有兩種 選擇。
E N D
語法複習 任課老師:江啟惠
1.選擇結構 • 循序結構設計程式時都是一行陳述式接一行陳述式由上往下逐行執行,每次執行都得到相同的結果。 • 選擇結構較複雜的程式會應程式的需求,按照所給予條件的不同而執行不同的程式碼,此種因條件而改變程式執行的流程,而得到不同的結果。 • VB 2005提供的選擇陳述式有下列三種: If… Then... Else(雙重或單一選擇) Select …Case (多重選擇兩種以上)
雙重選擇 If… Then... Else陳述式 • If Then Else 陳述式只有一個條件有兩種選擇。 • 若滿足條件即條件為真(True)就執行程式區塊1 • 若不滿足條件即條件為假(False)則執行程式區塊2。 • 執行完If Then Else 陳述式兩者都會回到接在If Then Else陳述式後面的陳述式繼續往下執行。 • 所謂程式區塊是指多行陳述式的集合。其寫法如下:
If條件式 Then 程式區塊1 Else 程式區塊2 End If 由上面語法可知,If和End If 是成對出現條件式可以關係運算式或是邏輯運算式。
若上述語法,不滿足時不做任何事情,如右下圖可省略Else部分的程式區塊2,其寫法如下:若上述語法,不滿足時不做任何事情,如右下圖可省略Else部分的程式區塊2,其寫法如下: • If條件式 Then 程式區塊1 End If • 若程式區塊只有一行,可省略End If,其寫法如下: If條件式 Then陳述式
【例1】若單價(price)大於等於1,000元, 折扣(discount)八折,否則折扣九折。 If price>=1000 Then discount=0.8 ‘price大於等於1000執行此敘述 Else discount=0.9 ‘price小於1000執行此敘述 End If
【例2】若年齡(age)是10歲(含)以下或60歲(不含)以上 則票價(price)為100元,否則為200元。 If age<=10 Or age>60 Then price=100 Else price=200 End If • 若 If 或 Else 程式區塊內還有 If…Else 陳述式就構成「巢狀If」。譬如下面範例由於有三個條件要判斷,可使用巢狀 If 來完成。
這個範例由鍵盤輸入兩整數(num1和num2),判斷 (範例ifelse1.sln) 若num1=num2,則顯示num1=num2”。 若num1>num2,則顯示num1>num2”。 若num1<num2,則顯示num1<num2”。
FileName: ifelse1.sln 1 Module Module1 2 3 Sub Main() 4 Dim num1, num2 As Integer 5 Console.Write("請輸入第一個整數(num1) :") 6 num1 = Console.ReadLine() 7 Console.Write("請輸入第二個整數(num2) :") 8 num2 = Console.ReadLine() 9 If (num1 = num2) Then 10 Console.WriteLine("{0} = {1}", num1, num2) 11 Else 12 If (num1 > num2) Then 13 Console.WriteLine("{0} > {1}", num1, num2) 14 Else 15 Console.WriteLine("{0} < {1}", num1, num2) 16 End If 17 End If 18 Read() 19 End Sub 20 21 End Module
2.多重選擇Select Case陳述式 • If ElseIf Else與Select Case陳述式兩者使用上的差異在,前者可使用多個不同的條件式,後者只允許使用一個運算式依據其運算式的結果來判斷其值是落在哪個範圍。 • 使用太多的If使得程式看起來複雜且不易維護,Select Case多重選擇陳述式則不會,其語法如下:
Select Case(運算式) • Case Value1 • 程式區塊1 • Case Value2 • 程式區塊2 • Case Value n • 程式區塊n • Case Else • 程式區塊n+1 • End Select
【例】Case各種寫法: • Case 1 to 6 • (若條件式為1、2、3、4、5、6則為真) • Case 9,19,29 • (若條件式為9,19,29,則為真) • Case Is <=0, Is>60 • (若條件式小於等於0或大於60則為真)
Case 10 to 18, 20 to 28,35 • (若條件式10~18或20~28或35為真) • Case ”a”,”c”,”y” • (若條件式結果為”a” 或 ”c” 或 ”y” 則為真) • Case ”a” To”z” • (若條件式結果為小寫字母則為真) • Case Is <”0”,Is>”9” • (若條件式結果為非數值則為真)
試使用Select Case陳述式,由鍵盤輸入一個字元,判斷輸入的字元為大寫、小寫、數字或其他字元。(範例select1.sln)
FileName: select1.sln • 1 Module Module1 • 2 • 3 Sub Main() • 4 Dim str1 As String • 5 Console.Write("== 請在鍵盤按任意鍵 : ") • 6 str1 = Console.ReadLine • 7 Select Case str1 • 8 Case "A" To "Z" ‘判斷str1是否為 "A" ~ "Z" • 9 Console.WriteLine("大寫") • 10 Case "a" To "z" ‘判斷str1是否為 "a" ~ "z" • 11 Console.WriteLine("小寫") • 12 Case "0" To "9" ‘判斷str1是否為 "0" ~ "9" • 13 Console.WriteLine("Digit") • 14 Case Else ‘str1為其他值 • 15 Console.WriteLine("other") • 16 End Select • 17 Read() • 18 End Sub • 19 • 20 End Module
3.For迴圈 • 計數器控制迴圈陳述式是以For開始,最後以 Next 結束。 • For …Nxet 必須成對出現的。For 迴圈陳述式語法如下:
由上可知,For 迴圈陳述式是由控制變數、控制變數的初值、控制變數的終值以及控制變數的增值構成。其運算方式是: 增值 為正時當 (初值終值)時,迴圈採遞增方式,首先將 初值 指定給 控制變數, 若 初值終值 則將迴圈內的程式區塊執行一次後,再將 增值加到 控制變數, 若相加後的 控制變數終值,繼續執行迴圈內的程式區塊一次...以此類推,一直到 控制變數>終值 時才離開迴圈,跳到接在Next後面的陳述式繼續往下執行。
增值為負時當 (初值終值) 時,迴圈採遞減方式,首先將初值指定給 控制變數, 若 初值終值 則將迴圈內的程式區塊執行一次後,再將 控制變數減去 增值, 若相減後的 控制變數終值,繼續執行迴圈內的程式區塊一次... 以此類推,一直到 控制變數<終值 時才離開迴圈,跳到接在Next後面的陳述式繼續往下執行。 若 增值 省略不寫其預設值為1。
若中途欲離開For...Next迴圈,可使用Exit For陳述式。 • 下面列舉一般常用For迴圈的常用寫法: For k=1 To 5 (Step省略表示Step=1) k= 1、2、3、4、5 共執行迴圈內的程式區塊5次。 For k=1 To 5 Step 2 (增值不為1時,增值不可省略) k= 1、3、5 共執行迴圈內的程式區塊3次。 For k=-0.5 To 1.5 Step 0.5 (初值、終值、增值可為小數) k=-0.5、0、0.5、1.0、1.5共執行迴圈內程式區塊5次。 For k=6 To 1 Step -2 (增值採遞減) k= 6、4、2 共執行迴圈內的程式區塊3次。 For k=x To y+9 Step 2 (初值和終值可以為運算式) 若x=1、y=-2,則k=1,3,5,7共執行迴圈內的程式區塊4次。 • 若迴圈內還有迴圈就構成巢狀迴圈,一般應用在二維資料列表 • 下例即使用巢狀迴圈,將外迴圈的變數,每個變數值印五次後,再將游標移到下一行。
試寫一個程式,將介於5到30(含)之間,是3的倍數顯示出來,顯示時,每3個倍數印一行。(範例for1.sln)試寫一個程式,將介於5到30(含)之間,是3的倍數顯示出來,顯示時,每3個倍數印一行。(範例for1.sln)
FileName: for1.sln 1 Module Module1 2 3 Sub Main() 4 Dim k As Integer, count As Integer = 0 5 For k = 5 To 30 Step 1 6 If ((k Mod 3) = 0) Then 7 Console.Write("{0} ", k) ‘若k為3的倍數則執行此敘述 8 count += 1 9 If count = 3 Then ‘ 若印三個數值後即將游標移到下一行 10 Console.WriteLine() 11 count = 0 12 End If 13 End If 14 Next 15 Console.Read() 16 End Sub 17 18 End Module
4.前測式迴圈 • 前測式迴圈就是將條件式放在迴圈的最前面,依據條件式的真假來決定是否進入迴圈並將迴圈內的程式碼執行一次,然後再回到迴圈最前面的條件式 • 若滿足條件,繼續執行迴圈內的程式區塊,一直到不滿足時才離開迴圈。 • 前測式迴圈若第一次進入迴圈時便不滿足條件式,會馬上離開迴圈,連一次都沒執行迴圈內的程式碼。 • VB 2005所提供的前測式迴圈有 While 和 Until 兩種。其語法和流程圖如下:
試寫一個程式,由鍵盤輸入一個整數,使用Do While... Loop前測式迴圈求其數值的階乘。(範例factorial1.sln)
FileName: factorial1.sln 1 Module Module1 2 3 Sub Main() 4 Dim keyin, num As Integer, factorial As Integer = 1 5 Console.Write("請輸入整數 : ") 6 keyin = Console.ReadLine() ‘將輸入的整數指定給keyin 7 num = keyin ‘將keyin指定給num 8 Do While (num >= 1) ‘計算num!階乘 9 factorial *= num 10 num -= 1 11 Loop 12 Console.WriteLine("{0}! = {1} ", keyin, factorial) 13 Console.Read() 14 End Sub 15 16 End Module
練習1 • 將求階乘factorial1.sln範例改為以下列四種方式撰寫 • For…Next • Do Until…Loop • Do…Loop While • Do…Loop Until
練習2 • 撰寫一程式,程式執行時要求使用者輸入帳號及密碼,若輸入的帳號為「tit」且密碼為「1234」則顯示「登入成功」訊息,否則顯示「登入失敗」訊息。
5.為何需要陣列 • 在前面設計程式時,每使用到一個資料就需要宣告一個變數來存放,資料一多時,變數亦跟著增加,不但會增加變數命名的困擾而且程式的長度亦會增長而不易維護。 • 所幸VB 2005對相同性質的資料提供陣列(Array)來存放。 • 只要在宣告陣列時設定陣列名稱、陣列大小以及該陣列的資料型別,VB 2005在編譯時段自動在記憶體中保留連續空間來存放該陣列的所有元素。陣列宣告語法如下: • Dim myary() As Integer 或 Dim myary As Integer()
VB 2005的基本資料型別都可以當作陣列的資料型別。 • 由於VB 2005中將陣列視為物件,因此使用上面陳述式宣告一個陣列後,必須再使用New 關鍵字來建立陣列物件並指定陣列的大小和配置連續的記憶空間。其寫法如下: • myary=New Integer(10){}
上面陳述式最後面再接一對大括號,是不可以省略的,它用來初始化(Initialization)陣列元素的初值。上面陳述式最後面再接一對大括號,是不可以省略的,它用來初始化(Initialization)陣列元素的初值。 • 若大括號內是空的,表示使用系統預設值,若是數值資料型別預設值為零,字串資料型別預設為空字串,布林資料型別預設為False,參考資料型別預設為Nothing。我們也可以將下面兩個陳述式
Dim myary As Integer()myary=New Integer(10){} • 合併成下面一個陳述式 • Dim myary As integer()=New Integer(10){} • 上面陳述式宣告陣列並未設定初值只配置記憶空間。也可以在宣告的同時設定陣列的初值,其寫法如下: • Dim num As Integer()num = New Integer() {10, 20, 30, 40, 50, 60} • 上面敘述可合併成下面一行 • Dim num As Integer() = New Integer() {10, 20, 30, 40, 50, 60}
假設陣列元素由記憶位址10000 開始放起,經過上面陳述式宣告和設定初值,各陣列元素的記憶位址和內容如下:
一維陣列的存取 • 同一性質的資料若使用陣列來存放,可以透過For…Next迴圈逐一將資料由鍵盤鍵入到陣列中,也可將資料由陣列中讀取出來。譬如:以k當次數,並將對應的k值當做陣列元素的註標,連續由鍵盤讀取資料六次,便可放入myary陣列中,步驟如下: • Step1 k=0,將 myary(0) Console.ReadLine() • Step2 k=1,將 myary(1) Console.ReadLine() • Step3 k=2,將 myary(2) Console.ReadLine() • Step4 k=3,將 myary(3) Console.ReadLine() • Step5 k=4,將 myary(4) Console.ReadLine() • Step6 k=5,將 myary(5) Console.ReadLine()
將上面步驟寫成程式片段如下: • For k = 0 To 5 • myary(k) = Console.ReadLine() • Next • 至於如何使用For…Next 迴圈取出myary陣列中所有陣列元素的內容,寫法如下: • For k = 0 To 5 • Console.WriteLine(" myary[{0}] = {1} ", k , myary(k)) • Next
請參照下圖的輸出入畫面,將本小節所介紹如何使用For…Next迴圈來存取陣列寫成一個完整程式。(範例array1.sln)請參照下圖的輸出入畫面,將本小節所介紹如何使用For…Next迴圈來存取陣列寫成一個完整程式。(範例array1.sln)
FileName: array1.sln • 1 Module Module1 • 2 • 3 Sub Main() • 4 Dim k As Integer • 5 Dim myary As Integer() • 6 myary = New Integer(5) {} • 7 Console.WriteLine(" 由鍵盤輸入整數值到myary 陣列:") • 8 For k = 0 To 5 ‘連續輸入6個整數並指定給myary(0)~myary(5) • 9 Console.Write(" myary({0}) = ", k) • 10 myary(k) = Console.ReadLine() • 11 Next • 12 Console.WriteLine() • 13 Console.WriteLine(" == myary 陣列的內容 == ") • 14 For k = 0 To 5 ‘印出myary(0)~myary(5) • 15 Console.WriteLine(" myary({0}) = {1}", k, myary(k)) • 16 Next • 17 Console.Read() • 18 End Sub • 19 • 20 End Module
6.陣列的排序 • Array.Sort()方法可用來對指定的陣列由小而大做遞增排序。譬如欲對陣列名稱為avg做遞增排序,其寫法如下: • Array.Sort(avg)
先在程式中直接設定陣列的初值,再透過For... Next迴圈顯示陣列的初值。接著使用Array.Sort(avg)做遞增排序後再顯示排序後的結果。(範例arraysort1.sln)
FileName: arraysort1.sln 1 Module Module1 3 Sub Main() 4 Dim k As Integer 5 Dim avg As Integer() 6 avg = New Integer(5) {80, 86, 70, 95, 64, 78} 7 Console.WriteLine(" === 排序前 === ") 8 For k = 0 To 5 ‘印出avg陣列排序前的結果 9 Console.WriteLine(" avg({0}) = {1}", k, avg(k)) 10 Next 11 Console.WriteLine() 12 Array.Sort(avg) ‘由小到大排序avg陣列 13 Console.WriteLine(" === 排序後 === ") 14 For k = 0 To 5 ‘印出avg陣列排序後的結果 15 Console.WriteLine(" avg({0}) = {1}", k, avg(k)) 16 Next 17 Console.Read() 18 End Sub 20 End Module
譬如在下表為某個班級計算機概論的學期成績,由於此表中有兩個不同性質的資料,因此必須使用兩個陣列來分別存放姓名和學期成績。假設陣列名稱分別為name和avg。譬如在下表為某個班級計算機概論的學期成績,由於此表中有兩個不同性質的資料,因此必須使用兩個陣列來分別存放姓名和學期成績。假設陣列名稱分別為name和avg。
由於每個人的姓名和成績都對應到一個相同的註標值,若排序時使用Array.Sort(avg)時,只單獨對avg陣列物件做遞增排序時,name姓名陣列仍維持原狀,導致姓名和成績無法一致。若希望按照學期平均由小而大排序的同時姓名亦跟著更動,就必須改成Array.Sort(avg, name),結果如右圖所示: • (範例arraysort2.sln)
FileName: arraysort2.sln 1 Module Module1 3 Sub Main() 4 Dim k As Integer 5 Dim name As String() = New String(5) _ {"Jack", "Tom ", "Fred", "Mary", "Lucy", "Jane"} 6 Dim avg As Integer() = New Integer(5) {80, 86, 70, 95, 64, 78} 7 Console.WriteLine(" === 排序前 === ") 8 For k = 0 To 5 Step 1 9 Console.WriteLine _ (" name[{0}] = {1} avg[{2}] = {3}", k, name(k), k, avg(k)) 10 Next 11 Console.WriteLine() 12 Array.Sort(avg, name) ‘name陣列依avg陣列做由小而大排序 13 Console.WriteLine(" === 排序後 === ") 14 For k = 0 To 5 Step 1 15 Console.WriteLine _ (" name1[{0}] = {1} avg[{2}] = {3}", k, name(k), k, avg(k)) 16 Next 17 Console.Read() 18 End Sub 20 End Module