- C#從入門到精通(微視頻精編版)
- 明日科技
- 4694字
- 2020-03-06 11:53:26
第5章 條件控制語句
(
視頻講解:1小時(shí)3分鐘)
做任何事情都要遵循一定的原則。例如,到圖書館去借書,就必須要有借書證,并且借書證不能過期,這兩個(gè)條件缺一不可。程序設(shè)計(jì)也是如此,需要利用流程控制實(shí)現(xiàn)與用戶的交流,并根據(jù)用戶的需求決定程序“做什么”“怎么做”。
流程控制對于任何一門編程語言來說都是至關(guān)重要的,它提供了控制程序如何執(zhí)行的方法。如果沒有流程控制語句,整個(gè)程序?qū)凑站€性順序來執(zhí)行,而不能根據(jù)用戶的需求決定程序執(zhí)行的順序。本章將對C#中的條件控制語句進(jìn)行詳細(xì)講解。
通過學(xué)習(xí)本章,讀者主要掌握以下內(nèi)容:
了解程序的決策分支
if語句的使用
if…else語句的使用
if…else if…else語句的使用
if語句的嵌套使用
switch語句的使用
switch與if…else if…else的區(qū)別
5.1 決策分支

視頻講解
計(jì)算機(jī)的主要功能是提供用戶計(jì)算功能,但在計(jì)算的過程中會(huì)遇到各種各樣的情況,針對不同的情況會(huì)有不同的處理方法,這就要求程序開發(fā)語言要有處理決策的能力。匯編語言使用判斷指令和跳轉(zhuǎn)指令實(shí)現(xiàn)決策,高級語言使用選擇判斷語句實(shí)現(xiàn)決策。
一個(gè)決策系統(tǒng)就是一個(gè)分支結(jié)構(gòu),這種分支結(jié)構(gòu)就像一個(gè)樹形結(jié)構(gòu),每到一個(gè)節(jié)點(diǎn)都需要做決定,就像人走到十字路口,是向前走,還是向左走或是向右走都需要做決定,不同的分支代表不同的決定。例如,十字路口的分支結(jié)構(gòu)如圖5.1所示。
為描述決策系統(tǒng)的流通,設(shè)計(jì)人員開發(fā)了流程圖。流程圖使用圖形方式描述系統(tǒng)不同狀態(tài)的不同處理方法。開發(fā)人員使用流程圖表現(xiàn)程序的結(jié)構(gòu),主要的流程圖符號(hào)如圖5.2所示。
使用流程圖描述十字路口轉(zhuǎn)向的決策,利用方位做決定,判斷是否是南方,如果是南方向,則前行,如果不是南方,尋找南方,流程圖如圖5.3所示。

圖5.1 十字路口分支結(jié)構(gòu)

圖5.2 主要的流程圖符號(hào)

圖5.3 十字路口轉(zhuǎn)向流程圖
程序中使用選擇結(jié)構(gòu)語句來做決策,選擇結(jié)構(gòu)是編程語言的基礎(chǔ)語句,在C#語言中有兩種選擇結(jié)構(gòu)語句,分別是if語句和switch語句,下面分別對這兩種選擇結(jié)構(gòu)語句進(jìn)行講解。
說明
選擇結(jié)構(gòu)語句也稱為條件判斷語句或者分支語句。
5.2 if語句

視頻講解
在生活中,每個(gè)人都要做出各種各樣的選擇。例如,吃什么菜?走哪條路?找什么人?那么當(dāng)程序遇到選擇時(shí),該怎么辦呢?這時(shí)需要使用的就是選擇結(jié)構(gòu)語句。if語句是最基礎(chǔ)的一種選擇結(jié)構(gòu)語句,它主要有3種形式,分別為if語句、if…else語句和if…else if…else多分支語句,本節(jié)將分別對它們進(jìn)行詳細(xì)講解。
5.2.1 最簡單的if語句
C#語言中使用if關(guān)鍵字來組成選擇語句,其最簡單的語法形式如下:

