C++での2次元配列

紹介

A two-dimensional array in C++ is the simplest form of a multi-dimensional array. It can be visualized as an array of arrays. The image below depicts a two-dimensional array.

2D Array Representation

A two-dimensional array is also called a matrix. It can be of any type like integer, character, float, etc. depending on the initialization. In the next section, we are going to discuss how we can initialize 2D arrays.

C++で2次元配列の初期化

では、C++で2次元配列をどのように初期化するのでしょうか? こんなに簡単です:

int arr[4][2] = {
{1234, 56},
{1212, 33},
{1434, 80},
{1312, 78}
} ;

ご覧の通り、2次元配列arrを、42列の配列として初期化しています。 配列の各要素は、再び整数の配列です。

次のように、2次元配列も初期化することができます。

int arr[4][2] = {1234, 56, 1212, 33, 1434, 80, 1312, 78};

この場合も、arrは4行2列の2次元配列です。

C++で2次元配列を出力する

2次元配列の初期化は終わりましたが、実際に出力しないと正しく初期化されたか確認できません。

また、多くの場合、いくつかの操作を行った後の結果の2次元配列を出力する必要があるかもしれません。 では、どのように出力するのでしょうか?

以下のコードは、それを行う方法を示しています。

#include<iostream>
using namespace std; 
main( ) 
{  
	int arr[4][2] = {
		{ 10, 11 },
		{ 20, 21 },
		{ 30, 31 },
		{ 40, 41 }
		} ;
		
	int i,j;
	
	cout<<"Printing a 2D Array:\n";
	for(i=0;i<4;i++)
	{
		for(j=0;j<2;j++)
		{
			cout<<"\t"<<arr[i][j];
		}
		cout<<endl;
	}
}

出力:

Printing A 2D Array

上記のコードでは、

  • まず、特定の値でarr[4][2]という2D配列を初期化します。
  • その後、2つのforループを使用して対応する配列を印刷しようとします。
  • 外側のforループは行を反復処理し、内側のループは2D配列の列を反復処理します。
  • したがって、外側のループの各反復で、iが増加し、次の1D配列に移動します。また、内側のループは1回につき1つの1D配列全体を走査します。
  • そして、個々の要素arr[ i ][ j ]を印刷します。

ユーザー入力として2D配列の要素を取得する

以前、事前に定義された値で2D配列を初期化する方法を見ました。ただし、それをユーザー入力にすることもできます。方法を見てみましょう。

#include<iostream>
using namespace std; 
main( ) 
{  
      int  s[2][2];
      int  i, j;
      cout<<"\n2D Array Input:\n";
	  for(i=0;i<2;i++)
	  {
	  	for(j=0;j<2;j++)
	  	{
	  		cout<<"\ns["<<i<<"]["<<j<<"]=  ";
	  		cin>>s[i][j];
		}
	  } 
	  
	  cout<<"\nThe 2-D Array is:\n";
      for(i=0;i<2;i++)
	  {
	  	for(j=0;j<2;j++)
	  	{
	  		cout<<"\t"<<s[i][j];
		}
		cout<<endl;
	  } 
} 

出力:

2D Array User Input

上記のコードでは、sという2X2の2D配列を宣言します。2つのネストされたforループを使用して、配列の各要素を走査し、対応するユーザー入力を取得します。この方法で配列全体が埋められ、結果を確認するために同じものを印刷します。

C++における2次元配列を使用した行列の加算

例を見て、2D配列を使用して行列の加算と結果の表示を行う方法を見てみましょう。

#include<iostream>
using namespace std; 
main() 
{  
      int  m1[5][5], m2[5][5], m3[5][5];
      int  i, j, r, c;
      
      cout<<"Enter the no.of rows of the matrices to be added(max 5):";
      cin>>r;
      cout<<"Enter the no.of columns of the matrices to be added(max 5):";
      cin>>c;
      
      cout<<"\n1st Matrix Input:\n";
	  for(i=0;i<r;i++)
	  {
	  	for(j=0;j<c;j++)
	  	{
	  		cout<<"\nmatrix1["<<i<<"]["<<j<<"]=  ";
	  		cin>>m1[i][j];
		}
	  } 
	  
	  cout<<"\n2nd Matrix Input:\n";
	  for(i=0;i<r;i++)
	  {
	  	for(j=0;j<c;j++)
	  	{
	  		cout<<"\nmatrix2["<<i<<"]["<<j<<"]=  ";
	  		cin>>m2[i][j];
		}
	  } 
	  
	  cout<<"\nAdding Matrices...\n";
	  
	  for(i=0;i<r;i++)
	  {
	  	for(j=0;j<c;j++)
	  	{
	  		m3[i][j]=m1[i][j]+m2[i][j];
		}
	  } 
	  
	  cout<<"\nThe resultant Matrix is:\n";

	  for(i=0;i<r;i++)
	  {
	  	for(j=0;j<c;j++)
	  	{
	  		cout<<"\t"<<m3[i][j];
		}
		cout<<endl;
	  } 
	  
} 

