白洪濤[1] 何麗莉[2] 胡成全[2]
([1]吉林大學(xué)公共計算機教學(xué)與研究中心 吉林·長春 130012;[2]吉林大學(xué)計算機科學(xué)與技術(shù)學(xué)院 吉林·長春 130012)
摘 要 針對學(xué)生學(xué)習(xí)計算機程序設(shè)計語言的困難,以提高學(xué)生的實際編程能力為目標,提出了分層次的基于問題(Problem Based Learning,PBL)的程序設(shè)計學(xué)習(xí)方法。包括:以激發(fā)學(xué)習(xí)興趣為目標的教學(xué)情景案例、以培養(yǎng)“計算思維”為目標的宏觀問題和以培養(yǎng)實際編程能力為目標的微觀問題等。教學(xué)實踐表明基于PBL的教學(xué)取得了良好的效果。
關(guān)鍵詞 基于問題的學(xué)習(xí) 教學(xué)情景 宏觀問題 微觀問題
中圖分類號:G424 文獻標識碼:A DOI:10.16400/j.cnki.kjdkz.2015.08.061
Programming Design Language Teaching Cases Base on PBL
BAI Hongtao[1], HE Lili[2], HU Chengquan[2]
([1] Center for Computer Fundamental Education, Jilin University, Changchun, Jilin 130012;
[2] College of Computer Science and Technology, Jilin University, Changchun, Jilin 130012)
Abstract: For students to learn computer programming languages difficult, in order to improve students' ability to target the actual programming is proposed based on hierarchical problem (Problem Based Learning, PBL) learning programming. Including: to stimulate interest in learning the target of teaching case scenario, to develop macro issues "computational thinking" as the goal, and to develop practical programming capabilities targeted micro issues and so on. The practice shows that the good results achieved based on the teaching of PBL.
Keywords: problem-based learning; teaching situation; macro issues; micro issues
0 引言
計算機程序設(shè)計語言是學(xué)生們普遍認同的學(xué)習(xí)難點,過多的語法知識點以及在考核考評模式下,學(xué)習(xí)計算機程序設(shè)計語言應(yīng)有的根本目標——編程能力沒有得到很好的鍛煉。當前的教學(xué)模式是以教師為主體,教師是教學(xué)過程的主導(dǎo),學(xué)生是知識的被動接受者和思想的跟隨者。因此,培養(yǎng)學(xué)生的創(chuàng)造力,構(gòu)建以學(xué)生“學(xué)”為中心的教學(xué)體系是非常必要的。
基于問題(Problem Based Learning,PBL)的教學(xué)模式率先由美國神經(jīng)病學(xué)教授Barrows創(chuàng)立。①PBL已從國際醫(yī)學(xué)界擴展到工程、法學(xué)、工商管理等諸多學(xué)科,從大學(xué)高等教育逐步延伸到中小學(xué)教育。②③PBL在國內(nèi)的起步較晚,上世紀90年代才引起研究者的關(guān)注,全國教育科學(xué)“十五”項目規(guī)劃將PBL的網(wǎng)絡(luò)化設(shè)計列為重點課題。1994年開始,陸續(xù)有關(guān)PBL理論研究的文章發(fā)表,且側(cè)重于醫(yī)學(xué)教育領(lǐng)域,2000年后擴展到其他領(lǐng)域,但理論研究比例較大。④⑤PBL在高等院校計算機程序語言學(xué)課程中的實踐,則較為少見。
本文引進PBL教學(xué)模式,通過基于“問題”的學(xué)習(xí),探尋一條適合學(xué)生學(xué)習(xí)計算機程序設(shè)計語言的有效途徑,同時為教師在教學(xué)中提供可參考的方法和思路。
1 教學(xué)情景案例
1.1 什么是計算機語言
對于初學(xué)者而言,最直接的問題就是:“什么是計算機語言?”我們從《通靈芯片》一書⑥中對計算機語言既抽象又形象的解釋來闡述這一問題。
石頭上我蝕刻了一副圖案,內(nèi)有幾何圖形種種,在不明者眼中,顯得神秘而又復(fù)雜,但我明白,只要布局正確,這塊石頭將被賦予一種特殊的能力,即對一種至今無人說過的咒語做出反應(yīng)。我用這種語言提問,石頭會顯靈應(yīng)答:那是一個我用符咒創(chuàng)造的世界,一個在石頭圖案內(nèi)想象的世界。
石頭是硅片(硬件),咒語就是程序(軟件)。
1.2 計算機語言與人類語言的關(guān)系,學(xué)習(xí)計算機語言與學(xué)習(xí)外語的相似性
語言也是我們?nèi)祟惖闹饕涣魍緩?,要說對方能夠聽得懂的話。若我們想讓計算機遵從我們的意愿工作,就必須對計算機“說”它能夠“聽得懂”的“語言”。
學(xué)習(xí)和使用計算機語言與我們學(xué)期一門外語(如英語)一樣,有兩種方式:
先學(xué)習(xí)單詞、語法,再學(xué)習(xí)語義。
學(xué)習(xí)一定的語法,在使用(編程)中學(xué)習(xí)語義,融會貫通。
我們建議采用第二種學(xué)習(xí)方法,竭力避免為了語法而語法,死記硬背的學(xué)習(xí)是沒有意義的。
1.3 結(jié)構(gòu)化程序設(shè)計的好處
我們吃中餐都有這樣一個體會,同樣一個菜品,在不同的飯店,由不同的廚師做出來的味道迥異。而比如KFC,無論在世界上的哪個店面,口味幾乎是一樣的。同學(xué)們想為什么呢?對,因為KFC建立了一套標準化的食品制作流程,每個環(huán)節(jié)都是規(guī)定好的,細致的,不需要個人主觀“發(fā)揮”的。同樣,程序設(shè)計既可以是“京醬肉絲”,也可以是“漢堡包”??梢允撬囆g(shù),也可以是工程。比較而言,我們更側(cè)重于用工程化的思想和方法來進行程序設(shè)計。進而,有了結(jié)構(gòu)化程序設(shè)計方法,就是為了規(guī)范程序設(shè)計的個人行為的。使得程序有更好的可讀性、可理解性和可移植性。
1.4 正確理解編譯器的提示信息
同學(xué)們在用編譯器對高級語言源程序進行編譯的時候,若有語法錯誤,通常編譯器會告知我們語法錯誤出現(xiàn)在哪一行。有時僅僅有一個語法錯誤,但是編譯器會顯示有很多行都有錯誤。很多同學(xué)不理解,以為出了什么問題,其實這是可以解釋的,如圖1所示:
圖1 編譯器匹配規(guī)則
第一行有5個正確的匹配,如果我拿走了其中的一個(黃色一對中的一個),則高級語言順序編譯器根據(jù)至上而下檢查的原則,會出現(xiàn)4個(而不是一個)失配的錯誤。只要更正了黃色的部分,則所有錯誤消失。
2 宏觀問題
(1)如何才能學(xué)好計算機程序設(shè)計語言?
回答:從模仿開始。
人類學(xué)習(xí)母語是模仿,學(xué)習(xí)計算機程序設(shè)計語言也可以從“照葫蘆畫瓢”開始,在模仿的過程中修正錯誤,掌握知識點,培養(yǎng)程序設(shè)計的思路、方法和技能。
類比,學(xué)習(xí)外語如英語的方法也不該只是大量地背單詞,應(yīng)該是從說話、閱讀、寫作當中學(xué)習(xí),學(xué)會用是最終目的,否則再多的單詞也是沒有生命力的。
(2)if 語句和switch…case語句都能實現(xiàn)選擇分支,是不是二者用哪個都可以?
回答:雖然從語法上,switch…case結(jié)構(gòu)相當于多個if嵌套。也有一些題目來考察兩者的相互轉(zhuǎn)換。但語法不該被亂用或濫用,switch…case結(jié)構(gòu)只有在特定的多分支選擇時才適合使用。
(3)條件表達式可以代替if語句,那么就多用條件表達式對嗎?
回答:這個問題類似于switch…case結(jié)構(gòu)一樣,不能被濫用。只有類似于下面的條件語句
if ?( a>b )
Max = a;
else
Max = b;
才能使用 Max = a>b?a:b;來代替,不是任何if語句轉(zhuǎn)換成條件表達式都是合適和易于理解的。
(4)為什么C語言有“指針”?是必須的嗎?
回答:包括C語言在內(nèi)的任何一種計算機程序設(shè)計語言,都是從實用性出發(fā)的,而不像數(shù)學(xué)定理那樣追求“當且僅當”。C語言的指針并不是必須的,比如C#就沒有指針的概念,但有了“指針”,能夠使程序更具靈活性,在實現(xiàn)某些功能時更方便、快捷。當然,C語言的指針也有一些負面的作用,如野指針。對初學(xué)者來說,C語言的指針也確實是一個難點。但無論如何,同學(xué)們完全可以通過勤學(xué)多練,掌握“指針”。隨著學(xué)習(xí)和應(yīng)用的深入,同學(xué)們會慢慢體會到C語言的“指針”不僅不是阻礙,而且還是解決問題的“利器”。
3 微觀問題
(1)數(shù)組既然是多個數(shù)據(jù)元素的集合,是否可以對數(shù)組所有元素進行整體輸入和輸出?
例如:int a[10];
scanf(“%d”, a);
回答:C語言規(guī)定,數(shù)組的名字代表了數(shù)組首元素的地址(或理解為數(shù)組在內(nèi)存中的起始地址),雖然scanf的參數(shù)表列的要求是地址,但不允許用一個地址將數(shù)組所有元素都輸入,除非要輸入的字符串,且字符串是放到字符數(shù)組中,并當作一個整體來看待的。
正確的方法是:
int a[10], i;
for (i=0; i<10; i++)
scanf(“%d”, &a[i]);
對于字符數(shù)組而言,可以:
int c[10];
scanf(“%s”, c);
(2)如何驗證對浮點數(shù)在“足夠接近”情況下的等值。
回答:浮點數(shù)的定義決定它的絕對精確度會隨著其代表的值變化, 所以比較兩個浮點數(shù)的最好方法就要利用一個精確的閾值。這個閾值和作比較的浮點數(shù)值大小有關(guān)。不要用下面的代碼:
double a, b;
...
if (a == b) /*錯!*/
要用類似下列的方法:
#include <math.h>
if (fabs(a - b) <= epsilon * fabs(a))
epsilon 被賦為一個選定的值來控制“接近度”。你也要確定a 不會為0。
(3)莫要亂寫“;”
C語言程序的一行是以“;”為結(jié)尾的,但不意味著任何一行程序的末尾都要加“;”。比如:
for ( i=0; i<100; i++ )
sum = sum + i;
有很多同學(xué)在for ( i=0; i<100; i++ )后加了一個“;”,這使得本來完成一個功能的語句,硬生生地被“分開”了。
4 結(jié)束語
熟練掌握一門計算機程序設(shè)計語言,無論是對計算機還是非計算機專業(yè)的學(xué)生都是非常重要的。教學(xué)實踐表明,通過不同層次基于問題的學(xué)習(xí),能夠顯著增強學(xué)生的主觀能動性,提升學(xué)習(xí)興趣。本文是在我校教育教學(xué)改革項目的支持下的教學(xué)研究成果。期望在政策的指引下,通過師生的共同努力,探索出適合當代大學(xué)生學(xué)習(xí)計算機程序設(shè)計語言和相關(guān)課程新道路。
參考文獻
2013.09,吉林大學(xué)本科教學(xué)改革研究項目,在線“非計算機專業(yè)計算機程序設(shè)計PBL教學(xué)”內(nèi)容研究,項目編號:2013097;
2013.09,吉林大學(xué)本科教學(xué)改革研究項目,基于PBL理論的《無線傳感器網(wǎng)絡(luò)》課程教學(xué)研究,項目編號:2013093;
2013.09,吉林大學(xué)本科教學(xué)改革研究項目,《物聯(lián)網(wǎng)應(yīng)用系統(tǒng)分析與設(shè)計》課程建設(shè),項目編號:2013091