본문 바로가기

c언어 기초

c언어 배열 array - 나도코딩

유튜브 나도코딩 c언어 기초 강의 내용입니다.

 

 

배열은 여러개의 변수를 함께 동시에 생성한다고 볼 수 있다. 메모리 상에 연속으로 위치함.

동일한 자료형을 많이 담을 때 주로 사용한다. 변수가 많아지면 하나하나 모두 선언하기 힘든데, 이 때 배열을 사용하면

같은 자료형의 데이터를 보다 쉽게 선언 할 수 있다.

 

자료형 배열명[배열크기] = {초기화 값};

으로 선언하면 된다. 물론 초기화 값은 생략하고 나중에 초기화 해줘도 된다.

#include <stdio.h>

int main(void)
{
	// 배열
	// 여러 개의 변수를 함께 동시에 생성

	int subway_array[3]; // [0] [1] [2]

	subway_array[0] = 30;
	subway_array[1] = 40;
	subway_array[2] = 50;

	for (int i = 0; i < 3; i++)
	{
		printf("지하철 %d호차에 %d 명이 타고 있습니다.\n", i + 1, subway_array[i]);
	}


	// 값 설정 방법
	// 값은 초기화를 반드시 해야함
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}

	// int size = 10
	// int arr2[size];
	// 배열 크기는 항상 상수로 선언해야함
	
	
	// 크기는 10인데 하나라도 선언을 해두면 나머지 값들은 0으로 들어감
	int arr3[10] = { 1,2 };

	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr3[i]);
	}

	int arr4[] = { 1,2 }; // 이렇게 하면 배열 크기를 자동으로 2로 맞춰줌

	// int 말고 float 등도 가능
	float arr_f[5] = { 1.0f, 2.0f, 3.0f };
	for (int i = 0; i < 5; i++)
	{
		printf("%.2f\n", arr_f[i]);
	}


	return 0;
}

 

위의 코드를 보면 int arr[10] = {1,2,3,4,5,6,7,8,9,10}; 으로 변수를 하나하나 선언과 초기화 해줄 필요 없이 보다 쉽게 선언과 초기화를 해줄 수 있다.

그리고

for (int i = 0; i < 10; i++)
{
    printf("%d\n", arr[i]);
}

이렇게 arr[i] 처럼 대괄호 안에 변수를 넣어줄 수도 있지만, 배열을 선언할 때는 상수로 선언해야한다.

 

int arr3[10] = { 1,2 }; 을 보면 크기는 10인데 값은 두개밖에 없다. 이런경우에는 arr3[0] = 1, arr3[1] = 2가 되고 나머지값들은 모두 0이 들어간다. 

 

 

int arr4[] = {1, 2}; 를 보면 배열의 크기가 선언되어있지 않다. 이런 경우에는 배열의 크기를 2로 맞춰진다.

 

int arr_f[5] =  { 1.0f, 2.0f, 3.0f }; 를 보면 float형도 가능하다.

 

 

#include <stdio.h>

int main(void)
{
	char c = 'A';
	printf("%c\n", c);


	char str[6] = "coding"; // [c][o][d][i][n][g] 6개의 공간 생기고 한개씩 들어감
	printf("%s\n", str); // 이렇게 하면 뒤에 이상한 한자같은거 나옴
	// 문자열 끝에는 '끝'을 의미하는 NULL '\0' 문자가 반드시 포함되어야 함
	
	char str2[7] = "coding"; // [c][o][d][i][n][g][\0]
	printf("%s\n", str2);

	char str3[] = "coding";
	printf("%s\n", str3);
	printf("%d\n", sizeof(str3));

	for (int i = 0; i < sizeof(str3); i++)
	{
		printf("%c\n", str3[i]);
	}



	char kor[] = "나도코딩";
	printf("%s\n", kor);
	printf("%d\n", sizeof(kor));

	// 영어 1글자 : 1byte  (배열 1칸)
	// 한글 1글자 : 2byte  (배열 2칸)
	// char 크기 : 1byte

	char c_array[7] = { 'c', 'o', 'd','i','n','g','\0' };
	printf("%s\n", c_array);


	char str4[10] = { 'c', 'o', 'd','i','n','g','\0' };
	for (int i = 0; i < sizeof(str4); i++)
	{
		printf("%c\n", str4[i]);
	}
	// 배열 크기는 10인데 7개만 채우면 나머지 3칸은 \0(빈칸)으로 들어감.

	char str5[10] = { 'c', 'o', 'd','i','n','g','\0' };
	for (int i = 0; i < sizeof(str5); i++)
	{
		printf("%d\n", str5[i]);
	} // %s가 아니라 %d로 들어가면 문자의 ASCII코드 숫자가 나옴

	
	return 0;
}

