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개의 열이 있는 두 개의 행렬
m1
및m2
를 사용합니다. 그리고 결과를 저장할 또 다른 매트릭스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