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