也稱爲多循環,在一個循環中嵌套使用一個或多個循環。
嵌套循環的基本結構就是在一個循環中,循環體包含了另外一個循環的狀況。下面我用幾個嵌套循環的例子來深刻理解嵌套循環。ios
分別打印下面三種圖案:編程
通常來講,單循環打印的圖案都是線性的,要麼是橫線要麼是豎線。那麼咱們這裏須要打印一個二維圖形,就須要從線跨越到面。那麼咱們只要有不少條線就能構成一個平面,因此咱們這裏打印二維圖形就須要兩個循環來實現。數組
那麼咱們這裏規定外層循環控制行,內層循環控制列。而後找到圖形中行與列的關係,經過控制內層循環的循環條件,就能夠打印出須要的圖形。bash
菱形能夠看作兩個三角形組成的,一個正等腰三角,一個倒等腰三角。這裏就能夠經過 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
*
***
*****
*******
*****
***
*
請按任意鍵繼續. . .
複製代碼
這裏和實心菱形星星改變的只有打印的內容,總體的圖形仍是沒變的。因此咱們這裏只要改變上面程序中打印的內容就行。
下面是參考代碼:code
...
for (...) {
...
// 打印字母
for (int col = 0; col <= col_max; col++) {
cout << (char)('A' + row); //使字母根據行數變化
}
...
}
...
複製代碼
輸出結果以下:cdn
A
BBB
CCCCC
DDDDDDD
EEEEE
FFF
G
請按任意鍵繼續. . .
複製代碼
這裏和實心菱形星星改變的也是內循環的內容,總體圖形沒有變化。因此只須要改變打印內容便可。
下面是參考代碼:blog
...
for (...) {
...
// 按規則打印星星
for (int col = 0; col <= col_max; col++) {
if (col == 0 || col == col_max) // 只在開始和末尾打印星星
cout << '*';
else
cout << ' ';
}
...
}
...
複製代碼
輸出結果以下:遊戲
*
* *
* *
* *
* *
* *
*
請按任意鍵繼續. . .
複製代碼
顧名思義,蛇形矩陣:矩陣的一種,常被應用在編程題目與數學數列中。
它由1開始的天然數依次排列成的一個矩陣,有上三角、環形或對角線等走法,輸入文件由一行或多行組成,每行由一個正整數N組成(N不大於100)。
下面練習一些常見的蛇形矩陣:
要實現以下效果:
請輸入一個(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
請按任意鍵繼續. . .
複製代碼
要實現以下效果:
請輸入一個(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
請按任意鍵繼續. . .
複製代碼