程式控制與除錯
程式控制與除錯
程式控制與除錯
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
CH7 程 式 控 制 與 除 錯<br />
進 一 步 的 程 式 流 程 控 制<br />
1
程 式 流 程 控 制<br />
• 程 式 是 一 行 一 行 執 行 的 , 因 此 若 能 適 當 依 據 參 數 變 化<br />
其 執 行 方 向 , 便 可 有 更 多 變 化 。<br />
• 主 要 控 制 流 程<br />
1. 分 支 GoTo, On Error, On...GoSub, On...GoTo, GoSub...Return<br />
2. 結 束 或 暫 停 DoEvents, End, Exit, Stop<br />
3. 迴 圈 Do...Loop, For...Next, For Each...Next, While...Wend, With<br />
4. 判 斷 If...Then...Else, Select Case<br />
2
END、 STOP 指 令<br />
— 讓 程 式 立 刻 停 止<br />
• 不 論 在 任 何 地 方 ,, 單 獨 的 END 或 STOP<br />
指 令 會 讓 程 式 立 刻 停 止 , 且 不 會 再 執 行<br />
其 他 指 令<br />
• END: 停 止 程 式 、 釋 放 記 憶 體 及 已 開 啟<br />
的 檔 案 , 程 式 需 重 新 執 行 。<br />
• STOP: 暫 停 程 式 , 記 憶 體 未 釋 放 , 通<br />
常 是 除 錯 時 用 , 其 實 甚 少 用 到 ( 效 果 等 同<br />
按 暫 停 鍵 )<br />
3
END 保 留 字 其 他 用 法<br />
不 要 混 肴<br />
End<br />
End Function<br />
End If<br />
End Property<br />
End Select<br />
End Sub<br />
End Type<br />
End With<br />
4
EXIT— 跳 出 指 令<br />
• Exit 有 幾 個 用 法 , 但 無 法 單 獨 使 用 , 是<br />
跳 出 的 意 思 , 不 可 與 C 語 言 中 的 Exit 混 肴<br />
了 。<br />
Exit Do do .. loop<br />
Exit For For … Next<br />
Exit Function function… end function<br />
Exit Property Property … end property<br />
Exit Sub sub… end sub<br />
5
FOR…NEXT<br />
Dim i ,sum<br />
For i=10 to 1 step -1<br />
sum=Sum +1<br />
Next I<br />
Msgbox sum<br />
計 算 1+ 到 100 等 於 多 少 ?<br />
在 迴 圈 中 改 變 計 數 器 的 值 , 將 會 使 您 的 程 式 碼 不 容 易 閱 讀 和 除 錯<br />
6
EXAMPLE<br />
• Print 是 表 單 的 Method, 可 以 將 文 字 直 接 輸 出<br />
到 表 單 上 , 在 表 單 的 事 件 , 物 件 的 方 法 引 用 是<br />
以 點 . 來 表 示 如 form1.print “hello” ( 在 表<br />
單 的 副 程 式 則 form1 可 略 )<br />
• 在 form_load 事 件 中 輸 入<br />
Dim I<br />
For i = 1 To 10 Step 2<br />
Print I<br />
Next I<br />
• 執 行 後 會 出 現 哪 些 數 字 ?<br />
7
AutoRedraw 自 動 重 畫<br />
• 表 單 的 屬 性 ,boolean 型 態 , 用 以 控 制 輸 出 文<br />
字 或 繪 圖 的 資 料 , 是 否 需 要 配 置 一 塊 記 憶 體 ,<br />
以 便 程 式 隨 時 依 據 記 憶 體 內 容 將 已 輸 出 的 圖 案<br />
更 新 。 預 設 值 是 false<br />
• 當 預 設 為 false 時 , 由 於 form_load 是 一 個 表 單<br />
執 行 的 第 一 個 程 式 , 執 行 該 事 件 時 , 程 式 其 實<br />
還 沒 有 顯 示 表 單 的 圖 形 , 因 此 雖 然 用 print 輸<br />
出 資 料 , 也 沒 有 記 憶 住 之 前 的 圖 案 。 等 事 件 完<br />
後 圖 形 顯 示 時 , 便 沒 有 任 何 資 料 。<br />
• 若 先 執 行 form1.SHOW 則 可 以 顯 示 1 3 5 7 9<br />
數 字 , 但 若 最 小 化 後 再 還 原 , 則 該 資 料 不 見<br />
8
Example(form_load)<br />
• Show<br />
Dim I<br />
For i = 1 To 10 Step 2<br />
Print I<br />
Next I<br />
• 將 form1 的 AutoRedraw 改 成 true, 再 最<br />
小 化 後 還 原 , 則 會 如 何<br />
9
多 重 巢 狀 (nested) 迴 圈<br />
for next<br />
• Dim I, J<br />
For i=1 to 10<br />
for j=1 to 10<br />
print I, J<br />
next j<br />
next i<br />
計 數 用 的 變 數 不 可 以 重 複<br />
10
九 九 乘 法 表<br />
• 在 表 單 上 輸 出 九 九 乘 法 表<br />
• Autoredraw=true<br />
Dim I,J<br />
for I=1 to 9<br />
for J=1 to 9<br />
print cstr(I)+”x”+cstr(j)+”=“+cstr(i*j)<br />
next j<br />
next i<br />
•<br />
11
排 版 九 九 乘 法 表<br />
AutoRedraw = True<br />
Dim I, J<br />
For I = 1 To 9<br />
For J = 1 To 9<br />
Print CStr(J) + "x" + CStr(I) + "=" + CStr(I * J) + vbTab;<br />
Next J<br />
Print<br />
Next I<br />
12
倒 數 時 STEP 用 負 數<br />
• DIM I<br />
for I =100 to 1 step -2<br />
print I<br />
next I<br />
13
DO… LOOP 迴 圈<br />
計 算 結 果 為 Boolean 型 態<br />
TRUE or FALSE<br />
•<br />
While 只 要 … 就 進 入 迴 圈<br />
Until 執 行 迴 圈 … 直 到<br />
不 可 前 後 都 放 while|until<br />
常 用<br />
Do<br />
Loop until<br />
Do while<br />
Loop<br />
14
While|Until 前 後 的 差 別<br />
• Do …loop 語 法 ,while|until 放 前 面 與 後 面 ,<br />
主 要 差 別 是 執 行 前 先 檢 驗 還 是 執 行 後 檢 驗<br />
• 對 一 般 數 學 運 算 用 法 是 沒 差 , 但 對 於 一 些 需 要<br />
先 檢 驗 可 行 性 再 運 算 的 , 則 while|until 放 在 前<br />
面 會 比 較 方 便<br />
• 例 如 檔 案 存 取 ( 要 先 確 認 檔 案 尚 有 資 料 可 讀 )<br />
Do while not EOF(file)<br />
Line input#file, s<br />
print s<br />
Loop<br />
EOF=End of file<br />
偵 測 一 個 檔 案 被 讀 到 的 位 置<br />
是 否 還 有 資 料 可 讀<br />
Line input# 是 讀 入 一 筆 檔 案<br />
15<br />
的 指 令 , 細 節 以 後 再 談
Until == while not<br />
until not == while<br />
• Dim i<br />
Do while i
簡 化 一 點 的 do loop<br />
• 利 用 exit do 配 合 IF 判 斷 可 以 模 擬 各 種 特 殊 的<br />
情 況<br />
Do while i10 Loop<br />
• Do<br />
….<br />
if i>10 then exit do<br />
loop<br />
Do<br />
If i
Example (form_load)<br />
• Dim I, sum<br />
I=0: sum=0<br />
do<br />
sum= sum + I<br />
loop until I>=100<br />
msgbox sum<br />
• 將 until 改 成 IF 語 法<br />
If I>=100 then exit do<br />
18
WHILE … WEND<br />
• 另 一 種 迴 圈 型 態 , 其 實 與 Do loop 差 不 多<br />
可 以 完 全 用 Do loop 取 代 即 可<br />
• While i
FOR EACH … NEXT<br />
• 對 某 一 陣 列 或 集 合 物 件 中 的 所 有 元 素 ,<br />
重 複 執 行 一 段 敘 述 。<br />
配 合 IF 敘 述<br />
20
EXAMPLE(FORM_LOAD)<br />
FORM_LOAD 事 件 中 加 入<br />
以 下 程 式 碼 :<br />
Show<br />
Dim a(1 To 10)<br />
Dim i<br />
For i = 1 To 10<br />
a(i) = i<br />
Next i<br />
For Each i In a<br />
Print i<br />
Next i<br />
陣 列 宣 告 (ARRAY)<br />
下 次 會 介 紹<br />
陣 列 引 用<br />
和 函 數 用 法 相 近<br />
要 分 清 楚 是 函 數<br />
還 是 陣 列<br />
21
集 合 物 件<br />
(Collection Object)<br />
• 如 果 一 個 表 單 上 , 有 一 百 個 元 件 , 我 們<br />
想 找 出 其 中 元 件 上 , 所 有 的 textbox,<br />
此 時 便 需 要 用 到 一 個 集 合 物 件 的 概 念<br />
在 form 上 放 一 些 控 制 元 件 , 在<br />
form_LOAD 測 試 以 下 範 例<br />
Show<br />
Dim i<br />
For Each i In Controls<br />
If TypeName(i) = "TextBox" Then<br />
Print i.Name + " is a textbox"<br />
End If<br />
Next i<br />
其 他 常 用 的 的 集 合 物 件<br />
還 有<br />
FORMS<br />
PRINTERS<br />
22
常 用 的 集 合 物 件<br />
• CONTROLS: 傳 回 表 單 上 每 一 個 元 件<br />
• FORMS: 傳 回 程 式 中 已 開 啟 的 所 有 的 表 單<br />
• PRINTERS: 傳 回 所 有 的 印 表 機 物 件<br />
• 可 用 陣 列 方 式 引 用 單 一 物 件<br />
• 開 啟 兩 個 以 上 的 表 單 , 在 form1_LOAD<br />
測 試 :<br />
DIM I<br />
FOR I=1 to FORMS.COUNT<br />
forms(i).show<br />
FORMS(i).caption=“HELLO”<br />
NEXT I<br />
FOR each I in forms<br />
i.show<br />
i.caption=“HELLO”<br />
NEXT I<br />
兩 者 結 果 一 樣<br />
但 for each 簡 單 多 了<br />
23
WITH… END WITH<br />
• 若 有 一 個 物 件 (eq. form1) 的 許 多 屬 性 要 設 定 ,<br />
通 常 表 示 如<br />
form1.caption=“HELLO”<br />
form1.autoredraw=true<br />
form1.height=2880<br />
• 利 用 WITH 可 簡 化 成<br />
WITH form1<br />
.caption=“HELLO”<br />
.autoredraw=true<br />
.height=2880<br />
END WITH<br />
24
• 選 擇 執 行 路 徑<br />
SELECT CASE<br />
成 立 便 跳 開<br />
25
SELECT CASE exp<br />
• CASE 1 to 10<br />
•<br />
CASE Is>10<br />
• CASE true<br />
• Case 1 to 8, 9, is>10<br />
26
例 : 十 八 禁 判 別 程 式 ( 有 bug)<br />
• Dim I<br />
• I = InputBox("HOW OLD ARE YOU?")<br />
• Select Case I<br />
• Case Is < 18<br />
• MsgBox “ 未 滿 十 八 歲 禁 止 進 入 "<br />
• Case Is >= 18, Is < 60<br />
• MsgBox “ 歡 迎 光 臨 !"<br />
• Case Else<br />
• MsgBox “ 請 注 意 健 康 !"<br />
• End Select<br />
27
DEBUG 除 錯<br />
• 上 例 中 輸 入 80 結 果 , 仍 為 歡 迎 光 臨 ,<br />
WHY?<br />
• LET’S DEBUG IT!<br />
• 先 介 紹 DEBUG 工 具<br />
28
基 本 除 錯 工 具<br />
• 找 出 偵 錯 工 具 列<br />
檢 視 => 工 具 列 => 偵 錯<br />
29
專 家 都 用 快 速 鍵<br />
執 行 程 式 停 止 程 式<br />
在 游 標 處 切 換<br />
暫 停 中 斷 點 設 定<br />
逐 程 序 執 行 ( 跑 進 呼 叫<br />
的 程 序 或 函 數 中 執 行 )<br />
跳 過 程 序 執 行<br />
F5 F9 F8<br />
Ctrl-Break<br />
Shift-F8<br />
F4 是 什 麼 快 速 鍵 ?<br />
30
四 種 監 看 變 數 的 方 法<br />
顯 示 呼 叫 堆 疊 視 窗 :<br />
如 果 一 個 副 程 式 呼 叫 另 一 個 副 程 式<br />
則 可 以 顯 示 目 前 在 那 一 層 的 副 程 式<br />
顯 示 區 域 變 數 視 窗<br />
顯 示 即 時 運 算 視 窗<br />
顯 示 監 看 視 窗<br />
顯 示 快 速 監 看 對 話 框<br />
31
示 範 ( 十 八 禁 判 別 程 式 )<br />
• 逐 步 執 行<br />
• 跳 過 程 序 執 行<br />
• 中 斷 點 設 定 切 換<br />
• 中 斷 點 清 除<br />
• 四 種 監 看 變 數 的 方 式<br />
• 除 錯 目 的 : 找 出 與 設 計 時 所 預 期 不<br />
同 的 關 鍵 點 , 看 問 題 在 哪 裡 。<br />
32
找 出 錯 誤<br />
• Dim I<br />
• I = InputBox("HOW OLD ARE YOU?")<br />
• Select Case I<br />
• Case Is < 18<br />
• MsgBox “ 未 滿 十 八 歲 禁 止 進 入 "<br />
• Case Is >= 18, Is < 60<br />
• MsgBox “ 歡 迎 光 臨 !"<br />
• Case Else<br />
• MsgBox “ 請 注 意 健 康 !"<br />
• End Select<br />
33
正 確 程 式<br />
• Dim I<br />
• I = InputBox("HOW OLD ARE<br />
YOU?")<br />
• Select Case I<br />
• Case Is < 18<br />
• MsgBox “ 未 滿 十 八 歲 禁 止 進 入 "<br />
• Case Is < 60<br />
• MsgBox “ 歡 迎 光 臨 !"<br />
• Case Else<br />
• MsgBox “ 請 注 意 健 康 !"<br />
• End Select<br />
34
SELECT CASE 注 意<br />
• SELECT CASE 語 法 是 過 濾 式 的 用 法 ,<br />
成 立 便 跳 開 !<br />
• CASE Is>18, Is
綜 合 練 習<br />
• 寫 一 個 程 式 , 輸 入 體 重 與 身 高 , 運 用 公 式 計 算 :<br />
標 準 體 重 = 身 高 -110<br />
• 若 體 重 大 於 標 準 體 重 10%( 或 30%) 顯 示 ” 有 點<br />
胖 ”(“ 太 胖 了 ”) 等 警 語 與 建 議 。 同 理 , 瘦 也 一<br />
樣 。<br />
• 使 用 Select 語 法<br />
• 為 避 免 錯 誤 , 使 用 On ERROR GOTO 使 錯 誤<br />
時 ( 例 如 輸 入 非 數 字 時 ) 重 新 要 求 資 料 輸 入<br />
• 10 分 鐘 team work<br />
36
HW 心 理 測 驗 程 式<br />
• 心 理 測 驗 通 常 是 針 對 問 題 回 答<br />
最 後 以 加 總 方 式 顯 現 出 分 析 結 果<br />
• 請 找 一 個 心 理 測 驗 題 目 ( 報 紙 、 網 路 )<br />
• 將 之 程 式 化<br />
按 鈕 後 開 始<br />
使 用 msgbox 詢 問 及 回 答<br />
回 答 後 使 用 select case 判 斷<br />
加 入 錯 誤 防 止 機 制 (on error)<br />
37
打 字 速 度 計 算<br />
• Hjssub<br />
=>reset_Timer(var)<br />
timer_read(var)<br />
• A-Z RANDOM 出 現<br />
跟 隨 打 字 厚 出 現 下 一 字<br />
• 可 設 定 多 少 時 間<br />
• 最 後 計 算 每 秒 速 度<br />
• 依 據 每 秒 速 度 給 予 評 論<br />
• 可 互 相 討 論 , 但 格 式 特 色 自 行 發 揮<br />
38
接 磚 塊<br />
• 利 用 for each in controls<br />
• 利 用 form 的 keypreview 作 左 右 動 作<br />
• 接 住 掉 下 的 磚 塊<br />
39
小 學 生 數 學 心 算 測 驗<br />
• 依 據 難 度 方 式 , 產 生 十 題 數 學 , 計 算 完<br />
成 時 間<br />
• 紀 錄 目 前 最 高 紀 錄<br />
• 難 度 一 位 數 二 位 數 三 位 數<br />
• 難 度 + - * /<br />
40