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

3.4 分支結構

程序的分支結構實現分支流程。if語句是Java語言中實現分支流程的最基本語句。它根據給定的條件進行判斷,以決定是否執行某個分支程序段。Java語言的if語句有三種基本形式。

3.4.1 if形式

if語句的格式如下:

     if(表達式) 語句

執行流程是:如果表達式的值為true,則執行其后的語句,否則不執行該語句(見圖3.3)。

圖3.3 if語句的執行流程框圖

例3.1 設計一個Java GUI程序,計算并顯示用戶所輸入的最大整數。

分析:此程序界面中首先應有輸入整數的組件,使用前面學過的文本字段;顯示最大整數的組件也使用一個文本字段組件,設置為不可編輯;用戶可能輸入多個整數,則采用可以顯示多行文本的文本區域組件存放和顯示,且在GUI構建器中創建的文本區域組件當文本行數超過組件大小時還會顯示滾動條,它的editable屬性可以設置為不能編輯;使用兩個按鈕分別用于確定一個整數輸入的完成,以及重新開始另一組整數篩選時清除本組的所有數據。請讀者根據描述手工畫出界面草圖。

程序算法這樣考慮:在類的范圍內設置一個整型變量(字段)存放篩選出來的最大整數,其初值設置為int類型包裝類Integer提供的整數的最小值字段Integer.MIN_VALUE。程序運行時每當用戶輸入一個整數,就通過比較將該字段變量賦值為當前已經輸入的整數中的最大值;同時,還應該將輸入的這個整數添加到文本區域保存的整數列表中,并更新顯示最大數的文本字段的內容。

解:首先設計程序的GUI,簡要設計步驟如下。

(1)創建名為chap03的Java應用程序項目。注意取消“創建主類”復選框的選擇。以下操作均在該項目中進行。

(2)創建新的JFrame窗體,包名輸入book.ifdemos,類名輸入IfMaxDemo。設置該窗體的title屬性值為“最大數篩選程序”。

(3)在IfMaxDemo窗體中創建三個標簽組件,text屬性值分別為“輸入整數:”“所有整數:”和“最大整數:”。

(4)創建兩個文本字段,變量名為jTextFieldNum和jTextFieldMax,text屬性值為空,columns屬性值為16,jTextFieldMax組件的editable屬性值為false。

(5)創建一個文本區域組件,變量名設置為jTextAreaNums,editable屬性值為false,columns屬性值為16。

(6)創建兩個按鈕組件,變量名為jButtonInput和jButtonClearAll,text屬性值分別為“確定”和“清除”。

(7)IfMaxDemo窗體中組件的布局如圖3.4所示。

圖3.4 篩選最大數程序界面

以下步驟設計在jTextFieldMax文本字段顯示用戶輸入數據最大數的程序。

(8)單擊程序編輯窗口“源”標簽,切換到源代碼視圖。在IfMaxDemo類體的第一行(源代碼視圖的第13行)添加變量聲明“int maxNum=Integer.MIN_VALUE;”語句()。

(9)單擊程序編輯窗口“設計”標簽,切換到設計視圖。單擊“確定”按鈕組件jButtonInput,然后單擊屬性窗口的“事件”標簽,接著單擊屬性窗口actionPerformed行右側的…按鈕,在新出現的對話框中單擊“添加”按鈕,輸入新處理程序的名稱為addNumber,單擊“確定”按鈕,自動切換到“源”代碼視圖。

(10)在addNumber方法中輸入如圖3.5所示的語句。

圖3.5 IfMaxDemo類addNumber方法中輸入的Java語句段

(11)使用與步驟(9)相同的操作,為“清除”按鈕設計事件處理方法clearNums。該方法源代碼如下。

完成上述步驟后,運行程序,輸入一些整數,看到程序按要求工作(見圖3.6)。

圖3.6 例3.1程序運行窗口

程序解析:

