1. 程式人生 > 其它 >03 - 程式控制結構

03 - 程式控制結構

一、順序控制

程式從上到下逐行地執行,中間沒有任何判斷和跳轉。

順序控制舉例和注意事項:
Java中定義變數時採用合法的前向引用。

//正確形式
public class Test{
    int num1=12;
    int num2=num1+2;
}

//錯誤形式:
public class Test{
    int num2=num1+2;//num1還未宣告
    int num1=12;
}

二、分支控制

1. 單分支 if

基本語法

if(條件表示式){
            執行程式碼塊;(可以有多條語句.)
}

案例

//編寫一個程式,輸入人的年齡,如果年齡大於 18 歲,
//則輸出 "你年齡大於 18,要對自己的行為負責,送入監獄"
import java.util.Scanner;//匯入Scanner包

public static void main(String[] args) {
	Scanner myScanner = new Scanner(System.in);
	System.out.println("請輸入年齡");
	int age = myScanner.nextInt();
    if(age > 18) {
        System.out.println("你年齡大於 18,要對自己的行為負責,送入監獄");
    }
    	System.out.println("單分支if程式結束...");
    }
}

單分支if的說明

當條件表示式為true時,就會執行{}的程式碼。如果為false,就不執行。

如果{}中只有一條語句,則可以不用{},建議寫上{}

2. 雙分支 if-else

基本語法

if(條件表示式){
	執行程式碼塊1;
} else {
	執行程式碼塊2;
}

案例

//編寫一個程式,可以輸入人的年齡,如果該同志的年齡大於 18 歲,
//則輸出 "你年齡大於 18,要對自己的行為負責, 送入監獄"。
//否則 ,輸出"你的年齡不大這次放過你了."
import java.util.Scanner;//匯入Scanner包

public static void main(String[] args) {
	Scanner myScanner = new Scanner(System.in);
	System.out.println("請輸入年齡");

	int age = myScanner.nextInt();
	if(age > 18) {
		System.out.println("你年齡大於 18,要對自己的行為負責,送入監獄");
	} else {//雙分支 
		System.out.println("你的年齡不大這次放過你了");
	}
}

雙分支if-else的說明

當條件表示式成立,就會執行程式碼塊1,否則執行程式碼塊2。
如果執行程式碼塊中只有一條語句,則{}可以省略,否則,不能省略。

3. 多分支 if-else if -....-else

基本語法

if(條件表示式1){
    執行程式碼塊1;
} else if (條件表示式2) {
	執行程式碼塊2;
}
......
else {
    執行程式碼塊n;
}

案例

/* 輸入信用分: 如果:
信用分為 100 分時,輸出 信用極好;
信用分為(80,99]時,輸出 信用優秀;
信用分為[60,80]時,輸出 信用一般;
其它情況 ,輸出 信用不及格
請從鍵盤輸入信用分,並加以判斷
假定信用分數為 int
*/
import java.util.Scanner;

public static void main(String[] args) {
	Scanner myScanner = new Scanner(System.in);//接收使用者輸入
	System.out.println("請輸入信用分(1-100):");
	int grade = myScanner.nextInt();
	
	//先對輸入的信用分,進行一個範圍的有效判斷 1-100, 否則提示輸入錯誤
	if(grade >=1 && grade <= 100) {
		//因為有 4 種情況,所以使用多分支
        if(grade == 100) {
            System.out.println("信用極好");
		} else if (grade > 80 && grade <= 99) {
			//信用分為(80,99]時,輸出 信用優秀;
			System.out.println("信用優秀");
		} else if (grade >= 60 && grade <= 80) {
			//信用分為[60,80]時,輸出 信用一般
			System.out.println("信用一般");
		} else {
			//其它情況 ,輸出 信用 不及格
			System.out.println("信用不及格");
		}
	} else {
		System.out.println("信用分需要在 1-100,請重新輸入:)");
	}
}

多分支的說明

多分支可以沒有else,如果所有條件表示式都不成立,則一個執行入口都沒有

如果有else,如果裡面所有條件表示式都不成立,則預設執行else程式碼塊。

4. 巢狀分支

在一個分支結構中又完整的嵌套了另一個完整的分支結構,裡面的分支的結構稱為內層分支,外面的分支結構稱為外層分支。

建議: 不要超過 3 層 (可讀性不好)

