摘要:教學中方法得當,事半功倍。該文重點闡述了類比法在《C語言程序設計》教學過程中的應用,以函數實例介紹了方法的展開過程,使得教學中的抽象概念具體化,收到良好的教學效果。
關鍵詞:類比法;函數;教學效果
中圖分類號:TP311文獻標識碼:A 文章編號:1009-3044(2009)25-7318-02
Application Analogy in C Programming Teaching
XU Wen-fang
(Xiamen University Tan Kah Kee College Computer Department, Zhangzhou 363105,China )
Abstract: A suitable method can help us get twice the result with half the effort.. This paper is concerned with the application analogy in C programming teaching. By the example of function, Tell us how to apply analogy to programming teaching. It gets good teaching results.
Key words: Analogy;Function;Teaching result
C語言作為一個經典的編程語言,被很多的高校選做編程入門的必修課程。對于計算機專業學生而言,這門課通常在大學第一年開設,課程的主要目地在于使學生掌握程序設計的基本方法和本思想,培養使用計算機解決實際問題的能力,為它對后續專業課程的學習奠定基礎。但對于大一的新生而言,往往對計算機工作原理了解不多,對一些抽象的編程思想,理解時存在一定的困難,致使寫程序時無從下手。所以在教學過程中,采用適當的教學方法將抽象的思想具體化是非常必要的。筆者在教學過程中使用了類比法,收到了良好的教學效果。
類比在漢語字典中的解釋是一種推理方法,根據兩種事物在某些特征上的相似,做出它們在其他特征上也可能相似的結論,這種方法在我們認識新事物時很有幫助。教學中應用類比法,可將抽象概念同生活中熟悉的事物類比,將難理解的編程思想同已學知識類比,下面結合函數相關知識點介紹一下教學過程的展開。
1 針對抽象的參數概念應用類比法
在講解函數參數這個知識點時,一個讓學生很困惑的問題是:什么時候要用實參傳遞數值,什么時候用實參傳遞地址?二者的差別是什么?通過以下示例說明類比法在教學中的展開。
編寫一個子程序實現加密電文的翻譯,其功能是:對于字符字母,字母表中第i個字母變成第(26-i+1)個字母。即:A→Za→z;B→Yb→y;C→Xc→x;對于非字母字符保持不變。例如輸入Blf ziv irtsg!輸出:You are right!
#include
main()
{
void transform(char c);
int i=0;
char ch[80];
printf(\"請輸入密文: \");
gets(ch);
while(ch[i]!='\\0')
{
transform(ch[i]);
i++;
}
printf(\"\翻譯后的電文為: %s\\",ch);
} /* 程序1主函數結束*/
void transform(char c)
{
if( (c >='A') (c <='Z') )
c =155 - c;
else if((c >='a')(c <= 'z'))
c =219-c ;
else
c = c;
} /* 程序1 子函數結束*/
請輸入密文:Blf ziv irtsg!翻譯后的電文為:Blf ziv irtsg!
上述程序1中實參傳遞給形參的是一個變量的值。講解時可將參數傳遞的過程與學生中流行的qq聊天類比。參數傳遞數值就好比A通過qq向好友B傳遞照片, B接收到后如果對照片進行了修改,并不會影響A在本地瀏覽照片,因為過程中是將照片復制了一份給B,實參是將數值復制了一份給子函數transform(),子函數對數值進行了修改,但沒有返回主函數,所以上述程序是沒有起到翻譯作用的。再來看程序2:
#include
main()
{ void transform(char str[80]);
int i=0;
char ch[80];
printf(\"請輸入密文:\");
gets(ch);
transform(ch);
printf(\"\翻譯后的電文為:%s\\",ch);
}/* 程序2 主函數結束*/
void transform(char str[80])
{
int i=0;
while(str[i]!='\\0')
{
if( (str[i] >= 'A') (str[i] <= 'Z') )
str[i] = 155 - str[i];
else if( (str[i] >= 'a') (str[i] <= 'z') )
str[i] = 219 - str[i];
else
str[i] = str[i];
i++;}
}/* 程序2 子函數結束*/
請輸入密文:Blf ziv irtsg!翻譯后的電文為:You are right!
上述程序中實參傳遞了一個地址給形參,好比A通過qq的遠程協助與B共享了自己電腦,這樣B與A看到的是同一個文件,當B修改照片后,A所看到的就是被修改后的照片,通過傳遞地址給子函數,同一段的存儲空間在主函數和子函數transform()之間實現共享,所以這段程序可以輸出翻譯后的電文。
通過以上的類比,使學生清楚看到二者的本質差別,從而在編程時可以結合具體問題靈活的做出選擇。
2 針對易混淆的參數形式應用類比法
對于普通變量做函數參數時,相應的子函數定義以及函數原型的形式多數學生是很容易掌握的,但談到數組元素做函數參數時,很多同學在定義子函數,寫函數原型時就容易同數組名做函數參數混淆,通過下面的表1,容易讓學生看到其實(1)(2)本質上是一樣,所以對于(1)中普通變量做函數參數時的特點,(2)也一樣,這樣就不容易將(2)和(3)混淆了。
3 對于難理解的遞歸思想應用類比法
對于第一次接觸遞歸思想的學生來說,將自己的遞歸思想用代碼實現時往往不知從何處下手,此時可將學生熟悉循環思想與遞歸類比,例如:求斐波那契(Fibonacci)數列的問題,用循環實現求數列第20項值的代碼如程序3所示,用遞歸實現如程序4所示:
#include
main()
{ int i;
int f[20]= {1,1};
for(i = 2;i < 20;i ++)
f[i] = f [i-2] + f[i-1];
printf(″%12d″,f[19]);
} /* 程序3 結束 */
#include
int fib(int n)
{ int z;
if(n == 1 || n == 2)
z = 1;
else
z = fib(n-1) + fib(n-2);
return(z);
}/*求數列各項的遞歸函數*/
main()
{ int fib(int );
int n=20,result;
result = fib(n);
printf(“%d”,result);
} /*程序4結束*/
通過程序3與程序4的對比,可以看到循環思想中的必要元素有:循環初始值,循環結束條件以及循環體。同樣實現遞歸思想的必要元素有:遞歸求解的問題規模,遞歸返回點以及遞歸表達式,找到這些元素后再編寫遞歸程序就容易了。
以上是筆者在c語言程序設計課程教學方法方面的一點嘗試。但這遠不是一個終點,如何將我們熟悉的方法與具體的教學相結合是值得我們不斷探討的問題,總之,希望借著對這些問題的探討,使教學水平得到不斷的提高。
參考文獻:
[1] 譚浩強.C程序設計[M].3版.清華大學出版社,2005 :155-184.
[2] 程艷.C語言程序設計教學中類比法的運用[J]. 教職論壇,2003(18):34.