22.07.2014 Views

程式控制與除錯

程式控制與除錯

程式控制與除錯

SHOW MORE
SHOW LESS

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

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

Saved successfully!

Ooh no, something went wrong!