基本語法

if() {
    if() {
        //if-else...
    } else {
        //if-else...
    }
}

案例

/*
參加歌手比賽,如果初賽成績大於 8.0 進入決賽,否則提示淘汰。
並且根據性別提示進入男子組或女子組。輸入成績和性別,進行判斷和輸出資訊。
提示: double score; char gender;
接收字元:
char gender = scanner.next().charAt(0)
*/

import java.util.Scanner;

public static void main(String[] args) {

	Scanner myScanner = new Scanner(System.in); 
	System.out.println("請輸入該歌手的成績"); 
	double score=myScanner.nextDouble();

    if( score > 8.0 ) {
        System.out.println("請輸入性別");
        char gender = myScanner.next().charAt(0);
            if( gender == '男' ) {
                System.out.println("進入男子組");
			} else if (gender == '女') {
				System.out.println("進入女子組");
			} else {
				System.out.println("你的性別有誤,不能參加決賽~");
			}
	} else {
		System.out.println("sorry ,你被淘汰了~");
    }
}

5. switch 分支結構

基本語法

switch(表示式) {
	case 常量1: //當...
		語句塊1;
		break;
	case 常量2;
		語句塊2;
		break;
	...
	case 常量n;
		語句塊n;
		break;
	default:
		default語句塊;
		break;
}

案例

/*
請編寫一個程式,該程式可以接收一個字元
比如:a,b,c,d,e,f,g
a 表示星期一,b 表示星期二 … 
根據使用者的輸入顯示相應的資訊。
要求使用 switch 語句完成
*/
import java.util.Scanner;

public static void main(String[] args) {
	Scanner myScanner = new Scanner(System.in);
	System.out.println("請輸入一個字元(a-g)");
	char c1 = myScanner.next().charAt(0);
	
	switch(c1) {
		case 'a' :
			System.out.println("今天星期一,猴子穿新衣");
			break;

		case 'b' :
			System.out.println("今天星期二,猴子當小二"); 
			break;

		case 'c' :
			System.out.println("今天星期三,猴子爬雪山.."); 
			break;

		default:
			System.out.println("你輸入的字元不正確,沒有匹配的");
	}
}

Switch分支注意事項