說明
使用if語句時(shí),如果只有一條語句,省略{}是沒有語法錯(cuò)誤的,而且不影響程序的執(zhí)行,但是為了程序代碼的可讀性,建議不要省略。
其中,表達(dá)式部分必須用()括起來,它可以是一個(gè)單純的布爾變量或常量,也可以是關(guān)系表達(dá)式或邏輯表達(dá)式,如果表達(dá)式為真,則執(zhí)行“語句塊”,之后繼續(xù)執(zhí)行“下一條語句”;如果表達(dá)式的值為假,就跳過“語句塊”,執(zhí)行“下一條語句”,這種形式的if語句相當(dāng)于漢語里的“如果……那么……”,其流程圖如圖5.4所示。

圖5.4 if語句流程圖
【例5.01】使用if語句判斷用戶輸入的數(shù)字是不是奇數(shù),代碼如下:(實(shí)例位置:資源包\源碼\05\5.01)

運(yùn)行程序,當(dāng)輸入5時(shí),效果如圖5.5所示;當(dāng)輸入6時(shí),效果如圖5.6所示。

圖5.5 奇數(shù)運(yùn)行結(jié)果

圖5.6 不是奇數(shù)的運(yùn)行結(jié)果
說明
if語句后面如果只有一條語句時(shí),可以不使用大括號(hào){},例如下面的代碼:

但是,不建議開發(fā)人員使用這種形式,不管if語句后面有多少要執(zhí)行的語句,都建議使用大括號(hào){}括起來,這樣方便代碼的閱讀。
5.2.2 if…else語句
如果遇到只能二選一的條件,比如某個(gè)公司在發(fā)展過程中遇到了“擴(kuò)張”和“求穩(wěn)”的抉擇,C#中提供了if…else語句解決類似問題,其語法如下:

使用if…else語句時(shí),表達(dá)式可以是一個(gè)單純的布爾變量或常量,也可以是關(guān)系表達(dá)式或邏輯表達(dá)式,如果滿足條件,則執(zhí)行if后面的語句塊,否則,執(zhí)行else后面的語句塊,這種形式的選擇語句相當(dāng)于漢語里的“如果……否則……”,其流程圖如圖5.7所示。

圖5.7 if…else語句流程圖
【例5.02】用if…else語句判斷用戶輸入的分?jǐn)?shù)是不是足夠優(yōu)秀,如果大于90,則表示優(yōu)秀,否則,輸出“希望你繼續(xù)努力!”,代碼如下:(實(shí)例位置:資源包\源碼\05\5.02)

運(yùn)行程序,當(dāng)輸入一個(gè)大于90的數(shù)時(shí)(如93),效果如圖5.8所示;當(dāng)輸入一個(gè)小于90的數(shù)時(shí)(如87),效果如圖5.9所示。

圖5.8 輸入大于90的運(yùn)行結(jié)果

圖5.9 輸入小于90的運(yùn)行結(jié)果
注意
在使用else語句時(shí),else一定不可以單獨(dú)使用,它必須和關(guān)鍵字if一起使用,例如下面的代碼是錯(cuò)誤的:

程序中使用if…else語句時(shí),如果出現(xiàn)if語句多于else語句的情況,將會(huì)出現(xiàn)懸垂else問題:究竟else和哪個(gè)if相匹配呢?例如下面的代碼:

如果遇到上面的情況,記住:在沒有特殊處理的情況下,else永遠(yuǎn)都與最后出現(xiàn)的if語句相匹配,即:上面代碼中的else是與if(y>x)語句相匹配的。如果要改變else語句的匹配對象,可以使用大括號(hào),例如將上面代碼修改如下:

如果修改成這樣,else將與if(x>1)語句相匹配。
技巧
建議總是在if后面使用大括號(hào){}將要執(zhí)行的語句括起來,這樣可以避免程序代碼混亂。
5.2.3 if…else if…else語句
大家平時(shí)在網(wǎng)上購物付款時(shí)通常都有多種選擇,如圖5.10所示。