(1)用戶在文本字段jTextFieldNum中輸入數據時有可能無意中在數值前后輸入了空格,需要用String類的trim方法去除;用戶有可能沒有輸入數值或輸入了幾個空格(或其他空白字符)就單擊“確定”按鈕,這時程序不必計算和處理什么。因此,使用if語句“if(text!=null && !text.trim().equals("")) {…}”確保用戶輸入了內容(text!=null)且(&&)不是空白輸入(!text.trim().equals("")),才進行計算處理({…})。

(2)在文本區域組件jTextAreaNums中從第二行起,對每個新輸入行都應該在換行(”\n”)之后添加一行顯示(jTextAreaNums.append("\n");)。因此,使用if語句確保文本區域已有內容(if(texts!=null && !texts.trim().equals("")))才添加換行符“TextAreaNums.append("\n");”。

(3)如果當前輸入的整數大于目前記錄的最大整數值(if(num>maxNum)),則將新輸入的整數賦值給記錄最大數的變量(maxNum = num;)。

顯然,使用if語句使此程序中的一些語句有條件地執行。

3.4.2 if-else形式

Java語言if語句的第二種形式是if-else,一般格式如下:

     if(表達式)
         語句1;
     else
         語句2;

執行流程是:如果表達式的值為true,則執行語句1,否則執行語句2(見圖3.7)。

圖3.7 if-else語句的執行流程框圖

例3.2 設計一個Java GUI程序,在用戶輸入一系列整數時,統計用戶所輸入的奇數和偶數個數。

分析:用戶所輸入的每個整數不是奇數就是偶數,所以程序的核心部分是二分支判斷結構——if(num%2==1) //奇數個數加1;

else //偶數個數加1;

GUI與例3.1大同小異。

解:按照以下步驟操作。

(1)在項目窗口右擊IfMaxDemo.java文件,在快捷菜單中選擇“復制”菜單項。然后右擊包名book.ifdemos,在快捷菜單中選擇“粘貼”|“重構復制”菜單項,新名稱輸入“IfElseDemo”,單擊“重構”按鈕。

(2)修改窗體IfElseDemo的title為“奇數偶數個數統計程序”。

(3)修改標簽“最大整數:”為“奇數個數:”,修改文本字段組件jTextFieldMax的變量名為jTextFieldOdd,設置jTextFieldOdd組件的columns值為3。

(4)添加標簽“偶數個數:”,添加文本字段組件且修改變量名為jTextFieldEven,設置該文本字段組件的columns值為3。

完成上述步驟后,得到如圖3.8所示GUI。

圖3.8 例3.2GUI設計視圖

(5)單擊“確定”按鈕,切換到屬性窗口“事件”視圖,單擊actionPerformed行右側下三角按鈕,選擇addNumber,編輯窗口會自動切換到“源”視圖。

(6)在IfElseDemo類體中修改原“int maxNum=0;”為“int oddNum=0;”,回車后添加語句“int evenNum=0;”。

(7)修改addNumber方法體代碼為:

(8)修改clearNums方法體代碼為:

     jTextFieldNum.setText("");
     jTextAreaNums.setText("");
     jTextFieldOdd.setText("");
     jTextFieldEven.setText("");
     oddNum=0;
     evenNum=0;

完成上述步驟后,右鍵單擊IfElseDemo.java文件,在快捷菜單中選擇“運行文件”菜單項開始運行程序,程序可以按照題意統計奇數和偶數個數。

3.4.3 if-else-if形式

前兩種形式的if語句一般都用于兩個分支的情況。當出現多個分支選擇的情況時,可采用if-else-if語句,其一般形式為:

     if(表達式1)
         語句1;
     else if(表達式2)
         語句2;
     else if(表達式3)
         語句3;
     …
     else if(表達式m)
         語句m;
     else
         語句n;

執行流程是:依次判斷表達式的值,當出現某個值為true時,則執行其對應的語句。然后跳到整個if語句之外繼續執行程序。如果所有的表達式均為false,則執行語句n。然后繼續執行后續程序。if-else-if語句的執行過程如圖3.9所示。

