鄧波 夏太武
摘要:C語言中程序常見有三種嵌套結(jié)構(gòu),即選擇結(jié)構(gòu)嵌套、循環(huán)結(jié)構(gòu)嵌套、函數(shù)調(diào)用嵌套,筆者通過對以上結(jié)構(gòu)教學(xué)分析,告知讀者在使用的過程中三者的需要注意之處,對提高C語言學(xué)習(xí)效率很有好處。
關(guān)鍵詞:嵌套;循環(huán);函數(shù);遞歸
一、 引言
接觸過C語言的人都知道C語言是一種功能強大的計算機編程語言,學(xué)好C語言得花很多的功夫才能學(xué)好,它功能強大也表現(xiàn)在自由度大、語句靈活、學(xué)習(xí)過程中容易出錯,像嵌套結(jié)構(gòu)就是其中容易出錯的部分。比如在學(xué)習(xí)選擇結(jié)構(gòu)嵌套時,學(xué)生們最容易出現(xiàn)else與if的配對問題;在循環(huán)結(jié)構(gòu)嵌套時,一些初值的設(shè)置問題;在函數(shù)嵌套調(diào)用時,特別是遞歸調(diào)用,正推與反推過程的理解問題無不困擾著初學(xué)者。對此,筆者將這三種情況集中進行了教學(xué)分析,很大程度避免易混淆、難理解問題。
二、 選擇結(jié)構(gòu)嵌套問題
C語言中的選擇結(jié)構(gòu)語句包含單分支結(jié)構(gòu)、雙分支結(jié)構(gòu)以及多分支結(jié)構(gòu),其中單分支結(jié)構(gòu)采用if語句完成,雙分支結(jié)構(gòu)采用if-else語句完成,而多分支結(jié)構(gòu)可采用if語句的嵌套,也可以采用else-if的嵌套,對于整型或字符型數(shù)據(jù)還可以switch語句以及switch的嵌套結(jié)構(gòu)來完成,由此可以看到選擇結(jié)構(gòu)嵌套形式是多樣的,下面對分段函數(shù)用if的兩種嵌套為例來介紹循環(huán)結(jié)構(gòu)的嵌套問題,函數(shù)如下:
注意兩個程序代碼中的嵌套部分的區(qū)別,可以看出如果采用if語句的嵌套,它是將復(fù)雜的部分放置在前,簡單的部分放置在后,即在前面嵌套,程序中往往會連續(xù)出現(xiàn)多個if或else的情形,這個時候要注意else與if的配對問題,象程序①中的第一個if是跟第二個else進行配對,而第二個if是跟第一個else進行配對,這是初學(xué)者一定要注意的地方,而采用else-if語句嵌套,它是將復(fù)雜的部分放置在后面,簡單的部分放置在前面,即在后面嵌套,if跟else往往會交替出現(xiàn),這個時候二者的配對就難以混淆起來,程序②中第一個if是跟第一個else進行配對,而第二個if是跟第一個else進行配對。在if語句嵌套程序中,要改變if跟else的配對問題,也就是說if的嵌套部分就是一個單分支if語句,只有通過對嵌套部分添加{}來完成。
三、 循環(huán)結(jié)構(gòu)的嵌套問題
循環(huán)結(jié)構(gòu)嵌套對于初學(xué)者來說是一個麻煩問題,大家知道循環(huán)完成的是對有規(guī)律的操作進行重復(fù),找規(guī)律對初學(xué)者特別是文科類學(xué)生是頭痛的,理工科學(xué)生幾分鐘能夠考慮好的算法,文科生要十幾分鐘甚至更長時間才能想清楚,簡單循環(huán)稍微好些,例如,設(shè)計程序求1+2+3+…+100的和,學(xué)生們上手都快,但是把程序改成1+1/2+2/3+3/4+…+99/100,就有相當(dāng)一部分學(xué)生找不到規(guī)律,或者找到了規(guī)律也不知怎么用C語言表示,這是跟學(xué)生的素質(zhì)有很大關(guān)系的,當(dāng)然跟老師的講授也有一定的關(guān)系。像1-(1+2)-(1+2+3)-…-(1+2+3+…+100)的求值問題,素質(zhì)高的同學(xué)可采用單循環(huán)做,素質(zhì)一般同學(xué)的可采用循環(huán)的嵌套來做,素質(zhì)高的同學(xué)立馬想到了除了第一個數(shù)為正以外,其他每一項都是負的,而且每一項都比前一項多一個數(shù),這個數(shù)有規(guī)律,素質(zhì)一般的同學(xué)想到的是要用循環(huán)的嵌套,外循環(huán)做減法,內(nèi)循環(huán)做加法,每一趟加法都是沒有任何聯(lián)系的,在循環(huán)嵌套設(shè)置中,學(xué)生們感覺普遍為難的地方就是初值的設(shè)置問題,像這個問題,對于內(nèi)循環(huán)的求和問題,表示和的變量應(yīng)該是每一趟都是從0開始的,所以這個變量應(yīng)在每一趟內(nèi)循環(huán)開始都要置0,而不能只在程序的開始部分置0。
程序分析:設(shè)置變量s=1-(1+2)-(1+2+3)-…-(1+2+3+…+100),它的初值設(shè)為1,外循環(huán)用變量i來表示第i項,其初值設(shè)為2,表示從第二項開始,變量t用來表示每一項的和,用內(nèi)循環(huán)來完成求t,代碼如下:
同樣是對變量賦初值,變量s,i,t,j對于賦初值都有自己的方式及位置,這也是學(xué)生們要通過大量的訓(xùn)練才能熟練的。
四、 函數(shù)嵌套調(diào)用問題
C語言中所有的函數(shù)都是級別相同的,在C語言中不允許函數(shù)嵌套定義,即在一個函數(shù)內(nèi)部再定義其他函數(shù),但允許嵌套調(diào)用,在函數(shù)嵌套調(diào)用中,比如主函數(shù)調(diào)用函數(shù)a,而函數(shù)a在執(zhí)行過程中又調(diào)用函數(shù)b,函數(shù)b在執(zhí)行過程中又調(diào)用函數(shù)c,這樣函數(shù)c執(zhí)行完后返回b,函數(shù)b執(zhí)行完后返回a,函數(shù)a執(zhí)行完后返回主函數(shù),這樣的函數(shù)嵌套調(diào)用需要注意的是函數(shù)的說明、定義通常要在該函數(shù)被調(diào)用之前進行,除非被調(diào)用的函數(shù)類型是整型,這種調(diào)用通常層次不會很多,只要在函數(shù)調(diào)用過程中不要出現(xiàn)死鎖情況(即如函數(shù)a執(zhí)行時調(diào)用函數(shù)b,而函數(shù)b在執(zhí)行時又調(diào)用函數(shù)a,這樣就會出現(xiàn)直接死鎖,還有一種就是間接死鎖,情況如函數(shù)a執(zhí)行時調(diào)用函數(shù)b,而函數(shù)b在執(zhí)行時又調(diào)用函數(shù)c,而函數(shù)c在執(zhí)行時又調(diào)用函數(shù)a),在函數(shù)嵌套調(diào)用中,遞歸調(diào)用是最有代表性的嵌套調(diào)用,所謂遞歸就是函數(shù)在執(zhí)行過程中,調(diào)用自己本身,這種調(diào)用不是簡單調(diào)用自身,而是在調(diào)用時要使問題的規(guī)模逐漸縮小,最后達到解決問題的目的,也就是說,一定要有結(jié)束遞歸調(diào)用的情況出現(xiàn)。例如用遞歸調(diào)用編程求5!。
通過函數(shù)的嵌套調(diào)用,我們發(fā)現(xiàn)主函數(shù)變得簡單了,程序的功能都交由被調(diào)用的函數(shù)來完成。對于遞歸調(diào)用,它的正推與反推是相對應(yīng)的,一定要有一個結(jié)束正推的情況出現(xiàn),否則就是一個有去無回的調(diào)用。
五、 總結(jié)
通過上述各種嵌套結(jié)構(gòu)的分析,我們了解了選擇結(jié)構(gòu)嵌套、循環(huán)結(jié)構(gòu)嵌套、函數(shù)嵌套調(diào)用等多種形式在使用過程中要注意的地方,這對于學(xué)好C語言這門課程是有所幫助的。
作者簡介:
鄧波,夏太武,湖南省邵陽市,邵陽學(xué)院信息工程學(xué)院。