肖紅德
摘要:C語(yǔ)言作為學(xué)生學(xué)習(xí)計(jì)算機(jī)程序設(shè)計(jì)語(yǔ)言的入門語(yǔ)言,對(duì)于順序、循環(huán)和分支結(jié)構(gòu)的學(xué)習(xí)和掌握是非常重要的。選擇結(jié)構(gòu)作為C語(yǔ)言中常用的一種基本結(jié)構(gòu),學(xué)生在進(jìn)行學(xué)習(xí)時(shí)往往會(huì)困惑于怎樣使用選擇結(jié)構(gòu)、如何表達(dá)實(shí)際問(wèn)題中的條件等。該文主要講解了選擇結(jié)構(gòu)中的if語(yǔ)句和switch語(yǔ)句的使用條件以及他們之間不同的執(zhí)行過(guò)程,并通過(guò)實(shí)例講解了他們之間的區(qū)別和聯(lián)系。
關(guān)鍵詞:選擇結(jié)構(gòu);表達(dá)式;順序執(zhí)行;流程圖;算法設(shè)計(jì)
1選擇結(jié)構(gòu)的地位和作用
選擇結(jié)構(gòu)適用于某個(gè)操作需要滿足一定的前提條件的情況,在現(xiàn)實(shí)生活中,需要進(jìn)行判斷和選擇的情況是很多的。選擇結(jié)構(gòu)作為程序設(shè)計(jì)中基本且重要的一種結(jié)構(gòu)被廣泛使用,任何一門計(jì)算機(jī)語(yǔ)言都會(huì)使用到選擇結(jié)構(gòu)。但是由于學(xué)生學(xué)習(xí)時(shí)的認(rèn)知背景以及在講解選擇結(jié)構(gòu)時(shí)的案例選擇等方面的因素,使得學(xué)生在學(xué)習(xí)這部分內(nèi)容時(shí)往往缺乏深入的理解和思考,導(dǎo)致在遇到實(shí)際問(wèn)題時(shí)出現(xiàn)困惑、不知道如何使用選擇結(jié)構(gòu)來(lái)解決實(shí)際中遇到的問(wèn)題。
作為結(jié)構(gòu)化程序設(shè)計(jì)中三種基本結(jié)構(gòu)其中之一,選擇結(jié)構(gòu)既不像順序結(jié)構(gòu)那樣規(guī)則簡(jiǎn)單,也不像循環(huán)結(jié)構(gòu)那樣涉及循環(huán)變量的改變和循環(huán)體的設(shè)計(jì),它是一種相對(duì)循序結(jié)構(gòu)更為簡(jiǎn)單、相對(duì)順序結(jié)構(gòu)較為復(fù)雜的、在解決問(wèn)題的過(guò)程中較為常見(jiàn)的一種結(jié)構(gòu)。因此,學(xué)生需要對(duì)這種結(jié)構(gòu)進(jìn)行較為深入的理解才能在實(shí)際使用中靈活應(yīng)用、得心應(yīng)手。
使用計(jì)算機(jī)語(yǔ)言在表示算法過(guò)程時(shí)要與接近自然語(yǔ)言的含義表達(dá)一致,使得語(yǔ)句簡(jiǎn)潔、表達(dá)語(yǔ)義充分,選擇結(jié)構(gòu)也不例外。因此在使用選擇結(jié)構(gòu)的時(shí)候,要盡可能地使得每條語(yǔ)句有具體的使用背景和含義,有其背后的理論依據(jù)。
本文以C語(yǔ)言作為基本語(yǔ)言來(lái)講解選擇結(jié)構(gòu)的適用條件以及if語(yǔ)句與switch語(yǔ)句的比較和使用問(wèn)題。
2選擇結(jié)構(gòu)的使用
選擇結(jié)構(gòu)有兩種基本的實(shí)現(xiàn)形式:if語(yǔ)句和switch語(yǔ)句。if語(yǔ)句常用于實(shí)現(xiàn)兩個(gè)分支的選擇結(jié)構(gòu),switch語(yǔ)句常用于多個(gè)分支的選擇結(jié)構(gòu)。其中,if語(yǔ)句的基本形式如下:
if(表達(dá)式)語(yǔ)句1;
【else語(yǔ)句2;】
其中,表達(dá)式就是一種判斷,if語(yǔ)句的執(zhí)行順序是先判斷表達(dá)式是否成立,若表達(dá)式成立,則執(zhí)行語(yǔ)句1,否則執(zhí)行else后面的語(yǔ)句2并結(jié)束if語(yǔ)句的執(zhí)行。表示else部分根據(jù)需要可以有也可以沒(méi)有,表達(dá)式的判斷一般是關(guān)系表達(dá)式(也就是比較大小的表達(dá)式),也可
以是邏輯表達(dá)式或算術(shù)表達(dá)式等。
switch語(yǔ)句注意事項(xiàng):switch后面圓括號(hào)中的表達(dá)式的類型,在Visual C++6.0中只允許為整型、字符型或枚舉類型。case后面常量表達(dá)式的值必須互不相等,其類型應(yīng)該與switch后面表達(dá)式的類型相容。case和常量表達(dá)式之間要有空格。case和default可以出現(xiàn)在任何位置,習(xí)慣上將default放在switch結(jié)構(gòu)的底部。每個(gè)case語(yǔ)句的結(jié)尾不要忘了加break,否則將導(dǎo)致多個(gè)分支重疊;多個(gè)case可以執(zhí)行同一語(yǔ)句序列,只在最后一個(gè)case結(jié)束的地方加一個(gè)break。不要忘記最后的de-fault分支,即使程序真的不需要default處理,也應(yīng)該保留語(yǔ)句:default:break;以防程序中出現(xiàn)異常表達(dá)式。
switch語(yǔ)句的執(zhí)行過(guò)程和if語(yǔ)句不同,在執(zhí)行switch語(yǔ)句時(shí),直接執(zhí)行表達(dá)式與case后面的標(biāo)號(hào)相同的標(biāo)簽處,順序執(zhí)行switch語(yǔ)句中的語(yǔ)句,直到遇到break語(yǔ)句才結(jié)束switch語(yǔ)句的執(zhí)行。
3選擇結(jié)構(gòu)應(yīng)用舉例
在使用選擇結(jié)構(gòu)的時(shí)候主要是對(duì)涉及表達(dá)式中的變量進(jìn)行處理。對(duì)于switch語(yǔ)句中的表達(dá)式比較常用的就是整型類型,這里主要以整型類型為例進(jìn)行講解。在具體使用的時(shí)候也主要是對(duì)表達(dá)式中的變量進(jìn)行設(shè)置初值和處理。對(duì)于表達(dá)式的使用,if語(yǔ)句和switch有比較明顯的區(qū)別,if語(yǔ)句在使用表達(dá)式的時(shí)候,使用關(guān)系表達(dá)式判斷變量處于某個(gè)區(qū)間的情況比較多,比如對(duì)于5 if(x>5&&x<10)語(yǔ)句; 而switch語(yǔ)句不能直接對(duì)區(qū)間進(jìn)行判斷,它主要是對(duì)某些固定的整數(shù)進(jìn)行判斷比如對(duì)于5 下面以一個(gè)實(shí)例來(lái)說(shuō)明if語(yǔ)句與switch語(yǔ)句在具體使用時(shí)候的區(qū)別和聯(lián)系。 要求輸入一個(gè)整數(shù)n,判斷它能否被2、3、5整除,并輸出能否被其中的一個(gè)或多個(gè)整除。 該問(wèn)題可以通過(guò)選擇結(jié)構(gòu)來(lái)解決,具體的,既可以通過(guò)if語(yǔ)句來(lái)解決,又可以通過(guò)switch語(yǔ)句來(lái)解決。通過(guò)分析,可知對(duì)于一個(gè)整數(shù)能否被2、3、5整除,一共分為8種情況(因?yàn)閷?duì)于每一個(gè)相除的結(jié)果都有能夠整除和不能整除兩種情況,所以一共有2^3=8種結(jié)果)。通過(guò)if語(yǔ)句解決該問(wèn)題的流程圖如圖1。 相比if語(yǔ)句的簡(jiǎn)潔易懂,switch語(yǔ)句在使用的時(shí)候不太直觀,但其執(zhí)行效率更高,對(duì)于具有多個(gè)分支的情況,使用switch語(yǔ)句往往能夠提高程序的執(zhí)行效率。對(duì)于該問(wèn)題的解決,在使用switch語(yǔ)句時(shí),其中的結(jié)果表達(dá)式需要經(jīng)過(guò)處理,因?yàn)閟witch中的結(jié)果表達(dá)式只能表示為具體的某個(gè)整數(shù),也就是需要將結(jié)果表達(dá)式的數(shù)據(jù)表示為某幾個(gè)具體的整數(shù)。通過(guò)switch語(yǔ)句來(lái)解決這個(gè)問(wèn)題,需要將8種結(jié)果轉(zhuǎn)換為具體的數(shù)值來(lái)進(jìn)行解決,由于每種情況只有兩種狀態(tài),所以我們可以使用3位的二進(jìn)制來(lái)表示每種情況,即:000、001、010,、011、100、101、110、111,二進(jìn)制中的每一位對(duì)應(yīng)能否被2、3、5是否整除的結(jié)果,結(jié)果為0表示能夠整除,否則不能整除。由于每個(gè)二進(jìn)制數(shù)都對(duì)應(yīng)一個(gè)十進(jìn)制數(shù),我們?cè)诒硎緮?shù)據(jù)的時(shí)候通常都使用十進(jìn)制數(shù)來(lái)表示,所以在處理數(shù)據(jù)的時(shí)候需要將這些二進(jìn)制數(shù)據(jù)處理成十進(jìn)制數(shù)進(jìn)行處理,得到的十進(jìn)制數(shù)分別為0、1、2、3、4、5、6、7。在處理n對(duì)2、3、5求余數(shù)的時(shí)候,只需要將對(duì)應(yīng)二進(jìn)制位置處理為0或者1即可。由于不同的位置所對(duì)應(yīng)的位權(quán)不同,所以可以將對(duì)n對(duì)2求余的結(jié)果處理成0、1;n對(duì)3求余的結(jié)果處理成0、2;n對(duì)5求余的結(jié)果處理成0、4,通過(guò)這個(gè)處理后,將3個(gè)處理結(jié)果相加就得到了對(duì)應(yīng)每種情況的一個(gè)整數(shù),然后對(duì)每一種整數(shù)情況進(jìn)行對(duì)應(yīng)的處理即可。 通過(guò)switch語(yǔ)句解決該問(wèn)題的流程圖如下: 對(duì)于該問(wèn)題的處理,還可以寫出通過(guò)if的嵌套結(jié)構(gòu)實(shí)現(xiàn)的算法或者通過(guò)switch的嵌套結(jié)構(gòu)實(shí)現(xiàn)的算法,比較而言,上述給出的通過(guò)switch語(yǔ)句給出的算法是更為簡(jiǎn)單和簡(jiǎn)潔的算法設(shè)計(jì)過(guò)程,這里對(duì)于其他的算法過(guò)程不再詳細(xì)說(shuō)明。 4結(jié)論 If語(yǔ)句多用于變量區(qū)間的判斷(比如a>=5,a<0等),而switch語(yǔ)句用于變量(為整型類型,包括字符型)值在取單個(gè)值(即有限個(gè)點(diǎn))的情況,在很多情況下,若想使用switch語(yǔ)句,一般需要將變量的取值情況先進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換成switch能夠處理的有限個(gè)點(diǎn)的情況,上面的例題即是先通過(guò)將n對(duì)2、3、5求余進(jìn)行轉(zhuǎn)化為兩種取值進(jìn)行累加后,再對(duì)累加后的值使用switch語(yǔ)句進(jìn)行處理的。