다차원 배열: 2차원 이상의 배열
int arronedim[10]; 길이가 10인 1차원 int형 배열
int arrtwodim[5][5]; 가로 세로 길이가 각각 5인 2차원 int형 배열
int arrthreedim[3][3][3]; 가로,세로,높이의 각각 3인 3차원 int형 배열
int arr1[3][4]; //세로가 3, 가로가 4인 int형 2차원 배열
sizeof 연산자
배열의 크기가 바이트 단위로 계산되어 반환된다.이것은 2차원 배열의 경우에도 해당된다.
# include <stdio.h>
int main()
{
int arr1[3][4];
int arr2[7][9];
printf("세로3 가로4:%d \n", sizeof(arr1));
printf("세로7 가로9:%d \n", sizeof(arr2));
return 0;
}
3x4x4(int에 배당되는 바이트)=48이고 7x9x4=252이다. 따라서 sizeof 연산자가 2차원 배열의 크기를 정확히 계산해서 반환하고 있음을 실행결과를 통해서 확인할 수 있다.
arr[n-1][m-1]=20; //세로 n 가로 m의 위치에 정수 20을 저장
printf("%d",arr[n-1][m-1]);//세로 n 가로 m의 위치에 저장된 값을 출력
예제
# include <stdio.h>
int main()
{
int villa[4][2];
int popu, i, j;
//가구별 거주인원 입력받기
for (i = 0; i < 4; i++)
{
for (j = 0; j < 2; j++)
{
printf("%d층 %d호 인구수", i + 1, j + 1);
scanf_s("%d", &villa[i][j]);
}
}
//빌라 층별 인구수 출력하기
for (i = 0; i < 4; i++)
{
popu = 0;
popu += villa[i][0];
popu += villa[i][1];
printf("%d층 인구수: %d\n", i + 1,popu);
}
return 0;
}
int arr[3][2]; 선언시
주소값은 int형 변수의 크기인 4바이트 만큼 차이가 남을 알수 있다.
예제
# include <stdio.h>
int main()
{
int i, j;
//2차원 배열 초기화의 예1
int arr1[3][3]={
{1,2,3},
{4, 5, 6},
{7, 8, 9}
};
//2차원 배열의 초기화 예2
int arr2[3][3]={
{1},
{4,5},
{7,8,9}
};
//2차원 배열 초기화의 예3
int arr3[3][3] = { 1,2,3,4,5,6,7 };
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
printf("%d", arr1[i][j]);
printf("\n");
}
printf("\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
printf("%d", arr2[i][j]);
printf("\n");
}
printf("\n");
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
printf("%d", arr3[i][j]);
printf("\n");
}
return 0;
}
실행결과
123
456
789100
450
789123
456
700
2차원 배열을 선언과 동시에 초기화하는 경우에는 배열의 세로길이만 생략이 가능하다.
ex) int arr[][2]={1,2,3,4,5,6,7,8};
문제1
가로의 길이가 9 세로의 길이가 3인 int형 2차원 배열을 선언하여 구구단 중 2단,3단,4단을 다음과 같이 저장하자.
# include <stdio.h>
int main()
{
int arr[3][9];
int i, j;
for (i = 0; i <3; i++)
{
for (j = 0; j < 9; j++)
arr[i][j] = (i + 2) * (j + 1);
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 9; j++)
printf("%d ",arr[i][j]);
printf("\n");
}
return 0;
}
문제2
아래 그림과 관련해서 문제를 제시할테니, 그림에서 제시하는 배열 A와 B를 유심히 관찰하자.
위그림의 형태로 배열A와 배열B를 선언하자. 그리고 배열A는 선언과 동시에 그림에서 명시하는 대로 초기화를 진행하자! 그리고 배열 B도 위 그림에서 보이는 대로 초기화를 진행하되, 반드시 배열 A에 저장된 값을 이용해서 초기화를 진행해야한다.
# include <stdio.h>
int main()
{
int arrA[2][4] = {
{1,2,3,4},
{5,6,7,8}
};
int arrB[4][2];
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 2; j++)
arrB[i][j] = arrA[j][i];
}
for (i = 0; i < 4; i++)
{
for (j = 0; j < 2; j++)
printf("%d ", arrB[i][j]);
printf("\n");
}
return 0;
}
문제3
성적관리 프로그램을 작성하자. 과목은 국어,영어,수학,국사 이렇게 네과목이고 학생은 철희,철수,영희,영수 이렇게 네 사람이다. 프로그램 사용자로부터 이 네사람의 네과목 점수를 입력받는다. 그리고 미리 선언해놓은 배열에 다음의 형태로 그 값을 저장해야한다.