標籤:規律 之間 個數 引用 中間 沒有 賦值 就會 草稿
問題:用C語言編寫程式求1-1/3+1/5-1/7+...
樣本:
1 #include <stdio.h> 2 void main(){ 3 int n=1; 4 float sum=0,a=1; 5 while(a<=100){ 6 sum=sum+n/a; 7 n=-n; 8 a=a+2; 9 }10 printf("%f\n",sum);11 }
分析:
數列的求和問題,每一項正負交替,並且分母遞增2。
首先,這是一個加法(累加)問題,涉及到被加數,加數,和的概念。每一次加法運算產生的和又作為新的被加數,然後加上一個新的加數,並且新的加數之間(即每一項之間)具有規律性。這樣不斷重複做加法運算。
計算離不開記憶,對於人,每一次運算的中間結果都要記住或者記到草稿紙上才能進行下一步計算,並且求出新結果後舊的結果無需再記憶;電腦也是如此,對於電腦來說,資料儲存在儲存單元中,在程式中用變數來表示,用來暫存各種資料,包括未經處理資料,中間結果和最終結果。並且,變數的值可以改變,當舊的值不再需要並且產生新值之後,變數便更新為新值。只從這點來看,草稿紙就毫無優勢可言~
對於累加問題,被加數以及和(新的被加數)可以用同一個變數(sum)來儲存,它不斷地被更新。一開始為0,然後為各種中間結果,直到最後為最終結果並輸出。另外,加數也是一個變數,它每次更新為新的值,並且這種更新是有規律可循的:作為一個分數,每次分子更新為相反數,分母則遞增2。分子分母都在變化,因此可分別作為一個變數。
但是,我們並沒有用一個真正的變數來表示加數,而是用一個含有變數的運算式n/a,這樣可以節省一個變數。
然後,C代碼要做的除了聲明和初始設定變數,就是根據邏輯(規律)更新變數(包括變數的引用和賦值)。並且,正因為變數的更新都是有規律可循的,都是在舊值的基礎上做運算,可以用一個通用公式來表示,即具有相同的形式,所以可以採用迴圈結構來實現(這裡,我們只迴圈到分母為99的項)。
小結:
我們從變數的角度分析了這個程式。做的事情無非是變數的聲明和初始化(有時變數的輸入取代了初始化),以及變數的多次引用和更新(首次賦值稱為初始化,再次賦值便是更新),最終可能還要輸出它,輸出到螢幕或磁碟等。
從形式上來看,變數出現在賦值符(=)的左邊(聲明並初始化時,賦值時),或右邊(引用)。
1 #include <stdio.h> 2 void main(){ 3 /*變數的聲明及初始化*/ 4 int n=1; 5 float sum=0,a=1; 6 /*變數的循環參考及賦值*/ 7 while(a<=100){ 8 sum=sum+n/a; 9 n=-n;10 a=a+2;11 }12 /*變數的輸出*/13 printf("%f\n",sum);14 }
注意:
這裡面有一個坑,就是如果n和a都是整型變數的話,n/a也會是整型,而不是浮點型,結果就會有錯誤。因此,我們將a聲明為浮點型。
拓展:
比較有意思的是,利用這個數列(無窮級數)可以求得圓周率。即將其乘以4便得到π的近似值,項數越多越精確。
C語言求1-1/3+1/5-1/7+...——小程式,大道理