1. 程式人生 > >for迴圈的經典程式分析

for迴圈的經典程式分析

1.單層for迴圈,利用for迴圈列印輸出1~100之間的所有整數(最基礎的)然後通過與if-else語句結合實現更多的功能。
可以看出利用for迴圈可以遍歷整數

/*
    1. 輸出從1到100之間所有的整數;(簡單的單層for迴圈)**for迴圈遍歷整數**
    2. 輸出從1到100之間所有的奇數;(通過與if-else結合,有條件的輸出語句)
    3. 輸出從1到100之間所有不能被3整除的數;並輸出這些整數的和;(通過增加條件,更合理的練習for迴圈與if語句結合)
*/
public class NumberFor {

    public static void main (String[] args) {
        //這裡利用輸出語句列印一個提示語句
System.out.println("輸出從1到100之間所有的整數;"); //輸出從1到100之間所有的整數; for (int i = 1; i < 100; i++) { /* i 為迴圈因子,根據題意i要初始化為1,i < 100,每個整數都要列印,因此迭代語句自增為1. 程式執行1~100(沒有100)共99次 次數:計算方法(100-1) */ //迴圈體 System.out.print(i + " "); } System.out
.println("\n" + "輸出從1到100之間所有的奇數;"); //輸出從1到100之間所有的奇數 for (int i = 1; i < 100; i++) { //設定條件判斷,有條件的輸出迴圈 if (i % 2 != 0) { System.out.print(i + " "); } } System.out.println("\n" + "輸出從1到100之間所有不能被3整除的數;並輸出這些整數的和"); //輸出從1到100之間所有不能被3整除的數;並輸出這些整數的和
//最後要輸出整數的和,要提前宣告一個儲存和的變數 int sum = 0; for (int i = 1; i < 100; i++) { if (i % 3 != 0) { //每次迴圈都進行判斷,若真執行{}中語句 System.out.print(i + " "); //將符合條件的i進行累加 sum += i; } } System.out.println("\n" + "這些數的和為:" + sum); } }

2.巢狀for迴圈
先利用for迴圈列印一個簡單的矩形
矩形形式:

*****
*****
*****  每一行5個星星,共有3行

思路:若我們每次輸出一行5個星星,我們迴圈3次就可以完成矩形

class LoopTest1 {
    public static void main(String[] args) {
        //可以稱i為迴圈因子 需要列印3行,迴圈次數為3(0 1 2)在i = 3時不滿足條件,結束迴圈。
        for (int i = 0; i < 3; i++) {
            //迴圈體,每次輸出5個星星並換行
            System.out.println("*****");
        }
    }
}

深入思考,我們是不是也可以把每次輸出5個星星這個語句轉化成每次輸出一個星星,迴圈輸出5次然後構成迴圈。
思路:依舊用一個迴圈控制行數,因為每行都要輸出5個星星,因此在i = 0時,它要執行一個迴圈輸出*的迴圈。i = 1 i =2 都要這樣,就得到下面這個巢狀迴圈程式

class LoopTest2{ 
    public static void main(String[] args) {
        //外迴圈控制行數(外迴圈的迴圈體是一個內迴圈)
        for (int i = 0; i < 3; j++) {
            //i :0~3 共3次
            //內迴圈控制列數,這個迴圈用來迴圈輸出5個星星
            for (int j = 0; j < 5; i++) {
                //內迴圈迴圈體 j:0~5 共5次 每次列印一個星星
                //這裡不要換行,因為在同一行上列印
                System.out.print("*");
            }
            //內迴圈執行完成後進行換行
            System.out.println();
        }
    }
}

綜上:若是把LoopTest1中的i < 3 ,3改為n的話就可以列印輸出n行
若是把LoopTest2中的j < 5,5改為m的話每行就可以列印輸出5個星星,總結一下,可以把外層迴圈看做控制行數,內層迴圈控制列數。自己多做幾個程式,多思考幾次就可以體會到這句話真正的含義了。
那麼列印一個n*m的矩形易如反掌,下面是列印n*m矩形的程式。

class LoopTest3{

    public static void main(String[] args) {
        //從命令列獲取n,m
        int n = Integer.parseInt(args[0]);
        int m = Integer.parseInt(args[1]);
        //外迴圈控制行數
        for (int i = 0; i < n; i++) {
            //外迴圈控制列數
            for (int j = 0; j < m; j++) {
                System.out.print("*");
            }
            //內層迴圈執行完後,進行換行
            System.out.println();
        }
    }
}

熟練掌握for巢狀迴圈可以列印一個空心矩形,下面程式碼供參考。

/**
    列印n*m的空心矩形
*/
public class TestFor {

    public static void main(String[] args) {
        //從命令列獲取n,m
        int n = Integer.parseInt(args[0]);
        int m = Integer.parseInt(args[1]);

        for (int i = 0; i < n; i++) {
            //將首尾行與其他行分開列印
            if (i == 0 || i == n-1) {
                //列印首尾行
                for (int j = 0; j < m; j++){
                    System.out.print("*");
                }
            }else {
                //列印其他行
                for (int j = 0; j < m; j++) {
                    //其他行,控制首列和尾列的列印
                    if(j == 0 || j == m-1) {
                        System.out.print("*");
                    }else {
                        System.out.print(" ");
                    }
                }
            }
            System.out.println();
        }
    }
}

3.巢狀迴圈深入

/*
分析過程:
    列印等腰三角形(高度為5)
    底邊長度為9     1 3 5 7 9 
    空格數 i            *
        4  0    *       1    
        3  1   ***      3
        2  2  *****     5
        1  3 *******    7
        0  4*********   9

        * = 2i + 1      *與行數成正比     y=kx+b
     空格 = 4-i = 5-1-i 空格與行數成反比

*/
public class TestFor {

    public static void main(String[] args) {

        for(int i = 0; i < 5; i++) {
            //從0行開始
        //程式順序執行,先打空格,空格與行數的關係 5-1-i//5-(i+1)
            //這裡j因為不在同一個{}中,所以都可以用j
            for(int j = 0; j < (5 - 1) - i; j++) {
                System.out.print(" ");
            }
            //星星列印數1 3 5 7 9 與行數關係(2*行數)+1
            for (int j = 0; j < (2 * i) + 1; j++) {
                    System.out.print("*");
            }
            //換行
            System.out.println();
        }
    }
}
/*
    拓展一下,列印高度為n的等腰三角形
    實際只需要將外層迴圈5換成n就好
*/
class TestFor1 {
    public static void main(String[] args) {
        //從命令列獲取引數
        int n = Integer.parseInt(args[0]);
        //設定外迴圈控制行數
        for (int i = 0; i < n; i++) {
            //設定內迴圈控制列中空格的列印
            for (int j = 0; j < n - 1 - i; j++) {
                System.out.print(" ");
            }
            //設定並列內迴圈控制列中*的列印
            for (int j = 0; j < (2 * i) + 1; j++) {
                System.out.print("*");
            }
            //換行
            System.out.println();
        }
    }
}

總結:要想使用好迴圈,首先要觀察問題的規律,找出要迴圈的步驟,直接套用即可。多做迴圈的題體會迴圈。

4.巢狀迴圈中最高難度的for迴圈問題(列印質數的問題)

首先要了解質數的定義,質數:只能被1和其本身整除的數就是質數。1不是質數

從定義可以知道,若是我們正向考慮,問題極為的複雜,要先找出其所有能被整除的數,然後判斷除了1和它本身以外還有其他的嗎?若有不是質數,若沒有,就是質數。
這樣,我們反向考慮,問題就變得異常簡單。

思路:首先我們要會遍歷一個範圍內的整數,這個利用簡單的單層迴圈實現,其次對於每一個整數,我們先假設它是質數,然後利用反證法只要找出一個能被它整除的數就可以將它推翻。若找不出能被它整除的數,則它是質數。

/*
    列印100-200之間的所有質數,並統計個數
    這個題,共有兩個問題。
    1.列印100~200所有質數
    2.統計質數的個數

    思路:利用反證法
        質數的個數統計應該和質數輸出在同一個{}中
*/
class TestFor1 {
    public static void main(String[] args) {
        //設定計數器,用於統計質數的個數
        int count = 0;
        //利用for迴圈遍歷100~200所有整數,不包括200.
        for (int i = 100; i < 200; i++) {
            //先假設i為質數,利用反證法 設定一個布林變數,值為true時為質數,值為false時,不是質數
            boolean flag = true;
            //設定內迴圈對每個數進行判斷
            //質數:只能被1和自身整除的數
            for (int j = 2; j < i; j++) {
                //設定條件判斷,若存在可以被整除的數(除1和自身),修改flag為flase,只要存在一個就可以推翻。
                if(i % j == 0) {
                    flag = false;
                    break;  //此處加個break優化程式碼,只要找到一個,利用break結束當前迴圈的特性,直接結束內層迴圈。
                }
            }
            //內迴圈判斷質數執行完畢,通過判斷flag,列印輸出質數,並統計個數
            if(flag) {
                //列印輸出質數
                System.out.println(i + "是質數");
                //個數自增
                count++;
            }
        }
        //列印統計的個數
        System.out.println("質數的個數為:" + count);
    }
}

會打了上邊的這個求質數的程式碼,來分析一個更深層次的問題。
列印1~100內的質數(只打印引數個質數就行,儘可能的優化程式碼)

/**
    利用continue,break簡化質數的列印
    列印1~100之間的質數(要求列印引數個質數)
*/
class TestFor2 {

    public static void main(String[] args) {
        //從命令列獲取引數
        int n = Integer.parseInt(args[0]);
        //設定計數器
        int count = 0;
        //迴圈遍歷2~100(因為1不是質數),並設定標籤l1
        l1:for (int i = 2; i < 100; i++) {
            //設定迴圈判斷i能否被除1和其本身之外的數整除,預設認為i是質數
            //因為利用continue加標籤所以不用使用再進行最後的真假判斷
            l2:for (int j = 2; j < i; j++) {
                //設定條件判斷,若i不是質數,利用continue l1 結束當次迴圈,(這裡的當次迴圈指的是標籤處外迴圈)
                // 進入下一次迴圈(外層迴圈的迭代語句)
                if (i % j == 0) {
                    continue l1; 
                }
            }
            //內迴圈結束列印輸出質數
            System.out.println(i + "是質數");
            //計數器自增1
            count++;
            //判斷輸出的質數是否符合題意,若符合利用break結束迴圈(結束的是break所屬的迴圈即外層迴圈)
            if(count == n){
                break;
            }
        }
    }
}

如果能解決掉上述問題,對for迴圈的理解和使用非常熟練。
利用for迴圈還可以列印直角三角形,倒直角,99乘法表等等。如果會了上邊的for迴圈,這些問題手到擒來。重點是靈活運用java中的基礎知識,互相結合得到更多的東西。