- Java語言程序設(shè)計(jì)
- 陸遲編著
- 1821字
- 2019-01-09 14:01:53
3.2 分支語句
分支語句在程序中的作用是使程序更靈活,它允許程序根據(jù)不同的情況、不同的條件等采取不同的動(dòng)作、進(jìn)行不同的操作,實(shí)現(xiàn)選擇結(jié)構(gòu)。在Java語言中使用的分支語句有if -else語句和switch語句。
3.2.1 if - else語句
1.用單個(gè)if語句實(shí)現(xiàn)單選、雙選結(jié)構(gòu)
用一個(gè)if - else語句可實(shí)現(xiàn)根據(jù)一個(gè)關(guān)系或邏輯表達(dá)式的值是true還是false兩種情況下
進(jìn)行不同操作的程序結(jié)構(gòu),它的語法結(jié)構(gòu)如下:
if(布爾表達(dá)式) 語句1 [else 語句2]
執(zhí)行到本語句,首先要計(jì)算布爾表達(dá)式,若值為真,則執(zhí)行語句1,否則(值為假時(shí))執(zhí)行語句2(實(shí)現(xiàn)雙選結(jié)構(gòu))。語句1和語句2都可以是復(fù)合語句。
if - else語句的else語句2部分可省略,省略時(shí),若布爾表達(dá)式的值為假,則不執(zhí)行任何語句(實(shí)現(xiàn)單選結(jié)構(gòu))。
【例3.2】用Math類的random()方法產(chǎn)生一個(gè)字符,若該字符是一個(gè)大寫英文字母,則輸出“Yes!”,否則輸出“No!”。
random()方法產(chǎn)生的隨機(jī)數(shù)在0.0和1.0之間,乘以128后,其值在0.0和128.0之間,將它轉(zhuǎn)換為char類型后,用if來判斷是否在'A'和'Z'之間。程序如下:
class IsUpper{ public static void main(String args[]){ char ch; ch=(char)(Math.random()*128); if(ch >= 'A' && ch <= 'Z') System.out.println(ch + "是大寫字母。"); else System.out.println(ch + "不是大寫字母。"); } }
程序的一次運(yùn)行結(jié)果如下:
e不是大寫字母。
2.用多個(gè)if語句實(shí)現(xiàn)多選結(jié)構(gòu)
(1)if語句并列
在多個(gè)if語句中可書寫多個(gè)條件,若這些if并列,且這些條件包含了所有的情況無一遺漏也不重復(fù),就可以實(shí)現(xiàn)多選結(jié)構(gòu)。
【例3.3】對任意三個(gè)存放在變量a,b,c中的int類型數(shù)據(jù),按從小到大的順序輸出它們。
下面程序的設(shè)計(jì)思想是:將最小數(shù)據(jù)存入變量a中,這需要將a與b、c比較兩次;然后,將b,c中的小者存入變量b中,這需要b與c比較1次,共需比較3次。用3個(gè)并列if實(shí)現(xiàn)。
class Sort3{ public static void main(String args[]){ int a = 10,b = 8,c = 12,t; if(a > b){t = a;a = b;b = t;} if(a > c){t = a;a = c;c = t;} if(b > c){t = b;b = c;c = t;} System.out.println(a + " " + b + " " + c); } }
程序運(yùn)行結(jié)果如下:
8 10 12
在本例中,程序運(yùn)行前,數(shù)據(jù)a,b,c中的值是無序的,程序運(yùn)行后,a,b,c已經(jīng)按從小到大的順序排序。
(2)if語句嵌套
在if - else語句中,若語句1或語句2又是if - else語句時(shí),就構(gòu)成了if語句的嵌套。采用if嵌套的程序設(shè)計(jì)方法也可實(shí)現(xiàn)多選操作。
【例3.4】檢查用random()方法產(chǎn)生的一個(gè)字符,判斷是否為英文大寫字母、小寫字母、數(shù)字、空格或是其他符號,并輸出相應(yīng)信息。
程序要根據(jù)5 種不同的字符情況輸出不同的信息。這屬于多分支的程序設(shè)計(jì),采用if嵌套的方法。程序如下:
class Letter{ public static void main(String args[]){ char ch; ch=(char)(Math.random()*128); if(ch < ' ') System.out.println("是不可顯示字符!"); else if(ch >= 'a' && ch <= 'z') System.out.println(ch + " 是小寫字母!"); else if(ch >= 'A' && ch <= 'Z') System.out.println(ch + " 是大寫字母!"); else if(ch >= '0' && ch <= '9') System.out.println(ch + " 是數(shù)字!"); else System.out.println(ch + " 是其他符號!"); } }
需要注意的是,Java編譯器總是將else與其最近未配對的if配對。因?yàn)閕f - else語句允許else部分省略,會(huì)出現(xiàn)if的個(gè)數(shù)多于else個(gè)數(shù)的情況,此時(shí)要注意if和else的配對,否則可能發(fā)生邏輯錯(cuò)誤。例如:
if(x > 5) if(y > 10) System.out.println("x大于5并且y大于10。"); else System.out.println("x不大于5。");
程序員想實(shí)現(xiàn)x是否大于5輸出不同字符串的本意,但Java編譯器卻理解為:當(dāng)x大于5且y大于10時(shí)輸出第一個(gè)字符串,當(dāng)x大于5且y不大于10時(shí)輸出第二個(gè)字符串。兩個(gè)字符串均在x大于5時(shí)輸出,當(dāng)x不大于5時(shí),什么也不輸出,此時(shí)出現(xiàn)了邏輯錯(cuò)誤。
為避免嵌套時(shí)if和else配對時(shí)邏輯出錯(cuò),可用下面的方法之一來解決。
(1)在用if嵌套方法進(jìn)行多分支程序設(shè)計(jì)時(shí),將if語句嵌套在else部分。例如,上述例子中的邏輯關(guān)系可改寫為:
if(x <= 5) System.out.println("x不大于5。");
else if(y > 10) System.out.println("x大于5并且y大于10。");
(2)若需要在if - else語句的語句1部分嵌套if語句,則將內(nèi)層的if語句用括號括起來,指明正確的if與else的配對組合。例如,上述例子中的邏輯關(guān)系可改寫為:
if(x > 5){ if(y > 10) System.out.println("x大于5并且y大于10。"); } else System.out.println("x不大于5。");
3.2.2 switch語句
switch多分支語句結(jié)構(gòu)實(shí)際上也是一種if - else結(jié)構(gòu),不過它使得在編碼時(shí)很容易寫出判斷條件,特別是條件有很多選項(xiàng)而且比較簡單的時(shí)候。switch的語法結(jié)構(gòu)如下:
switch(表達(dá)式){ case值1: 語句1;break; case值2: 語句2;break; ... case值N: 語句N;break; default: 語句N+1;break; }
執(zhí)行switch語句時(shí),首先計(jì)算表達(dá)式的值(其類型是整型或字符型,并與各個(gè)case之后的常量值類型相同),然后將該值同每個(gè)case后的值做恒等比較:若相等,則程序流程轉(zhuǎn)入該值后的語句;若表達(dá)式的值與任何一個(gè)case后的值都不相同,則執(zhí)行default后的語句(若沒有default子句,則什么都不執(zhí)行)。
使用switch語句時(shí),需要注意的是:
(1)各個(gè)case后的常量值應(yīng)各不相同。
(2)通常在每一種case情況后都應(yīng)使用break語句,否則,遇到第一個(gè)相等情況后,下面break前的所有語句都會(huì)被執(zhí)行(包括default后面的語句,若有的話)。可以試著分別加上或去掉break語句來執(zhí)行例3.4。
(3)語句1至語句N+1可以是一條或多條語句,不必使用復(fù)合語句。
(4)不同case后的語句相同時(shí),可以合并多個(gè)case子句。
(5)switch語句在用表達(dá)式的值比較每一個(gè)case后的值時(shí),是從前往后順序進(jìn)行的。
若各個(gè)值互不相同,則case子句的順序可任意。通常default子句放在switch結(jié)構(gòu)的最后,使得switch語句最后執(zhí)行default子句。
【例3.5】查看五級分制的成績對應(yīng)的百分制成績的范圍。設(shè)百分制與五級分制成績的對應(yīng)關(guān)系為:
A:90~100 B:80~89 C:70~79 D:60~69 E: 60以下
class SwitchTest{ public static void main(String args[])throws java.io.IOException{ char a; System.out.println("請輸入大寫字母A ~ E:"); a=(char)System.in.read(); switch(a){ case 'A':System.out.println("范圍90~100!");break; case 'B':System.out.println("范圍80~89!");break; case 'C':System.out.println("范圍70~79!");break; case 'D':System.out.println("范圍60~69!");break; case 'E':System.out.println("60分以下!");break; default: System.out.println("重新輸入!"); } } }
在代碼中加break語句后,應(yīng)明確知道程序?qū)?huì)發(fā)生的變化,并要確認(rèn)程序沒有轉(zhuǎn)移到不想執(zhí)行的代碼上。
【例3.6】輸入一個(gè)小寫字母,判斷是元音還是輔音。
因?yàn)樵粲? 個(gè),都需要執(zhí)行相同的語句,為避免重復(fù),只需寫出最后一個(gè)值后的語句和break語句即可。
class EmptyCase { public static void main(String args[])throws java.io.IOException{ // 從鍵盤輸入一個(gè)小寫字母 char ch =(char)System.in.read(); // 確定是元音還是輔音 switch(ch) { case 'a': case 'e': case 'i': case 'o': case 'u':System.out.println(ch + " 是元音");break; default:System.out.println(ch + " 是輔音"); } } }
- 大學(xué)計(jì)算機(jī)應(yīng)用基礎(chǔ)實(shí)踐教程
- AngularJS Web Application Development Blueprints
- HTML5 Mobile Development Cookbook
- Groovy for Domain:specific Languages(Second Edition)
- Web程序設(shè)計(jì)(第二版)
- Flux Architecture
- 用Python實(shí)現(xiàn)深度學(xué)習(xí)框架
- RabbitMQ Cookbook
- Julia高性能科學(xué)計(jì)算(第2版)
- D3.js By Example
- LabVIEW虛擬儀器入門與測控應(yīng)用100例
- Django 3.0應(yīng)用開發(fā)詳解
- Kotlin極簡教程
- Arduino Wearable Projects
- Python GUI設(shè)計(jì)tkinter菜鳥編程(增強(qiáng)版)