圖5.10 購物時(shí)的付款頁面
圖5.10中提供了5種付款方式,這時(shí)用戶就需要從多個(gè)選項(xiàng)中選擇一個(gè)。在開發(fā)程序時(shí),如果遇到多選一的情況,則可以使用if…else if…else語句,該語句是一個(gè)多分支選擇語句,通常表現(xiàn)為“如果滿足某種條件,進(jìn)行某種處理,否則,如果滿足另一種條件,則執(zhí)行另一種處理……”。if…else if…else語句的語法格式如下:

使用if…else if…else語句時(shí),表達(dá)式部分必須用()括起來,它可以是一個(gè)單純的布爾變量或常量,也可以是關(guān)系表達(dá)式或邏輯表達(dá)式,如果表達(dá)式為真,執(zhí)行語句;而如果表達(dá)式為假,則跳過該語句,進(jìn)行下一個(gè)else if的判斷,只有在所有表達(dá)式都為假的情況下,才會(huì)執(zhí)行else中的語句。if…else if…else語句的流程圖如圖5.11所示。

圖5.11 if…else if…else語句的流程圖
注意
if和else if都需要判斷表達(dá)式的真假,而else則不需要判斷;另外,else if和else都必須跟if一起使用,不能單獨(dú)使用。
【例5.03】使用if…else if…else多分支語句實(shí)現(xiàn)根據(jù)用戶輸入的年齡輸出相應(yīng)信息提示的功能,代碼如下:(實(shí)例位置:資源包\源碼\05\5.03)

運(yùn)行程序,輸入一個(gè)年齡值,按回車鍵,即可輸出相應(yīng)的信息提示,效果如圖5.12所示。

圖5.12 if…else if…else多分支語句的使用
技巧
使用if選擇語句時(shí),盡量遵循以下原則。
(1)使用bool變量作為判斷條件,假設(shè)bool變量flag,較為規(guī)范的書寫:

不符合規(guī)范的書寫:
(2)使用浮點(diǎn)類型變量與0值進(jìn)行比較時(shí),規(guī)范的書寫格式如下:

不符合規(guī)范的書寫格式如下:

(3)使用if(1==a)這樣的書寫格式可以防止錯(cuò)寫成if(a=1)這種形式,以避免邏輯上的錯(cuò)誤。
5.2.4 if語句的嵌套
前面講過3種形式的if選擇語句,這3種形式的選擇語句之間都可以進(jìn)行互相嵌套。例如,在最簡單的if語句中嵌套if…else語句,形式如下:

例如,在if…else語句中嵌套if…else語句,形式如下:

說明
if選擇語句可以有多種嵌套方式,開發(fā)程序時(shí),可以根據(jù)自身需要選擇合適的嵌套方式,但一定要注意邏輯關(guān)系的正確處理。
【例5.04】通過使用嵌套的if語句實(shí)現(xiàn)判斷用戶輸入的年份是不是閏年的功能,代碼如下:(實(shí)例位置:資源包\源碼\05\5.04)

說明
判斷閏年的方法是“四年一閏,百年不閏,四百年再閏”。程序使用嵌套的if語句對這3個(gè)條件逐一判斷,第5行代碼首先判斷年份能否被4整除iYear%4==0,如果不能整除,輸出字符串“這不是閏年”,如果能整除,第7行代碼繼續(xù)判斷能否被100整除iYear%100==0,如果不能整除,輸出字符串“這是閏年”,如果能整除,第9行代碼繼續(xù)判斷能否被400整除iYear%400==0,如果能整除,輸出字符串“這是閏年”,如果不能整除,輸出字符串“這不是閏年”。
運(yùn)行程序,當(dāng)輸入一個(gè)閏年年份時(shí)(如2000),效果如圖5.13所示;當(dāng)輸入一個(gè)非閏年年份時(shí)(如2017),效果如圖5.14所示。

