段紅義
摘要:函數(shù)是實現(xiàn)模塊化程序設計的基礎,是《C程序設計》課程教學的重點與難點內容,但是由于函數(shù)涉及內容比較復雜,知識點多,對于初學者來說理解、掌握并應用函數(shù)處理實際問題往往比較困難。針對我院應用型本科教學實際,結合筆者多年教學經驗,在課堂教學中滲透模塊化程序設計思想,教學過程中以案例教學為主,結合啟發(fā)、提問、類比、圖示、動畫演示、上機實踐等教學方法與手段,以達到讓學生積極主動參與課堂教學,激發(fā)學生的學習興趣,幫助學生更好地理解函數(shù)的教學內容,從而提高課堂教學效果。
關鍵詞:函數(shù);模塊化程序設計;課堂教學;教學方法
中圖分類號:G642 ? ? ? ?文獻標識碼:A
文章編號:1009-3044(2020)31-0119-03
函數(shù)是《C程序設計》課程中教學的重點與難點,同時它也是進行模塊化程序設計的基礎,對于培養(yǎng)學生建立并使用模塊化程序設計思想處理復雜程序設計問題起著重要的作用。由于函數(shù)教學內容比較復雜,涉及的知識點較多,對于初次接觸程序設計的學生而言,由于對函數(shù)知識理解掌握不夠扎實,應用函數(shù)去處理實際問題的時候往往會遇到很多困難,如何讓學生更好地理解與掌握函數(shù)的知識并利用函數(shù)來設計一些相對復雜的程序,就需要教師在教學過程中滲透“模塊化程序設計”思想理念,講明白函數(shù)的設計思路,設計方法,調用與參數(shù)傳遞的過程。本文以我院應用型本科教學實際為例,結合筆者多年的教學體會與經驗,探討通過由淺入深,循序漸進的方式,采取案例法、提問法、啟發(fā)法、類比法、圖示法、動畫演示、上機實踐等多種教學方法與手段,倡導以學生為中心的教學理念,讓學生積極主動參與課堂教學,積極進行課堂互動,從而調動學生的學習積極性,提高課程的教學效果。
1 在函數(shù)教學中滲透“模塊化程序設計”思想
為了提高學生進一步學習新知識的欲望與興趣,引出函數(shù)的概念,先讓學生了解模塊化程序設計的思想。通過啟發(fā)與提問相結合的方法引導學生進行思考,通過回顧前面學習過的知識,讓學生進行思考當我們遇到一個大的問題時如果將所有的程序代碼全部放在主函數(shù)中會有什么缺點?對于這個問題如果我們仍然利用前面學過的知識去解決,將程序的代碼全部都放在主函數(shù)中,那么主函數(shù)將會變得越來越復雜,這樣做程序的可讀性比較差而且也不利于日后對程序進行修改、功能擴展。通過引出問題讓學生去思考用什么樣的方法去解決這個問題?這樣我們就可以輕松引入模塊化程序設計的思想了。模塊化程序設計為我們處理大型的、復雜的問題提供了一種設計的方法,在大型軟件的設計過程中無不體現(xiàn)這種設計思想。模塊化程序設計就是將一個大的程序按照其功能的不同劃分為若干小程序模塊,每個小的程序模塊完成一個特定的功能[1]。就好比我們玩的搭積木游戲,每一個積木可以看成一個模塊即函數(shù),我們用不同的積木來經過合理的擺放就可以搭建好一個游戲房子,對于我們所處理的一個大的程序而言,它就好比是一個大房子,該程序是由不同功能的子程序(模塊或函數(shù))所構成的,當我們把所有的子程序設計好以后,通過對它們的調用就可以完成程序設計。在C程序中,模塊化程序設計通過函數(shù)來實現(xiàn)[2]。利用函數(shù)我們可以實現(xiàn)一次定義,多次使用的目的,達到程序的復用性。通過講解模塊化設計思想使學生進一步理解在處理大的復雜的程序設計問題時,我們應該采取什么樣的設計方法,為學習函數(shù)的知識做好鋪墊。
2 函數(shù)教學中主要教學方法的使用探究
為了讓學生更容易理解與掌握函數(shù)這部分知識,教學過程中應遵循學生對知識認知規(guī)律的特點,講授過程應采取循序漸進,由淺入深,由易到難,對不同的知識點采取不同的教學方法,并且在授課時與前面的知識內容進行有效的聯(lián)系,下面以三個案例為主對教學中使用的主要方法進行探討。
2.1 類比法在函數(shù)教學中的使用
在程序設計中有許多相似的題目與問題,當我們設計出其中的一個問題時,可以通過類比的方法設計出其他相類似的問題。
案例1:利用函數(shù)求1+2+3+…+n的值。
分析:這是一個簡單的求和問題,在循環(huán)結構程序設計一章我們對該程序的設計方法做了重點介紹??梢允褂肅語言提供的三種不同的循環(huán)語句來進行設計。以for語句為例,可以寫出其核心代碼如下:
int n,i,sum;
sum=0;
printf(“輸入變量n=”);
scanf(“%d”,&n);
for(i=1;i<=n;i++)
sum=sum+i;
printf(“sum=%d”,sum);
該程序比較簡單,但是每次執(zhí)行只能求一次累加和,不能重復使用,如在程序中要同時求解1+2+…+10,1+2+…+100的和,就需要重復書寫除第一條語句以外的其他代碼兩次。我們可以使用函數(shù)來達到一次定義,多次使用的目的,根據(jù)函數(shù)定義的語法規(guī)則,對上面的程序段稍做修改,就可以修改為一個可以反復調用的函數(shù)。求1+2+…+n問題可以用下面的這個函數(shù)sum來實現(xiàn):
intsum(int n)//函數(shù)頭部,指出函數(shù)的類型,函數(shù)名,調用函數(shù)時需要的參數(shù)個數(shù)及其類型
{
ints,i;
s=0;
for(i=1;i<=n;i++)
s= s*i;
return s;
}
在main函數(shù)中我們可以反復地調用這個函數(shù),只需給該函數(shù)提供不同的參數(shù)值即可。如有如下語句:
int s1,s2;
s1=sum(10);//求解1+2+…+10的累加和
s2=sum(100);//求解1+2+…+100的累加和
通過案例1的學習,引導學生在學習該例的基礎上模仿寫出如下實現(xiàn)方法與例1類似的函數(shù),達到對知識的融會貫通,舉一反三。
如求2+4+…+n,1+1/2+1/3+…+1/n等類似累加的數(shù)學問題。
這類問題的設計與案例1函數(shù)設計方法比較類似,也是借助循環(huán)語句進行處理的,對案例1的程序稍作修改即可寫出這些函數(shù)。另外對于第二個函數(shù)的設計可以引導學生需要將累加語句改為s=s+1.0/n;才能得出正確的結果,另外還需要將函數(shù)的返回值與累加變量s修改為double類型。
2.2用圖示對函數(shù)調用“虛實結合”的過程進行分析
函數(shù)設計完成后就可以使用該函數(shù)了,即通過調用函數(shù)來完成相應的操作,在函數(shù)調用時,對于有參函數(shù)來說涉及函數(shù)參數(shù)的傳遞,即需要將實參的值傳遞給形參,當形參獲取到相應的值之后,就可以在函數(shù)體內對相關的量進行操作,這個過程稱為“虛實結合”。參數(shù)傳遞分為“傳值”和“傳址”, “傳值”過程相對比較簡單,就是一個數(shù)據(jù)值的復制操作,是一個單向的操作,即實參把數(shù)值傳遞給形參變量,在函數(shù)體內對形參的操作不會影響到實參,這個過程學生比較容易理解,但是“傳址”過程比較復雜,學生理解起來就有一定的困難了,因為“傳址”過程涉及地址即指針的知識,為了讓學生深入理解“傳值”和“傳址”過程,通過圖示可以直觀形象的標識實參與形參在函數(shù)調用過程中的數(shù)值狀態(tài)。以案例2為例說明:
案例2:編寫函數(shù)實現(xiàn)修改兩個實參變量的數(shù)值。
先看下面的自定義函數(shù)swap1,分析為什么該函數(shù)不能實現(xiàn)交換兩個實參的數(shù)值,其代碼如下:
void swap1(int x,int y)
{
int temp;
temp=x;x=y;y=temp; //交換形參數(shù)據(jù)語句
}
int main()
{
int a=100,b=200;
swap1(a,b); //函數(shù)調用語句,使用普通變量作為實參參數(shù)
printf(“a=%d,b=%d”,a,b); //測試實參數(shù)據(jù)是否變化
}
分析:主函數(shù)中定義了兩個整型變量a,b,其值分別為100和200,在函數(shù)調用時,以a,b作為實參,程序將把a,b的值傳遞給形參變量x,y,所以x的值為100,y的值為200,接下來執(zhí)行交換語句,形參x的值變?yōu)?00,y的值變?yōu)?00,當函數(shù)調用執(zhí)行完后返回到主函數(shù)時,執(zhí)行打印語句得到輸出結果a=100,b=200。本案例程序執(zhí)行過程中實參與形參變量的值的變化用圖1,圖2所示:
通過該例我們可以總結出當用普通變量作函數(shù)參數(shù)時,只能夠將實參的數(shù)值傳遞給形參,而不能通過對形參的操作來實現(xiàn)修改實參,這個參數(shù)傳值稱為單向的值傳遞[4]。
對本例做如下修改,將形參修改為指針參數(shù),實參修改為地址,然后進行分析。
void swap2(int *x,int *y)
{
int temp;
temp=*x;*x=*y;*y=temp; //交換形參所指對象的值
}
int main()
{
int a=100,b=200;
swap2(&a,&b); //函數(shù)調用語句,使用地址作為實參,把a,b的地址值傳遞給形參
printf(“a=%d,b=%d”,a,b); //測試實參數(shù)據(jù)是否變化
}
分析:同樣在主函數(shù)中定義了兩個整型變量a,b,其初值仍然為100和200,但是在函數(shù)調用時,是把a與b的地址值作為實參傳遞給形參變量x與y,所以x的值為&a,y的值為&b,通過參數(shù)傳遞形參指針變量x指向主函數(shù)中的變量a,形參指針變量y指向主函數(shù)中的變量b,接下來執(zhí)行自定義函數(shù)中的交換語句,*x與*y的值進行了交換,因為*x為指針變量x所指的對象即為主函數(shù)中的變量a,同理*y為主函數(shù)中的變量b。同時需要注意雖然*x與*y的值發(fā)生了變化,但是x與y的值卻沒有變化。當函數(shù)調用執(zhí)行完后返回到主函數(shù)時,執(zhí)行打印語句得到輸出結果a=200,b=100。修改后的程序執(zhí)行過程中實參與形參變量的值的變化用圖3,圖4所示:
通過修改后的例子我們能夠發(fā)現(xiàn)并總結出如果要在自定義函數(shù)中實現(xiàn)修改主調函數(shù)中的變量,可以使用指針變量作為形參,使用普通變量的地址作為實參,這樣就可以間接地實現(xiàn)利用形參對實參的修改,故稱為“雙向數(shù)據(jù)傳遞”。
2.3在遞歸函數(shù)設計中數(shù)學思維及動畫演示的使用
遞歸函數(shù)是《C程序設計》課程中的一個難點,如果定義函數(shù)時在函數(shù)體內調用自定義函數(shù)本身,執(zhí)行時形成遞歸調用,稱該自定義函數(shù)為遞歸函數(shù)。在講授遞歸函數(shù)內容的時候,可以結合數(shù)學遞推思維來描述遞歸問題。
案例3:編寫遞歸函數(shù)求n!。
根據(jù)高中學習過的知識,啟發(fā)學生求解n!可以寫成如下的數(shù)學遞歸公式:
如果用函數(shù)double fac(int n)表示n!,其中fac表示函數(shù)名,整數(shù)n表示形參,通過該公式發(fā)現(xiàn),求解n!有兩種情況(1)當n=0或1時,n!=1,即fac(1)=1或fac(0)=1即函數(shù)返回值為1;(2)當n>1時,n!=n*(n-1)!,即fac(n)=n*(n-1)!,函數(shù)返回值為n*(n-1)!。顯然求解(n-1)!仍然需要調用該函數(shù)自身即調用fac(n-1),即這是一個遞歸問題。
根據(jù)分析并按照函數(shù)定義語法規(guī)則,可以寫出如下遞歸函數(shù):
double fac(int n)
{
if(n==0 || n==1)
return(1);
else
return(n*fac(n-1));
}
在設計遞歸函數(shù)時,應給學生特別強調遞歸函數(shù)設計一定要滿足兩個要素,一個是能夠根據(jù)題目寫出相應的遞推公式,另一個是遞歸函數(shù)調用的結束條件,二者缺一不可,否則會造成設計上的錯誤。
遞歸函數(shù)的調用執(zhí)行是一個非常復雜的過程,學生對這個過程理解起來有很大的難度,為了讓學生更好理解“回溯”與“遞推”,在教學中采用動畫來演示其執(zhí)行的過程,通過動畫演示可以形象直觀的表示遞歸函數(shù)的調用執(zhí)行過程。動畫演示在教學過程中具有形象、生動、直觀且感染力強的優(yōu)勢,能清晰地展現(xiàn)出需要強調的主要教學內容,輕松化解教學難點知識,使復雜的教學過程得到簡化,同時也可以減輕教師工作量[5]。
3 結束語
通過函數(shù)我們可以實現(xiàn)模塊化程序設計,學習使用函數(shù)對于培養(yǎng)學生處理解決大的復雜的問題具有極其重要的作用,所以在教學中,讓學生掌握好函數(shù)的知識非常重要,教學應以學生為中心,采取多種方法與手段,充分調動學生的自主學習意識,學習興趣、學習積極性。本文只介紹了函數(shù)教學中使用的其中的幾種方法,這些方法不是孤立使用的,在教學中我們可以將這些方法進行有效的融合,多使用形象,直觀的教學方法,這樣可以使教學中的難點問題簡單化,便于學生理解與掌握,有助于課堂教學的提高。
參考文獻:
[1] 賴均,等.軟件工程[M].清華大學出版社,2016.
[2] 譚浩強.C程序設計(第五版)[M].北京:清華大學出版社,2017.
[3] 吳登峰,等.C語言程序設計[M].北京:中國水利水電出版社,2015.
[4] 趙娟,樊超.C語言函數(shù)參數(shù)傳遞規(guī)律[J].現(xiàn)代電子技術,2012,35(4):55-56.
[5] 彭冬生.動畫演示在《材料科學基礎》教學中的應用[J].科技創(chuàng)新導報,2013,10(9):158.
【通聯(lián)編輯:代影】