下載/瀏覽

Download Report

Transcript 下載/瀏覽

第6章 運算式與運算子
[算術與多功能計算機]
6-1 運算式的基礎
6-2 Visual Basic的運算子
6-3 算術與連接運算子
6-4 比較與邏輯運算子
6-5 運算式的資料型態轉換
6-6 例外處理
6-1 運算式的基礎
6-1-1 運算式簡介
6-1-2 運算式的種類
6-1-1 運算式簡介-說明
「運算式」(Expressions)是由一序列的
「運算子」(Operators)和「運算元」
(Operands)組成,可以用來在程式中執
行所需的運算任務。
6-1-1 運算式簡介-範例
一些Visual Basic語言的運算式範例,如下所示:
A
B
15
-15
A+B*1
A >= B
A > B And A > 1
A=B+1
運算式中的變數A、B和字面值1、15和-15是運算元,
「+」、「*」、「>=」、「>」、「And」和「=」為運算
子,運算子是一個使用幾個字元組成的符號,運算元是字
面值或變數,事實上,單獨運算元(不包含運算子)也是
一種運算式。
6-1-1 運算式簡介-如何執行運算
當同一個運算式擁有超過一個運算子時,運算式
的執行結果會因運算子的執行順序而不同。例如:
一個數學運算式,如下所示:
10 * 2 + 5
上述運算式如果先執行加法,運算過程是2+5=7,
然後7*10=70,結果為70。如果先執行乘法,過
程是10*2=20,然後20+5=25,結果是25。
運算式如果擁有多個運算子時,運算子的執行順
序是由優先順序(Precedence)和結合
(Associativity)來決定。
6-1-1 運算式簡介優先順序(Precedence)
一般來說,程式語言提供多種不同的運算
子,在同一個運算式如果使用多個運算子
時,為了讓運算式能夠得到相同的運算結
果,運算式是以運算子預設的優先順序來
進行運算,也就是我們所熟知的「先乘除
後加減」口訣,如下所示:
A+B*2
在上述運算式中,因為運算子的優先順序*
大於+,所以先計算B*2後才和A相加。
6-1-1 運算式簡介結合(Associativity)
運算式的運算子都擁有相同優先順序時,
運算子的執行順序是由結合(Associativity)
決定。結合分為兩種,如下所示:


右左結合(Right-to-left Associativity):運算
式是從右到左執行運算子的運算,例如:運算
式A-B-C是先計算B-C的結果D,然後才是A-D。
左右結合(Left-to-right Associativity):運算
式是從左到右執行運算子的運算,例如:運算
式A-B-C是先計算A-B的結果D,然後才是D-C。
6-1-2 運算式的種類-1
單運算元運算式(Unary Expressions)
單運算元運算式只包含一個運算元和「單
運算元運算子」(Unary Operator),例如:
正負號是一種單運算元運算式,如下所示:
-15
+10
在Visual Basic語言的-和+正負號是一種單
運算元運算子。
6-1-2 運算式的種類-2
二元運算式(Binary Expressions)
二元運算式包含兩個運算元,使用一個二
元運算子來分隔,Visual Basic語言的運算
式大都屬於二元運算式,如下所示:
A+B*1
D+C+E
第1個運算式是使用運算子優先順序來執行
運算。第2個運算式的2個運算子因為擁有
相同的優先順序,所以程式語言是使用結
合(Associativity)來執行運算式的計算。
6-2 Visual Basic的運算子
6-2-1 運算子的種類
6-2-2 運算子的優先順序
6-2-3 在運算式使用括號
6-2-1 運算子的種類
算術運算子(Arithmetic Operators):執行常見
數學運算的加、減、乘和除法等數值運算。
比較運算子(Comparison Operators):執行兩
個運算元的大於、等於、小於、大於等於和小於
等於的運算,可以傳回布林值True或False。
字串連接運算子(Concatenation Operators):
可以連接多個字串成為一個字串,每一個字串是
連接在前一個字串的最後。
邏輯運算子(Logical Operators):可以連接比
較運算式來建立更複雜的條件運算式。
6-2-2 運算子的優先順序-規則
運算式預設依其出現順序,由左到右依序的執行
運算,其優先順序規則,如下所示:


"( )"括號內比括號外先執行,括號的目的是為了推翻現
有優先順序,在括號內依照正常的優先順序。
當運算式擁有多種運算子時,算術運算子最先,接著
是比較運算子,最後才是邏輯運算子,如下所示:
算術運算子 > 比較運算子 > 邏輯運算子


比較運算子擁有相同的優先順序。
算術運算子的加和減法優先順序相同,乘和除法擁有
相同的優先順序,不過乘除高於加減,如下所示:
^指數 > (-)負號 > */乘除 > \整數除法 > Mod餘數 > +-加減 > &

邏輯運算子的優先順序,如下所示:
Not > And, AndAlso > Or, OrElse > Xor
6-2-2 運算子的優先順序-優先順序
Visual Basic語言運算子的預設優先順序,愈前面
的列;其優先順序愈高,如下表所示:
運算子
說明
^
指數
+、正號、負號
*、/
乘法、除法
\
整數除法
Mod
餘數
+、加法、減法
&
連接
=、<>、<、<=、>、>=、 等於、不等於、小於、小於等於、大於、大於等於、
Is、IsNot、Like
物件比較、字串範本比較
Not
Not 非運算
And、AndAlso
And 且運算
Or、OrElse
Or 或運算
Xor
Xor 運算
6-2-2 運算子的優先順序-結合規則
當運算式的運算子擁有相同的優先順序時,
Visual Basic語言是使用左右結合(Left-toright Associativity)來執行D + C + E的運
算,先計算D + C等於R後,計算R+E的值。
6-2-3 在運算式使用括號-括號運算
式(Parenthetical Expressions)
在運算式中擁有超過2個運算子時,我們才
可能使用括號來改變運算順序,例如:一
個擁有乘法和加法運算子的算術運算式,
如下所示:
A = B * C + 10
上述運算式的運算順序是先計算B * C後,
再加上字面值10,因為乘法的優先順序大
於加法。如果需要先計算C + 10,我們可
以使用括號來改變優先順序,如下所示:
A = B * (C + 10)
6-2-3 在運算式使用括號-巢狀括號運算
式(Nested Parenthetical Expressions)
在運算式的括號中可以擁有其他括號,稱
為巢狀括號,此時在最內層的括號擁有最
高的優先順序,然後是其上一層,直到得
到最後的運算結果,如下所示:
A = (B * 2) ^ (C * (D + 10))
上述運算式的運算順序是先計算最內層的D
+ 10,然後是上一層的(B * 2)和(C * (D +
10)),最後才計算指數的運算結果。
6-3 算術與字串連接運算子
6-3-1 算術運算子
6-3-2 使用數學公式建立運算式

