- Java程序設計與實踐教程(第2版)
- 楊麗萍 王薇 張焱焱主編 北京云班科技有限公司副主編
- 2636字
- 2019-07-01 11:10:52
3.2 選擇結構
選擇結構提供了這樣一種控制機制,它根據條件表達式值的不同,選擇執行不同的語句序列,其他與條件值或表達式值不匹配的語句序列則被跳過不執行。選擇結構分為條件結構(if語句)和多分支結構(switch語句)。
3.2.1 if語句
1.if結構
if語句是Java中的條件選擇語句。一般語法格式如下:
if(條件) statement;
或者
if(條件) { block }
格式中的“條件”為關系表達式或邏輯表達式,其值為布爾值。
第一種情況下,在條件為真時,執行一條語句statement;否則跳過statement執行下面的語句。
第二種情況下,在條件為真時,執行多條語句組成的代碼塊block;否則跳過block執行下面的語句。
if結構的流程如圖3-1所示。

圖3-1 if結構的流程圖
【例3-1】 輸入數據x,測試其是否小于一個標識符常量。若小于標識符常量,則輸出x的值。
//文件名:InputTest.java import java.io.*; //導入所需要的公用類 public class InputTest{ public static void main(String args[]) throws IOException { final int MAX_NUM=50; //定義標識符常量MAX_NUM=50 //下面7行語句的作用是從鍵盤輸入一個整數并存放到變量x中 InputStreamReaderir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); System.out.println("Input x is:"); String s=in.readLine(); int x=Integer.parseInt(s); //下面用if結構判斷x的值是否小于MAX_NUM if (x<MAX_NUM){ System.out.println("x="+x); } } }
2.if-else結構
Java語言中,較常見的條件結構是if-else結構。一般語法格式如下:
if (條件) statement1;或{bolck1} else statement2;或{block2}
在條件為真時,執行statement1或代碼塊block1,然后跳過else和statement2(或代碼塊block2)執行下面的語句;在條件為假時,跳過語句statement1(或代碼塊block1)執行else后面的statement2(或代碼塊block2),然后繼續執行下面的語句。
if-else結構的流程如圖3-2所示。

圖3-2 if-else結構的流程示意圖
知識提示 else子句不能單獨作為語句使用,它必須和if子句配對使用。
3.if-else if結構
當需要處理多個分支時,可以使用if-else if結構。一般語法格式如下:
if (條件1) statement1;或 { block1 } else if (條件2) statement2; 或{ block2 } … else if (條件N) statementN; 或{ blockN } [else statementN+1;或{ blockN+1 }]
if-else if結構的流程如圖3-3所示。

圖3-3 if-else if結構的流程示意圖
其中,else部分是可選的。else總是與離它最近的if配對。下面舉一個例子加以說明。
【例3-2】 某公司為經銷員制定了產品的銷售任務,用task表示。下面的程序根據經銷員實際完成銷售值的不同分別輸出不同的信息,并發給不同的紅利。
//文件名:SalesTest.java import java.io.*; //導入所需要的公用類 public class SalesTest { public static void main(String args[]) throws IOException { int task=30; //銷售任務 int bonus; //紅利 //從鍵盤輸入實際完成的銷售值存放到變量yourSales中 InputStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); System.out.println("Input your Sales is: "); String s=in.readLine(); int yourSales=Integer.parseInt(s); //用if-else if結構判斷yourSales的大小,決定紅利多少并輸出不同的信息 if (yourSales>=2*task) { //實際銷售值達到或超出銷售任務的2倍 bonus=1000; System.out.println("Excellent! bonus="+bonus); } else if (yourSales>=1.5*task) { //達到或超出1.5倍,但小于2倍 bonus=500; System.out.println("Fine! bonus="+bonus); } else if (yourSales>=task) { //達到或超出銷售任務,但小于1.5倍 bonus=100; System.out.println("Satisfactory! bonus="+bonus); } else { //未完成銷售任務 System.out.println("You're fired"); } } }
程序的運行結果如下:
Input your Sales is: 50 Fine! bonus=500
再次運行結果如下:
Input your Sales is: 20 You're fired
【例3-3】 用if-else if結構實現下面的符號函數:

//文件名:SignFunction.java import java.io.*; //導入所需要的公用類 public class SignFunction { public static void main(String args[]) throws IOException { InputStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); System.out.println("Input x is:"); String s=in.readLine(); int x=Integer.parseInt(s); int y; //下面用if-else if結構求y的值 if (x<0){ y=-1; } else if (x==0){ y=0; } else { y=1; } System.out.println("x="+x+"y="+y); // 輸出x和y的值 } }
3.2.2 案例分析:閏年問題
1.案例描述
創建一個程序,通過輸入的年份,判斷是否為閏年。
2.案例分析
根據案例描述中的要求信息,分析如下:因為閏年的年份可被4整除而不能被100整除,或者能被400整除。因此,首先輸入年份存放到變量year中,如果表達式(year%4==0 &&year%100! =0||year%400==0)的值為true,則為閏年;否則就不是閏年。
3.案例實現
本例的代碼如下:
//文件名:LeapYear.java import java.io.*; //導入所需要的公用類 public class LeapYear { public static void main(String args[]) throws IOException { //下面7行語句的作用是從鍵盤輸入年份存放到變量year中 InputStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); System.out.println("Input year is: "); String s=in.readLine(); int year=Integer.parseInt(s); //下面用if-else結構判斷year中的年份是否為閏年 if (year % 4 ==0 && year % 100 ! =0 || year % 400 ==0){ System.out.println("year"+year+"is a leap year."); } else{ System.out.println("year"+year+"is not a leap year."); } } }
4.歸納與提高
本例中,應掌握if-else定義的形式和方法。需要注意的是,else語句一定要和if語句配對使用,不可單獨使用,if或else語句體中的語句若多于一條,則外面需用花括號括起來。
3.2.3 switch語句
必須在多個備選方案中處理多項選擇時,再用if-else結構就顯得很煩瑣,這時可以使用switch語句來實現同樣的功能。switch語句基于一個表達式值來執行多個分支語句中的一個,它是一個不需要布爾求值的流程控制語句。switch語句的一般語法格式如下:
switch(表達式) { case值1:語句1; break; case值2:語句2; break; … case值N:語句N; break; [ default: 上面情況都不符合情況下執行的語句;] }
switch結構的流程如圖3-4所示。

