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