圖5.13 輸入閏年年份的結(jié)果

圖5.14 輸入非閏年年份的結(jié)果
說明
(1)使用if語句嵌套時(shí),要注意else關(guān)鍵字要和if關(guān)鍵字成對出現(xiàn),并且遵守臨近原則,即else關(guān)鍵字總是和自己最近的if語句相匹配。
(2)在進(jìn)行條件判斷時(shí),應(yīng)該盡量使用復(fù)合語句,以免產(chǎn)生二義性,導(dǎo)致運(yùn)行結(jié)果和預(yù)想的不一致。
5.3 switch多分支語句

視頻講解
在開發(fā)中一個(gè)常見的問題就是檢測一個(gè)變量是否符合某個(gè)條件,如果不符合,再用另一個(gè)值來檢測它,依此類推,當(dāng)然,這種問題可以使用if選擇語句完成。
例如,使用if語句檢測變量是否符合某個(gè)條件。

在執(zhí)行上面代碼時(shí),每一條if語句都會(huì)進(jìn)行判斷,這樣顯得非常煩瑣,為了簡化這種編寫代碼的方式,C#中提供了switch語句,將判斷動(dòng)作組織了起來,以一個(gè)比較簡單的方式實(shí)現(xiàn)“多選一”的邏輯。本節(jié)將對switch語句進(jìn)行詳細(xì)講解。
5.3.1 switch語句
switch語句是多分支條件判斷語句,它根據(jù)參數(shù)的值使程序從多個(gè)分支中選擇一個(gè)用于執(zhí)行的分支,其基本語法如下:

switch關(guān)鍵字后面的括號(hào)()中是要判斷的參數(shù),參數(shù)必須是sbyte,byte,short,ushort,int,uint,long,ulong,char,string,bool或者枚舉類型中的一種,大括號(hào){ }中的代碼是由多個(gè)case子句組成的,每個(gè)case關(guān)鍵字后面都有相應(yīng)的語句塊,這些語句塊都是switch語句可能執(zhí)行的語句塊。如果符合常量值,則case下的語句塊就會(huì)被執(zhí)行,語句塊執(zhí)行完畢后,執(zhí)行break語句,使程序跳出switch語句;如果條件都不滿足,則執(zhí)行default中的語句塊。
注意
(1)case后的各常量值不可以相同,否則會(huì)出現(xiàn)錯(cuò)誤。
(2)case后面的語句塊可以多條語句,不必使用大括號(hào){}括起來。
(3)case語句和default語句的順序可以改變,但不會(huì)影響程序執(zhí)行結(jié)果。
(4)一個(gè)switch語句中只能有一個(gè)default語句,而且default語句可以省略。
switch語句的執(zhí)行流程圖如圖5.15所示。

圖5.15 switch語句的執(zhí)行過程
【例5.05】使用switch多分支語句實(shí)現(xiàn)查詢高考錄取分?jǐn)?shù)線的功能,其中,民辦本科:350分,藝術(shù)類本科:290分,體育類本科:280分,二本:445分,一本:555分。代碼如下:(實(shí)例位置:資源包\源碼\05\5.05)

程序運(yùn)行效果如圖5.16所示。

圖5.16 查詢高考錄取分?jǐn)?shù)線
常見錯(cuò)誤
(1)使用switch語句時(shí),常量表達(dá)式的值絕不可以是浮點(diǎn)類型。例如下面的代碼就是不合法的:

在Visual Studio 2017開發(fā)環(huán)境中運(yùn)行上面代碼時(shí),將會(huì)出現(xiàn)如圖5.17所示的錯(cuò)誤提示。

圖5.17 判斷參數(shù)為浮點(diǎn)類型時(shí)出現(xiàn)的錯(cuò)誤提示
(2)使用switch語句時(shí),每一個(gè)case語句或者default后面必須有一個(gè)break關(guān)鍵字,否則,將會(huì)出現(xiàn)如圖5.18所示的錯(cuò)誤提示。