圖3.9 if-else-if語句的執行流程框圖

例3.3 設計一個Java GUI程序,在用戶輸入一些學生成績時,統計各分數段人數。其中,成績在90及以上為優秀、在80~89為良好、60~79為及格,0~59為不及格。要求成績取整數值,小于0和大于100的分數為非法輸入,應該過濾掉。

分析:由于需要把各個成績歸入4個合法分數段,所以進行多分支判斷,核心程序段應該采用if-else-if結構。

解:在項目chap03的book.ifdemos包中創建窗體IfElseIf之后,按照以下步驟設計。

(1)設計如圖3.10所示界面。其中,顯示4個分數段人數的文本字段組件變量名分別為jTextFieldGe90、jTextFieldGe80、jTextFieldGe60和jTextFieldB60,其余組件命名與例3.2相同。修改窗體title屬性值為“分數段頻數統計程序”。

圖3.10 例3.3程序的GUI設計視圖

(2)在IfElseIfDemo類體中開始位置添加語句:

     int numGe90=0;
     int numGe80=0;
     int numGe60=0;
     int numB60=0;

(3)為“確定”按鈕的actionPerformed事件添加addNumber方法,方法體代碼為:

(4)為“清除”按鈕的actionPerformed事件添加clearNums方法,方法體代碼如下。

     jTextFieldNum.setText("");
     jTextAreaNums.setText("");
     jTextFieldGe90.setText("");
     jTextFieldGe80.setText("");
     jTextFieldGe60.setText("");
     jTextFieldB60.setText("");
     numGe90 = 0;
     numGe80 = 0;
     numGe60 = 0;
     numB60 = 0;

完成上述步驟后,右擊IfElseIfDemo.java文件,在快捷菜單中選擇“編譯文件”菜單項。再次右擊IfElseIfDemo.java文件,在快捷菜單中選擇“運行文件”菜單項開始運行程序,程序可以按照題意工作。

3.4.4 if語句的嵌套

當if語句中的執行語句又是if語句時,則構成了if語句嵌套的情形。

其一般形式可表示如下:

     if(表達式)
         if語句;

或者為

     if(表達式)
        if語句;
     else
        if語句;

在嵌套內的if語句可能又是if-else型的,這將會出現多個if和多個else重疊的情況,這時要特別注意if和else的配對問題。

例如:

     if(表達式1)
     if(表達式2)
         語句1;
     else
         語句2;

其中的else究竟是與哪一個if配對呢?應該理解為:

     if(表達式1)
          if(表達式2)
             語句1;
          else
             語句2;

還是應理解為:

     if(表達式1)
         if(表達式2)
             語句1;
     else
         語句2;

為了避免這種二義性,Java語言規定,else總是與它前面最近的if配對,因此對上述例子應按前一種情況理解。

在Java GUI程序設計中,出現if語句嵌套的情況還是比較普遍的。例3.1和例3.2就使用了嵌套的if語句,在外層if語句確保文本框中有輸入內容的前提下,在內層才利用if語句計算正負數個數,或奇偶數個數。例3.3則演示了更復雜的if語句嵌套使用,其中第二層“if(num>=0 &&num<=100) {…}”確保輸入的分數是合法值,最內層的if語句則統計各個分數段人數。

主站蜘蛛池模板: 马山县| 凤冈县| 镇沅| 海阳市| 西华县| 阜阳市| 阳原县| 乌恰县| 湛江市| 漯河市| 闽清县| 永清县| 德昌县| 尤溪县| 潞西市| 瑞安市| 伊川县| 嘉峪关市| 广汉市| 宽城| 云和县| 康马县| 仙游县| 钦州市| 湾仔区| 高安市| 南部县| 毕节市| 延川县| 葵青区| 专栏| 镇雄县| 全州县| 武胜县| 普格县| 融水| 吴忠市| 柯坪县| 浪卡子县| 沾益县| 娄底市|