李環(huán)宇,林曉霞,徐燕妮,李保銀
(山東科技大學智能裝備學院,泰安271000)
針對程序設計課學習效果欠佳的情況,分析學生在學習過程中遇到的細節(jié)處理能力差的情況。以工程教育認證為契機,提出反向利用錯誤程序,以學生為中心,讓學生自主分析錯誤程序,分析錯誤發(fā)生的原因,總結編程規(guī)律,達到提高學生綜合素質的要求。
工程教育認證;錯誤程序;設計細節(jié);反向利用;素質提高
《C程序設計》是中國高校理工科類各專業(yè)普遍開設的一門基礎課?!吨袊叩仍盒S嬎銠C基礎教育課程體系》在2006年、2008年以及2014年三次調整相關課程時,一直將其列為中國大學生計算機教育的基礎課程[1],這也從側面印證了該課程在中國大學計算機教育中不可或缺的基礎性地位。
但是眾所周知,C語言的程序十分繁瑣,大多數學生是在大一剛入校的時候開始學習該課程,對程序設計的概念相當陌生,算法基礎幾乎為零,所以在理解有關語法、程序結構時會感覺吃力,容易產生抵觸心理,主動去理解、探索程序設計的內在規(guī)律就更為困難,因此及時有針對性地解決程序設計教學中凸顯出來問題一直是相關專家和任課教師重點關注的研究方向。
很多專家學者對改進C語言的教法進行了積極有益的探討和改進,例如:針對學生雖然記住了簡單的語言知識,但卻不知道總體如果布局下手編程的問題,柴群提出了“五步編程法”,指出了一個“編程路線圖”,讓學生在編程過程中有路可循[2];算法是程序的靈魂,離開了算法,編程就像沒有明燈指引走夜路。安廣勇老師提出了以“數學算法為基礎的編程技巧”[3],深入剖析數學算法在C程序設計中的指導性作用;楊琴等人提出基于“互聯(lián)網+”平臺下載翻轉課堂教學改革,目的是增強學生學習的主動性,提高課堂教學效率,使課堂教學更有針對性[4]。綜合各種教改成果,這些改革的思路側重于系統(tǒng)化的改革,對于程序設計教學過程中的細節(jié)涉及不多。
另外,近年來,隨著新工業(yè)革命時代的到來,與之相對應的工程教育認證蓬勃發(fā)展。早在2013年,同濟大學副校長陳以一教授就在教育部人文社會科學研究專項任務項目中指出了新工業(yè)革命對工程教育的影響,并且提出了在新工業(yè)革命背景下工程教育改革的新課題,例如專業(yè)整合、課程重構、學習模式變革等[5]。工程教育認證強調教學“以學生為中心,產出為導向,持續(xù)改進”的標準。以此為標準,許多教師也提出了自己的教學思考,例如蔡美琴老師提出在教學內容上需要重構,在學生“怎么學”上,要要充分發(fā)揮學生的自主性、能動性和創(chuàng)造性,提高學生的參與度[6]。凡此種種研究成果,本文不再贅述。
按照工程教育認證的標準,要使學生主動參與,提高整體素質,能夠著手的地方很多?!凹毠?jié)決定成敗”。本文擬從提高設計細節(jié)角度來談談設計綜合能力的提高。
設計中需要關注的細節(jié)很多,“轉化”能力就是設計細節(jié)中容易被忽略,但卻又是一種不可或缺的基礎性能力。文獻[7]以介紹“打擂臺”法為“鋪墊”,“轉化”為選擇法排序,降低了理解算法的難度。不過在實際的教學中,即便是學生對題目的算法、程序設計步驟都已經非常清楚了,在具體編程實現過程中,仍面臨著“轉化”的問題,“轉化”能力較差,就會產生了一系列編程錯誤。這類錯誤無論是從教師角度看,還是從學生自身角度看,都好像是淺層次的問題。但是此類錯誤一而再,再而三的出現,就成了系統(tǒng)性問題,需要重點關注和解決。從這類問題實際產生的影響看:一是降低了學習效率,因為學生總是在低層次問題“徘徊”;二是打擊了學生的自信心和學習的積極性,因為這種問題一般出現在學習的入門階段,反復出現的此類問題,好像是掉入了“錯誤的海洋”,由此影響學生的學習熱情。
教師在指導學生編程時,一般是先分析問題,得到一個具體的算法,然后用流程圖、偽代碼等算法語言把算法表達清楚。下一步,就是學生把前面得到流程圖或偽代碼等算法“轉化”為符合C語言語法的程序了。但就在這個以“轉化”階段為代表的細節(jié)處理,在具體實現算法的這個環(huán)節(jié)就出現了各種各樣的問題。以“轉化”環(huán)節(jié)來說,細節(jié)處理出現的問題主要體現在以下幾個方面:
(1)數學公式轉化為合法C語言表達式的能力較差。
在編程過程中,有很多數學公式需要轉化為C語言的表達式。例如編程中常用到的一元二次方程的兩個根。學生基本了解要把求根公式分解為兩部分:p=但在實現p或q的時候,編程就出現了“轉化”錯誤。以實現p為例,學生常犯的錯誤經常是:
(2)對基本概念轉化為具體語句的能力差
這類問題經常出現在選擇結構和循環(huán)結構中。例如算法描述:“if a>b,將a和b交換”。實現語句為:if(a>b){t=a;a=b;b=t;},該語句實現了一個選擇結構,其中使用了“復合語句”這個概念,但初學者往往把“花括號”忘記,導致程序可能出錯。
(3)從算法語言到合法C語句的轉化能力差
該類問題很多,例如閏年的表示問題,涉及到關系表達式和邏輯表達式的綜合應用。素數問題,算法本身不復雜,但涉及到循環(huán)的正常結束與非正常結束的問題。在遇到這種上述算法時,學生們經常是算法明白了,但仍然是寫不出正確的程序。
(4)對具體問題中已知條件轉化為函數參數能力較差
函數的定義和調用是學習C程序設計中的難點。具體到函數參數的設置,學生更是屢屢出現問題。究其原因:是學生不了解參數的本質是解決一個問題的已知條件,不是在程序設計過程中用到過度變量;從表現形式上說,不清楚已知條件的表達方法,特別是涉及到數組和指針作為函數參數的時候。
凡此種種的“轉化”過程出現的問題,其實是的細節(jié)處理能力薄弱的表現,實質是都是編程能力低下的具體體現。錯誤的細節(jié)處理必然產生錯誤的程序。因此細節(jié)處理能力差就是編程能力差。而基于工程教育認證模式下,尤其重視能力的培養(yǎng)。編程能力差,尤其與以目標為導向的工程教育認證原則相背離。
上文提到的細節(jié)處理能力不足,主要的自主學習能力和實踐能力不足所致。解決這個問題的傳統(tǒng)方法是強調正面引導,強調正確的轉化過程。當學生出現錯誤時,就告訴學生,你的程序錯了,然后告訴他正確的應該是怎樣的。而對學生編程過程中出現的錯誤案例(錯誤程序)反而重視不夠,忘記了“教訓”本身也會在學生成長過程中扮演重要的角色。
文獻[8]就提出重視錯誤程序的觀點,并引用了ACM計算機教育專家Robert M.Panoff博士在SIGCSE 2014大會所作的主題報告中提出一個鮮明觀點:“Right Answer=Wrong Answer+Corrections”(正確答案=錯誤答案+更正)。因此重視錯誤程序,從中發(fā)現錯誤發(fā)生的規(guī)律可以從反向提高學生的編程能力。
交互式學習在20世紀70年代就已經提出,它強調以學生為主體,注重教育者與學習者之間的平等交流和自由互動[9],與工程教育認證的以學生為中心的思想是相同的。根據程序設計課程的教學和學習特點,在面對學生的錯誤程序的時候,通過交互式雙向討論的方式改正學生的錯誤,采用了以下的教學環(huán)節(jié)。
(1)收集學生的錯誤案例
教師應該在日常教學工作中,注重發(fā)現學生在編程過程中所犯的錯誤程序。為了能夠使各種錯誤程序有代表性,應該對錯誤程序進行分類,使每一類錯誤程序都能代表某一個方向性問題,提高教學效率。
(2)對學生進行分組
根據學生的編程水平,對學生進行分組。每組人數不宜太多,以四到五為宜,讓每個學生在這個小組中都有具體的任務。小組人員組成水平最好有層次之分,以層次較高的學生帶動較差的學生。
(3)教師分配討論任務
教師將不同類別的錯誤程序分配給不同的學生組。為了提高下面在課堂討論時的效率,每個小組分配的題目盡量的不同,但是每個類型的錯誤程序都要有。分配討論時機應與課堂正面教學相配合。
(4)學生按照分組討論并記錄總結
學生分組討論可以在自習期間,也可以再自建微信群或QQ群中討論。把討論發(fā)現的程序中的錯誤記錄下來,并分類保存形成文字內容。討論時的內容既可以包含語法細節(jié),也可以包括宏觀算法思路。特別是算法思路,程序可能并沒有語法錯誤,僅僅是邏輯錯誤,與預定的結果不符。這樣的情況可以鼓勵學生將各自的想法程序化,然后運行看結果,然后從結果倒推錯誤成因。
(5)教師引導啟發(fā)
學生在討論的過程中,教師應該適時的加入討論,可以提高學生討論的層次,并將討論引入更寬的視角,點出所涉及問題的難點并對相關知識進行適當的拓展。
(6)課堂總結歸納,學生撰寫本次差錯報告
在整個教學環(huán)節(jié)中,課堂總結是交流討論的收尾階段。在這個階段,教師在課堂上要對各個小組的討論結果分別進行總結。教師應該站在更高的層次上,把各個小組的討論結果背后的知識點進行串聯(lián)。經過這個階段,對相關知識點從正反兩個方面進行強化。經過強化串聯(lián)之后,學生應該能從宏觀和微觀兩個方面對知識進行掌握,學會從局部到全局的學習方法。
本文采用的案例是筆者在教學過程中遇到的真實案例,錯誤程序片段以照片的形式原樣呈現,如圖1所示。原題目要求編程完成數學上的一個分段函數:
圖1 錯誤程序段樣例
將該錯誤程序提供給學生討論。學生容易發(fā)現兩個錯誤:首先,“y=5x”這個錯誤最容易被發(fā)現,很顯然與“y=-5x”這個句子不一致,形成對比,當然從表達式的組成的定義也容易判斷;其次,“x=0”這個錯誤的發(fā)現困難些,主要原因是數學概念對學生的影響太大了,學生對兩種話語體系區(qū)別還體會不深。
如果教師不介入討論,很多時候學生發(fā)現的錯誤就到此為止了。教師在這個時候的介入就可以拓展學
生的思路。例如可以向學生提出該程序整體的結構是什么?當筆者給學生提出這個問題的時候,部分學生誤以為這是if語句的三分支結構呢!而沒有意識到這是連續(xù)使用了兩個選擇結構的順序結構,并且第一個選擇雙分支選擇結構使用的還很不規(guī)范!
在課堂總結歸納階段,可以首先總結學生們發(fā)現的錯誤,其次應重點介紹隱藏比較深的邏輯錯誤,編譯階段發(fā)現不了,但實際上算法是錯誤的程序段。另外不良的編程風格也應該及時給學生指出,例如圖1中的第一個雙分支選擇結構,是一個不規(guī)范的用法。此外編程風格不好,例如本例中代碼沒有形成縮進。最后學生將本次差錯的心得各自寫成文字保存,方便以后查詢,逐漸改正錯誤,形成良好的編程習慣。
上述過程不是一勞永逸的,應該在發(fā)現新問題時,反復執(zhí)行。具體的討論形式也應該與時俱進,不斷鞏固發(fā)展,這也是工程教育認證本身所要求的。
本文分析了學生在編程細節(jié)處理方面出現的問題。基于工程教育認證的編程能力的培養(yǎng),需要正面的引導和教育,也離不開對錯誤的反向思考。因為在學習編程的過程中,避免不了犯各種各樣的錯誤。要對每一種錯誤進行分析,分析錯誤發(fā)生的原因以及避免錯誤發(fā)生的方法。放棄對錯誤的研究,意味著失去進步的一個途徑。通過讓學生自己對典型編程錯誤分析和總結,可以起到事半功倍的效果,加深學生對編程的理解,提高學生編程的能力。