圖5.18 缺少break關(guān)鍵字時(shí)的錯(cuò)誤提示
5.3.2 switch與if…else if…else的區(qū)別
5.2.3節(jié)中講到的if…else if…else語句也可以實(shí)現(xiàn)多分支選擇的情況,但它主要是對布爾表達(dá)式、關(guān)系表達(dá)式或者邏輯表達(dá)式進(jìn)行判斷,而switch多分支語句主要對常量值進(jìn)行判斷。因此,在程序開發(fā)中,如果遇到多分支選擇的情況,并且判斷的條件不是關(guān)系表達(dá)式、邏輯表達(dá)式或者浮點(diǎn)類型,就可以將使用switch語句代替if…else if…else語句,這樣執(zhí)行效率會(huì)更高。
5.4 小結(jié)
本章詳細(xì)介紹了條件語句的概念及用法。在程序中,語句是程序完成一次操作的基本單位,而流程語句控制語句執(zhí)行的順序,在講解流程控制語句過程中,通過實(shí)例演示每種語句的用法。在學(xué)習(xí)本章內(nèi)容時(shí),讀者要重點(diǎn)掌握if語句、switch語句的用法,因?yàn)檫@兩種語句在程序開發(fā)中會(huì)經(jīng)常用到,希望通過對本章的學(xué)習(xí),讀者能夠熟練掌握C#中條件控制語句的使用,并能夠應(yīng)用于實(shí)際的開發(fā)中。
5.5 實(shí)戰(zhàn)
5.5.1 實(shí)戰(zhàn)一:模擬到銀行取錢場景
模擬到銀行取錢場景:已知銀行卡密碼是404328,密碼正確才可以取錢。使用if語句判斷取錢密碼是否正確。如果輸入的密碼是404328,則說明密碼正確,運(yùn)行效果如圖5.19所示。(實(shí)例位置:資源包\源碼\05\實(shí)戰(zhàn)\01)

圖5.19 模擬到銀行取錢場景
5.5.2 實(shí)戰(zhàn)二:模擬設(shè)計(jì)游戲關(guān)卡
模擬設(shè)計(jì)游戲關(guān)卡,要求根據(jù)輸入的數(shù)字,直接進(jìn)入對應(yīng)的關(guān)卡。如,輸入的是數(shù)字3,控制臺(tái)輸出“當(dāng)前進(jìn)入第3關(guān)”,游戲設(shè)置只有3關(guān),因此,當(dāng)輸入不是1,2,3的數(shù)字時(shí),提示“請輸入正確的關(guān)數(shù),當(dāng)前游戲只有3關(guān)”。輸入正確關(guān)數(shù)的效果如圖5.20所示,輸入不正確關(guān)數(shù)的效果如圖5.21所示。(實(shí)例位置:資源包\源碼\05\實(shí)戰(zhàn)\02)

圖5.20 輸入正確關(guān)數(shù)

圖5.21 輸入不正確關(guān)數(shù)
- Data Visualization with D3 4.x Cookbook(Second Edition)
- 數(shù)據(jù)科學(xué)實(shí)戰(zhàn)手冊(R+Python)
- ASP.NET MVC4框架揭秘
- Mastering OpenCV Android Application Programming
- 垃圾回收的算法與實(shí)現(xiàn)
- Java從入門到精通(第5版)
- Python零基礎(chǔ)快樂學(xué)習(xí)之旅(K12實(shí)戰(zhàn)訓(xùn)練)
- SEO實(shí)戰(zhàn)密碼
- TMS320LF240x芯片原理、設(shè)計(jì)及應(yīng)用
- 新印象:解構(gòu)UI界面設(shè)計(jì)
- HTML+CSS+JavaScript網(wǎng)頁制作:從入門到精通(第4版)
- 微前端設(shè)計(jì)與實(shí)現(xiàn)
- Mastering ASP.NET Core 2.0
- 從零開始學(xué)算法:基于Python
- Building UIs with Wijmo