1. 程式人生 > 實用技巧 >C/C++程式設計筆記:C++ 巢狀迴圈,含迴圈列印及蛇形矩陣例項

C/C++程式設計筆記:C++ 巢狀迴圈,含迴圈列印及蛇形矩陣例項

也稱為多迴圈,在一個迴圈中巢狀使用一個或多個迴圈。

巢狀迴圈的基本結構就是在一個迴圈中,迴圈體包含了另一個迴圈的情況。下面我用幾個巢狀迴圈的例子來深入理解巢狀迴圈。

迴圈圖案列印

分別列印下面三種圖案:

思路分析

一般來說,單迴圈列印的圖案都是線性的,要麼是橫線要麼是豎線。那麼我們這裡需要列印一個二維圖形,就需要從線跨越到面。那麼我們只要有很多條線就能構成一個平面,所以我們這裡列印二維圖形就需要兩個迴圈來實現。

那麼我們這裡規定外層迴圈控制行,內層迴圈控制列。然後找到圖形中行與列的關係,通過控制內層迴圈的迴圈條件,就可以打印出需要的圖形。

1. 實心菱形星星

菱形可以看做兩個三角形組成的,一個正等腰三角,一個倒等腰三角。這裡就可以通過if

語句來根據行數改變列的迴圈條件,從而實現列印兩個圖形並組合。

下面是參考程式碼:

輸出結果如下:

*

***

*****

*******

*****

***

*

2. 實心菱形字母

這裡和實心菱形星星改變的只有列印的內容,整體的圖形還是沒變的。所以我們這裡只要改變上面程式中列印的內容就行。

下面是參考程式碼:

輸出結果如下:

列印蛇形矩陣

顧名思義,蛇形矩陣:矩陣的一種,常被應用在程式設計題目與數學數列中。

它由1開始的自然數依次排列成的一個矩陣,有上三角、環形或對角線等走法,輸入檔案由一行或多行組成,每行由一個正整數N組成(N不大於100)。

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

1. 上三角

要實現如下效果:

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

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

下面是參考程式碼:

輸出結果如下:

2. 環形

要實現如下效果:

可以發現上述表格的規律是,從左上角第一個格開始(起始為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
請按任意鍵繼續. . .

希望對大家有幫助!

另外如果你想更好的提升你的程式設計能力,學好C語言C++程式設計!彎道超車,快人一步!

C語言C++程式設計學習交流圈子,QQ群757874045點選進入】微信公眾號:C語言程式設計學習基地

分享(原始碼、專案實戰視訊、專案筆記,基礎入門教程)

歡迎轉行和學習程式設計的夥伴,利用更多的資料學習成長比自己琢磨更快哦!

程式設計學習軟體分享:

程式設計學習視訊分享: