1. 程式人生 > >C++中二維陣列的使用

C++中二維陣列的使用

1 定義

C++中,如果陣列的元素又是陣列,則稱為二維陣列,其每一維對應一個下標,第一維通常稱為行(row),第二維則稱為列(column)。例如

int a[2][3];

可以將二維陣列a看成是一個23列的矩陣。

2 初始化

2.1使用花括號進行初始化

可以使用花括號括起來的初始化式列表來初始化二維陣列的元素。

int a[2][3] = {
        {1, 2, 3}
        , {4, 5, 6}
};

2.2 不使用花括號進行初始化

也可以不使用花括號,而是將二維陣列中的每個元素排列後進行初始化。

int a[2][3] = {1, 2, 3, 4, 5, 6};

2.3 置零初始化

通常情況下,如果要將二維陣列中所有的元素都置零時,可以使用如下方法:

int a[2][3] = {0};

3 下標引用

可以使用下標運算子來訪問二維陣列的元素,此時陣列的每個維度對應一個下標運算子。如

int i = a[0][1];

表示將i的值賦值成二維陣列中第1行第2列的元素值。

4 通過二維陣列實現蛇形填數

蛇形填數指的是從1開始,以1為步進,按照蛇形排列,將指定的位置填上指定的數。下圖為5*5矩陣時的蛇形填數排列。

 

4.1 初始化操作

定義一個維數為20*20的二維陣列,並且將該陣列的第1行,第20列的元素設定為1,即蛇形排列的起始位置。

#define MAX_N 20
int a[MAX_N][MAX_N] = { 0 };
int x = 0;
int y = MAX_N -1;
int value = a[x][y] = 1;

4.2 按蛇形排列設定陣列的值

如上圖所示,將蛇形排列,頭尾連線看成是一個迴圈,即從1-16是一個迴圈,從17-24是另一個迴圈,25是最後一個迴圈。每個迴圈都由4個步驟組成,即由上向下、由右向左,由下向上,由左向右,最後形成頭尾相連。因此,有如下程式碼

while (value < n*n)
{
while (x + 1 < n && !a[x + 1][y])//由上向下
a[++x][y] = ++value;
while (y - 1 >= 0 && !a[x][y - 1])//由右向左
a[x][--y] = ++value;
while (x - 1 >= 0 && !a[x - 1][y])//由下向上
a[--x][y] = ++value;
while (y + 1 < n && !a[x][y + 1])//由左向右
a[x][++y] = ++value;
}

其中,外面的while()語句的迴圈條件就是判斷是否將二維陣列中所有的位置都設定了值,每迴圈一次就完成上述的四個步驟,而裡面的四個while()語句就對應了一次迴圈的四個步驟。這四個while()語句的迴圈條件是一個邏輯與操作符。邏輯與操作符中第一個表示式保證了行數或者列數不超過二維陣列最大的行數或者列數;第二個表示式判斷了下一個要賦值的位置上的值是否是0,如果是0,則說明該位置沒有被賦值,可以對其進行賦值;如果不是0,則說明該位置已經被賦過值,就不必再進行賦值了。

4.3 二維陣列的列印

通過for迴圈語句的巢狀實現二維陣列的列印。

for (x = 0; x < n; x++)
{
for (y = 0; y < n; y++)
printf("%5d", a[x][y]);
printf("\n");
}

其中,第一個printf()中的引數“5”是將所有輸出的數字寬度指定為5,保證了輸出的矩陣行和列是對齊的;第二個printf()的作用是換行,即每輸出完一行,則需要換行繼續輸出下一行。

5 完整程式碼

以下為實現蛇形輸出的完整程式碼。

#include "stdafx.h"
#include <string.h>
#define MAX_N 20
 
int main()
{
int n, x, y, value = 0;
while (1)
{
printf("請輸入陣列的維數,最大值為%d.\n", MAX_N);
scanf_s("%d", &n);
if (n > MAX_N)
{
printf("輸入的維數大於指定的維數,最大維數為%d.\n", MAX_N);
continue;
}
int a[MAX_N][MAX_N] = { 0 };
value = a[x = 0][y = n - 1] = 1;
while (value < n*n)
{
while (x + 1 < n && !a[x + 1][y])
a[++x][y] = ++value;
while (y - 1 >= 0 && !a[x][y - 1])
a[x][--y] = ++value;
while (x - 1 >= 0 && !a[x - 1][y])
a[--x][y] = ++value;
while (y + 1 < n && !a[x][y + 1])
a[x][++y] = ++value;
 
}
printf("維數為%d的蛇形排列陣列為:\n", n);
for (x = 0; x < n; x++)
{
for (y = 0; y < n; y++)
printf("%5d", a[x][y]);
printf("\n");
 
}
}
return 0;
}
 


相關推薦

C#陣列int[,]與交叉陣列int[][]的區別

首先說一下交叉陣列這個東西是C#裡面的,c++裡面是沒有的交叉陣列這個定義的   int[][] 是陣列的陣列,即一個一維陣列的每個元素都是一個數組,這個在C++,java等語言裡面也是這麼定義的; int[,]這個是C#中提供的一個二維陣列的形式,在C++中並不存在

C/C++陣列和指標關係分析

        在C/c++中,陣列和指標有著密切的關係,有很多地方說陣列就是指標式錯誤的一種說法。這兩者是不同的資料結構。其實,在C/c++中沒有所謂的二維陣列,書面表達就是陣列的陣列。我猜想是為了表述方便才叫它二維陣列。       在本文中,我也就叫它二維陣列。在C/C

c++陣列向量的長度

對於一個二維陣列: int mm[3][5] = { { 1,2,3,4,5 },{ 5,6,7,8,9 },{ 9,10,11,12,13 } }; int toatlnums = sizeof(mm) / sizeof(int); //元素總個數 int cols =

