周思方 彭 力
摘要:C語言是一門非常重要的專業基礎課程,直接影響后續專業課的學習和編程能力的培養,因此,針對語言特點,不斷探索更為有效的教學方法,顯得尤為重要。實踐中,筆者把“啟發式”和“案例驅動”教學方法結合起來,取得了良好的教學效果。在明確了C語言的教學目標的基礎上,把提高學習興趣、培養編程能力作為重點,結合實踐,對“啟發式”和“案例驅動”教學方法進行了探索,對于C語言教學方法改進具有參考價值。
關鍵詞:C語言教學;啟發式;案例驅動
中圖分類號:G642.41文獻標志碼:A文章編號:1002-2589(2009)17-0221-02
一、引言
C語言的發展貫穿了計算機發展的幾乎整個歷程,蘊含了程序設計的基本思想和相關概念,如程序設計、數據結構等重要考業課程都以C語言為背景,再加上它應用廣泛,從操作系統、數據庫系統、通訊、數據處理,甚至嵌入式應用都大量使用C語言開發。所以,在高校作為重要的專業基礎課程,C語言教學的重要性是公認的。作者多年來從事C語言的教學,實踐中發現在明確的教學目標下,精心設計教學內容,并將“啟發式”與“案例驅動”結合起來能取得較好的教學效果。下面是作者提煉出的教學心得,以期拋磚引玉。
二、明確的教學目標
教學中,首先應明確教學目標。C語言的第一節課很重要,有的老師為了趕課時可能匆匆略過,沒有講到位就直接進入后序章節中,學生沒有真正領悟學習C語言的重要性,沒有激發出主動獲取知識的動力,造成被動的接受知識,學到最后可能也不學習C語言有什么用。為避免這種情況,第一次課我們就應突出以下三個方面:
(1)為什么說C語言是一門重要的專業基礎課程?除了為后序課程做準備外,它還能做哪些應用,并用C語言編的實例程序演示一下,會收到很好的教學效果,學生會很喜歡,也讓學生明白學習C語言的目的,激發學習興趣。
(2)規劃教學內容,明確學習方向。把C語言的大綱給學生展示及課程設計所包含的內容,最后達到的目標,讓學生明確大致的方向。
(3)溝通“教”與“學”的方法。老師準備如何教?讓學生怎樣學?對于初學編程語言的學生來說非常重要,花些時間,會起到事半功倍的作用。大學里的學習和高中明顯不同,更要注重提高學生的主動性,教師在此可以給學生提供一些資料、網址及學習方法,讓學生沒有畏難心理,并可以主動學習。
三、精心設計的教學內容
教材在教學中起著至關重要的作用,在教學當中,吃透教材,但又不能局限于教材,安排好教學內容很關鍵,也能起到畫龍點睛的作用。
例如在求解最大公約數時,很多教科書只給出一個經典的輾轉相除算法,如果我們就這樣直接講解時,學生很可能不知道為什么非要這樣寫呢?這是根據一個數學定理得到的求最大公約數的算法,大部分學生都不知道這個定理,所以不能理解。但我們在講解時,可以安排先從最大公約數的定義出發,即幾個數所公有的約數叫這幾個數的公約數,公約數中最大的一個叫做這幾個數的最大公約數。按照該理論可以寫出學生容易理解的算法:
void main()
{
int m, n, j;
printf("input n,m(n>0,m>0)");
scanf("%d%d",&n,&m);
j=(n for(;j>0;j--) { if(n%j==0&&m%j==0) break; else continue; } printf("max gys is:%d
",j); } 該程序的思想是,從兩個數中選出較小的那個整數,從它開始依次遞減(步長為1),直到某個數可以同時整除這兩個數,最先滿足條件的就是最大公約數。先按照學生的普遍思路出發講解這個簡單的程序實現方法,然后再講解經典算法,學生就會更自信,興趣也會更濃。 另外,有些章節可以根據情況詳略得當,大學里的學生要培養其逐步養成自學的能力,有些內容可以適當的留給學生自己,讓學生自己去理解,去做題目,以增加其成就感。 在教學中,還應參考一些其它的教材,可以豐富知識,引入更加合適的案例,建議可以參考一下國外的教材,因為國外的有些教材與實例結合,解決當前熱點問題,如移動通信、網絡的配置、DNA結構圖繪制等,講述了解決問題的系統的方法,講述了利用軟件工程方法設計出內聚的、可讀性好的、可重用的模塊化程序解決方案。可以引薦給學生,以提高其知識面,也可以彌補一些教材的不足。 四、結合案例應用啟發式教學 有了前面的基礎,教學中再安排一些案例,啟發學生思考,效果會更好。對于學生而言,很想學習一些實踐性的例子,所以在適當的章節中應該有一個切合實際的例子。比如講到指針和數組時,這是一個難點,學生會感到很難,并且不知如何運用,此時以撲克牌游戲為例,先以52張牌為基準,從“洗牌”還有“發牌”講起,這中間我們用到了指針數組、隨機函數、雙重循環語句等,由復雜到簡單,把復雜的難以接受的語句和算法通過強烈的興趣變成容易接受和消化吸收。這種教學方法,特別適合學生掌握了一定的方法之后再進一步的理解和加深并學會靈活運用的能力,在教學當中,可以從以下幾點啟發學生。 (一)啟發學生復雜的事情簡單的做 當面對一個復雜的程序時,應讓學生明白不能選擇逃避,而是如何想辦法解決它,如何把復雜的程序從大的模塊分析化簡為若干個小的模塊再到具體的算法。拿撲克牌游戲為例,當看到這個題目學生可能感到無從下手,先分析需要幾個函數,再到具體實現。在具體實現中比如洗牌時先分析這52張牌需要多少個變量,這些變量應該如何定義,通過分析我們得出: char*p[4]={"黑桃","紅桃","梅花","方塊"};//四種花色 int a[4][13]={0}; //每種花色對應13張牌,共52張,初始值為0,為洗牌準備 int row,clon;//隨機的行與列(4行與13列) 最關鍵的是算法的選取,52張牌(1-52)我們要放在隨機的位置上,應如何放,這要用到隨機函數,循環語句,然后得出: for(int i=1;i<53;i++)//共52張牌 {while(1)//找出一個隨機的行與列 {row=rand()%4; clon=rand()%13; if(a[row][clon]==0)//如果這個位置是空的就填上,然后退出內循環 a[row][clon]=i; break; } else continue; //如果已填上就繼續找 }} 學生看到原來一個撲克牌游戲就是如此實驗出來的,感覺很有意義,也對C越來越感興趣,趁熱打鐵,此時啟發學生如果加上兩張大王的話,又該如何編寫呢?從而引起學生深深的思考,化被動為主動。 (二)啟發學生簡單的事情認真的做 啟發學生越是簡單的東西越不能忽視,看似簡單的程序,里面任何一個環節都要研究透徹,不能大意。對于洗牌程序來說算法已有,那發牌程序又如何編寫呢?可以先讓學生自己考慮,經過測試,有一部分學生這樣寫: for(int i=0;i<4;i++) for(int j=0;j<13;j++)
{ if(m%2= =0)//m已定義過,初值為0
printf(" ");//分兩列輸出
prinf("%d",a[i][j]);
m++;
}
當場運行給學生,會發現發牌是一樣的,和洗牌的結果不一致。看似簡單,但一下手就錯,如何改進?和洗牌結合起來:
for(int k=1;k<53;k++)//52張牌
for(int i=0;i<4;i++)
for(int j=0;j<13;j++)
{ if(m%2= =0)//m已定義過,初值為0
printf(" "); //分兩列輸出
if(a[i][j]= =k)//找到第1、2……牌
{prinf("%d",a[i][j]);
m++;}
}
學生會恍然大悟,看似簡單的東西,要不斷實驗,最后才能得出正確結果。
(三)啟發學生認真的事情反復的做
還是拿上例為準,當場將編好的程序反復驗證,發現是有規律的,為什么會出現這樣的情況,隨機發牌應該是無規律的,這是因為隨機種子一樣,所以產生的隨機數一樣。程序修改為:
srand(time(0));//給隨機數產生一個隨機種子(seed),時間在變化,所以種子也不同
for(int i=1;i<53;i++)//共52張牌
{while(1)//找出一個隨機的行與列
{row=rand()%4;
clon=rand()%13;
if(a[row][clon]= =0)//如果這個位置是空的就填上,然后退出內循環
a[row][clon]=i;
break;
}
else continue; //如果已填上就繼續找
}}
啟發學生考慮成熟的東西還需要不斷測試與驗證,直至達到合乎要求的結果。從這個例子中學生會學到書上沒有的一些知識點,有種學有所用的感覺。
(四)啟發學生反復的事情創新的做
啟發學生在反復測試一些程序的時侯,看有無更好的解決辦法,代碼能簡化的盡量簡化,但又不能影響程序的可讀性。創新能力對于培養學生的基本素質也很重要,但這需要學生了解更多的知識,促使學生主動學習,培養其獨立發現和解決問題的能力。
五、總結
本文主要提出了“啟發式”與“案例驅動”相結合的教學方法。老師在教學中起到的作用不僅是傳授知識,指點方向也很重要,要不斷挖掘學生的潛能。教學是個不斷發展的過程,教學當中,要根據學生情況具體對待,找出一套適合自己學生學習的好方法,不斷總結,尋找經驗,以取得更大的教學效果。
參考文獻:
[1]中國高等院校計算機基礎教育課程體系[M].北京:清華大學出版社,2006.
[2]劉達明,甘玲.如何提高計算機專業的C語言教學質量[J].計算機教育,2005,(8):32-33.
[3]張瑩.淺談高職院校的項目教學模式[J],江蘇高教,2008,(1):25-26.
[4]徐涵.行為導向教學中的教師角色轉換[J].中國職業技術教育,2006,(4):14-16.
(責任編輯/石銀)