C++ 嵌套循環

也稱爲多循環,在一個循環中嵌套使用一個或多個循環。
嵌套循環的基本結構就是在一個循環中,循環體包含了另外一個循環的狀況。下面我用幾個嵌套循環的例子來深刻理解嵌套循環。ios

循環圖案打印

分別打印下面三種圖案:編程

思路分析

通常來講,單循環打印的圖案都是線性的,要麼是橫線要麼是豎線。那麼咱們這裏須要打印一個二維圖形,就須要從線跨越到面。那麼咱們只要有不少條線就能構成一個平面,因此咱們這裏打印二維圖形就須要兩個循環來實現。數組

那麼咱們這裏規定外層循環控制行,內層循環控制列。而後找到圖形中行與列的關係,經過控制內層循環的循環條件,就能夠打印出須要的圖形。bash

1. 實心菱形星星

菱形能夠看作兩個三角形組成的,一個正等腰三角,一個倒等腰三角。這裏就能夠經過 if 語句來根據行數改變列的循環條件,從而實現打印兩個圖形並組合。
下面是參考代碼:ui

#include <iostream>

using namespace std;

int main() {
    // 打印菱形星星
    int row_max = 7;
    int col_max, space_max;

    // 外層循環控制行 (行數,換行)
    // 內層循環控制列 (列數,列的圖形)
    for (int row = 0; row < row_max; row++) {
        if (row < 4) {      // 第4行以前*號數量爲 2*row ,空格數量爲 2-row
            col_max = 2 * row;
            space_max = 2 - row;
        } else {            // 第4行以後*號數量遞減2,空格數量遞增1
            col_max -= 2;
            space_max += 1;
        }
        // 打印*號前的空格
        for (int space = 0; space <= space_max; space++) {
            cout << " ";
        }
        // 打印*號
        for (int col = 0; col <= col_max; col++) {
            cout << "*";
        }
        cout << endl;   // 進行換行
    }
    
    system("pause");
    return 0;
}
複製代碼

輸出結果以下:spa

*
  ***
 *****
*******
 *****
  ***
   *
請按任意鍵繼續. . . 
複製代碼

2. 實心菱形字母

這裏和實心菱形星星改變的只有打印的內容,總體的圖形仍是沒變的。因此咱們這裏只要改變上面程序中打印的內容就行。
下面是參考代碼:code

...
    for (...) {
        ...
        // 打印字母
        for (int col = 0; col <= col_max; col++) {
            cout << (char)('A' + row);          //使字母根據行數變化
        }
        ...
    }
...
複製代碼

輸出結果以下:cdn

A
  BBB
 CCCCC
DDDDDDD
 EEEEE
  FFF
   G
請按任意鍵繼續. . .
複製代碼

3. 空心菱形星星

這裏和實心菱形星星改變的也是內循環的內容,總體圖形沒有變化。因此只須要改變打印內容便可。
下面是參考代碼:blog

...
    for (...) {
        ...
        // 按規則打印星星
        for (int col = 0; col <= col_max; col++) {
            if (col == 0 || col == col_max)         // 只在開始和末尾打印星星
                cout << '*';
            else
                cout << ' ';
        }
        ...
    }
...
複製代碼

輸出結果以下:遊戲

*
  * *
 *   *
*     *
 *   *
  * *
   *
請按任意鍵繼續. . .
複製代碼

打印蛇形矩陣

顧名思義,蛇形矩陣:矩陣的一種,常被應用在編程題目與數學數列中。
它由1開始的天然數依次排列成的一個矩陣,有上三角、環形或對角線等走法,輸入文件由一行或多行組成,每行由一個正整數N組成(N不大於100)。

下面練習一些常見的蛇形矩陣:

1. 上三角

要實現以下效果:

請輸入一個(1-10)的正整數:5
1       3       4       10      11
2       5       9       12      19
6       8       13      18      20
7       14      17      21      24
15      16      22      23      25
複製代碼

能夠發現上述表格的規律是,從左上角第一個格開始(起始爲1),而後沿右上角到左下角的斜線,先從下到上,再從上到下。開始數字遞增排列。

咱們能夠想象有一個遊戲角色在一個 5*5 的格子上進行走動,每一個數字就是他走的步數。這個角色只有4個移動方向,分別爲向下、向右上、向右和向左下。那麼咱們就能夠創造一個 (x,y)來表示角色的座標。再用一個數組來記錄每一個座標當中的步數是什麼。
下面是參考代碼:

#include <iostream>

using namespace std;

