王聲光
【摘 要】本文闡述了VB上機編程過程中的常見錯誤,主要包括編譯錯誤、運行錯誤和邏輯錯誤。對于不同的錯誤類型,提出相應(yīng)的解決辦法,并結(jié)合具體程序調(diào)試教學,詳細介紹添加斷點、單步執(zhí)行、跟蹤變量的方法在調(diào)試程序時的操作步驟,希望對提高學生的糾錯能力和程序設(shè)計水平有較大的幫助。
【關(guān)鍵詞】VB程序;程序調(diào)試;錯誤處理
【中圖分類號】G434 【文獻標識碼】A
【論文編號】1671-7384(2021)06-060-04
問題的提出
在《高中信息科技》(華師大版教材)第二冊的教學中,學生不僅要進行基礎(chǔ)算法理論的學習,還要進行上機編程實踐,驗證算法設(shè)計的正確性。學生在上機過程中,出現(xiàn)程序錯誤是難免的,無論怎樣精心地設(shè)計算法,在編程時都很難做到一次就運行正確。在編程過程中,不怕程序報錯,就怕程序結(jié)果不對但不報錯。為了解決這個問題,在教學過程中,要注重培養(yǎng)學生的程序調(diào)試能力,使其掌握程序調(diào)試的相關(guān)方法。學生通過不斷地編程實踐,提高程序設(shè)計的自信心和解決實際問題的能力。
編程中常見的錯誤分類
1.編譯錯誤
編譯錯誤又分為兩種,一種是VB集成開發(fā)環(huán)境自動檢查出的語法錯誤。當用戶在輸入代碼時,發(fā)現(xiàn)程序存在輸入錯誤,如語句缺少運算符、語句沒輸入完整、遺漏關(guān)鍵字等,編譯器會彈出一個窗口提示,告知出錯原因,出錯代碼會變成紅色字體顯示。例如,在if語句中遺漏了then,在換行時就會彈出錯誤提示:缺少Then或GoTo。另一種是單擊“啟動”按鈕后,系統(tǒng)在編譯時檢查出來的錯誤。程序編寫完成后,編譯器會先編譯程序,檢查程序中是否有錯誤,如單詞拼寫錯誤,函數(shù)缺少參數(shù),if語句結(jié)束時遺漏了endif。for語句結(jié)束時遺漏了next語句等。
2.運行錯誤
運行錯誤是指在編譯通過后,運行時發(fā)生的錯誤。這類錯誤一般是由代碼在執(zhí)行過程中遇到了不可執(zhí)行的操作引起的,如溢出錯誤、類型不匹配、下標越界、試圖打開一個不存在的文件等。當遇到運行錯誤時,系統(tǒng)也會彈出一個提示框,顯示錯誤原因。同時,在彈出框中還會有四個按鈕,分別是“繼續(xù)”“結(jié)束”“調(diào)試”“幫助”。當用戶單擊提示框上的“調(diào)試”按鈕時,系統(tǒng)會將出錯代碼以黃底黑字突出顯示。
3.邏輯錯誤
邏輯錯誤是指編譯和運行都正常,沒有提示錯誤,但是運行沒有結(jié)果或者結(jié)果和預(yù)期不一致,這說明程序中存在邏輯錯誤。邏輯錯誤不容易被發(fā)現(xiàn),需要用戶自己去排查,所以查找錯誤語句就比較困難,一般可能的原因有運算符使用不正確、語句中前后使用的變量不一致、語句前后的次序不對、循環(huán)語句的初值或終值不正確等。邏輯錯誤是這三類錯誤中最難排查的,需要借助斷點調(diào)試來查找錯誤原因。
不同錯誤的應(yīng)對方法
1.編譯錯誤和運行錯誤的應(yīng)對方法
當遇到編譯錯誤時,彈出框上有“確定”和“幫助”兩個按鈕,單擊“確定”按鈕,出錯的語句會自動選中,認真檢查選中的語句就能找到錯誤原因。如輸入語句,學生經(jīng)常寫成a=imputbox(“”),在執(zhí)行時編譯器會彈出提示:編譯錯誤,子程序或函數(shù)未定義,單擊“確定”按鈕后,imputbox單詞會被選中,仔細檢查發(fā)現(xiàn)是單詞拼寫錯誤,修改后程序執(zhí)行正確。
當遇到彈出框上有“調(diào)試”按鈕時,說明是運行錯誤,此時要單擊“調(diào)試”按鈕,定位到錯誤語句所在的行,根據(jù)提示的錯誤原因,修改程序即可。如在累加或累乘的算法中,經(jīng)常會出現(xiàn)“溢出”錯誤,主要原因是計算的結(jié)果超過了變量所能存放的最大值,只需要修改變量類型即可。對于運行錯誤,需要學生在平時遇到錯誤時多積累,遇到看不懂的錯誤時多提問,再遇到時就能輕松解決了。
2.邏輯錯誤的應(yīng)對方法
對于邏輯錯誤,無法輕松地定位到錯誤語句所在的行,在排查時要借助斷點調(diào)試,單步執(zhí)行語句,跟蹤變量值的變化,來檢查程序中的錯誤。通過添加斷點,可以中斷程序的運行,具體使用斷點進行調(diào)試的方法如下。
第一步,插入斷點。在需要設(shè)置斷點的語句左側(cè)灰色區(qū)域單擊鼠標左鍵或者按下鍵盤上的F9鍵,此時語句前面有一個紅色圓圈,整條語句呈紅底白字的突出顯示狀態(tài),再次單擊紅色圓圈,就可以取消斷點。一般斷點是加在可能出錯的語句上,加一個斷點即可。
第二步,添加監(jiān)視。通過監(jiān)視窗口,可以顯示當前程序執(zhí)行過程中變量的值。單擊菜單欄中的“調(diào)試”,添加監(jiān)視,在彈出的對話框中輸入變量名或者表達式,即可以打開監(jiān)視窗口。如果程序執(zhí)行過程中,監(jiān)視窗口隱藏起來了,也可以通過視圖菜單,監(jiān)視窗口會顯示隱藏的監(jiān)視界面。
第三步,單步執(zhí)行程序。單擊運行菜單下的“啟動”按鈕,程序就會執(zhí)行到斷點語句停下來,然后選擇調(diào)試菜單下的單步執(zhí)行或者按鍵盤上的F8鍵,即可單步執(zhí)行程序,單步執(zhí)行后,執(zhí)行點會移動到下一行。每執(zhí)行一行語句,在監(jiān)視窗口查看變量當前的值,檢查程序中的錯誤。
案例分析
雖然在平時的上機練習中,當學生遇到程序錯誤時,解釋過當前程序出錯的原因及解決的辦法,但是對于如何解決邏輯錯誤,卻很少涉及。筆者在經(jīng)典算法實例講完之后,以平時學生上傳的作業(yè)為例,挑選了一些典型的錯誤程序,帶領(lǐng)學生一起查錯誤,調(diào)試程序,修改代碼,整理和歸納程序調(diào)試的方法。
1.活動1—— 計算快遞費
問題情境:放暑假時,小明利用順豐快遞將自己本學期的書籍寄回家,目前的收費標準是上海本地1kg以內(nèi)收費12元,超過1kg的部分,每1Kg收費2元,輸入書籍的重量,計算應(yīng)付快遞費。程序代碼如表1所示,程序共有多處錯誤,請運行程序,找出錯誤語句并改正。
學生1:點擊啟動按鈕之后,系統(tǒng)彈出編譯錯誤,必選參數(shù)。同時inputBox單詞被選中,檢查發(fā)現(xiàn),inputbox()是輸入函數(shù),在括號中缺少了雙引號,加上雙引號就可以了。繼續(xù)執(zhí)行程序,系統(tǒng)彈出第2個錯誤提示,else 沒有if。程序中else語句會被選中,初步看else是和if語句匹配的,出錯了說明沒有匹配成功。仔細閱讀程序,發(fā)現(xiàn)if語句單獨寫成了一行,此時的if語句是單分支結(jié)構(gòu),else不能與if進行匹配,而雙分支結(jié)構(gòu)的語句格式是then后面的語句要換行寫,所以在then后面敲一下回車,后面的語句換行寫就可以了。
在上面的程序中,其在運行時出現(xiàn)了兩個編譯錯誤,分別是“必選參數(shù)”“else沒有if”。這些錯誤在執(zhí)行程序時,都會有錯誤提示,根據(jù)提示定位錯誤行,修改語句即可。
2.活動2—— 求三位數(shù)中所有的水仙花數(shù)
具體程序如表2所示,程序中有多處錯誤,先運行程序,再修改錯誤。
學生2:嘗試運行程序,發(fā)現(xiàn)沒有輸出結(jié)果,也沒有任何的錯誤提示,初步檢查代碼,并沒有發(fā)現(xiàn)什么錯誤,這時該如何修改呢?
這就是我們常說的邏輯錯誤,可以用斷點調(diào)試的方法來排查。第一步是添加斷點,在a=x/100這一行前面添加斷點,然后添加監(jiān)視,監(jiān)視變量a,b,c,i的值,再單步執(zhí)行語句。當i=100時,執(zhí)行循環(huán)體,分別計算變量的值。if語句判斷條件不滿足,i的值加1,i=101,繼續(xù)進入循環(huán)判斷,再次執(zhí)行循環(huán)體,在監(jiān)視窗口很方便地看到當前a,b,c,i的值,如圖1所示。程序運行到這里,閱讀代碼,思考程序中可能存在的問題。
學生3:通過觀察變量a,b,c,i值的變化,發(fā)現(xiàn)了兩個問題,一個是第二次執(zhí)行循環(huán)體時,i=102,說明執(zhí)行一次循環(huán),i的值加了2次,for循環(huán)中省略了步長step,默認的步長為1,不需要在循環(huán)體中加上i=i+1這條語句,否則就會跳過了所有對奇數(shù)數(shù)據(jù)的判斷,在枚舉時就會遺漏可能的結(jié)果,修改的方法是把循環(huán)體中的i=i+1去掉。另一個問題是變量a應(yīng)該是存放三位數(shù)百位上的值,當i=102時,a的值應(yīng)該是1,而不是1.02,說明a=i/100此處應(yīng)使用整除運算,應(yīng)該加上取整函數(shù)int()或者改用整除運算符。
學生4:發(fā)現(xiàn)還有另外一個問題,變量a是求三位數(shù)百位上的值,用的是整除運算,變量b是求三位數(shù)十位上的值,應(yīng)該也用整除運算,所以應(yīng)該將b=i/10 mod 10修改為b=i\10 mod 10或者b=int(i/10) mod 10。
通過斷點調(diào)試,跟蹤變量,可以清楚地看到變量值的變化,這有助于我們排查錯誤。對于循環(huán)結(jié)構(gòu)的程序,有時循環(huán)體執(zhí)行一次,跟蹤變量后就能發(fā)現(xiàn)問題,有時要多次反復(fù)執(zhí)行循環(huán)體,才能檢查出錯誤語句。當找到錯誤后,修改好程序,再執(zhí)行時可以去掉斷點,看是否能得到預(yù)期的結(jié)果。
通過課堂教學實踐,總結(jié)上機編程過程中的常見問題。當遇到程序出錯時,主要分兩類:報錯和不報錯,如圖2所示。當程序報錯時,根據(jù)錯誤原因不同又分為編譯錯誤和運行錯誤,此時要認真閱讀錯誤提示,根據(jù)錯誤提示定位到錯誤語句所在的行,再去修改程序。如果程序沒有報錯,但是沒有結(jié)果,說明此時是邏輯錯誤,需要通過斷點調(diào)試的方法來排查錯誤語句,再修改程序。
結(jié)束語
本文介紹了VB上機編程過程中的常見錯誤類型,不同類型錯誤的調(diào)試方法,并以具體的教學實踐為例,闡述了如何使用添加斷點、單步執(zhí)行、跟蹤變量來調(diào)試程序,修改錯誤。掌握這些方法,對提高程序設(shè)計能力有較大的幫助。除此之外,在一開始的上機練習中,幫助學生做好語句書寫的規(guī)范,讓學生養(yǎng)成良好的編程習慣也同樣重要。例如,在分支結(jié)構(gòu)或循環(huán)結(jié)構(gòu)的語句中,采用縮進的語句格式,如if和else中間的語句進行縮進,for語句的循環(huán)體也是以縮進的方式來書寫,這樣在閱讀程序時能快速厘清程序的框架結(jié)構(gòu),更容易地找到程序中的錯誤。
程序調(diào)試不是一件容易的事,僅僅掌握這些方法還是不夠的,還需要在上機實踐過程中不斷地積累,不斷地總結(jié)經(jīng)驗,才能快速地提高VB程序設(shè)計水平,寫出高質(zhì)量的程序。