出力:

Matrix Addition Using 2D Arrays

ここでは、

  • 最大5行5列の2つの行列m1とm2を取ります。そして、結果を格納する別の行列m3を取ります。
  • ユーザーの入力として、両方の行列の行数と列数を取ります。行列の加算を行っているので、両方の行列の行数と列数は同じである必要があります。
  • その後、ネストされたforループを使用して、両方の行列をユーザーの入力として取ります。
  • この時点で、両方の行列m1とm2を持っています。
  • 次に、2つのforループを使用してm3行列をトラバースし、対応する要素m3[i][j]をm1[i][j]+m2[i][j]の値で更新します。この方法で、外側のforループの終わりには、求めたい行列が得られます。
  • 最後に、結果の行列m3を出力します。

C++での2D配列へのポインタ

整数へのポインタ、浮動小数点数へのポインタ、文字へのポインタがあれば、配列へのポインタがないわけではありません。確かにあります。次のプログラムは、その構築と使用方法を示しています。

#include<iostream>
using namespace std;
/* 配列へのポインタの使用 */ 
main( ) 
{  
      int  s[5][2] = {
           {1, 2},
           {1, 2},
           {1, 2},
           {1, 2}
           } ;
           
      int (*p)[2] ;
      int  i, j;
      for (i = 0 ; i <= 3 ; i++)
      {
      		p=&s[i];
      		cout<<"Row"<<i<<":";
            for (j = 0; j <= 1; j++)
                cout<<"\t"<<*(*p+j);
            cout<<endl;
      } 
      
}

出力:

2D Array Pointer

ここでは、

  • 上記のコードでは、ポインタを使用して2次元配列を出力しようとしています。
  • 以前に行ったように、最初に2次元配列s[5][2]を初期化します。また、ポインタ(*p)[2]も宣言します。ここでpは2つの要素を持つ配列のアドレスを格納するポインタです。
  • 先に述べたように、2次元配列は配列の配列として分解することができます。この場合、sは実際には要素数5の配列であり、さらに各行には要素数2の配列があります。
  • forループを使用して、配列sの5つの要素を走査します。各反復ごとに、ps[i]のアドレスを割り当てます。
  • さらに、内部のforループでは、ポインタpを使用して配列s[i]の個々の要素を出力します。ここで、(*p + j)はs[i][j]の個々の要素のアドレスを取得するため、*(*p+j)を使用して対応する値にアクセスできます。

2次元配列を関数に渡す

このセクションでは、2次元配列を関数に渡し、対応する要素にアクセスする方法を学びます。以下のコードでは、配列ashow()print()という2つの関数に渡し、渡された2次元配列を出力します。

#include<iostream>
using namespace std;   
 
void show(int (*q)[4], int  row, int  col)
{
	int  i, j ;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
    		cout<<"\t"<<*(*(q + i)+j); 
		cout<<"\n";
	}  
    cout<<"\n";
} 
 
void print(int  q[][4], int row, int col)
{
    int  i, j; 
    for(i=0;i<row;i++)
    {   
	 for(j=0;j<col;j++)
   	    	cout<<"\t"<<q[i][j];
   	 cout<<"\n";
	}
   cout<<"\n";
}
 
int main() 
{
  int  a[3][4] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21} ; 
 
  show (a, 3, 4);
  print (a, 3, 4);
  return 0;
} 

出力:

Passing 2D Array To Functions

ここでは、

  • show( )関数内で、int (*q)[4]という宣言を通じて、4つの整数の配列へのポインタqを定義しています。
  • q holds the base address of the zeroth 1-D array
  • このアドレスは、int型のポインタであるqに割り当てられ、このポインタを使用してゼロ番目の1次元配列のすべての要素にアクセスします。
  • 次のループでは、i1の値を取るとき、式q+iは最初の1次元配列のアドレスを取得します。これは、qがゼロ番目の1次元配列へのポインタであり、それに1を加えると次の1次元配列のアドレスが得られるためです。このアドレスは再びqに割り当てられ、それを使用して次の1次元配列のすべての要素にアクセスします。
  • 2番目の関数print()では、qの宣言は次のようになります:int q[][4]
  • これはint (*q )[4]と同じであり、qは4つの整数の配列へのポインタです。唯一の利点は、配列要素にアクセスするためにより一般的な式q[i][j]を使用できることです。show()でも同じ式を使用することができましたが、ポインタの使用方法をより理解するために、各要素にアクセスするためにポインタを使用しています。

結論

この記事では、C++での2次元配列について説明し、さまざまな操作の方法や行列の加算における応用について取り上げました。さらなる質問があれば、コメントをご利用ください。

参考文献

Source:
https://www.digitalocean.com/community/tutorials/two-dimensional-array-in-c-plus-plus