int main() {
    // 上三角
    int num;
    cout << "請輸入一個(1-10)的正整數:";
    cin >> num;     //定義格子的長寬
    int* arr = new int[num*num];
    // 移動方向,分別是向下,向右上,向右,向左下
    const int step[4][2] = {0,1, 1,-1, 1,0, -1,1};
    // 初始座標爲(0,0),方向向下
    int x = 0, y = 0, direction = 0;
    arr[0] = 1;

    for (int value = 2;value <= (num*num); value++) {
        // 進行移動
        x += step[direction][0];
        y += step[direction][1];
        // 記入當前座標對應的數據
        arr[y*num + x] = value;

        // 判斷下一步方向
        switch (direction) {
        case 0:     // 向下以後
            direction = x == 0 ? 1 : 3;
            break;
        case 1:     // 向右上以後
            if (y == 0 || x == (num-1))
                direction = x == (num-1) ? 0 : 2;
            break;
        case 2:     // 向右以後
            direction = y == 0 ? 3 : 1;
            break;
        case 3:     // 向左下以後
            if (x == 0 || y == (num-1))
                direction = y == (num-1) ? 2 : 0;
            break;
        }
    }
    // 按照存儲在數組 arr 中的數據,將每一個座標的值打印
    for (y = 0; y < num; y++) {
        for (x = 0; x < num; x++) {
            cout << arr[y*num + x] << '\t';
        }
        cout << endl;
    }

    delete [] arr;

    system("pause");
    return 0;
}
複製代碼

輸出結果以下:

請輸入一個(1-10)的正整數:7
1       3       4       10      11      21      22
2       5       9       12      20      23      34
6       8       13      19      24      33      35
7       14      18      25      32      36      43
15      17      26      31      37      42      44
16      27      30      38      41      45      48
28      29      39      40      46      47      49
請按任意鍵繼續. . .
複製代碼

2. 環形

要實現以下效果:

請輸入一個(1-10)正整數:5
1       2       3       4       5
16      17      18      19      6
15      24      25      20      7
14      23      22      21      8
13      12      11      10      9
複製代碼

能夠發現上述表格的規律是,從左上角第一個格開始(起始爲1),進行順時針繞圈圈移動。開始數字遞增排列。

這裏則能夠認爲這個角色在繞圈圈。這個角色只有4個移動方向,分別爲向右、向下、向左和向上。這個角色每繞一圈,他所能走的格子寬度就減少 1。
下面是參考代碼:

#include <iostream>

using namespace std;

int main() {
    // 環形
    int num;
    cout << "請輸入一個(1-10)正整數:";
    cin >> num;
    int* arr = new int[num*num];
    // 移動方向,分別是向右,向下,向左,向上
    const int step[4][2] = {1,0, 0,1, -1,0, 0,-1};
    // 初始座標爲(0,0),方向向右
    int x = 0, y = 0, direction = 0;
    // 這裏初始化角色能走的格子尺寸
    int limit = num - 1;
    arr[0] = 1;

    for (int value = 2;value <= (num*num); value++) {
        //進行移動
        x += step[direction][0];
        y += step[direction][1];
        arr[y*num + x] = value;
        //判斷是否須要改變方向
        switch (direction) {
        case 0:     // 向右以後,到可走格子邊界就向下不然繼續向右
            direction = x == limit ? 1 : 0;
            break;
        case 1:     // 向下以後,到可走格子邊界就向左不然繼續向下
            direction = y == limit ? 2 : 1;
            break;
        case 2:     // 向左以後,到可走格子邊界就向上不然繼續向左
            direction = x == (num - limit -1) ? 3 : 2;
            break;
        case 3:     // 向上以後,到可走格子邊界就向右,而且可走格子尺寸減小 1 ,不然繼續向上
            if (y == (num - limit)) {
                limit -= 1;
                direction = 0;
            }
            break;
        }
    }
    // 按照存儲在數組 arr 中的數據,將每一個座標的值打印
    for (y = 0; y < num; y++) {
        for (x = 0; x < num; x++) {
            cout << arr[y*num + x] << '\t';
        }
        cout << endl;
    }

    delete [] arr;

    system("pause");
    return 0;
}
複製代碼

輸出結果以下:

請輸入一個(1-10)正整數:7
1       2       3       4       5       6       7
24      25      26      27      28      29      8
23      40      41      42      43      30      9
22      39      48      49      44      31      10
21      38      47      46      45      32      11
20      37      36      35      34      33      12
19      18      17      16      15      14      13
請按任意鍵繼續. . .
複製代碼
相關文章
相關標籤/搜索