- 相關(guān)推薦
淺談C語言中循環(huán)結(jié)構(gòu)的教學(xué)方法
摘 要 循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計中的三種基本結(jié)構(gòu)之一,也是程序設(shè)計的基礎(chǔ)。但是,對于初學(xué)者來說,循環(huán)結(jié)構(gòu)與人類日常的思維習(xí)慣不同,較難掌握。本文用幾個例子闡述了在《C語言程序設(shè)計》課程中循環(huán)結(jié)構(gòu)的教學(xué)方法,這些方法在日常授課中取得了較好的效果。 關(guān)鍵詞 C語言;結(jié)構(gòu)化程序設(shè)計;循環(huán)結(jié)構(gòu);效率1 引言 順序、分支、循環(huán)是結(jié)構(gòu)化程序設(shè)計的三種基本結(jié)構(gòu),所以在高級語言程序設(shè)計課程中,掌握這三種結(jié)構(gòu)是學(xué)好程序設(shè)計的基礎(chǔ)。而循環(huán)結(jié)構(gòu)是這三者中最復(fù)雜的一種結(jié)構(gòu),幾乎所有的程序都離不開循環(huán)結(jié)構(gòu)。在C語言中,循環(huán)結(jié)構(gòu)主要是由for和while、do-while語句實現(xiàn)的,其中for語句的應(yīng)用更為普遍一些。for語句的用法對于有程序設(shè)計經(jīng)驗的學(xué)生來說輕而易舉,但是對于那些沒有經(jīng)驗的初學(xué)者來說,難度卻不小。本文從初學(xué)者的角度,闡述了C語言中循環(huán)結(jié)構(gòu)幾種典型應(yīng)用的實現(xiàn)方法。2 用循環(huán)結(jié)構(gòu)輸出幾何圖形 輸出簡單的幾何圖形(如圖1),是循環(huán)結(jié)構(gòu)的典型應(yīng)用之一。對于這一類型的題目,初學(xué)者往往直接采用一條或若干條輸出語句printf完成,這樣雖然可以完成題目要求,但是很顯然缺乏靈活性,不符合程序設(shè)計的思想。按照正常的程序設(shè)計思想,應(yīng)該先分析圖形的構(gòu)成,找出其中的規(guī)律:如圖1(a)中的實心三角形,每一行由若干個空格、星號和一個回車換行符構(gòu)成,將行號、空格數(shù)和星號數(shù)分別設(shè)為i、m和n,則可以形成下表:
表1 實心三角形的構(gòu)成表
行號i 空格數(shù)m 星號數(shù)n 1 4 1 2 3 3 3 2 5 4 1 7 5 0 9 分析表1,可以得出行號i與空格數(shù)m、星號數(shù)n如下的數(shù)學(xué)關(guān)系:m=5-i,n=2×i-1 則實心三角形的構(gòu)成規(guī)律可以描述為:第i行由(5-i)個空格和(2×i-1)個星號和一個回車符構(gòu)成。把行號i作為for語句的循環(huán)變量,輸出圖形程序的主要部分見程序段1。采用上面的方法,可以使學(xué)生很容易編寫出類似的程序,其中的關(guān)鍵在于讓學(xué)生找出圖形中行號與每一行的空格數(shù)以及星號數(shù)的關(guān)系(對于圖1(b)、(c)需要把圖形分成幾個部分,再分析其中的構(gòu)成規(guī)律),這需要學(xué)生數(shù)學(xué)方面的知識,非編程本身的范疇了。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 數(shù)組中循環(huán)結(jié)構(gòu)的應(yīng)用
在C語言中,for語句經(jīng)常與數(shù)組相結(jié)合,用于實現(xiàn)數(shù)組元素的賦值、輸入與輸出。對于初學(xué)者來說,更習(xí)慣于用順序結(jié)構(gòu)的語句來實現(xiàn)(如圖2左)。我們將圖2左的幾條語句作比較,可以看出在這5條語句中,不同的只有數(shù)組下標(biāo),那么就可以將這5條語句合并成一條for語句,將數(shù)組下標(biāo)換成for語句的循環(huán)變量i,而i的值從0增加到 4。按照for語句的基本語法規(guī)則可以很容易的寫出圖2右的for語句。
同樣,對于下面這個輸出二維數(shù)組元素的例子,也可以用上述辦法實現(xiàn),不過轉(zhuǎn)換過程比上例要復(fù)雜一些:經(jīng)過對比圖3左側(cè)方框中順序結(jié)構(gòu)的12條語句,可以發(fā)現(xiàn)也是只有數(shù)組下標(biāo)在變化,但是由于是二維數(shù)組,行下標(biāo)和列下標(biāo)同時都在變化,很顯然不能直接用一條簡單的for語句來實現(xiàn)(不是絕對不可以實現(xiàn),后面將會看到)。但是我們可以把這12條語句細(xì)分一下,3條語句為一組,而在同一組中的語句只有列下標(biāo)在變化,這時可以采用上例中的方法,將列下標(biāo)都用循環(huán)變量j來代替,得到圖3右上的形式。再次對比圖3右上的4條for語句,不同的是行下標(biāo),同樣用新的循環(huán)變量i來代替,合并后得到圖3右下最終二重for循環(huán)的語句。
在上例中,常規(guī)的思路都采用二重for循環(huán)與二維數(shù)組相結(jié)合來實現(xiàn)對數(shù)組元素的訪問,實際上也可以使用一重for循環(huán)來實現(xiàn):無論如何變化,我們可以先確定的是,輸出語句printf肯定要執(zhí)行12次,如果用一重for循環(huán),那么循環(huán)變量i的值就要從0遞增到11。再分析數(shù)組行下標(biāo)m和列下標(biāo)n與循環(huán)變量i之間的關(guān)系,很顯然:i=m*3+n,按照整數(shù)除法的思想,行下標(biāo)m恰好是循環(huán)變量i整除3后的商,而列下標(biāo)n恰好是循環(huán)變量i整除3后的余數(shù),即:
m=i/3,n=i%3從而可以寫出下面的for語句:for(i=0;i<12;i++)printf(“%d”,a[i/3][i%3]);4 循環(huán)結(jié)構(gòu)中的效率問題 對于程序設(shè)計的初學(xué)者來說,往往以完成題目要求的功能為目的,程序的執(zhí)行效率是最容易忽略的一個問題。在循環(huán)結(jié)構(gòu)中,具體表現(xiàn)為循環(huán)體的執(zhí)行次數(shù)。例如,一個經(jīng)典的素數(shù)判定問題。在數(shù)學(xué)中素數(shù)如下定義:素數(shù)即指那些大于1,且除了1和它本身外,不能被其它任何數(shù)整除的數(shù)。根據(jù)這一定義,初學(xué)者很容易編寫出如下程序段2的程序:int isprime(int n) { int i; for(i=2;i<n;i++) if(n%i==0) return 0; return 1; } 程序段2 判斷素數(shù)的程序段 上面的程序,完全可以實現(xiàn)題目要求的功能,初學(xué)者往往滿足于此。但是當(dāng)對for循環(huán)的執(zhí)行次數(shù)進行分析時,我們發(fā)現(xiàn):當(dāng)n不是素數(shù)時,沒有任何問題;而當(dāng) n是素數(shù)時,循環(huán)體就要執(zhí)行(n-2)次,而實際上是不需要這么多次的。根據(jù)數(shù)學(xué)的知識,可以將次數(shù)降為n/2或n的算術(shù)平方根,這樣可以大大減少循環(huán)體的執(zhí)行次數(shù),提高程序的效率。
程序的執(zhí)行效率是編程中時刻需要考慮的問題,也是程序設(shè)計中的基本要求。這需要許多算法方面的知識,對于初學(xué)者來說,要求可能過高,但是我們在講授過程中要注意向?qū)W生灌輸這種思想,從學(xué)習(xí)之初就要打下良好的基礎(chǔ),尤其是類似上面例子中這樣顯而易見的情況,可以提醒學(xué)生在編制完一道程序以后,檢驗一下,是否還有可優(yōu)化的地方,這對以后進一步高級編程的學(xué)習(xí)都是必要的。5 結(jié)束語 以上這些,都是本人在授課過程中的一些體會,可能比較膚淺,但是從初學(xué)者的角度來看,卻是必要的。如何讓一名初學(xué)者盡快擺脫日常的思維定式,更加透徹地理解和掌握程序設(shè)計中的基本思想,領(lǐng)會程序設(shè)計的精髓,是高級語言程序設(shè)計這門課程在講授過程中,應(yīng)該時刻注意的問題。希望本文能在這方面起到一點作用,同時望廣大同仁多多指教。參考文獻[1] 譚浩強. C 語言程序設(shè)計(第二版)[M]. 北京:清華大學(xué)出版社,1999[2] 蘇運霖譯. 計算機程序設(shè)計藝術(shù)第1 卷 基本算法[M]. 北京:國防工業(yè)出版社,2002【淺談C語言中循環(huán)結(jié)構(gòu)的教學(xué)方法】相關(guān)文章:
循環(huán)結(jié)構(gòu)的程序設(shè)計方法(一)03-07
淺談英漢句子結(jié)構(gòu)差異03-11
淺談結(jié)構(gòu)轉(zhuǎn)換層的應(yīng)用及施工03-06
淺談藥學(xué)論文的結(jié)構(gòu)及存在的問題03-18
淺談生態(tài)價值論視野下的循環(huán)經(jīng)濟03-19
淺談跨國公司組織結(jié)構(gòu)06-07