官术网_书友最值得收藏!

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語句的使用方法。

主站蜘蛛池模板: 德化县| 罗甸县| 陇西县| 霍林郭勒市| 南宁市| 永泰县| 文水县| 永安市| 宝坻区| 大荔县| 奉新县| 灵石县| 老河口市| 云霄县| 陇南市| 石棉县| 文昌市| 比如县| 沂源县| 嫩江县| 开江县| 黑山县| 黄骅市| 蓬莱市| 雅安市| 大化| 芒康县| 平罗县| 涡阳县| 迭部县| 福建省| 祁连县| 贵州省| 新干县| 东海县| 左贡县| 疏勒县| 南阳市| 廉江市| 溧水县| 乐东|