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