22.07.2014 Views

程式控制與除錯

程式控制與除錯

程式控制與除錯

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!