07-流程控制
順序結構:程式從上到下執行。
分支結構:
if-else if - else
switch-case
迴圈結構:
for
while
do-while
//============================================================================================================================
1.if-else條件判斷結構
1.1.
結構一:
if(條件表示式){
執行表示式
}
結構二:二選一
if(條件表示式){
執行表示式1
}else{
執行表示式2
}
結構三:n選一
if(條件表示式){
執行表示式1
}else if(條件表示式){
執行表示式2
}else if(條件表示式){
執行表示式3
}
...
else{
執行表示式n
}
1.2.說明:
1》. else 結構是可選的。
2.》 針對於條件表示式:
> 如果多個條件表示式之間是“互斥”關係(或沒有交集的關係),哪個判斷和執行語句宣告在上面還是下面,無所謂。
> 如果多個條件表示式之間有交集的關係,需要根據實際情況,考慮清楚應該將哪個結構宣告在上面。
> 如果多個條件表示式之間有包含的關係,通常情況下,需要將範圍小的宣告在範圍大的上面。否則,範圍小的就沒機會執行了。
3》. if-else結構是可以相互巢狀的。
4》. 如果if-else結構中的執行語句只有一行時,對應的一對{}可以省略的。但是,不建議大家省略。
2.switch-case選擇結構
switch(表示式){
case 常量1:
執行語句1;
//break;
case 常量2:
執行語句2;
//break;
...
default:
執行語句n;
//break;
}
2.說明:
① 根據switch表示式中的值,依次匹配各個case中的常量。一旦匹配成功,則進入相應case結構中,呼叫其執行語句。
當呼叫完執行語句以後,則仍然繼續向下執行其他case結構中的執行語句,直到遇到break關鍵字或此switch-case結構
末尾結束為止。
② break,可以使用在switch-case結構中,表示一旦執行到此關鍵字,就跳出switch-case結構
③ switch結構中的表示式,只能是如下的6種資料型別之一:
byte 、short、char、int、列舉型別(JDK5.0新增)、String型別(JDK7.0新增)
④ case 之後只能宣告常量。不能聲明範圍。
⑤ break關鍵字是可選的。
⑥ default:相當於if-else結構中的else.
default結構是可選的,而且位置是靈活的。
3.如果switch-case結構中的多個case的執行語句相同,則可以考慮進行合併。
4.break在switch-case中是可選的
1 練習1:如何獲取一個隨機數:10 - 99 2 3 int value = (int)(Math.random() * 90 + 10);// [0.0,1.0) --> [0.0,90.0) --->[10.0, 100.0) -->[10,99] 4 5 System.out.println(value); 6 7 //公式:[a,b] : (int)(Math.random() * (b - a + 1) )+ a
//============================================================================================================================
1.迴圈結構的四要素
① 初始化條件
② 迴圈條件 --->是boolean型別
③ 迴圈體
④ 迭代條件
說明:通常情況下,迴圈結束都是因為②中迴圈條件返回false了。
2.三種迴圈結構:
2.1 for迴圈結構
for(①;②;④){
③
}
執行過程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
2.2 while迴圈結構
①
while(②){
③;
④;
}
執行過程:① - ② - ③ - ④ - ② - ③ - ④ - ... - ②
說明:
寫while迴圈千萬小心不要丟了迭代條件。一旦丟了,就可能導致死迴圈!
for和while迴圈總結:
1》. 開發中,基本上我們都會從for、while中進行選擇,實現迴圈結構。
2》. for迴圈和while迴圈是可以相互轉換的!
區別:for迴圈和while迴圈的初始化條件部分的作用範圍不同。
3》. 我們寫程式,要避免出現死迴圈。
2.3 do-while迴圈結構
①
do{
③;
④;
}while(②);
執行過程:① - ③ - ④ - ② - ③ - ④ - ... - ②
說明:
1》.do-while迴圈至少會執行一次迴圈體!
2》.開發中,使用for和while更多一些。較少使用do-while
3》.“無限迴圈”結構: while(true) 或 for(;;)
總結:如何結束一個迴圈結構?
方式一:當迴圈條件是false時
方式二:在迴圈體中,執行break
4.巢狀迴圈
1》.巢狀迴圈:將一個迴圈結構A宣告在另一個迴圈結構B的迴圈體中,就構成了巢狀迴圈
內層迴圈:迴圈結構A
外層迴圈:迴圈結構B
2》.說明:
① 內層迴圈結構遍歷一遍,只相當於外層迴圈迴圈體執行了一次
② 假設外層迴圈需要執行m次,內層迴圈需要執行n次。此時內層迴圈的迴圈體一共執行了m * n次
③ 外層迴圈控制行數,內層迴圈控制列數
1 【典型練習】 2 3 //練習一: 4 5 /* 6 7 ****** 8 9 ****** 10 11 ****** 12 13 ****** 14 15 */ 16 17 for(int j = 1;j <= 4;j++ ){ 18 19 for(int i = 1;i <= 6;i++){ 20 21 System.out.print('*'); 22 23 } 24 25 System.out.println(); 26 27 } 28 29 //練習二: 30 31 /* i(行號) j(*的個數) 32 33 * 1 1 34 35 ** 2 2 36 37 *** 3 3 38 39 **** 4 4 40 41 ***** 5 5 42 43 */ 44 45 46 47 for(int i = 1;i <= 5;i++){//控制行數 48 49 for(int j = 1;j <= i;j++){//控制列數 50 51 System.out.print("*"); 52 53 } 54 55 System.out.println(); 56 57 } 58 59 60 61 //練習三:九九乘法表 62 63 public static void main(String[] args) { 64 65 for(int i =1;i<=9;i++){ 66 67 for(int j=1;j<=i;j++){ 68 69 System.out.print(j+"*"+i+"="+(i*j) + "\t"); 70 71 } 72 73 System.out.println(); 74 75 } 76 77 }
補充:衡量一個功能程式碼的優劣:
1.正確性
2.可讀性
3.健壯性
4.高效率與低儲存:時間複雜度 、空間複雜度 (衡量演算法的好壞)
如何理解流程控制的練習:流程控制結構的使用 + 演算法邏輯
//============================================================================================================================
break和continue關鍵字的使用
使用範圍迴圈中使用的作用(不同點)相同點
break:switch-case
迴圈結構中結束當前迴圈關鍵字後面不能宣告執行語句
continue:迴圈結構中結束當次迴圈關鍵字後面不能宣告執行語句
//============================================================================================================================
【練習四】
1 //一個數如果恰好等於它的因子之和,這個數就稱為"完數"。(因子:除去這個數本身的約數) 2 //例如6=1+2+3.程式設計 找出1000以內的所有完數 3 public static void main(String[] args) { 4 System.out.println("1-1000之間的完數有:"); 5 for(int i=1;i<=1000;i++){ 6 int sum = 0; 7 for(int j=1;j<i;j++){ 8 if(i%j==0){ 9 sum +=j; 10 } 11 } 12 if(sum == i){ 13 System.out.println(i); 14 } 15 } 16 }
【練習五】
1 //輸入兩個正整數m和n,求其最大公約數和最小公倍數 2 int m = 12, n = 28; 3 //獲取m和n的較大值 4 int max = (m > n)? m : n; 5 //獲取m和n的較小值 6 int min = (m < n)? m : n; 7 8 //求m和n的最大公約數 9 for(int i = min;i >= 1;i--){ 10 if( m % i == 0 && n % i == 0){ 11 System.out.println("m和n的最大公約數是:" + i); 12 break; 13 } 14 } 15 //求m和n的最小公倍數 16 for(int i = max;i <= m * n;i++){ 17 if( i % m == 0 && i % n == 0){ 18 System.out.println("m和n的最小公倍數是:" + i); 19 break; 20 } 21 }
【練習六】
1 //求調和級數中從第多少項開始值大於10 2 //調和級數的第n項形式為:1+1/2+1/3+…+1/n 3 public static void main(String[] args) { 4 double sum = 0.0; 5 int i = 1; 6 while (true) { 7 sum += 1.0 / i; 8 if (sum > 10) { 9 break; 10 } 11 i++; 12 } 13 System.out.println(i); 14 }
【練習七】
/**列印如下的圖形:三角形 * * * * * * * * * * * * * * * * * * * * * * * * * */ for (int i = 0; i < 7; i++) { if (i < 4) { for (int j = 0; j < 2 * i + 1; j++) { System.out.print("* "); } System.out.println(); } else { for (int k = 0; k < 13 - 2 * i; k++) { System.out.print("* "); } System.out.println(); } }
【練習八】
/**列印如下的圖形:菱形1 * * * * * * * * * * * * * * * * * * * * * * * * * */ // 上半部分 for (int i = 0; i < 5; i++) { // 輸出“-” for (int j = 0; j < 4 - i; j++) { System.out.print(" "); } // 輸出“* ” for (int k = 0; k < i + 1; k++) { System.out.print("* "); } System.out.println(); } // 下半部分 for (int i = 0; i < 4; i++) { for (int j = 0; j < i + 1; j++) { System.out.print(" "); } for (int k = 0; k < 4 - i; k++) { System.out.print("* "); } System.out.println(); }