# 流程控制
[TOC]
## 導學
在之前的js學習中,我們同學也接觸到了關于流程控制的內容,事實上流程控制就是我們日常生活中的實際應用,比如我們有時候做一件事會從頭到尾的給做下去,有時候會根據實際情況選擇做某件事情,有時候會不斷重復的做某件事情。
那么,在我們的編程中也會存在類似的情況,本節課程我們就來學習如何去應用編程語法完成對流程的控制。
## 流程控制分類
* 順序結構
* 判斷(分支選擇)結構
* 循環結構
## 順序結構
程序是一個自上而下運行的過程。
## 分支選擇結構
Java 中的分支選擇結構有 if 結構、switch 結構
### if 結構
具備三種類型的結構表現形式
* **形式一:**
~~~
if (logic expression) {
statement;
}
~~~
示例:
~~~
int age = 20;
if (age > 18) {
String name = "Tom";
System.out.println("我叫" + name + ",已經" + age + "歲了,我成年了!");
}
~~~
* **形式二:**
~~~
if (logic expression) {
statement;
} else {
statement;
}
~~~
示例:
~~~
int age = 16;
if (age > 18) {
String name = "Tom";
System.out.println("我叫" + name + ",已經" + age + "歲了,我成年了!");
} else {
System.out.println("我還未成年!");
}
~~~
* **形式三:**
~~~
if (logic expression) {
statement;
} else if (logic expression) {
statement;
} else {
statement;
}
~~~
示例:
~~~
if (age >= 0 && age <= 10) {
System.out.println("少年");
} else if (age <= 18) {
System.out.println("青少年");
} else if (age <= 30) {
System.out.println("青年");
} else if (age <= 50) {
System.out.println("中年");
} else {
System.out.println("老年");
}
~~~
### switch 結構
swtich 語句是有控制表達式和多個 case 標簽塊組成。
> 在控制表達式中,只允許出現 byte、short、int、char四種基礎數據類型,在JDK1.7以后,支持 String 類型的控制表達式。
~~~
switch (expression) {
case condition1 : {
statement;
break;
}
case condition2 : {
statement;
break;
}
default : {
statement;
break;
}
}
~~~
示例:
~~~
String color = "red";
switch (color) {
case "red": {
System.out.println("紅色");
break;
}
case "blue": {
System.out.println("藍色");
break;
}
case "green": {
System.out.println("綠色");
break;
}
default: {
System.out.println("沒有找到");
break;
}
}
~~~
> 在 case 中要加入 break 關鍵字跳出;
> 在實際的開發中,我們一般使用 if - else 結構替代 switch。swtich 結構應用的較少。
## 循環結構
循環語句可以在滿足循環條件的情況下,反復執行某一段代碼。
被重復執行的代碼叫做**循環體**。
循環語句可能包含的部分有:
* 初始化語句(init\_statement):一條或多條語句,這些語句用于完成一些初始化的工作。
* 循環條件(test\_expression):是一個 boolean 類型的表達式,這個表達式決定是否繼續執行循環體。
* 循環體(body\_statement):如果條件允許,循環體會被反復執行。
* 迭代語句(iteration\_statement):在一次循環體執行結束后,對循環體條件進行求值,通常用于控制循環條件中的變量,使得循環在合適的時候結束。
### while 結構
~~~
(init_statement);
while (test_expression) {
body_statement;
[iteration_statement];
}
~~~
示例:
~~~
int sum = 0;
int i = 1;
while (i <= 10) {
sum = sum + i;
i++;
}
System.out.println(sum); // 55
~~~
### do-while 結構
~~~
(init_statement);
do {
body_statement;
[iteration_statement];
} while (test_expression)
~~~
> 無論如何都會執行一次循環體內容
> 示例:
~~~java
int i = 1;
int sum = 0;
do {
sum += i++;
// sum = sum + i;
// i = i + 1;
} while (i <= 10);
System.out.println(sum); // 11
~~~
### for 循環
語法:
~~~
for ([init_statement]; test_expression; [iteration_statement]) {
body_statement;
}
~~~
示例:
~~~
int sum = 0;
for (int i = 1; i <= 28; i++) {
sum = sum + i;
}
System.out.println(sum);
~~~
> 在實際的開發中,對于已知循環次數的遍歷,一般使用 for 循環。而且 for 循環的應用場景要比 while 循環多。
### 控制循環結構
**break**:在循環體中,使用 break 關鍵字跳出**整個循環**。
~~~
int flag = 6;
int sum = 0;
for (int i = 1; i <= 10; i++) {
sum = sum + i;
if (i == flag) {
break;
}
}
System.out.println(sum); // 21
~~~
**continue**:在循環體中,使用 continue 跳出**本次循環**,循環還會繼續執行。
~~~
int sum = 0;
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue;
}
sum = sum + i;
}
System.out.println(sum); // 25
~~~
## 程序調試-debug
開發人員經常會在開發程序的時候出現錯誤。那么,如何快速的找出錯誤,就成為開發人員重要的一項技能。
我們把錯誤通常稱為bug,而把找錯誤叫做debug。
對于找錯誤,我們通常會采用調試這一方法,它的作用在于能讓程序員看清楚程序每一步的效果,在需要查看結果的時候,使用debug查看實際結果是否與預期結果一致。
>[warning]注意:編譯的錯誤,開發工具一般會自動的報錯,我們一般對程序進行調試是為了找出邏輯上的錯誤。
~~~
我們以這段代碼為例,進行調試
public static void main(String[] args) {
int sum = 0;
for(int n = 1; n <= 5; n++) {
sum = sum + n;
//輸出sum的值
System.out.println("sum=" + sum);
}
System.out.println("sum=" + sum);
}
~~~
步驟:
1. 設置斷點(斷點是指程序運行到點的位置就終止了,斷點可以設置多個)

