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