淺談C語言中迴圈結構的教學方法

才智咖 人氣:1.8W
摘  要  迴圈結構是結構化程式設計中的三種基本結構之一,也是程式設計的基礎。但是,對於初學者來說,迴圈結構與人類日常的思維習慣不同,較難掌握。本文用幾個例子闡述了在《C語言程式設計》課程中迴圈結構的教學方法,這些方法在日常授課中取得了較好的效果。     關鍵詞  C語言;結構化程式設計;迴圈結構;效率 
1  引言     順序、分支、迴圈是結構化程式設計的三種基本結構,所以在高階語言程式設計課程中,掌握這三種結構是學好程式設計的基礎。而迴圈結構是這三者中最複雜的一種結構,幾乎所有的程式都離不開迴圈結構。在C語言中,迴圈結構主要是由for和while、do-while語句實現的,其中for語句的應用更為普遍一些。for語句的用法對於有程式設計經驗的學生來說輕而易舉,但是對於那些沒有經驗的初學者來說,難度卻不小。本文從初學者的角度,闡述了C語言中迴圈結構幾種典型應用的實現方法。2  用迴圈結構輸出幾何圖形     輸出簡單的幾何圖形(如圖1),是迴圈結構的典型應用之一。對於這一型別的題目,初學者往往直接採用一條或若干條輸出語句printf完成,這樣雖然可以完成題目要求,但是很顯然缺乏靈活性,不符合程式設計的思想。按照正常的程式設計思想,應該先分析圖形的構成,找出其中的規律:如圖1(a)中的實心三角形,每一行由若干個空格、星號和一個回車換行符構成,將行號、空格數和星號數分別設為i、m和n,則可以形成下表:

 

淺談C語言中迴圈結構的教學方法

表1  實心三角形的構成表

行號i 空格數m 星號數n 1 4 1 2 3 3 3 2 5 4 1 7 5 0 9      分析表1,可以得出行號i與空格數m、星號數n如下的數學關係:m=5-i,n=2×i-1     則實心三角形的構成規律可以描述為:第i行由(5-i)個空格和(2×i-1)個星號和一個回車符構成。把行號i作為for語句的迴圈變數,輸出圖形程式的主要部分見程式段1。採用上面的方法,可以使學生很容易編寫出類似的程式,其中的關鍵在於讓學生找出圖形中行號與每一行的空格數以及星號數的關係(對於圖1(b)、(c)需要把圖形分成幾個部分,再分析其中的構成規律),這需要學生數學方面的知識,非程式設計本身的範疇了。

for(i=1;i<=5;i++) { /*輸出(5-i)個空格;*/ for(m=1;m<=5-i;m++)    printf(“ ”);   /*輸出(2*i-1)個星號;*/ for(n=1;n<=2*i-1;n++)    printf(“*”);   /*輸出回車符;*/ printf(“n”); } 程式段1 實心三角形的主要程式

 3  陣列中迴圈結構的應用

     在C語言中,for語句經常與陣列相結合,用於實現陣列元素的賦值、輸入與輸出。對於初學者來說,更習慣於用順序結構的語句來實現(如圖2左)。我們將圖2左的幾條語句作比較,可以看出在這5條語句中,不同的只有陣列下標,那麼就可以將這5條語句合併成一條for語句,將陣列下標換成for語句的迴圈變數i,而i的值從0增加到 4。按照for語句的基本語法規則可以很容易的寫出圖2右的for語句。

同樣,對於下面這個輸出二維陣列元素的例子,也可以用上述辦法實現,不過轉換過程比上例要複雜一些:經過對比圖3左側方框中順序結構的12條語句,可以發現也是隻有陣列下標在變化,但是由於是二維陣列,行下標和列下標同時都在變化,很顯然不能直接用一條簡單的for語句來實現(不是絕對不可以實現,後面將會看到)。但是我們可以把這12條語句細分一下,3條語句為一組,而在同一組中的語句只有列下標在變化,這時可以採用上例中的方法,將列下標都用迴圈變數j來代替,得到圖3右上的形式。再次對比圖3右上的4條for語句,不同的是行下標,同樣用新的迴圈變數i來代替,合併後得到圖3右下最終二重for迴圈的語句。

   

     在上例中,常規的思路都採用二重for迴圈與二維陣列相結合來實現對陣列元素的訪問,實際上也可以使用一重for迴圈來實現:無論如何變化,我們可以先確定的是,輸出語句printf肯定要執行12次,如果用一重for迴圈,那麼迴圈變數i的值就要從0遞增到11。再分析陣列行下標m和列下標n與迴圈變數i之間的`關係,很顯然:i=m*3+n,按照整數除法的思想,行下標m恰好是迴圈變數i整除3後的商,而列下標n恰好是迴圈變數i整除3後的餘數,即:

m=i/3,n=i%3從而可以寫出下面的for語句:for(i=0;i<12;i++)printf(“%d”,a[i/3][i%3]);4  迴圈結構中的效率問題     對於程式設計的初學者來說,往往以完成題目要求的功能為目的,程式的執行效率是最容易忽略的一個問題。在迴圈結構中,具體表現為迴圈體的執行次數。例如,一個經典的素數判定問題。在數學中素數如下定義:素數即指那些大於1,且除了1和它本身外,不能被其它任何數整除的數。根據這一定義,初學者很容易編寫出如下程式段2的程式: