C++의 2차원 배열


소개

C++의 2차원 배열은 다차원 배열의 가장 단순한 형태입니다. 배열의 배열로 시각화할 수 있습니다. 아래 이미지는 2차원 배열을 보여줍니다.

2차원 배열은 행렬이라고도 합니다. 초기화에 따라 정수, 문자, 부동 소수점 등과 같은 모든 유형이 될 수 있습니다. 다음 섹션에서는 2D 배열을 초기화하는 방법에 대해 설명합니다.

C++에서 2D 배열 초기화

그렇다면 C++에서 2차원 배열을 어떻게 초기화합니까? 다음과 같이 간단합니다.

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

보시다시피 배열의 배열로 4개의 행과 2개의 열을 사용하여 2D 배열 arr을 초기화합니다. 배열의 각 요소는 다시 정수 배열입니다.

다음과 같은 방법으로 2D 배열을 초기화할 수도 있습니다.

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

이 경우에도 arr는 4개의 행과 2개의 열이 있는 2D 배열입니다.

C++에서 2D 배열 인쇄

우리는 2D 배열 초기화를 마쳤습니다. 이제 실제로 동일하게 인쇄하지 않고 올바르게 수행되었는지 확인할 수 없습니다.

또한 많은 경우에 일부 작업을 수행한 후 결과 2D 배열을 인쇄해야 할 수도 있습니다. 그럼 어떻게 해야 할까요?

아래 코드는 우리가 어떻게 할 수 있는지 보여줍니다.

#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;
	}
}

산출:

위의 코드에서

  • 먼저 2D 배열 arr[4][2]을 특정 값으로 초기화합니다.
  • 그 후 두 개의 for 루프를 사용하여 각 배열을 인쇄하려고 합니다.
  • 외부 for 루프는 행을 반복하고 내부 루프는 2D 배열의 열을 반복합니다.
  • 따라서 외부 루프가 반복될 때마다 i가 증가하고 다음 1D 배열로 이동합니다. 또한 내부 루프는 한 번에 전체 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;
	  } 
} 

산출:

위 코드의 경우 2X2 2D 배열 s를 선언합니다. 두 개의 중첩된 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;
	  } 
	  
} 

산출:

여기,

  • 최대 5개의 행과 5개의 열이 있는 두 개의 행렬 m1m2를 사용합니다. 그리고 결과를 저장할 또 다른 매트릭스 m3,
  • 사용자 입력으로 두 행렬 모두에 대한 행과 열의 수를 취했습니다. 행렬 덧셈을 수행하고 있으므로 두 행렬의 행과 열의 수가 같아야 합니다.
  • 그 후 다시 중첩 for 루프를 사용하여 두 행렬을 사용자 입력으로 가져옵니다.
  • 이 시점에서 행렬 m1과 m2가 모두 있습니다.
  • 그런 다음 두 개의 for 루프를 사용하여 m3 행렬을 순회하고 각 요소 m3[ i ][ j ]m1[i][j]+m2 값으로 업데이트합니다. [i][j]. 이런 식으로 외부 for 루프가 끝날 때까지 원하는 행렬을 얻습니다.
  • 마지막으로 결과 행렬 m3을 출력합니다.

C++에서 2D 배열에 대한 포인터

정수에 대한 포인터, float에 대한 포인터, char에 대한 포인터를 가질 수 있다면 배열에 대한 포인터를 가질 수 없습니까? 우리는 확실히 할 수 있습니다. 다음 프로그램은 빌드하고 사용하는 방법을 보여줍니다.

#include<iostream>
using namespace std;
/* Usage of pointer to an array */ 
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 배열을 인쇄하려고 합니다.
  • 이전에 했던 것처럼 처음에는 2D 배열인 s[5][2]를 초기화합니다. 또한 포인터 (*p)[2], 여기서 p는 2개의 요소가 있는 배열의 주소를 저장하는 포인터입니다.
  • 이미 말했듯이 2D 배열을 배열의 배열로 분해할 수 있습니다. 따라서 이 경우 s는 실제로 5개의 요소가 있는 배열이며 각 행에 대해 실제로 2개의 요소가 있는 배열입니다.
  • for 루프를 사용하여 배열 s의 5개 요소를 순회합니다. 각 반복에 대해 s[i],
  • 의 주소로 p를 할당합니다.\n
  • 또한 내부 for 루프는 포인터 p를 사용하여 배열 s[i]의 개별 요소를 인쇄합니다. 여기서 (*p + j)는 개별 요소 s[i][j]의 주소를 제공하므로 *(*p+j)를 사용하여 액세스할 수 있습니다. 해당 값.

2차원 배열을 함수에 전달

이 섹션에서는 2D 배열을 함수에 전달하고 해당 요소에 액세스하는 방법을 배웁니다. 아래 코드에서 배열 a를 두 개의 함수 show()print()에 전달하여 전달된 2D 배열을 인쇄합니다.

#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;
} 

산출:

여기,

  • show( ) 함수에서 int (*q)[4],< 선언을 통해 q를 4개 정수 배열에 대한 포인터로 정의했습니다.< /리>
  • q는 0번째 1-D 배열의 기본 주소를 보유합니다.
  • 이 주소는 int 포인터인 q에 할당되고 이 포인터를 사용하여 0번째 1D 배열의 모든 요소에 액세스됩니다.
  • 다음에 i가 값 1을 가질 때 루프를 통해 q+i 표현식은 첫 번째 1차원 배열의 주소를 가져옵니다. 이것은 q가 0번째 1-D 배열에 대한 포인터이고 여기에 1을 더하면 다음 1-D 배열의 주소가 되기 때문입니다. 이 주소는 다시 한 번 q에 할당되며 이를 사용하여 다음 1-D 배열의 모든 요소에 액세스합니다.
  • 두 번째 함수 print()에서 q의 선언은 다음과 같습니다. int q[][4] ,
  • 이는 int (*q )[4]와 동일하며 여기서 q는 4개 정수 배열에 대한 포인터입니다. 유일한 장점은 이제 더 친숙한 표현식 q[i][j]를 사용하여 배열 요소에 액세스할 수 있다는 것입니다. show()에서도 동일한 표현식을 사용할 수 있지만 포인터 사용을 더 잘 이해하기 위해 포인터를 사용하여 각 요소에 액세스합니다.

결론

따라서 이 기사에서는 C++의 2차원 배열, 다양한 연산을 수행하는 방법 및 행렬 덧셈에서의 응용에 대해 논의했습니다. 추가 질문이 있으면 의견을 자유롭게 사용하십시오.

참조

  • https://en.wikipedia.org/wiki/Array_data_structure
  • /커뮤니티/튜토리얼/arrays-in-c