문자 또는 문자열을 쓸 때는 자료형을 char를 써야하는데 변수 하나에는 1바이트만 저장할 수 있어서 알파벳이나 숫자 등 하나만 저장 가능하고 한글은 저장할 수 없다.

한글을 쓰기 위해서는 문자열을 써야하는데 한글은 2비트로, 배열의 크기는 최소 한글 글자수 * 2 + 1 만큼 필요하다. +1 은 배열의 제일 마지막에 \0을 넣어줘야하기 때문이다.

위의 예 중

char kor[] = "나도코딩";
printf("%s\n", kor);
printf("%d\n", sizeof(kor));

이 코드의 실행결과를 보면 kor의 크기가 9인 것을 알 수 있다.

만약 \0이 들어갈 자리가 없어서 들어가지 않았다면 위의 예처럼 뒤에 쓰레기값(한자)가 같이 출력된다.

그리고 빈 자리는 \0이 들어가는데 \0은 NULL값이기 때문에 0이 출력되는 것이 아니라 아무것도 출력되지 않는다.

 

 

#include <stdio.h>
#include <time.h>



int main_5_2project(void)
{
	printf("\n\n === 아빠는 대머리 게임 === \n\n");
	srand(time(NULL));

	int answer;
	int treatment = rand() % 4; // 발모제 선택 (0-3)

	int cntShowBottle = 0;
	int prevcntShowBottle = 0; //앞 게임에 보여준 병 갯수
	// 서로 보여주는 병 갯수를 다르게 해서, 정답률 높일려고 (처음에 2개 > 다음엔 3개)

	// 3번의 기회 (3번의 발모제 투여 시도)
	for (int i = 1; i <= 3; i++)
	{
		int bottle[4] = { 0, };
		do {
			cntShowBottle = rand() % 2 + 2; // 보여줄 병 갯수 2 ,3 개
		} while (cntShowBottle == prevcntShowBottle);
		prevcntShowBottle = cntShowBottle;


		int isinclude = 0; // 보여줄 병 중에 발모제가 포함되었는지 여부 (1이면 포함)
		printf(" > %d 번째 시도 : ", i);

		// 보여줄 병 종류를 선택
		for (int j = 0; j < cntShowBottle; j++)
		{
			int randBottle = rand() % 4;// 0-3

			// 아직 선택되지 않은 병이면 선택 처리
			if (bottle[randBottle] == 0)
			{
				bottle[randBottle] = 1;
				if (randBottle == treatment)
				{
					isinclude = 1;
				}
			}
			// 이미 선택된 병이면 중복이니까 다시 선택
			else
			{
				j--;
			}
			
		}
		// 사용자에게 문제 표시
		for (int k = 0; k < 4; k++)
		{
			if (bottle[k] == 1)
			{
				printf("%d ", k + 1);
			}
		}
		printf(" 물약을 머리에 바릅니다\n\n");

		if (isinclude == 1)
		{
			printf(" >> 성공 ! 머리가 났어요 ! \n\n");
		}
		else
		{
			printf(" >> 실패 ! 머리가 나지 않았어요 ㅠ\n\n");
		}

		printf("\n ... 계속 하려면 아무키나 누르세요...");
		getchar();
	}
	printf("\n\n 발모제는 몇 번일까요? ");
	
	scanf_s("%d", &answer);

	if (answer == treatment+1)
	{
		printf("\n >> 정답입니다 !\n");
	}
	else
	{
		printf("\n >> 땡 ! 틀렸어요. 정답은 %d 입니다. \n",treatment+1);
	}





	return 0;
}

간단한 프로젝트다.

아빠는 대머리게임이고, 발모제 4개 중 매번 다른 갯수와 다른 발모제를 랜덤으로 뽑아서 발랐을 때 머리가 나는지 안 나는지를 보고 몇번 발모제가 진짜 발모제인 지 맞추는 게임이다.