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