比如想要查看sum的值,就可以在藍色區域雙擊,就會出現一個小點,這就是斷點。雙擊和鼠標右鍵選擇也可以取消斷點。
2. 選擇調試運行

鼠標右鍵選擇調試運行,或選擇如圖所示的調試運行的運行按鈕。
3. 打開debug視圖

4. 視圖作用

5. 快捷鍵調試
~~~
F5進入函數,單步條數
F6不進入函數,單步調試
F7由函數內部,返回調用處
F8一直執行到下個斷點處,知道終止調試
~~~
## 練習
一、選擇
1. 請看下面的程序代碼,運行結果為:

~~~
A. 2 B. 3 C. 4 D. 編譯出錯,無結果
~~~
2. 當a=1,b=3,c=5,d=4時,執行完下面一段程序后x的值是()

~~~
A. 1 B. 2 C. 3 D. 6
~~~
3. 關于switch結構,以下說法正確的是?
~~~
A. default語句在switch結構中是必需的
B. break語句在switch結構中是必需的
C. default語句后的語句總是會被執行
D. switch()小括號中的表達式可以是字符串類型
~~~
4. 關于選擇結構下列哪個說法是正確的?
~~~
A. if語句和else語句必須成對出現
B. if語句可以沒有else語句對應
C. switch結構中每個case語句中必須用break語句
D. switch結構中必須有default語句
~~~
5. 下面代碼的運行結果為()

~~~
A. 3 B. 7 C. 3 7 D. 7 3
~~~
6. 下列語句序列執行后,k 的值是?

~~~
A. 0 B. 1 C. 2 D. 3
~~~
7. 下面關于這段程序的描述正確的是()

~~~
A. while循環執行10次
B. 循環是無限循環
C. 循環體語句一次也不執行
D. 循環體語句值執行一次
~~~
8. 下面這段代碼循環體執行()次

~~~
A. 1 B. 5 C. 6 D. 無限次
~~~
9. 下列語句序列執行后,j 的值是?

~~~
A. 3 B. 4 C. 5 D. 6
~~~
10. 以下正確的描述是
~~~
A. continue語句的作用是結束整個循環的執行
B. 只能在循環體內和switch語句體內使用break語句
C. 在循環體內使用break語句或continue語句的作用相同
D. break語句是結束當前循環,但是繼續進行下一次循環
~~~
二、編程
1. 根據下面數學函數,編寫程序根據x的值,計算y的值,最后輸出x和y的值。(使用多重if-else結構完成)

效果圖:

~~~
public class IfElseDemo {
public static void main(String[] args) {
//定義整型變量x并初始化為-5
//定義整型變量y并初始化0
//根據所給條件,使用多重if-else結構求y的值
//輸出x和y的值
}
}
~~~
2. 給定一個字符變量,判斷該變量是否為元音字母并輸出。
任務:
1. 定義一個字符變量ch并初始化
2. 使用switch結構判斷是否為元音字母,如果是元音字母則輸出如效果圖所示的內容,如果不是元音字母則輸出:不是元音字母
提示:
元音字母為a、e、i、o、u
~~~
public class CharDemo {
public static void main(String[] args) {
//定義一個字符變量并初始化
//使用switch結構判斷是否為元音字母,并輸出對應的信息
}
}
~~~
3. 使用while循環求1到5的平方和。
~~~
public class LoopDemo {
public static void main(String[] args) {
//定義整型變量n作為循環變量,并初始化
//定義整型變量sum存放和,并初始化
//使用while循環求1到5的平方和
//輸出平方和
}
}
~~~
4. 編寫一個程序,求出200到300之間的數,且滿足條件:它們三個數字之積為42,三個數字之和為12。
任務:
1. 循環遍歷200到300之間的整數
2. 分別取出個位、十位和百位上的數
3. 求三個數字的和與積
4. 判斷三個數字的積是否為42,三個數字的和是否為12,如果滿足條件則輸出該數
~~~
public class LoopDemo {
public static void main(String[] args) {
//定義變量ge、shi、bai,用于存放個位、十位、百位上的數字
//使用for循環
//取出百位數
//取出十位數
//取出個位數
//計算三個數字之積
//計算三個數字之和
//如果積等于42并且和為12,則將滿足條件的數輸出
}
}
~~~