圖3-4 switch結構的流程示意圖
對switch結構有以下幾點說明:
(1)表達式只能返回這幾種類型的值:int、byte、short和char。多分支結構把表達式的值依次與每個case子句中的值相比較,如果遇到匹配的值,則執行該case子句后的語句序列。
(2)case子句中的值(value)必須是常量,而且所有case子句中的值應是不同的。
(3)default子句是可選擇的。當表達式的值與任一一個case子句中的值都不匹配時,程序執行default后面的語句;如果表達式的值與任一一個case子句中的值都不匹配而且沒有default子句,則程序不做任何操作,而是直接跳出switch語句結構。
(4)break語句用來在執行完一個case分支后,使程序跳出switch結構,即終止switch結構的執行。因為case子句只是起到一個標號的作用,用來查找匹配的入口并從此處開始執行。如果沒有break語句,當程序執行完匹配的case語句序列后,后面的case子句起不到跳出switch結構的作用,程序還會繼續執行后面的case語句序列。因此應該在每個case分支后,用break語句終止后面的case分支語句序列的執行。
在一些特殊情況下,多個相鄰的case分支執行一組相同的操作。為了簡化程序的編寫,相同的程序段只需出現一次,即出現在最后一個case分支中。這時為了保證這組case分支都能執行正確的操作,只在這組case分支的最后一個分支后加break語句,組中其他case分支則不使用break語句。
(5)case分支中包含多條語句時,可以不用花括號{}括起。
(6)switch結構的功能可以用if-else if結構來實現,但在某些情況下,使用switch結構更簡練,可讀性強,而且程序的執行效率也得到提高。
與if-else if結構相比,switch結構在數據類型上受到了限制,即只能用int、byte、short和char型。若數據類型是double型,便不能用switch結構,這是Java的不足之處。
【例3-4】 使用switch語句結構輸出四月份的季節。
//文件名:SwitchSample.java public class SwitchSample { public static void main(String args[]) { int month=4; String season; switch (month){ case 12: case 1: case 2: season="Winter"; break; case 3: case 4: case 5: season="Spring"; break; case 6: case 7: case 8: season="Summer"; break; case 9: case 10: case 11: season="Autumn"; break; default: season="Bogus Month"; } System.out.println("April is in the "+season+"."); } }
程序的運行結果如下:
April is in the Spring.
【例3-5】 設x=10, y=5,試用switch結構實現當輸入字符+、-、*、/時,分別計算x、y的和、差、積、商。
//文件名:Calculator.java import java.io.*; //導入所需要的公用類 public class Calculator { public static void main(String args[]) throws IOException { int x=10, y=5, z; char ch; //變量ch用來存放從鍵盤輸入的字符 //下面7行語句的作用是從鍵盤輸入ch的值 InputStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); System.out.println("Input ch is:"); String s=in.readLine(); ch=s.charAt(0); //下面用switch結構實現計算器的功能 switch (ch) { case '+': z=x+y; System.out.println("x+y="+z); // '+’時輸出x+y的值 break; case '-': z=x-y; System.out.println("x-y="+z); //'-’時輸出x-y的值 break; case '*': z=x*y; System.out.println("x*y="+z); //'*’時輸出x*y的值 break; case '/': z=x/y; System.out.println("x/y="+z); //'/’時輸出x/y的值 break; default: System.out.println("Input Error! "); //輸入其他字符時提示出錯 } } }
程序的運行結果如下:
Input ch is: + x+y=15
再次運行結果為:
Input ch is: = Input Error!
3.2.4 案例分析:劃分成績等級
1.案例描述
將學生的考試成績轉換成不同的等級:90分以上為A,80分以上90分以下為B,70分以上80分以下為C,60分以上70分以下為D, E表示不及格。
2.案例分析
根據案例描述中的信息,本案例通過鍵盤輸入學生成績,由于學生成績數據較為分散,若直接用switch結構判斷成績是哪個等級不具備可行性,因此可以利用除法操作來輔助。例如:90分以上的成績為A,若用變量score來存儲分數,則可令score=score/10,由于除法操作只保留商值,舍棄余數,所以90分以上的分數經過除法運算之后,其值是9;80~90之間的成績,經除法后,其值為8;70~80之間的成績,經除法后,其值為7,以此類推,完全可以用switch語句結構來實現。
3.案例實現
本例的代碼如下:
//文件名:GradeDevide.java import java.io.*; public class GradeDevide { public static void main(String args[]) throws IOException{ int ch; //下面7行語句的作用是從鍵盤輸入ch的值 InputStreamReader ir; BufferedReader in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); System.out.println("Input ch is:"); String s=in.readLine(); ch=Integer.parseInt(s); char grade; ch=ch/10; switch(ch) { case 9: grade='A'; break; case 8: grade='B'; break; case 7: grade='C'; break; case 6: grade='D'; break; default: grade='F'; } System.out.println("grade= "+grade); } }
4.歸納與提高
本例中,應掌握switch語句的定義形式和方法。在定義switch語句時,注意case語句后的變量值一定是唯一的,而且不重復。對于本例,也可以利用if-else-if語句實現,從而進一步熟悉switch語句及if語句的使用方法。
- OpenStack Cloud Computing Cookbook(Third Edition)
- Progressive Web Apps with React
- 微服務設計原理與架構
- 零基礎學Java程序設計
- Full-Stack React Projects
- iOS應用逆向工程(第2版)
- TradeStation交易應用實踐:量化方法構建贏家策略(原書第2版)
- Mastering Drupal 8 Views
- 計算機應用基礎實踐教程
- Spring Boot+Vue全棧開發實戰
- Anaconda數據科學實戰
- Python自動化開發實戰
- OpenCV:Computer Vision Projects with Python
- 片上系統設計思想與源代碼分析
- 軟件測試(第2版)