개발/C

[C언어] 다차원 배열(Multidimensional Array)

섭교수 2022. 5. 30. 08:00
반응형

#C언어

1. 다차원 배열

 

Multidimensional array는 단순히 대괄호를 하나 더 붙이는 것으로 생성 가능합니다.

 

int a[3][3];       //2차원 배열
char b[4][4][4];    //3차원 배열

initializing은 중괄호 중첩을 사용합니다.

 

int m[5][9] = { {1, 1, 1, 1, 1, 0, 1, 1, 1},
	            {0, 1, 0, 1, 0, 1, 0, 1},
	            {0, 1, 0, 1, 1, 0, 0, 1},
	            {1, 1, 0, 1, 0, 0, 0, 1},
	            {1, 1, 0, 1, 0, 0, 1, 1, 1} };

3차원 배열이라면 중괄호가 세 개가 사용됩니다.

만약 중괄호를 사용하지 않는다면 [0][0] -> [0][1] -> [0][2] 순으로 값이 저장됩니다.

2차원 배열의 경우 첫 번째 대괄호를 row, 두 번째 대괄호를 column 으로 생각할 수 있습니다.(실제 값이 저장되는 형식은 축이 하나)

 

일반적인 1차원 배열과 마찬가지로 값이 할당되지 않은 곳에는 0이 저장됩니다.

 

 

 

 

2. 2차원 배열 선언 시 주의사항

 

(1) 첫 번째 대괄호 내부의 행의 크기는 명시하지 않을 수 있습니다.

그러나 두 번째 대괄호 내부의 열의 크기는 반드시 명시해야 합니다.

 

 
int a[2][4] = {10, 30, 40, 50, 1, 3, 0, 0};

int main(void) {
	printf("%d", a[1][1]);  //3이 출력됨
	return 0;
}

 

int a[2][4] = {10, 30, 40, 50, 1, 3, 0, 0};

int main(void) {
	printf("%d", a[1][1]);  //3이 출력됨
	return 0;
}

 

 

c의 경우 10, 30, 40, 50 까지 네 개의 열이 모두 채워졌는데 1을 추가로 할당하려면 새로운 열이 필요하기 때문에 2개의 행을 가지도록 생성됩니다.

(2) 배열크기는 상수를 사용

기본적으로 배열크기에 변수를 사용할 수 없습니다.

3. 랜덤하게 카드를 지급받는 프로그램

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NUM_SUITS 4
#define NUM_RANKS 13

int main(void)
{
	int in_hand[NUM_SUITS][NUM_RANKS] = { 0 };
	int num_cards, rank, suit;
	const char rank_code[] = { '2','3','4','5','6','7','8','9','t','j','q','k','a' };
	const char suit_code[] = { 'c','d','h','s' };
	srand((unsigned)time(NULL));
	printf("Enter number of cards in hand: ");
	scanf("%d", &num_cards);
	printf("Your hand:");
	while (num_cards > 0) {
		suit = rand() % NUM_SUITS; /* picks a random suit */
		rank = rand() % NUM_RANKS; /* picks a random rank */
		if (!in_hand[suit][rank]) {
			in_hand[suit][rank] = 1;
			num_cards--;
			printf(" %c%c", rank_code[rank], suit_code[suit]);
		}
	}
	printf("\n");
	return 0;
}

 

※ const 선언 -> 배열이 수정되지 않는다.

 

(1) 난수 생성을 위해서 srand, time, rand 함수를 사용하였으며 time을 사용하기 위해서는 <time.h> 헤더가 포함되어야 하고 srand와 rand를 사용하기 위해서는 <stdlib.h> 헤더가 포함되어야 합니다.

 

(2) 난수의 구현

rand()함수는 함수호출 순서에 따라 미리 정해진 수열에 따라 수를 반환합니다.

 

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	for (int i = 0; i < 10; i++) {
		int a = rand();
		printf("%d \n", a);
	}
	return 0;
}

 

위 코드를 몇 번이고 다시 실행시켜도 41, 18467, 6334, 26500, 19169 등의 값들이 동일하게 출력됩니다.

이는 rand 함수가 srand에 저장된 시드값을 사용하기 때문인데 srand에 저장되는 값을 항상 다르게 바꾸어주는 것은 현재 시간을 반환하는 time 함수로 구현할 수 있습니다.

 

> srand에 서로다른 시드값이 저장될 경우 rand가 다른 수열을 반환합니다.

 

int main(void)
{
	for (int i = 0; i < 10; i++) {
		int a = rand();
		printf("%d, ", a);
	}

	printf("\n");
	srand(2);
	for (int i = 0; i < 10; i++) {
		int a = rand();
		printf("%d, ", a);
	}
	return 0;
}

 

time(NULL)은 1970년 1월 1일 이후 현재까지 경과된 시간을 초 단위로 반환하는 함수입니다.

srand(time(NULL)) 를 사용하면 프로그램을 실행할 때마다 서로다른 시드로부터 형성되는 난수를 반환할 수 있습니다.

 

본 예제에서는 그것을 4(NUM_SUITS)로 나눈 나머지를 사용해 0,1,2,3 으로 범위를 한정했습니다.

(3) 예제 코드의 srand((unsigned)time(NULL)) 와 차이점

: for declarity, using (unsigned)

 

이것은 캐스팅(casting)이라 부르는 것으로 unsigned int 로 변수의 명확성을 더해줍니다.

반응형

'개발 > C' 카테고리의 다른 글

[C언어] 배열(array), sizeof  (0) 2022.05.28
[C언어] 자료형 분류, getchar, putchar  (0) 2022.05.25
[C언어] if, else, else if, switch, break  (2) 2022.05.07
[C언어] 반복문 (while, do, for)  (0) 2022.05.05
[C언어] printf, scanf  (0) 2022.05.03