程起才+周天彤+王軍+王洪元+潘操
摘要:從循環(huán)結(jié)構(gòu)的特點(diǎn)出發(fā)分析連加連積類問題,總結(jié)出數(shù)列中數(shù)據(jù)的構(gòu)造規(guī)律,給出該類問題的編程模板,列舉實(shí)例進(jìn)一步驗(yàn)證該類問題的編程方法。該教學(xué)設(shè)計(jì)在我校C語言教學(xué)中,效果非常明顯。
關(guān)鍵詞:C語言;程序設(shè)計(jì);連加;連積;模板
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)10-0069-03
C語言是目前使用最廣泛的高級(jí)程序設(shè)計(jì)語言之一。C語言表達(dá)能力強(qiáng)、使用方便靈活,目標(biāo)程序執(zhí)行效率高、可移植性好,既可用于編寫系統(tǒng)軟件,也可用于編寫應(yīng)用軟件[1-2]。因此很多高校把C語言作為理工類專業(yè)的計(jì)算機(jī)程序設(shè)計(jì)的入門語言。C語言包含了三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu),其中循環(huán)結(jié)構(gòu)的程序設(shè)計(jì)是最難的部分。筆者在講解時(shí),通常把問題進(jìn)行分類,如連加和連積類、窮舉類、迭代類、圖案打印類等等。其中,連加和連積類是最基本的,也是學(xué)生必須掌握的基本編程技巧。但是,學(xué)生們?cè)诼犂蠋熤v課的時(shí)候基本上能夠理解,但是自己動(dòng)手編程實(shí)現(xiàn)時(shí),往往就不能得到正確結(jié)果,有的問題甚至無從下手。究其原因,筆者認(rèn)為主要是學(xué)生們沒有真正理解循環(huán)結(jié)構(gòu)的本質(zhì)以及連加和連積類問題的特點(diǎn)。本文從循環(huán)結(jié)構(gòu)的特點(diǎn)出發(fā),多角度分析連加連積類問題,給出這類問題的編程模板,讓讀者能夠準(zhǔn)確快速地編程實(shí)現(xiàn)該類問題。
1 連加與連積類問題分析
連加與連積類問題核心是如何通過已知條件去構(gòu)造數(shù)列中第[n]個(gè)數(shù)[Jn,1≤n]。如果每個(gè)數(shù)都能構(gòu)造出來,那么把這個(gè)數(shù)進(jìn)行連加和連乘就變得相當(dāng)簡(jiǎn)單。已知條件通常是[Jn]的位序[n]以及[Jn]之前的數(shù)列[Jk,1≤k 1)[Jn]僅僅與其位序[n]有關(guān),即[Jn=f(n)]。 2)[Jn]僅僅通過前面已經(jīng)得到的序列[Jk]構(gòu)造,即[Jn=f(Jk),1≤k 3)[Jn]不僅與其位序[n]有關(guān),而且還與前面已經(jīng)得到的序列[Jk]有關(guān),[Jn=f(n,Jk)]。 4)[Jn]不能由上述三個(gè)式子構(gòu)造出來,但是[Jn]中的一部分[J'n]卻可以,而且[J'n]一旦得到,那么[Jn]也就得到了。 2 連加與連積類問題模板代碼設(shè)計(jì) 當(dāng)把數(shù)列的[Jn]項(xiàng)是如何構(gòu)造的分析出來之后,接下來就可以設(shè)計(jì)模板代碼了。 首先以連加類問題為例分析編碼步驟: 2.1連加類問題模板代碼設(shè)計(jì)步驟 1)定義三個(gè)變量[i,j,sum]。其中[i]表示位序,即當(dāng)前進(jìn)行累加的數(shù)是數(shù)列中第幾項(xiàng),[j]表示參加累加的數(shù),[sum]是累加器。根據(jù)具體題目,為[i,j,sum]選擇合適的數(shù)據(jù)類型,并對(duì)其進(jìn)行如下初始化:[i=1],[ j=]數(shù)列中的首項(xiàng),[sum=0]。 2)建立循環(huán)條件表達(dá)式。根據(jù)題目,判斷循環(huán)是基于“次數(shù)”已知的循環(huán),還是基于“一直連加,直到某一項(xiàng)滿足某個(gè)條件就停止”的循環(huán)。對(duì)于“次數(shù)”已知的循環(huán),則其循環(huán)條件表達(dá)式寫成[i≤=次數(shù)];對(duì)于“一直連加,直到某一項(xiàng)滿足某個(gè)條件就停止”的循環(huán),則其循環(huán)條件表達(dá)式寫成“[j]滿足的條件”。 3)寫模板代碼。 這段模板代碼中,最核心的是“如何構(gòu)造下一次運(yùn)算的[j]”。 2.2連積類問題模板代碼設(shè)計(jì) 連積類問題與連加類問題很相似,主要是把連加類問題的步驟(1)的[sum]改成[sum=1],把步驟(3)的[sum+=j]改成[sum*=j]。另外,因?yàn)檫B乘容易導(dǎo)致[sum]值超出int類型范圍,所以在連加類問題中定義成int類型的問題,在連乘類問題里,可能要改成double范圍。 3 案例驗(yàn)證 為了讓讀者更好地理解上述方法,本節(jié)列舉多個(gè)實(shí)例進(jìn)行講解。 例1:求下列數(shù)列前10項(xiàng)和。 分析:從題目中可以看出:[Jn=f(n)=Jn-1*10+a];因?yàn)槭乔笄?0個(gè)數(shù)之和,即循環(huán)次數(shù)是已知的,所以循環(huán)條件表達(dá)式寫成[i≤=10]。定義三個(gè)整型變量并且初始化[i,j,sum],依據(jù)模板代碼,本題的代碼如下: int i=1,j=2/*數(shù)列的首項(xiàng)是2*/,sum=0; [a+aa+…+a…a] 分析:從題目中可以看出:[Jn=fn=Jn-1*10+a];因?yàn)槭乔笄皀個(gè)數(shù)之和,即循環(huán)次數(shù)是已知的,所以循環(huán)條件表達(dá)式寫成[i≤=n]。定義三個(gè)整型變量并且初始化[i,j,sum],依據(jù)模板代碼,本題的代碼如下: 對(duì)于模板代碼中的核心j=j*10+a,讀者要清楚=右邊的j是當(dāng)前參加運(yùn)算的j,即它的位序是i,它與sum+=j的j一樣,=左邊的j是下一次參加運(yùn)算的j,即它的位序是i+1。這個(gè)式子可以簡(jiǎn)單表述為后一次的j等于前一次的j乘以10加首項(xiàng)。 例3:求下列數(shù)列前n項(xiàng)和。 [s=1+11+2+…+11+2+3+…+n] 分析:從題目中可以看出[Jn]既不是n的函數(shù),也不是[Jk]的函數(shù),但是[Jn]的分母[Jn]=[Jn-1]的分母[Jn-1]+[Jn]的位序n。因?yàn)槭乔笄皀個(gè)數(shù)之和,即循環(huán)次數(shù)是已知的,所以循環(huán)條件表達(dá)式寫成[i≤=n]。定義三個(gè)變量并且初始化[i,j,sum],依據(jù)模板代碼,本題的代碼如下: 例4:求[π ]的展開式,直到某一項(xiàng)小于0.0005時(shí)停止。 [π2=1+13+1*23*5+…+1*2*…*n3*5*…*(2n+1)]
分析:從通項(xiàng)公式[1*2*…*n3*5*…*(2n+1)]得出,當(dāng)n=1時(shí),結(jié)果是[13],當(dāng)n=2時(shí),結(jié)果是[1*23*5]。即[π2]展開式中,首項(xiàng)1不滿足通項(xiàng)公式的規(guī)律。所以若數(shù)列中首項(xiàng)或者前幾項(xiàng)不滿足整個(gè)數(shù)列的規(guī)律,可以將這些無規(guī)律項(xiàng)事先初始化到累加器里。很明顯[Jn=Jn-1*n2n+1],循環(huán)次數(shù)是未知的,所以循環(huán)條件表達(dá)式寫成[j≥0.0005]。定義三個(gè)變量[i,j,sum],并且初始化i=1,j初始化為有規(guī)律數(shù)列的首項(xiàng),本題j=1.0/3,sum初始化為無規(guī)律項(xiàng)的和,本題sum=1。依據(jù)模板代碼,本題的代碼如下:
例5:求下列數(shù)列前n項(xiàng)之積。
[1!*2!*…*n!]
分析:很明顯[Jn=Jn-1*n],循環(huán)次數(shù)是已知的,所以循環(huán)條件表達(dá)式寫成[i≤n]。定義三個(gè)變量[i,j,sum],并且初始化i=1,j=1,因?yàn)槭沁B乘,所以 sum初始化=1,考慮到階乘和連乘的結(jié)果容易超出整數(shù)范圍,對(duì)j和sum都定義成double類型。依據(jù)模板代碼,本題的代碼如下:
例6:求下列數(shù)列前10項(xiàng)和。
[2-4+6-…+2n]
分析:本題與例1很相似,僅僅需要考慮正負(fù)號(hào)處理。正負(fù)號(hào)處理通常有兩種方式:(1)定義整型變量f,視第一項(xiàng)是正數(shù)還是負(fù)數(shù)將f初始化為f=1,或f=-1,然后把sum+=j改成sum+=f*j,把sum*=j改為sum*=f*j;最后在循環(huán)體里加入一條f=-f。(2)若第一項(xiàng)是正數(shù),將sum+=j改為sum+=[-(-1)i*j],sum*=j改為sum*=[-(-1)i*j],若第一項(xiàng)是負(fù)數(shù),將sum+=j改為sum+=[(-1)i*j],sum*=j改為sum*=[(-1)i*j]。本題兩種解法的代碼如表1所示:
4結(jié)束語
連加和連積類是最基本的,也是學(xué)生必須掌握的基本編程技巧。本文從循環(huán)結(jié)構(gòu)的特點(diǎn)出發(fā),多角度分析連加連積類問題,給出這類問題的編程模板,讓讀者能夠準(zhǔn)確快速地編程實(shí)現(xiàn)該類問題,該方法在我校C語言教學(xué)中效果非常明顯。
參考文獻(xiàn):
[1]譚浩強(qiáng).C語言程序設(shè)計(jì)[M].3版.北京:清華大學(xué)出版社,2005.
[2]程起才,王洪元,向艷,等.C語言教學(xué)改革與教學(xué)心得[J].電腦知識(shí)與技術(shù),2011(7):1694-1695.