王叢林
摘 要:C語言是一門理想的結(jié)構(gòu)化程序設(shè)計語言,是學(xué)生學(xué)習(xí)程序設(shè)計的基礎(chǔ)課程。可通過對比手工計算,分析C語言組織循環(huán)的方法,著重討論累加、累乘問題的計算,以及組織循環(huán)應(yīng)注意的問題,讓學(xué)生更好地掌握這一知識。
關(guān)鍵詞: C語言;組織循環(huán);計算方法
C語言是一門理想的結(jié)構(gòu)化程序設(shè)計語言,開設(shè)C語言程序設(shè)計課程的目的是要求學(xué)生利用C語言進行程序設(shè)計,重點在掌握程序設(shè)計的方法。程序設(shè)計通常包括以下幾項:針對提出的問題,研究確定求解的計算方法(算法)、根據(jù)計算方法繪制流程圖、根據(jù)計算流程圖編寫程序。其中,計算方法是程序設(shè)計靈魂,是編程的關(guān)鍵。
一、計算方法的比較
關(guān)于計算方法的選擇,必須注意到手算和計算機算有很大的差別的。手算更偏重于用人的經(jīng)驗去選擇恰當(dāng)?shù)耐緩絹肀M量減少工作量,縮短計算時間,提高計算精度;但是使用計算機時,多采用具有相同算法結(jié)構(gòu),簡單重復(fù)的計算,這樣能充分發(fā)揮計算機的長處,(運算速度快,最適合于重復(fù)操作,它有自動判斷的功能,因此,能控制重復(fù)執(zhí)行的次數(shù))。循環(huán)的計算結(jié)構(gòu)便于編寫程序,減少運算次數(shù)、提高計算速度,因此,程序設(shè)計語言中的循環(huán)語句成為具有廣泛應(yīng)用的基本語句之一,程序借助循環(huán)語句可以比較簡單地實現(xiàn)計算問題中包含的多次重復(fù)的計算(有規(guī)律的重復(fù)問題)。
例如:以下問題求解,用手工操作是這樣的:
①試求 1+2+3+4+……+100 的值
[分析與解] 利用等差數(shù)列求公式。(首項+末項)×項數(shù)÷2=(1+100)×100÷2=5050.
②試求 1×2+2×3+3×4+……+99×100的值
[分析與解] 用整數(shù)列項。原式=(1×2×3+2×3×3+3×4×3+4×5×3+……+99×100×3)÷3 = [1×2×3+2×3×(4-1)+3×4×(5-2)+4×5×(6-3)+……+99×100×(101-98) ]÷3=[99×100×101]÷3=333300.
③試求1×1+2×2+3×3+……99×99+100×100的值
[分析與解]利用平方差公式。1×1+2×2+3×3+……+n×n=n(n+1)(2n+1)÷6,原式=100×101×(2×100+1)÷6=338350.
上述問題,用計算機求解是這樣的:用“迭代”的方法進行運算。設(shè)一個變量s,用它來存放被加數(shù),x作為加數(shù),使s+x?圯s,x值變化,用循環(huán)來控制x的增值和使s加x。s的值不斷變化,用上一次計算出的s值來求下一次新的s值,然后再以這個新的s值去求下一個s值。每次以新值代替原值。S稱為“迭代變量”。具體求和的過程可寫成所謂的“括號套”的結(jié)構(gòu)形式:(…(((0+x1)+x2)+x3)+…+x99)+x100
①求 1+2+3+4+……+100 的值中,x1=1、x2=2、x3=3……x100=100. ②求 1×2+2×3+3×4+……+99×100的值中,x1=1×2、x2=2×3、x3=3×4……x100=99×100. ③求1×1+2×2+3×3+……99×99+100×100的值中,x1=1×1、x2=2×2、x3=3×3……x100=100×100. 若用變量s表示部分和,那么上述算式可改寫為:
0?圯ss中為0
s+x1?圯s s中為x1
s+x2?圯s s中為x1+x2
s+x3?圯s s中為x1+x2+x3
…… ……
s+x100?圯s s中為x1+x2+x3+……x100
用循環(huán)表示此求和過程,C語言實現(xiàn)循環(huán)常用三種語句:while、do-while和for語句。循環(huán)次數(shù)能估計出來時,一般采用for語句。
①試求 1+2+3+4+……+100 的值。源程序為:
# include "stdio.h"
void main()
{
int i,s=0;/ *賦初值 0?圯s * /
for(i=1;i<=100;i++)
s+=i; / * 累加和s+i?圯s * /
printf("%d \n",s);
}
②試求 1×2+2×3+3×4+……+99×100的值。
# include "stdio.h"
void main()
{
int i;
longs=0;\*初值為0*\
for(i=1;i<=99;i++)
s+=i*(i+1);
printf("%ld \n",s) ;
}
以上是求累加數(shù)(若干項之和)。同樣,若求累乘數(shù) 1×2×3×4×……×100 的值,求積過程可寫成 (…(((1×x1)×x2)×x3)×…×x99)×x100結(jié)構(gòu)形式。用循環(huán)表示這個求積過程,源程序為:
# include "stdio.h"
void main()
{
int i,s=1;
for(i=1;i<=100;i++)
s×=i;
printf("%d \n",s);
}
比較上例可知:此時s的初值是s=1而不是s=0 ,即初始值的確定問題。下面對循環(huán)語句使用作進一步說明。
二、關(guān)于循環(huán)語句,需要弄清楚的幾個問題
(1)循環(huán)內(nèi)變量往往需要賦初值。如上例中迭代變量 s賦初值。關(guān)于賦初值需考慮兩個問題。
其一,選初值的語句應(yīng)放在程序的什么位置,從上面的實例中可以看到這樣的規(guī)律:對變量選初值的語句應(yīng)設(shè)在循環(huán)體之外,即在for、while語句之前。如s=0、s=1。如果是雙循環(huán),則內(nèi)循環(huán)體的變量取初值外循環(huán)體外,即在內(nèi)循環(huán)的for、while之前。外循環(huán)體中的變量取初值的語句應(yīng)在外循環(huán)外,即在外循環(huán)的for、while語句前。
例如:求階乘之和s=m!的程序嵌套循環(huán)中變量的置位問題
# include"stdio.h"
void main()
{
inti,m,p,s;
s=0, m=1;/*累加結(jié)果變量s清零*/
while (m<=100)
{ p=1,i=1; /*共用變量p復(fù)位*/
while ( i<=m)
{ p*=i;i++;}
s+=p;m++;}
printf ("s=%d\n",s);
}
說明:程序由組成的二重循環(huán)構(gòu)成。內(nèi)層循環(huán)負責(zé)求某數(shù)的階乘,外層循環(huán)負責(zé)累加各數(shù)階乘的結(jié)果。存放累加結(jié)果的變量應(yīng)在二重循環(huán)之外清零,存放每個數(shù)結(jié)果的共用變量p應(yīng)在完成存放前一個數(shù)階乘結(jié)果之后,開始存放新數(shù)階乘結(jié)果之前,對共用變量復(fù)位,即在外層循環(huán)之內(nèi)、內(nèi)層循環(huán)變量之外對變量p復(fù)位。
其二,怎樣選擇初值,如上例中s=0 , s=1等,循環(huán)中的某些語句往往是與計算中題目的相應(yīng)項一一對應(yīng)的。若開始初值不知如何確定,一般可以先寫出循環(huán)體中的語句,然后再選初始值。從例中看出,求累加和運算,一般值為0,求累乘積一般值為1,但要看具體情況。
(2)循環(huán)體語句順序和循環(huán)條件有關(guān)系。
例如: 求階乘之和s=m!的程序
#include"stdio.h"
void main()
{
inti=0,s=0;
while (i<=100)
{s+=i ;
i++;}
printf("s=%d\n",s) ;
}
上例輸出結(jié)果為5050,若改變循環(huán)體內(nèi)語句的順序為 i++,s+=i輸出結(jié)果5150,這是因為循環(huán)被多執(zhí)行一次,需要把循環(huán)條件i<=100改為i<100或i<=99才能得到正確的結(jié)果。因此,對依靠循環(huán)條件來控制循環(huán)次數(shù)的循環(huán),應(yīng)注意對邊界條件進行檢驗,防止循環(huán)體多執(zhí)行一次。一般檢驗,可用從特殊到一般的方法。
參考文獻:
[1]譚浩強.C語言程序設(shè)計[M].北京:清華大學(xué)出版社,1999.
[2]汪大菊.C語言[M].天津:天津大學(xué)出版社,1996.
(新鄉(xiāng)職業(yè)技術(shù)學(xué)院)