(1)switch關鍵字,表示switch分支
(2)表示式對應一個值
(3)case 常量1:當表示式的值等於常量1,就執行 語句塊1
(4)break:表示退出switch
(5)如果和case 常量1 匹配,就執行語句塊1,如果沒有繼續匹配case 常量2
(6)如果一個都沒有匹配上,執行default
(7)表示式資料型別,應和case後的常量型別一致,或者是可以自動轉成可以相互比較的型別,比如輸入的是字元,而常量是int
(8)switch(表示式)中表達式的返回值必須是:(byte、short、int、char、enum[列舉]、String)
	比如:
	double c = 1.1;
	switch(c){//錯誤
		case 1.1://錯誤
		System.out.println("ok3");
		break;
(9)case子句中的值必須是常量(1,'a')或者常量表達式,而不能是變數
(10)default子句是可選的,當沒有匹配的case時,執行default。如果沒有default子句,又沒有匹配任何常量,則沒有輸出
(11)break語句用來在執行完一個case分支後使程式跳出switch語句塊;如果沒有寫break,程式會順序執行到switch結尾,除非遇到break;

6. switch和if的區別

(1)如果判斷的具體數值不多,而且符合 byte、 short  、int、 char, enum[列舉], String 這 6 種類型。雖然兩個語句都可以使用,建議使用 swtich 語句。

(2)其他情況:對區間判斷,對結果為 boolean 型別判斷,使用 if,if 的使用範圍更廣

三、迴圈控制

1. for迴圈控制

基本語法

for(迴圈變數初始化; 迴圈條件; 迴圈變數迭代) {
	迴圈操作(可以多條語句);
}

案例

//列印 1~100 之間所有是 9 的倍數的整數,統計個數及總和.
public static void main(String[] args) {
	int count = 0; //統計 9 的倍數個數 變數
	int sum = 0; //總和 int start = 10;
	int end = 200;
	int t = 5; // 倍數
	for(int i = start; i <= end; i++) { 
		if( i % t == 0) {
			System.out.println("i=" + i);
			count++;
			sum += i;//累積
		}
	}
	System.out.println("count=" + count); 
	System.out.println("sum=" + sum);
}

for迴圈注意事項

(1)for 關鍵字,表示迴圈控制

(2)for 有四要素: 1-迴圈變數初始化 2-迴圈條件 3-迴圈操作 4-迴圈變數迭代

(3)迴圈操作,這裡可以有多條語句,也就是我們要迴圈執行的程式碼

(4)如果迴圈操作(語句)只有一條語句,可以省略 {}, 建議不要省略

(5)迴圈條件是返回一個布林值的表示式

(6)for(;迴圈判斷條件;) 中的初始化和變數迭代可以寫到其它地方,但是兩邊的分號不能省略。

(7)迴圈初始值可以有多條初始化語句,但要求型別一樣,並且中間用逗號隔開,迴圈變數迭代也可以有多條變數迭代語句,中間用逗號隔開。

2. while迴圈控制

基本語法

迴圈變數初始化;
while(迴圈條件) {
	迴圈體(語句);
	迴圈變數迭代;
}

案例

// 列印 1—100 之間所有能被 3 整除的數 [使用 while]
public static void main(String[] args) {
	int i = 1;
	int endNum = 100;

	while( i <= endNum) {
    	if( i % 3 == 0) {
        	System.out.println("i=" + i);
        }
    }
}

while迴圈注意事項

(1)while迴圈也有四要素

(2)只是四要素放的位置和for不一樣

(3)迴圈條件是返回一個布林值的表示式

(4)while 迴圈是先判斷再執行語句

3. do..while迴圈控制

基本語法

迴圈變數初始化;
do {
	迴圈體(語句);
	迴圈變數迭代;
} while(迴圈條件);

案例

//統計 1---200 之間能被 5 整除但不能被 3 整除的 個數

public static void main(String[] args) {
	int i = 1;
	int count = 0; //統計滿足條件的個數 
	do {
		if( i % 5 == 0 && i % 3 != 0 ) { 
			System.out.println("i=" + i); 
			count++;
		} i++;
	} while(i <= 200);
	System.out.println("count=" + count);
}

do...while迴圈注意事項

(1)迴圈條件是返回一個布林值的表示式

(2)do..while 迴圈是先執行,再判斷, 因此它至少執行一次

4. 跳轉控制語句-break

break 語句用於終止某個語句塊的執行,一般使用在 switch 或者迴圈 [for , while , do-while] 中。

基本語法

{
	......
	break;
	......
}

案例

//1-100 以內的數求和,求出 當和 第一次大於 20 的當前數 【for + break】

public static void main(String[] args) {
	int sum = 0; //累積和
	//注意 i 的作用範圍在 for{}
	int n = 0;
	for(int i = 1; i <= 100; i++) { 
		sum += i;//累積
		if(sum > 20) {
			System.out.println("和>20 時候 當前數 i=" + i);
			n = i;
			break;
		}
	}
	System.out.println("當前數=" + n);
}

跳轉控制語句-break注意事項

(1)break語句出現在多層巢狀的語句塊中時,可以通過標籤指明要終止的是哪一句語句塊。

(2)標籤的基本使用
label1:{	......
label2:		{	......
label3:			{	......
							break;
						......
					}
				}
		}

解讀:
(1)break語句可以指定退出哪層
(2)label1是標籤,名字由程式設計師指定。
(3)break後指定到哪個label就退出到哪裡
(4)在實際的開發中,儘量不要使用標籤
(5)如果沒有指定break,預設退出最近的迴圈體

5. 跳轉控制語句-continue

基本語法

{
	......
	continue;
	......
}

案例

public static void main(String[] args) {
	int i = 1;
	while( i <= 4) {
		i++;
		if( i == 2) {
			continue;
		}
	System.out.println("i=" + i);
	}
}

跳轉控制語句-continue注意事項

(1)continue 語句用於結束本次迴圈,繼續執行下一次迴圈。

(2) continue 語句出現在多層巢狀的迴圈語句體中時,可以通過標籤指明要跳過的是哪一層迴圈 ,  這個和前面的標籤的 使用的規則一樣.

6. 跳轉控制語句-return

return 使用在方法中,表示跳出所在的方法.

注意:如果 return 寫在 main 方法,則退出程式。

注:本部落格引用韓順平老師Java課程

Record Our Mind