樊新華 林天亮
關鍵詞:程序設計;案例設計;算法表示;編程風格;程序調(diào)試
0 引言
程序設計是非計算機專業(yè)大學生必修且實踐性強的課程。在程序設計教學中,實踐教學具有非常重要的作用,也是掌握編程技能的主要途徑。因此,要進一步強化實踐教學環(huán)節(jié)和改革實踐教學方法,制訂實踐教學的標準,增加實踐教學比重,在教學中推行基于項目、基于案例的教學等方法[1]。
在實踐教學中,根據(jù)學生存在的問題,進行了一系列改進實踐教學的探索。潘麗麗等使用激發(fā)學生學習興趣、合理安排實驗教學內(nèi)容的教學思路[2]。徐一秋等將PBL教學法應用于程序設計實驗教學中,強調(diào)以“問題”為中心,以學生自學為主教學改革[3]。劉群等主要應用分層次實驗教學、調(diào)整教學內(nèi)容、多樣化的實驗教學方法、分組實驗活動、嚴格的考核制度和輔助的實驗教學等方法[4]。陳婷使用“階梯式”“案例式”方法進行課堂教學,“項目驅動式”方法進行實踐教學,并搭建多種自主學習平臺 [5]。
這一系列程序設計實踐教學改革,對學生提高實踐教學效果,加快掌握知識和技能,提高編程能力起到了一定促進作用。但是在運用所學知識解決實際問題中,通常學生還會遇到分析問題能力差、編程風格不規(guī)范、調(diào)試程序出現(xiàn)的錯誤不知如何解決等諸如此類的問題。
1 指導思維
在現(xiàn)實中,學生掌握了程序設計的基本知識,并不能熟練掌握編程。因此在實踐教學中,要以貼合實際生活案例、項目開發(fā)為目標,對容易忽視的薄弱環(huán)節(jié)進行刻意訓練,主要著眼于下面幾個方面:
1) 根據(jù)實驗的知識點、語法,設計相應案例,其難度呈現(xiàn)階梯式遞增,更利于學生進行訓練;
2) 根據(jù)所給問題進行分析、設計算法,通過標準的圖示或語言工具展示分析的結果;
3) 根據(jù)所設計的算法進行編程,一定遵循編程規(guī)范的書寫風格;
4) 根據(jù)程序運行結果,進行相關的分析;對出現(xiàn)的錯誤分析,學會程序調(diào)試的技能。
另外,在實驗考核過程中,要求按統(tǒng)一的規(guī)范描述每個實驗題目算法,并在代碼中帶有注釋,尤其是綜合項目的注釋及說明文檔更必不可少;加強學生測試、調(diào)試程序能力的訓練。對于高質(zhì)量圓滿完成設計開發(fā)型和研究創(chuàng)新型實驗的學生可予以適當加分,調(diào)動學生參與每個實驗的積極性。
2 具體實施方法
計算機程序解決問題的過程:分析問題、設計算法、編寫程序、調(diào)試運行和檢測結果。在實驗教學中,依照這個過程對常被忽視的一些重要知識或技能,必須進行刻意訓練。
2.1 案例設計
在有限的實驗課時掌握更多的知識和技巧,需要精心設計實驗題目。根據(jù)實驗性質(zhì)和目的,可采用“階梯式”設計實驗題目,實驗題目分為基礎驗證型、設計開發(fā)型和研究創(chuàng)新型三個類型,要求熟練掌握基礎驗證型實驗,基本掌握設計開發(fā)型實驗,鼓勵掌握研究創(chuàng)新型實驗[4-5]。
在設計實驗題目時,結合學生所學的專業(yè),內(nèi)容具有趣味性、實用性,同時依照階梯式思路,一步一步地提出相關編程要求,并引導學生獨立思考和分析問題。問題前后相互聯(lián)系,功能進一步完善,以培養(yǎng)學生邏輯思維能力,引導學會如何解決實際問題。
以文獻[4]中的“猜數(shù)游戲”、文獻[6]中的“素數(shù)探索”為基礎,參考文獻[7]的實驗案例設計方法,設計“擲骰子游戲”的實驗案例,具體內(nèi)容如下:每個骰子是一個正方體有6面上面標有1、2、3、4、5、6個圓點。擲骰子停止時,骰子朝上的點數(shù)就是該骰子的點數(shù)。
問題(1) :模擬擲骰子游戲1 000次,編程統(tǒng)計并輸出骰子的6個面各自出現(xiàn)的次數(shù)。
問題(2) :每次擲兩個骰子,計算點數(shù)之和。如果所得的和為7、11贏;和為2、3或12那么游戲者輸?shù)?;并模擬1000次擲骰子的結果。
問題(3) :每次擲兩個骰子,計算點數(shù)之和。如果第一次投的點數(shù)和為7或11,則游戲者獲勝;如果第一次投的點數(shù)和為2、3或12,則游戲者輸;如果第一次投的點數(shù)和為4、5、6、8、9或10,則將這個和作為游戲者獲勝需要擲出的點數(shù),繼續(xù)投骰子,直到賺到該點數(shù)時算是游戲者獲勝。如果投擲7次仍未賺到該點數(shù),則游戲者輸。
問題(4) :每次擲三個骰子,計算點數(shù)之和。讓用戶押大小,并告訴用戶押大小的結果,每局游戲結束時,程序詢問用戶是否再玩一次,如果用戶輸入的回答不是y或Y,程序會顯示勝敗的次數(shù)然后終止。其中“ 大”的點數(shù)范圍是[11,18],“ 小”的點數(shù)范圍是[3,10]。
問題(5) :每次擲三個骰子,計算點數(shù)之和。用戶押大小,并下注金額和賠率。具體規(guī)則如下:
①初始金額為1 000元;
②金額為0時游戲結束;
③默認賠率為1時,也就是說押對了能得相應金額,押錯了會輸?shù)粝鄳痤~。
這些問題由易到難,符合認知規(guī)律。通過此案例可以幫助學生熟練掌握控制語句、函數(shù)、數(shù)組、隨機函數(shù)等相關知識,同時能訓練靈活應用所學知識解決實際問題的能力,以提高計算思維能力。
遵循軟件工程的“高內(nèi)聚低耦合”原則,讓學生進一步明白模塊的作用,并在編程實踐過程中,通過具體案例體驗函數(shù)的好處,以掌握劃分模塊基本技能[8]。要求將一些常見的功能做成函數(shù),形成自己的解題方法,以備在以后開發(fā)中可以復用。
在學完課程后,可以設計一些常用的小項目(如通訊錄管理、學生成績管理等),要求學生分組完成,一方面培養(yǎng)學生的分析問題的能力,另一方面培養(yǎng)團隊合作能力。
2.2 算法描述
“程序=算法+數(shù)據(jù)結構”公式,說明算法在程序設計的核心位置。描述算法的方法有自然語言、結構化流程圖、偽代碼和PAD圖等[8-9]。在高中數(shù)學和信息技術中,學過用流程圖表示解決問題的方法、思路或算法,但學生還不習慣或不能熟練使用流程圖工具。
在描述算法時,利用更“有序”的思維去想問題,采用“自頂向下,逐步求精”方法。只要邏輯正確,人們都能看得懂就可以了,一般是由上而下按執(zhí)行順序畫出來的。
在學習編程過程中,學生經(jīng)常是看到題目,就直接編寫程序并上機調(diào)試;寫實驗報告時,會根據(jù)源程序畫出流程圖,這個過程完全是本末倒置,不利于學生分析問題,也不利于開發(fā)效率提高。所以,應要求學生做實驗,使用流程圖進行分析實驗題目,依據(jù)流程圖編程,在報告中畫出相應的流程圖。
記住一個道理,會寫代碼的不一定會流程圖,會流程圖的一定會寫代碼。描述算法是編程的一項基本功,務必讓學生掌握!
2.3 規(guī)范化編程
代碼風格不只是一種良好的習慣,同時反映出一個編程人員的素養(yǎng)。在編程過程中,不僅要實現(xiàn)所要求的功能,而且代碼必須能讓自己或別人讀懂、理解。尤其是在實際項目開發(fā)中,面臨開發(fā)周期長、邏輯復雜情況,開發(fā)團隊一定要保持良好且一致的代碼風格,才能最大化地提高開發(fā)效率[10-12]。
在實驗教學中,通過上網(wǎng)查閱Google、大廠(如:阿里巴巴、華為等)的編程規(guī)范,制定簡化版的編程規(guī)范,讓學生遵循編程規(guī)范進行編碼。通過每次實驗循序漸進地編程訓練,培養(yǎng)學生養(yǎng)成良好的編程風格,做到標識符要始終保持一致且應有意義、代碼的縮進編排、注釋的表達應該簡潔而準確。
2.3.1 命名
好的標識符命名實際是一件困難的事情。標識符對程序而言并不是“成敗攸關”的事,但會影響程序的可讀性、可懂性。目前,業(yè)界提供四種命名規(guī)則:駝峰命名法、匈牙利命名法、帕斯卡命名法和下劃線命名法。每種命名規(guī)則可對不同類別的標識符進行命名,使編程人員可以一目了然。
在實驗教學中,參照業(yè)界命名法則,制定一種簡化版的命名規(guī)則。要求標識符的命名規(guī)則要始終保持一致,且盡量能達到“見名思義”“見名知類型”的作用。標識符也應既簡短又具有描述性。例如變量名name 比 n 好,student_name 比 s_n 好,name_length 比length_of_persons_name 好。
可以看到遵循良好的命名規(guī)則和約定,以增強代碼的可讀性和可維護性。在實際編程中,應該培養(yǎng)學生養(yǎng)成良好的標識符命名習慣,以提高代碼的質(zhì)量和效率。
2.3.2 縮進
程序代碼格式混亂,沒有縮進或亂縮進,或空行間隔,嚴重影響程序的可讀性和可維護性。因此,編寫代碼時要合理使用縮進,使代碼清晰易讀、層次清楚。同時,還要注重功能塊的劃分,把不同的功能塊之間用一個空行隔開,就更能使程序清楚、整潔。
在遇到有關類、結構、函數(shù)或過程以及枚舉等復雜程序結構的定義的時候,通常需要將它的內(nèi)容縮進一層。在 C/C++/C#/Java 語言中,大括號是一個非常明顯的標志,凡是遇到大括號,都應該直接聯(lián)想到縮進,也會減少“{”與“}”不匹配的錯誤。
在指導實驗時,經(jīng)常會有學生說:這個代碼怎么不能編譯?通過代碼整理,發(fā)現(xiàn)有一個函數(shù)里少了半個大括號。要求學生正確地做到了縮進,類似這種大括號忘寫或者不配套的情況就不可能發(fā)生,也便于后期的維護與修改工作。現(xiàn)在的開發(fā)工具都支持“自動縮進”,根據(jù)用戶代碼的輸入,智能判定應該縮進還是反縮進,替用戶完成調(diào)整縮進的工作。可以利用此功能,保持代碼的縮進,可以避免不必要錯誤的出現(xiàn)。
2.3.3 注釋
現(xiàn)實中,許多程序員不重視注釋,也很少有寫注釋的習慣。注釋寫起來很痛苦, 但對保證代碼可讀性至關重要。對于學生更是如此,程序一旦出現(xiàn)問題,要找到問題出錯之處必須從頭閱讀程序,對一個比較大代碼更是困難,且費時費力。
注釋應該書寫規(guī)范且有意義的,讓代碼更有可讀性,能有效地幫助自己或別人理清思路、程序邏輯及查看代碼。在團隊開發(fā)工作中,注釋是代碼的一個重要組成部分,采用標準化的注釋尤為重要,便于程序員之間溝通。
按照編程規(guī)范的注釋類型,對代碼中的函數(shù)、重要變量、文件、主要功能等方面要求寫出相應注釋。
在實驗教學中,要求學生在代碼的合適位置,加上適當?shù)淖⑨?。盡量做到先寫注釋,再寫代碼,更有利于理清頭緒。
注釋固然很重要,但最好的代碼應當本身就是文檔,有意義的類型名和變量名,要遠勝過要用注釋解釋的含糊不清的名字。
2.4 調(diào)試訓練
調(diào)試貫穿于程序的整個開發(fā)過程,學會程序調(diào)試是每個編程人員必須掌握的一項技能。通過調(diào)試,可以發(fā)現(xiàn)代碼中隱藏的問題或缺陷,使寫出的程序更健壯和穩(wěn)定。在實驗過程中,程序運行出現(xiàn)錯誤,部分學生會頓感茫然,并不會判斷錯誤類型或位置,也不嘗試使用調(diào)試工具,只是一味舉手請老師幫著調(diào)試或修改。因此,應該加強學生程序調(diào)試能力訓練,具體方法如下:
首先,對初學者的易犯的錯誤進行歸類總結,通過實例講解程序錯誤的原因及修改方法,包括錯誤實例、錯誤描述、錯誤類型[11,13]。在每次實驗中,專門設計錯誤程序的題目進行針對性的訓練;還可以將學生作業(yè)、實驗過程中的易犯錯誤,進行一起分享、分析和總結,以免學生再次犯錯。
其次,在程序中設置顯示語句來顯示變量的值,了解程序的動態(tài)運行信息,可以查看并比較不同點的信息。這樣就可確定出錯誤位置并改正錯誤后,就可去掉調(diào)試語句。
最后,利用編譯器提供的調(diào)試工具。單步調(diào)試是最基本、最重要的調(diào)試手段,主要涉及設置斷點、單步跟蹤、變量觀察等相關技術。通過單步調(diào)試技術,運行到斷點處查看運行狀態(tài),并根據(jù)運行狀態(tài)分析錯誤,找到錯誤位置、修改錯誤。
讓學生綜合應用這幾種方法進行程序調(diào)試。另外,為了提高調(diào)試程序的效率,將“試錯說”理論應用到調(diào)試工作中,使用“理性創(chuàng)造錯誤”方法[14]進行實驗教學。
3 結束語
程序設計類課程是大學計算機基礎教學的核心課程,也是后續(xù)課程的基礎。在程序設計教學中,問題分析、算法表示、編程風格、程序調(diào)試等是非常重要的內(nèi)容,但因為不會影響程序運行結果,也是經(jīng)常被學生忽視的知識點。在實踐教學中,對學生這幾方面的進行針對性訓練,以提高學生分析問題和解決問題的能力,培養(yǎng)良好的編程風格。因此,要達到良好的教學效果,真正培養(yǎng)出有編程能力的學生,實驗教學環(huán)節(jié)一定要得到應有的重視。事實表明,學生養(yǎng)成良好的程序設計的習慣,是學生程序設計素養(yǎng)的要求,對提高學生的分析和解決問題的能力有很大的幫助,同時也對未來職業(yè)發(fā)展有著重要意義。