ch16 다차원 배열

암영·2022년 6월 6일
0

c언어

목록 보기
19/21

16-1 다차원 배열의 이해와 활용

다차원 배열: 2차원 이상의 배열

2차원,3차원 배열 ok, 4차원 5차원 배열 no!

int arronedim[10]; 길이가 10인 1차원 int형 배열
int arrtwodim[5][5]; 가로 세로 길이가 각각 5인 2차원 int형 배열
int arrthreedim[3][3][3]; 가로,세로,높이의 각각 3인 3차원 int형 배열

다차원 배열을 대표하는 결혼 2차원 배열의 선언

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차원 배열의 크기를 정확히 계산해서 반환하고 있음을 실행결과를 통해서 확인할 수 있다.

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

2차원 배열의 메모리상 할당의 형태

int arr[3][2]; 선언시

주소값은 int형 변수의 크기인 4바이트 만큼 차이가 남을 알수 있다.

2차원 배열 선언과 동시에 초기화 하기

예제

# 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
789

100
450
789

123
456
700

배열의 크기를 알려주지 않고 초기화 하기

2차원 배열을 선언과 동시에 초기화하는 경우에는 배열의 세로길이만 생략이 가능하다.
ex) int arr[][2]={1,2,3,4,5,6,7,8};

문제 16-1 2차원 배열의 활용

문제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
성적관리 프로그램을 작성하자. 과목은 국어,영어,수학,국사 이렇게 네과목이고 학생은 철희,철수,영희,영수 이렇게 네 사람이다. 프로그램 사용자로부터 이 네사람의 네과목 점수를 입력받는다. 그리고 미리 선언해놓은 배열에 다음의 형태로 그 값을 저장해야한다.

profile
just do! -얼레벌레 굴러가는 공대생

0개의 댓글