C#陣列

     生活中,有很多事物,僅僅用一維陣列,將無法恰當地被表示。還是說學生成績管理吧。一個班級30個學員,你把他們編成1到30號,這很好。但現在有兩個班級要管理怎麼辦?人家每個班級都自有自的編號,比如一班學生編是1~30;二班的學生也是1~30。你說,不行,要進行計算機管理,你們兩班學員的編號要混在一起,

C++陣列總結

最近程式設計需要研究了一下二維陣列,網上這方面的資料蠻多了,彙總一下,歡迎補充! 關於二維資料的基本知識見這裡: 關於二維資料的動態分配,以下部落格講述得比較清楚: 舉例: //動態定義一維陣列、二維陣列、三維陣列 #include<iostream>

C++陣列的使用

1 定義 在C++中,如果陣列的元素又是陣列,則稱為二維陣列,其每一維對應一個下標,第一維通常稱為行(row),第二維則稱為列(column)。例如 int a[2][3]; 可以將二維陣列a看成是一個2行3列的矩陣。 2 初始化 2.1使用花括號進行初始化 可以使用花括號

C++陣列的初始化

在C++中,二位陣列有兩種使用方式。 第一種是靜態宣告及初始化,如下: int array2[3][2]={{4,2},{5},{6}};第二種是,有時我們不知道二維陣列需要多少行和多少列,這時是動態陣列。 int **array; 後來我們通過輸入來獲取陣列的行n

C語言陣列名與陣列地址、首行地址、首行首元素地址關係與區別詳解(初學者必須掌握)

C語言作為很多大學理工科都會學習的語言,作為一種程式設計入門語言。但是相對於其他高階程式語言來說相對是比較難,尤其是指針,不知道有多少莘莘學子都是因為它,從C語言入門到放棄。想當年,筆者在大一學習C語言

c語言陣列在子函式的傳址

    在學習c語言的過程中,指標與二維陣列的傳值,傳址一直是我比較混淆的部分,今天做了一個較為完整的總結   一.自己定義的陣列傳址 1.  <span style="font-size:18px;">#include<iostream> #inc

C++動態陣列的建立

方法1.用new / delete建立二維動態陣列 程式碼: #include<iostream> #include<vector> using namespace std; #define ROW 2 //行數 #define COLUMN

C 語言陣列指標詳解

C語言中,指標是一個複雜但又靈活多變的知識點,我們知道,在一維陣列中,對於一個數組a[],*a,a,&a,都表示a的首地址,但如果與二維陣列混合使用,就顯得更為複雜了。例如對於一個二維陣列  a[2][4]={{1,2.3},{4,5,6}}  a+i,&a

9、C語言陣列陣列名及指向陣列的指標變數

#include <stdio.h> #include <stdlib.h> //與二維陣列相關的指標變數([] 比 *優先順序高) //在一般指標變數指向二維陣列,或者n維陣列,要直接操作a[i][j],對指標的操作必須有兩個符號(其中不出現&,如果有&則相應的加

徹底搞清C/C++陣列陣列,指標,陣列指標和指標陣列以及指向指標的指標,行地址和列地址之間的關係

#include <iostream> using namespace std; void test(char **ptr) { for(;(strcmp(*ptr,"NULL"))!=0;ptr=ptr+1)        cout << *(ptr) <&l

C#數組的行數和列數

取數 word 二維數組 同學 定義 dimen 行數 nbsp col 最近在項目中用到二維數組,需要獲取數組的行數和列數,本以為是很簡單的一些東西,卻發現網上好多答案都是錯誤的,遂寫下隨筆,希望之後有用到的同學們能夠順利解決答案。 下面是一些關於數組的一些屬性和方法以及

C語言-----陣列

二維陣列的建立,初始化,使用。 (一)二維陣列的建立 二維陣列定義的一般形式:型別說明符 陣列名[常量表達式][常量表達式] 舉例如下: int a[3][4]; //定義a為 3*4(3行4列) 的陣列。 二位陣列又可以看作是一種特殊的一維陣列:它的元素又是一個一維陣列

Python陣列的建立

習慣了java的Matrix = [][]不知道python怎麼創二維陣列。 先看 python中的二維陣列操作 對最後提出的二維陣列建立方式存在疑問 Matrix = [([0] * 3) for i in range(4)] 為什麼可以用[0]*3?不會淺拷貝嗎?   看了

C語言陣列指標練習

描述 程式填空,使其輸出結果是: 1,2,3,4, 10,12,14,16, 18,20,11,12, #include <iostream> using namespace std; void Double(int * p, int n) { for(int i = 0;i

15. C語言 -- 陣列

本部落格主要內容為 “小甲魚” 視訊課程《帶你學C帶你飛》【第一季】 學習筆記,文章的主題內容均來自該課程,在這裡僅作學習交流。在文章中可能出現一些錯誤或者不準確的地方,如發現請積極指出,十分感謝。 也歡迎大家一起討論交流,如果你覺得這篇文章對你有所幫助,記得評論、點贊哦 ~(。

C/C++獲取陣列行列數

對於type array[A][B];形式的二維陣列,可以通過計算sizeof獲取行列數。 sizeof(array[0][0])為一個元素佔用的空間, sizeof(array[0])為一行元素佔用的空間, sizeof(array)為整個陣列佔用的空間, 行數 = sizeof(ar

[C語言]陣列傳參的格式(詳細+總結)

喜歡就為我點贊,評論加收藏。 轉載請標明出處[link]https://blog.csdn.net/qq_43868654/article/details/84641383 初遇二維陣列作函式引數,宛如自己化身為了大頭兒子。很頭大。 不禁大聲吶喊:該怎麼宣告定義,該怎麼呼叫,又該怎麼