VB.NET 運算子 (Operator) 筆記 (基礎篇)
運算子就像是程式設計中的主廚的料理工具如同主廚使用刀具、攪拌器等工具來處理食材,運算子也用來處理各種資料,進行計算、比較或組合。,它可以對一個或多個食材(運算元)運算元(Operand)是指運算子作用的對象,可以是變數、常數或運算式。進行處理,製作出美味的料理(結果)。透過理解各種運算子的功能與用法,就能夠精準地對資料進行各式各樣的處理,完成程式的核心運算邏輯。
認識運算子
運算子 (Operator): 運算子是用於執行數學計算、邏輯比較、字串串連等操作的特殊符號或關鍵字。它們作用於一個或多個運算元,並產生一個結果。
在 VB.NET 中,運算子主要可以分為以下幾種類型:
- 算術運算子用於執行基本的數學運算,如加減乘除,就像主廚的刀具與量杯,進行切割與份量計算。:用於執行基本的數學運算,如同主廚的刀具與量杯,進行切割與份量計算。
- 比較運算子用於比較兩個運算元,如同料理用的溫度計與磅秤,用來判斷食材的狀態。:用於比較兩個運算元,如同料理用的溫度計與磅秤,用來判斷食材的狀態。
- 邏輯運算子用於組合多個布林條件,如同食譜中的「與」、「或」指令,決定料理步驟的流程。:用於組合多個布林條件,如同食譜中的「與」、「或」指令,決定料理步驟的流程。
- 串連運算子用於連接多個字串,如同將不同的食材混合在一起,創造出新的風味。:用於連接多個字串,如同將不同的食材混合在一起,創造出新的風味。
- 賦值運算子用於將值指派給變數,如同將處理好的食材放入容器中保存。:用於將值指派給變數,如同將處理好的食材放入容器中保存。
選擇正確的運算子,就如同主廚為不同的食材挑選最合適的工具,是確保程式能正確處理資料並得出預期結果的關鍵。
算術運算子
算術運算子用於執行加、減、乘、除等數學運算。它們是進行數值計算的基礎工具。
| 運算子 | 說明 | 範例 | 結果 |
|---|---|---|---|
| + | 加法 | 5 + 3 | 8 |
| - | 減法 | 5 - 3 | 2 |
| * | 乘法 | 5 * 3 | 15 |
| / | 浮點數除法 | 5 / 3 | 1.6666... |
| \ | 整數除法 | 5 \ 3 | 1 |
| Mod | 模數(取餘數) | 5 Mod 3 | 2 |
| ^ | 乘冪 | 5 ^ 3 | 125 |
算術運算子詳細說明
浮點數除法 (/) 與整數除法 (\) 的差異
/ 運算子會回傳包含小數的結果,而 \ 運算子只回傳整數部分。
Dim result1 As Double = 10 / 3 ' 結果為 3.3333...
Dim result2 As Integer = 10 \ 3 ' 結果為 3(捨棄小數部分)
模數運算子 (Mod) 的應用
常用於判斷數字的奇偶性或循環計算。
Dim number As Integer = 7
If number Mod 2 = 0 Then
Console.WriteLine("偶數")
Else
Console.WriteLine("奇數")
End If
範例:進階計算機
使用的控制項:
- TextBox1:用於輸入第一個數字。
- TextBox2:用於輸入第二個數字。
- Button1-Button7:分別對應不同的算術運算。
- Label1:用於顯示運算結果。
Imports System
Public Class Form1
Private Sub PerformCalculation(operation As String)
Try
Dim num1 As Double = Double.Parse(TextBox1.Text)
Dim num2 As Double = Double.Parse(TextBox2.Text)
Dim result As Double = 0
Select Case operation
Case "+"
result = num1 + num2
Label1.Text = $"{num1} + {num2} = {result}"
Case "-"
result = num1 - num2
Label1.Text = $"{num1} - {num2} = {result}"
Case "*"
result = num1 * num2
Label1.Text = $"{num1} × {num2} = {result}"
Case "/"
If num2 <> 0 Then
result = num1 / num2
Label1.Text = $"{num1} ÷ {num2} = {result:F4}"
Else
Label1.Text = "錯誤:除數不能為零"
End If
Case "\"
If num2 <> 0 Then
result = num1 \ num2
Label1.Text = $"{num1} \ {num2} = {result}"
Else
Label1.Text = "錯誤:除數不能為零"
End If
Case "Mod"
If num2 <> 0 Then
result = num1 Mod num2
Label1.Text = $"{num1} Mod {num2} = {result}"
Else
Label1.Text = "錯誤:除數不能為零"
End If
Case "^"
result = num1 ^ num2
Label1.Text = $"{num1} ^ {num2} = {result:E4}"
End Select
Catch ex As Exception
Label1.Text = "輸入格式錯誤"
End Try
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
PerformCalculation("+")
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
PerformCalculation("-")
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
PerformCalculation("*")
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
PerformCalculation("/")
End Sub
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
PerformCalculation("\")
End Sub
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
PerformCalculation("Mod")
End Sub
Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
PerformCalculation("^")
End Sub
End Class
比較運算子
比較運算子用於比較兩個運算元的值,其結果為布林值(True 或 False)。這就像使用磅秤比較兩樣食材的重量,會得到「相等」或「不相等」的結論。
| 運算子 | 說明 | 範例 | 結果 |
|---|---|---|---|
| = | 等於 | 5 = 5 | True |
| <> | 不等於 | 5 <> 3 | True |
| < | 小於 | 3 < 5 | True |
| > | 大於 | 5 > 3 | True |
| <= | 小於或等於 | 3 <= 5 | True |
| >= | 大於或等於 | 5 >= 5 | True |
比較運算子的特殊應用
字串比較
比較運算子也可以用於字串比較,會按照字典順序進行比較。
Dim result1 As Boolean = "Apple" < "Banana" ' True
Dim result2 As Boolean = "apple" = "Apple" ' False(區分大小寫)
日期比較
日期型別也支援所有比較運算子。
Dim date1 As Date = #1/1/2024#
Dim date2 As Date = #12/31/2023#
Dim isLater As Boolean = date1 > date2 ' True
範例:成績等級判定系統
使用的控制項:
- TextBox1:用於輸入學生成績。
- Button1:用於觸發等級判定。
- Label1:用於顯示等級結果。
- Label2:用於顯示詳細評語。
Imports System
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Dim score As Integer = Integer.Parse(TextBox1.Text)
Dim grade As String = ""
Dim comment As String = ""
' 使用多個比較運算子進行等級判定
If score >= 90 Then
grade = "A"
comment = "優秀!恭喜你獲得優等成績!"
ElseIf score >= 80 Then
grade = "B"
comment = "良好!繼續保持這個水準!"
ElseIf score >= 70 Then
grade = "C"
comment = "及格!還有進步的空間!"
ElseIf score >= 60 Then
grade = "D"
comment = "勉強及格,需要加強學習!"
Else
grade = "F"
comment = "不及格,請重新努力!"
End If
' 額外的條件檢查
If score > 100 Then
Label1.Text = "錯誤:成績不能超過100分"
Label2.Text = ""
ElseIf score < 0 Then
Label1.Text = "錯誤:成績不能為負數"
Label2.Text = ""
Else
Label1.Text = $"成績:{score}分,等級:{grade}"
Label2.Text = comment
End If
Catch ex As Exception
Label1.Text = "請輸入有效的數字"
Label2.Text = ""
End Try
End Sub
End Class
邏輯運算子
邏輯運算子用於對布林運算式進行操作,常見於流程控制的判斷中。這就像食譜中的步驟指示,例如「當麵糰發酵完成且烤箱預熱完畢,才可開始烘烤」。
| 運算子 | 說明 | 範例 | 結果說明 |
|---|---|---|---|
| And / AndAlso | 邏輯 AND | True And False | 當所有條件都為 True 時,結果才為 True |
| Or / OrElse | 邏輯 OR | True Or False | 只要任一條件為 True,結果就為 True |
| Not | 邏輯 NOT | Not True | 反轉布林值 |
| Xor | 邏輯 XOR | True Xor False | 當條件剛好一個為 True 一個為 False 時,結果為 True |
AndAlso 與 And 的差異
建議優先使用 AndAlso 與 OrElse,它們具有「short-circuiting」(短路)特性,當第一個條件已能決定最終結果時,就不會再評估第二個條件,有助於提升效能。
AndAlso 短路評估
' 如果 x 為 0,則不會執行 100 / x,避免除零錯誤
If x <> 0 AndAlso 100 / x > 10 Then
Console.WriteLine("條件成立")
End If
OrElse 短路評估
' 如果第一個條件為 True,就不會檢查第二個條件
If user.IsAdmin OrElse user.HasPermission("READ") Then
' 允許存取
End If
真值表
| A | B | A And B | A Or B | A Xor B | Not A |
|---|---|---|---|---|---|
| True | True | True | True | False | False |
| True | False | False | True | True | False |
| False | True | False | True | True | True |
| False | False | False | False | False | True |
範例:智能登入驗證系統
使用的控制項:
- TextBox1:用於輸入使用者名稱。
- TextBox2:用於輸入密碼。
- TextBox3:用於輸入年齡。
- CheckBox1:管理員權限勾選框。
- CheckBox2:VIP會員勾選框。
- Button1:用於觸發登入驗證。
- Label1:用於顯示驗證結果。
Imports System
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Dim username As String = TextBox1.Text.Trim()
Dim password As String = TextBox2.Text
Dim age As Integer = Integer.Parse(TextBox3.Text)
Dim isAdmin As Boolean = CheckBox1.Checked
Dim isVIP As Boolean = CheckBox2.Checked
' 基本驗證條件
Dim hasValidUsername As Boolean = Not String.IsNullOrEmpty(username) AndAlso username.Length >= 3
Dim hasValidPassword As Boolean = Not String.IsNullOrEmpty(password) AndAlso password.Length >= 6
Dim isAdult As Boolean = age >= 18
' 使用複合邏輯運算子進行多重驗證
Dim basicValid As Boolean = hasValidUsername AndAlso hasValidPassword
Dim ageValid As Boolean = isAdult OrElse isAdmin ' 管理員不受年齡限制
Dim privilegeValid As Boolean = isAdmin OrElse isVIP ' 至少要有一種特殊權限
' 最終驗證結果
Dim loginSuccess As Boolean = basicValid AndAlso ageValid AndAlso privilegeValid
' 顯示詳細的驗證結果
Dim result As String = "=== 登入驗證結果 ===" & vbNewLine
result &= $"使用者名稱驗證:{If(hasValidUsername, "通過", "失敗")}" & vbNewLine
result &= $"密碼驗證:{If(hasValidPassword, "通過", "失敗")}" & vbNewLine
result &= $"年齡驗證:{If(ageValid, "通過", "失敗")}" & vbNewLine
result &= $"權限驗證:{If(privilegeValid, "通過", "失敗")}" & vbNewLine
result &= "==================" & vbNewLine
If loginSuccess Then
result &= "✓ 登入成功!歡迎使用系統"
If isAdmin Then
result &= "(管理員模式)"
ElseIf isVIP Then
result &= "(VIP會員模式)"
End If
Else
result &= "✗ 登入失敗!請檢查以下條件:" & vbNewLine
If Not hasValidUsername Then
result &= "• 使用者名稱至少需要3個字元" & vbNewLine
End If
If Not hasValidPassword Then
result &= "• 密碼至少需要6個字元" & vbNewLine
End If
If Not ageValid Then
result &= "• 需年滿18歲或具有管理員權限" & vbNewLine
End If
If Not privilegeValid Then
result &= "• 需要管理員權限或VIP會員資格" & vbNewLine
End If
End If
Label1.Text = result
Catch ex As Exception
Label1.Text = "年齡請輸入有效數字"
End Try
End Sub
End Class
串連運算子
串連運算子用於將多個字串組合成一個單一的字串。這就像將不同的食材組合起來,形成一道完整的料理。
| 運算子 | 說明 | 範例 | 結果 |
|---|---|---|---|
| & | 字串串連(推薦) | "Hello" & " World" | "Hello World" |
| + | 加法或字串串連 | "Hello" + " World" | "Hello World" |
為了避免程式碼的歧義並確保可讀性,進行字串串連時應始終使用「&」運算子。
字串串連的進階技巧
字串內插 (String Interpolation)
VB.NET 支援使用 $ 符號進行字串內插,讓程式碼更簡潔易讀。
Dim name As String = "張三"
Dim age As Integer = 25
Dim message As String = $"姓名:{name},年齡:{age}歲"
StringBuilder 的使用
當需要進行大量字串串連時,使用 StringBuilder 可以提升效能。
Imports System.Text
Dim sb As New StringBuilder()
sb.Append("第一段文字")
sb.Append("第二段文字")
sb.AppendLine("第三段文字(換行)")
Dim result As String = sb.ToString()
範例:個人資料格式化工具
使用的控制項:
- TextBox1-TextBox6:分別輸入姓氏、名字、年齡、電話、Email、地址。
- ComboBox1:選擇格式化樣式。
- Button1:用於觸發格式化。
- TextBox7 (Multiline):顯示格式化結果。
Imports System
Imports System.Text
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
' 獲取使用者輸入的資料
Dim lastName As String = TextBox1.Text.Trim()
Dim firstName As String = TextBox2.Text.Trim()
Dim age As String = TextBox3.Text.Trim()
Dim phone As String = TextBox4.Text.Trim()
Dim email As String = TextBox5.Text.Trim()
Dim address As String = TextBox6.Text.Trim()
' 組合全名
Dim fullName As String = lastName & firstName
' 根據選擇的格式進行字串串連
Dim formatStyle As String = ComboBox1.Text
Dim result As String = ""
Select Case formatStyle
Case "基本格式"
' 使用 & 運算子進行基本串連
result = "姓名:" & fullName & vbNewLine &
"年齡:" & age & "歲" & vbNewLine &
"電話:" & phone & vbNewLine &
"Email:" & email & vbNewLine &
"地址:" & address
Case "正式格式"
' 使用字串內插進行格式化
result = $"【個人資料】{vbNewLine}" &
$"───────────────{vbNewLine}" &
$"姓 名:{fullName}{vbNewLine}" &
$"年 齡:{age} 歲{vbNewLine}" &
$"聯絡電話:{phone}{vbNewLine}" &
$"電子郵件:{email}{vbNewLine}" &
$"居住地址:{address}{vbNewLine}" &
$"───────────────"
Case "卡片格式"
' 使用 StringBuilder 建構複雜格式
Dim sb As New StringBuilder()
sb.AppendLine("╭─────────────────────╮")
sb.AppendLine("│ 個人名片 │")
sb.AppendLine("├─────────────────────┤")
sb.AppendLine($"│ 姓名:{fullName.PadRight(12)}│")
sb.AppendLine($"│ 年齡:{age}歲{Space(12 - age.Length - 1)}│")
sb.AppendLine($"│ 電話:{phone.PadRight(12)}│")
sb.AppendLine($"│ 信箱:{email.PadRight(12)}│")
sb.AppendLine("├─────────────────────┤")
sb.AppendLine($"│ 地址:{address.PadRight(12)}│")
sb.AppendLine("╰─────────────────────╯")
result = sb.ToString()
Case "JSON格式"
' 模擬 JSON 格式輸出
result = "{" & vbNewLine &
" ""personalInfo"": {" & vbNewLine &
" ""lastName"": """ & lastName & """," & vbNewLine &
" ""firstName"": """ & firstName & """," & vbNewLine &
" ""fullName"": """ & fullName & """," & vbNewLine &
" ""age"": " & age & "," & vbNewLine &
" ""phone"": """ & phone & """," & vbNewLine &
" ""email"": """ & email & """," & vbNewLine &
" ""address"": """ & address & """" & vbNewLine &
" }" & vbNewLine &
"}"
Case Else
result = "請選擇格式化樣式"
End Select
' 顯示結果
TextBox7.Text = result
Catch ex As Exception
TextBox7.Text = "格式化過程發生錯誤:" & ex.Message
End Try
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 初始化 ComboBox 選項
ComboBox1.Items.AddRange({"基本格式", "正式格式", "卡片格式", "JSON格式"})
ComboBox1.SelectedIndex = 0
End Sub
End Class
賦值運算子
賦值運算子用於將值指派給變數。除了基本的賦值運算子外,還有複合賦值運算子,可以同時進行運算和賦值操作。
| 運算子 | 說明 | 範例 | 等同於 |
|---|---|---|---|
| = | 基本賦值 | x = 5 | 將 5 指派給 x |
| += | 加法賦值 | x += 3 | x = x + 3 |
| -= | 減法賦值 | x -= 3 | x = x - 3 |
| *= | 乘法賦值 | x *= 3 | x = x * 3 |
| /= | 除法賦值 | x /= 3 | x = x / 3 |
| \= | 整除賦值 | x \= 3 | x = x \ 3 |
| ^= | 乘冪賦值 | x ^= 3 | x = x ^ 3 |
| &= | 串連賦值 | s &= "text" | s = s & "text" |
範例:銀行帳戶管理系統
使用的控制項:
- TextBox1:顯示帳戶餘額。
- TextBox2:輸入交易金額。
- Button1-Button6:不同的帳戶操作。
- ListBox1:顯示交易記錄。
- Label1:顯示帳戶狀態。
Imports System
Public Class Form1
Private balance As Decimal = 10000D ' 初始餘額
Private transactionCount As Integer = 0
Private Sub UpdateDisplay()
TextBox1.Text = balance.ToString("C") ' 顯示為貨幣格式
Label1.Text = If(balance >= 0, "帳戶正常", "帳戶透支")
End Sub
Private Sub AddTransaction(description As String, amount As Decimal)
transactionCount += 1 ' 使用 += 增加交易計數
Dim timestamp As String = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")
Dim record As String = $"[{transactionCount:D3}] {timestamp} - {description}: {amount:C}"
ListBox1.Items.Add(record)
ListBox1.SelectedIndex = ListBox1.Items.Count - 1 ' 自動選中最新記錄
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' 存款操作
Try
Dim amount As Decimal = Decimal.Parse(TextBox2.Text)
If amount > 0 Then
balance += amount ' 使用 += 複合賦值
AddTransaction("存款", amount)
UpdateDisplay()
TextBox2.Clear()
Else
MessageBox.Show("存款金額必須大於零")
End If
Catch ex As Exception
MessageBox.Show("請輸入有效的金額")
End Try
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
' 提款操作
Try
Dim amount As Decimal = Decimal.Parse(TextBox2.Text)
If amount > 0 Then
balance -= amount ' 使用 -= 複合賦值
AddTransaction("提款", -amount)
UpdateDisplay()
TextBox2.Clear()
Else
MessageBox.Show("提款金額必須大於零")
End If
Catch ex As Exception
MessageBox.Show("請輸入有效的金額")
End Try
End Sub
Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
' 投資獲利(餘額增加指定百分比)
Try
Dim percentage As Decimal = Decimal.Parse(TextBox2.Text)
If percentage > 0 AndAlso percentage <= 100 Then
Dim profit As Decimal = balance * (percentage / 100)
balance += profit ' 使用 += 複合賦值
AddTransaction($"投資獲利({percentage}%)", profit)
UpdateDisplay()
TextBox2.Clear()
Else
MessageBox.Show("獲利百分比必須在0-100之間")
End If
Catch ex As Exception
MessageBox.Show("請輸入有效的百分比")
End Try
End Sub
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
' 投資損失(餘額減少指定百分比)
Try
Dim percentage As Decimal = Decimal.Parse(TextBox2.Text)
If percentage > 0 AndAlso percentage <= 100 Then
Dim loss As Decimal = balance * (percentage / 100)
balance -= loss ' 使用 -= 複合賦值
AddTransaction($"投資損失({percentage}%)", -loss)
UpdateDisplay()
TextBox2.Clear()
Else
MessageBox.Show("損失百分比必須在0-100之間")
End If
Catch ex As Exception
MessageBox.Show("請輸入有效的百分比")
End Try
End Sub
Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
' 複利計算(餘額乘以指定倍數)
Try
Dim multiplier As Decimal = Decimal.Parse(TextBox2.Text)
If multiplier > 0 Then
Dim originalBalance As Decimal = balance
balance *= multiplier ' 使用 *= 複合賦值
Dim difference As Decimal = balance - originalBalance
AddTransaction($"複利計算(×{multiplier})", difference)
UpdateDisplay()
TextBox2.Clear()
Else
MessageBox.Show("倍數必須大於零")
End If
Catch ex As Exception
MessageBox.Show("請輸入有效的倍數")
End Try
End Sub
Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
' 清除記錄
ListBox1.Items.Clear()
transactionCount = 0 ' 重置計數器
MessageBox.Show("交易記錄已清除")
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
UpdateDisplay()
AddTransaction("帳戶開立", balance)
End Sub
End Class
運算子優先順序
當一個運算式中包含多個不同的運算子時,程式會根據「優先順序」來決定計算的先後順序。這就像一份複雜的食譜,必須先做某些準備工作(例如:先切菜),才能進行下一步的烹煮。優先順序較高的運算子會先被執行。
理解運算子的優先順序對於撰寫正確無誤的程式碼至關重要。
| 優先順序 | 類型 | 運算子 | 結合性 |
|---|---|---|---|
| 1 (最高) | 乘冪 | ^ |
右到左 |
| 2 | 一元運算子 | +, - (正負號) |
右到左 |
| 3 | 乘法與浮點數除法 | *, / |
左到右 |
| 4 | 整數除法 | \ |
左到右 |
| 5 | 模數 | Mod |
左到右 |
| 6 | 加法與減法 | +, - |
左到右 |
| 7 | 串連 | & |
左到右 |
| 8 | 比較 | =, <>, <, >, <=, >= |
左到右 |
| 9 | 邏輯 | Not |
右到左 |
| 10 | 邏輯 | And, AndAlso |
左到右 |
| 11 | 邏輯 | Or, OrElse |
左到右 |
| 12 (最低) | 邏輯 | Xor |
左到右 |
如果想改變預設的運算順序,可以使用括號 ()括號內的運算式會被優先執行,就像在食譜上特別標註「此步驟最先處理」。。括號內的運算式會被最優先執行。
範例:數學運算式計算器
使用的控制項:
- TextBox1:用於輸入數學運算式。
- Button1:用於計算運算式。
- Label1-Label4:顯示不同優先順序的計算結果。
- TextBox2 (Multiline):顯示詳細的計算過程。
Imports System
Imports System.Text
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
' 演示不同優先順序的計算
Dim a As Double = 2
Dim b As Double = 3
Dim c As Double = 4
Dim d As Double = 5
' 範例 1: 基本優先順序
Dim result1 As Double = a + b * c ' 2 + 3 * 4 = 2 + 12 = 14
Dim result1_brackets As Double = (a + b) * c ' (2 + 3) * 4 = 5 * 4 = 20
' 範例 2: 複雜運算優先順序
Dim result2 As Double = a + b * c ^ d ' 2 + 3 * 4^5 = 2 + 3 * 1024 = 3074
Dim result2_brackets As Double = (a + b) * c ^ d ' (2 + 3) * 4^5 = 5 * 1024 = 5120
' 範例 3: 混合運算優先順序
Dim result3 As Double = a * b + c / d ' 2 * 3 + 4 / 5 = 6 + 0.8 = 6.8
Dim result3_brackets As Double = a * (b + c) / d ' 2 * (3 + 4) / 5 = 2 * 7 / 5 = 2.8
' 範例 4: 邏輯與比較運算優先順序
Dim result4 As Boolean = a < b AndAlso c > d OrElse a = b
' 拆解:(2 < 3) AndAlso (4 > 5) OrElse (2 = 3)
' 結果:True AndAlso False OrElse False = False OrElse False = False
' 顯示結果
Label1.Text = $"範例 1 - 無括號: {result1}, 有括號: {result1_brackets}"
Label2.Text = $"範例 2 - 無括號: {result2}, 有括號: {result2_brackets}"
Label3.Text = $"範例 3 - 無括號: {result3}, 有括號: {result3_brackets}"
Label4.Text = $"範例 4 - 邏輯運算: {result4}"
' 詳細計算過程說明
Dim sb As New StringBuilder()
sb.AppendLine("=== 運算子優先順序演示 ===")
sb.AppendLine($"給定:a={a}, b={b}, c={c}, d={d}")
sb.AppendLine()
sb.AppendLine("【範例 1】基本優先順序")
sb.AppendLine("運算式: a + b * c")
sb.AppendLine("無括號: 2 + 3 * 4")
sb.AppendLine("步驟 1: 先算乘法 3 * 4 = 12")
sb.AppendLine("步驟 2: 再算加法 2 + 12 = 14")
sb.AppendLine($"結果: {result1}")
sb.AppendLine()
sb.AppendLine("有括號: (a + b) * c = (2 + 3) * 4")
sb.AppendLine("步驟 1: 先算括號內 2 + 3 = 5")
sb.AppendLine("步驟 2: 再算乘法 5 * 4 = 20")
sb.AppendLine($"結果: {result1_brackets}")
sb.AppendLine()
sb.AppendLine("【範例 2】乘冪優先順序")
sb.AppendLine("運算式: a + b * c ^ d")
sb.AppendLine("無括號: 2 + 3 * 4 ^ 5")
sb.AppendLine("步驟 1: 先算乘冪 4 ^ 5 = 1024")
sb.AppendLine("步驟 2: 再算乘法 3 * 1024 = 3072")
sb.AppendLine("步驟 3: 最後加法 2 + 3072 = 3074")
sb.AppendLine($"結果: {result2}")
sb.AppendLine()
sb.AppendLine("【範例 3】混合運算")
sb.AppendLine("運算式: a * b + c / d")
sb.AppendLine("無括號: 2 * 3 + 4 / 5")
sb.AppendLine("步驟 1: 先算乘除法 2 * 3 = 6, 4 / 5 = 0.8")
sb.AppendLine("步驟 2: 再算加法 6 + 0.8 = 6.8")
sb.AppendLine($"結果: {result3}")
sb.AppendLine()
sb.AppendLine("【範例 4】邏輯運算優先順序")
sb.AppendLine("運算式: a < b AndAlso c > d OrElse a = b")
sb.AppendLine("拆解: (2 < 3) AndAlso (4 > 5) OrElse (2 = 3)")
sb.AppendLine("步驟 1: 先算比較運算 True AndAlso False OrElse False")
sb.AppendLine("步驟 2: AndAlso 優先於 OrElse: (True AndAlso False) OrElse False")
sb.AppendLine("步驟 3: 計算結果 False OrElse False = False")
sb.AppendLine($"結果: {result4}")
TextBox2.Text = sb.ToString()
Catch ex As Exception
TextBox2.Text = "計算過程發生錯誤:" & ex.Message
End Try
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
TextBox1.Text = "點擊按鈕查看運算子優先順序演示"
TextBox2.Text = "請點擊「計算運算式」按鈕開始演示"
End Sub
End Class
運算子綜合應用範例
以下是一個完整的 VB.NET 範例,展示了如何綜合運用各種運算子來建構一個功能豐富的程式。這個範例將建立一個多功能的數據分析工具,讓使用者可以輸入一組數據並進行各種統計計算。
範例:智能數據分析器
這個範例允許使用者輸入一串數字,程式會自動計算各種統計值,並根據數據特徵給出分析報告。程式將綜合使用算術運算子、比較運算子、邏輯運算子等來完成複雜的數據處理。
使用的控制項:
- TextBox1:用於輸入數據(以逗號分隔)。
- Button1:用於開始分析數據。
- Button2:用於清除所有數據和結果。
- Label1-Label8:顯示各種統計結果。
- TextBox2 (Multiline):顯示詳細的分析報告。
- ProgressBar1:顯示分析進度。
- CheckBox1-CheckBox3:選擇不同的分析選項。
Imports System
Imports System.Linq
Imports System.Text
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
' 初始化進度條
ProgressBar1.Value = 0
' 解析輸入的數據
Dim inputText As String = TextBox1.Text.Trim()
If String.IsNullOrEmpty(inputText) Then
MessageBox.Show("請輸入數據")
Return
End If
' 將字串分割並轉換為數字陣列
Dim numberStrings() As String = inputText.Split(","c)
Dim numbers() As Double = numberStrings.Select(Function(s) Double.Parse(s.Trim())).ToArray()
ProgressBar1.Value = 10
' 基本統計計算(使用算術運算子)
Dim count As Integer = numbers.Length
Dim sum As Double = numbers.Sum()
Dim average As Double = sum / count ' 使用 / 運算子
Dim minimum As Double = numbers.Min()
Dim maximum As Double = numbers.Max()
Dim range As Double = maximum - minimum ' 使用 - 運算子
ProgressBar1.Value = 30
' 計算變異數和標準差(使用複合算術運算子)
Dim variance As Double = 0
For Each num As Double In numbers
Dim difference As Double = num - average
variance += difference ^ 2 ' 使用 += 和 ^ 運算子
Next
variance /= count ' 使用 /= 運算子
Dim standardDeviation As Double = Math.Sqrt(variance)
ProgressBar1.Value = 50
' 計算中位數
Dim sortedNumbers() As Double = numbers.OrderBy(Function(x) x).ToArray()
Dim median As Double
If count Mod 2 = 0 Then ' 使用 Mod 運算子檢查偶數
' 偶數個數據,取中間兩數的平均
Dim mid1 As Integer = count \ 2 - 1 ' 使用 \ 運算子
Dim mid2 As Integer = count \ 2
median = (sortedNumbers(mid1) + sortedNumbers(mid2)) / 2
Else
' 奇數個數據,取中間數
median = sortedNumbers(count \ 2)
End If
ProgressBar1.Value = 70
' 數據分析(使用比較和邏輯運算子)
Dim positiveCount As Integer = 0
Dim negativeCount As Integer = 0
Dim zeroCount As Integer = 0
Dim evenCount As Integer = 0
Dim oddCount As Integer = 0
For Each num As Double In numbers
' 使用比較運算子分類數據
If num > 0 Then
positiveCount += 1
ElseIf num < 0 Then
negativeCount += 1
Else ' num = 0
zeroCount += 1
End If
' 檢查整數的奇偶性
If num = Math.Floor(num) Then ' 檢查是否為整數
If CInt(num) Mod 2 = 0 Then
evenCount += 1
Else
oddCount += 1
End If
End If
Next
ProgressBar1.Value = 90
' 顯示基本統計結果
Label1.Text = $"數據總數:{count}"
Label2.Text = $"總和:{sum:F2}"
Label3.Text = $"平均值:{average:F2}"
Label4.Text = $"中位數:{median:F2}"
Label5.Text = $"最小值:{minimum:F2}"
Label6.Text = $"最大值:{maximum:F2}"
Label7.Text = $"全距:{range:F2}"
Label8.Text = $"標準差:{standardDeviation:F4}"
' 生成詳細分析報告(使用字串串連運算子)
Dim report As New StringBuilder()
report.AppendLine("=== 數據分析報告 ===")
report.AppendLine($"分析時間:{DateTime.Now:yyyy/MM/dd HH:mm:ss}")
report.AppendLine()
' 基本統計摘要
report.AppendLine("【基本統計】")
report.AppendLine($"• 數據筆數:{count}")
report.AppendLine($"• 數據總和:{sum:F2}")
report.AppendLine($"• 算術平均:{average:F2}")
report.AppendLine($"• 中位數值:{median:F2}")
report.AppendLine($"• 最小值:{minimum:F2}")
report.AppendLine($"• 最大值:{maximum:F2}")
report.AppendLine($"• 全距:{range:F2}")
report.AppendLine($"• 變異數:{variance:F4}")
report.AppendLine($"• 標準差:{standardDeviation:F4}")
report.AppendLine()
' 數據分佈分析
report.AppendLine("【數據分佈】")
report.AppendLine($"• 正數:{positiveCount} 個 ({positiveCount * 100.0 / count:F1}%)")
report.AppendLine($"• 負數:{negativeCount} 個 ({negativeCount * 100.0 / count:F1}%)")
report.AppendLine($"• 零:{zeroCount} 個 ({zeroCount * 100.0 / count:F1}%)")
report.AppendLine($"• 整數中的偶數:{evenCount} 個")
report.AppendLine($"• 整數中的奇數:{oddCount} 個")
report.AppendLine()
' 條件分析(使用邏輯運算子)
report.AppendLine("【條件分析】")
' 數據品質評估
Dim hasOutliers As Boolean = False
Dim outlierCount As Integer = 0
Dim lowerBound As Double = average - 2 * standardDeviation
Dim upperBound As Double = average + 2 * standardDeviation
For Each num As Double In numbers
If num < lowerBound OrElse num > upperBound Then
hasOutliers = True
outlierCount += 1
End If
Next
report.AppendLine($"• 是否有異常值:{If(hasOutliers, "是", "否")}")
If hasOutliers Then
report.AppendLine($"• 異常值數量:{outlierCount} 個")
report.AppendLine($"• 正常範圍:{lowerBound:F2} ~ {upperBound:F2}")
End If
' 數據特徵判斷
Dim isSymmetric As Boolean = Math.Abs(average - median) < standardDeviation * 0.1
Dim isUniform As Boolean = standardDeviation < (range * 0.3)
Dim isNormalDistributed As Boolean = isSymmetric AndAlso Not isUniform
report.AppendLine($"• 數據對稱性:{If(isSymmetric, "對稱", "偏態")}")
report.AppendLine($"• 數據分散性:{If(isUniform, "均勻分佈", "集中分佈")}")
report.AppendLine($"• 近似常態分佈:{If(isNormalDistributed, "是", "否")}")
report.AppendLine()
' 選擇性分析
If CheckBox1.Checked Then
report.AppendLine("【進階分析 - 四分位數】")
Dim q1Index As Integer = count \ 4
Dim q3Index As Integer = (count * 3) \ 4
Dim q1 As Double = sortedNumbers(q1Index)
Dim q3 As Double = sortedNumbers(q3Index)
Dim iqr As Double = q3 - q1
report.AppendLine($"• 第一四分位數 (Q1):{q1:F2}")
report.AppendLine($"• 第三四分位數 (Q3):{q3:F2}")
report.AppendLine($"• 四分位距 (IQR):{iqr:F2}")
report.AppendLine()
End If
If CheckBox2.Checked Then
report.AppendLine("【進階分析 - 峰度與偏度】")
' 簡化的偏度計算
Dim skewness As Double = 0
For Each num As Double In numbers
skewness += Math.Pow((num - average) / standardDeviation, 3)
Next
skewness /= count
report.AppendLine($"• 偏度係數:{skewness:F4}")
report.AppendLine($"• 偏度解釋:{If(Math.Abs(skewness) < 0.5, "接近對稱", If(skewness > 0, "右偏", "左偏"))}")
report.AppendLine()
End If
If CheckBox3.Checked Then
report.AppendLine("【數據建議】")
If hasOutliers Then
report.AppendLine("• 建議檢查異常值的合理性")
End If
If standardDeviation > range * 0.5 Then
report.AppendLine("• 數據變異較大,建議增加樣本數")
End If
If count < 30 Then
report.AppendLine("• 樣本數較少,統計結果可能不夠穩定")
End If
report.AppendLine()
End If
TextBox2.Text = report.ToString()
ProgressBar1.Value = 100
Catch ex As Exception
MessageBox.Show($"分析過程發生錯誤:{ex.Message}")
ProgressBar1.Value = 0
End Try
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
' 清除所有輸入和結果
TextBox1.Clear()
TextBox2.Clear()
Label1.Text = "數據總數:"
Label2.Text = "總和:"
Label3.Text = "平均值:"
Label4.Text = "中位數:"
Label5.Text = "最小值:"
Label6.Text = "最大值:"
Label7.Text = "全距:"
Label8.Text = "標準差:"
ProgressBar1.Value = 0
CheckBox1.Checked = False
CheckBox2.Checked = False
CheckBox3.Checked = False
MessageBox.Show("所有數據已清除")
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' 初始化介面
TextBox1.Text = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10"
TextBox2.Text = "請輸入數據後點擊「開始分析」按鈕"
CheckBox1.Text = "計算四分位數"
CheckBox2.Text = "計算偏度係數"
CheckBox3.Text = "顯示數據建議"
ProgressBar1.Minimum = 0
ProgressBar1.Maximum = 100
ProgressBar1.Value = 0
End Sub
End Class
這個綜合範例展示了如何在實際應用中靈活運用各種運算子:
- 算術運算子:用於基本的統計計算,如平均值、變異數等。
- 比較運算子:用於數據分類和條件判斷。
- 邏輯運算子:用於複合條件判斷和特徵分析。
- 賦值運算子:用於累積計算和數據更新。
- 串連運算子:用於生成詳細的分析報告。
透過合理地組合使用不同類型的運算子,可以建構出功能強大且邏輯清晰的程式,有效處理複雜的數據分析任務。