1. 程式人生 > 實用技巧 >07-流程控制

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();

}