ViLLE – 1.3 數學公式建立運算式
6-3-3 字串連接運算子
6-3-4 再談指定敘述
6-3-1 算術運算子-種類
Visual Basic語言提供多種算術運算子來執
行數學運算,其說明與範例如下表所示:
運算子
^
+
*
/
\
Mod
+
-
說明
指數
負號
正號
乘法
除法
整數除法
餘數
加法
減法
運算式範例
6 ^ 2 = 36
-17
+17
15 * 6 = 90
7 / 2 = 3.5
7\2=3
7 Mod 2 = 1
14 + 3 = 17
14 – 3 = 11
6-3-1 算術運算子-取得TextBox控制
項輸入的數值
在Windows應用程式通常是使用TextBox控
制項來取得使用者輸入的變數值,因為預
設資料型態是字串,所以,我們需要使用
資料型態轉換函數來轉換成數值,如下所
示:
Dim opd1, opd2 As Integer
opd1 = CInt(txtOpd1.Text)
opd2 = CInt(txtOpd2.Text)
6-3-1 算術運算子-Visual Basic專案
Visual Basic專案:Ch6-3-1\算術計算機
在Windows應用程式使用2個TextBox控制
項輸入運算元的值後,使用算術運算子在
Label標籤控制項顯示計算結果。其執行結
果如下圖所示:
6-3-2 使用數學公式建立運算式-說
明
數學公式可以轉換成算術運算式,建立
Visual Basic應用程式來解決數學問題。
例如:華氏(Fahrenheit)和攝氏
(Celsius)溫度的轉換公式。首先是攝氏
轉華氏的公式,如下所示:
F = (9.0 * C) / 5.0 + 32.0
華氏轉攝氏的公式,如下所示:
C = (5.0 / 9.0) * (F – 32.0)
體脂肪BMI值的計算公式,如下所示:
R = Weight / Hight ^ 2
6-3-2 使用數學公式建立運算式Visual Basic專案
Visual Basic專案:Ch6-3-2\多功能計算機
在Windows應用程式使用數學公式來建立
算術運算式,可以計算BMI值,和轉換攝氏
或華氏溫度。其執行結果如下圖所示:
ViLLE – 1.3 數學公式建立運算式
請啟動ViLLE,在【一. 變數與運算子】目錄下,
選【3. 數學公式建立運算式】,按【Run】鈕模
擬執行此範例程式,如下圖所示:
6-3-3 字串連接運算子-說明
如果運算元是String字串資料型態,在
Visual Basic語言提供運算子可以連接字串
內容,其說明和範例如下所示:
運算子
&
說明
字串連接
運算式範例
"abc" & "de" = "abcde"
6-3-3 字串連接運算子-Visual Basic
專案
Visual Basic專案:Ch6-3-3\多功能計算機
這個Windows應用程式和上一節的專案相
同,只是在計算BMI值時,除了輸出計算結
果外,還加上說明字串。其執行結果如下
圖所示:
6-3-4 再談指定敘述
在Visual Basic語言除了使用「=」等號建立指定
敘述外,還可以配合其他運算子來簡化運算式的
撰寫,建立更簡潔的算術運算式,如下表所示:
運算子
=
^=
+=
-=
*=
/=
\=
&=
範例
x=y
x ^= y
x += y
x -= y
x *= y
x /= y
x \= y
x &= y
相當的運算式
N/A
x=x^y
x=x+y
x=x-y
x=x*y
x=x/y
x=x\y
x=x&y
說明
指定敘述
指數
加法
減法
乘法
除法
整數除法
字串連接
6-4 比較與邏輯運算子
6-4-1 比較運算子
6-4-2 邏輯運算子
6-4-1 比較運算子
比較運算子沒有優先順序的分別,通常是使用在
迴圈和條件敘述作為判斷條件,運算結果是布林
值的True或False,其說明和範例如下表所示:
運算子
=
<>
<
>
<=
>=
Is
IsNot
Like
說明
等於
不等於
小於
大於
小於等於
大於等於
物件比較
物件比較
字串比較
結果
運算式範例
False
16 = 13
True
16 <> 13
False
16 < 13
True
16 > 13
False
16 <= 13
True
16 >= 13
比較 2 個變數是否指向同一個物件
比較 2 個變數是否指向不同的物件
使用範本字串來進行字串的比較
6-4-2 邏輯運算子-種類
在迴圈和條件敘述的判斷條件如果不只一個,我
們需要使用邏輯運算子來連接多個比較運算式,
其說明如下表所示:
運算子
Not
And
Or
說明
非,傳回運算元相反的值,通常是配合運算式的布林值來取得相反值
且,連接的 2 個運算元都為 True,則運算式為 True
或,連接的 2 個運算元中,任一個為 True,則運算式為 True;否則
為 False
Xor
連接的 2 個運算元中,只有一個運算元為 True,而且 2 個運算元不同
時為 True,則運算式為 True;否則為 False
AndAlso 連接的 2 個運算元都為 True 才為 True,如果第 1 個運算元已經 False,
就不用計算第 2 個運算元,傳回 False
OrElse 連接的 2 個運算元中,任一個為 True,則運算式為 True;否則為 False,
如果第 1 個為 True,就不用計算第 2 個運算元,傳回 True
6-4-2 邏輯運算子-範例
對於複雜的比較運算式可以使用邏輯運算子連接,
一些實際的運算式範例,如下表所示:
邏輯運算子
Not A
Not B
A And B
A Or B
A Xor B
A AndAlso B
A OrElse B
運算式範例
Not (25 > 23)
Not (14 <= 12)
25 > 23 And 14 <= 12
25 > 23 Or 14 <= 12
25 > 23 Xor 14 <= 12
25 > 23 AndAlso 14 <= 12
25 > 23 OrElse 14 <= 12
結果
False
True
False
True
True
False
True,以此例第 2 個運算元
根本不用計算
6-5 運算式的資料型態轉換
6-5-1 隱含型態轉換
6-5-2 明顯型態轉換
6-5 運算式的資料型態轉換
「資料型態轉換」(Type Conversions)是因為
同一個運算式可能有多個不同資料型態的變數或
字面值。例如:在運算式擁有整數和浮點數的變
數或字面值時,就需要執行型態轉換。
資料型態轉換是指轉換變數儲存的資料,而不是
變數本身的資料型態,因為不同型態佔用的位元
組數不同,所以在進行資料型態轉換時。例如:
Double轉換成Single,變數資料有可能損失資料
或精確度。
6-5-1 隱含型態轉換-說明
隱含型態轉換(Implicit Conversions)並不需要
特別語法,在運算式或指定敘述兩端,如果有不
同型態的變數,就會將儲存資料自動轉換成相同
的資料型態。
在指定敘述右邊運算式的結果會自動轉換成與左
邊變數相同的資料型態。一些運算式範例和說明,
如下表所示:
運算式
"250" + 125
"250" & 125
"250" + "125"
結果
說明
375
算術運算子加號的字串會轉換成數值
"250125"
字串連接運算子的數值會轉換成字串
"250125" 因為運算元都是字串,所以加號變成字串連接運
算子
6-5-1 隱含型態轉換-Visual Basic專
案
Visual Basic專案:Ch6-5-1\我的主控台程式
這個Windows應用程式是直接使用第5-4-1
節的【我的主控台程式】,可以建立運算
式來測試隱含型態轉換。其執行結果如下
圖所示:
6-5-2 明顯型態轉換-說明
隱含型態轉換對於程式設計者來說,並不
需要任何額外處理。不過,因為是自動轉
換,有時可能造成未知的型態轉換錯誤。
例如:上一節範例程式,如果準備將字串
轉換成整數後再相加,運算式
num=str1+str2結果的值應該是375,而不
是250125。
「明顯型態轉換」(Explicit Conversions)
是在進行運算前,自行使用資料型態轉換
函數來轉換成相同的資料型態。
6-5-2 明顯型態轉換-資料型態轉換
函數
函式名稱
CBool(Stmt)
CByte(Stmt)
CChar(Stmt)
ChrW(Exp)
CDate(Stmt)
傳回型態
Boolean
Byte
Char
Char
Date
CDbl(Stmt)
CDec(Stmt)
CInt(Stmt)
CLng(Stmt)
Double
Decimal
Integer
Long
CShort(Stmt)
CSng(Stmt)
Short
Single
CStr(Stmt)
String
範例
CBool(5 = 5)
CByte(125.89)
CChar("BCED")
ChrW(65)
CDate("2010/01/24")
CDate("4:35:47 PM")
CDbl( 234.56789D)
CDec(1234567.0587)
CInt(2345.678)
Clng(15427.45)
Clng(15427.55)
CShort(100)
CSng(85.3421105)
CSng(85.3421567)
CStr(537.324)
CStr(#2010/12/19#)
CStr(#2/12/2010 12:00:01
AM#)
結果
True
126
B
A
2010/1/24
下午 04:35:47
234.56789
1234567.0587
2346
15427
15428
100
85.34211
85.34216
537.324
2010/12/19
2010/2/12 上午
12:00:01
6-5-2 明顯型態轉換-明顯型態轉換
當運算式或指定敘述兩端的資料型態不相
同時,就可以使用上表函數自行轉換成相
同資料型態,如下所示:
intValue = CInt(longValue)
num = CInt(str1) + num1
str = CStr(CInt(str1) + num1)
6-5-2 明顯型態轉換-Visual Basic專
案
Visual Basic專案:Ch6-5-2\我的主控台程式
這個Windows應用程式是直接使用第6-5-1節的
【我的主控台程式】,可以建立運算式來測試明
顯型態轉換,對於不同型態的變數,需要自行使
用型態轉換函數來轉換型態。其執行結果如下圖
所示:
6-6 例外處理-說明
例外處理是指在程式執行時,如果發生不
正常執行狀態時,我們可以在程式碼處理
這些錯誤。例外處理的目的是為了讓程式
能夠更「強壯」(Robust)。當程式遇到
不尋常情況,也不會造成程式「崩潰」
(Crashing),進而導致整個系統當機的
情況。
6-6 例外處理-語法
Visual Basic語言提供結構化的例外處理程式敘述,
即Try/End Try,其語法如下所示:
Try
' 測試錯誤的程式碼
程式區塊
Catch ex As Exception
' 例外處理的程式碼
程式區塊
Finally
程式區塊
End Try
6-6 例外處理-語法說明
例外處理敘述可以分為三個部分,其說明
如下表所示:
程式區塊
Try
Catch
Finally
說明
在 Try 和 Catch 關鍵字間的程式區塊是 Visual Basic 需要執行
例外處理的程式碼,也就是預期可能產生錯誤的程式碼
如果 Try 程式區塊的程式碼發生錯誤,在 Catch 到 Finally 關
鍵字間的程式區塊會傳入參數 ex 的 Exception 例外物件,可
以在此區塊顯示錯誤資訊,或建立例外處理的補救程式碼
選擇性的程式區塊,不論錯誤是否產生,都會執行此區塊的
程式碼,通常是用來作為善後用途的程式碼
6-6 例外處理-Visual Basic專案
Visual Basic專案:Ch6-6\算術計算機
這個Windows應用程式是修改第6-3-1節的【算術
計算機】,在除法運算建立Try/End Try例外處理
敘述,可以處理除以0導致溢位的運算錯誤。其執
行結果如下圖所示: