본문 바로가기
c언어 개발일지

[나도 코딩 C언어] 배열

by 노랑사랑팽이 2022. 8. 16.

✏️배열

🔎 지하철칸, 화장실칸

여러개의 변수를 함께, 동시에 생성

#include <stdio.h>

int main(void)
{
	int subwqy_array[3];
	subwqy_array[0] = 30;
	subwqy_array[1] = 40;
	subwqy_array[2] = 50;

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

 

🔎 배열 값 설정 방법

#include <stdio.h>

int main(void)
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //값 초기화
	int arr[10]; //값 설정안함

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

값을 설정하지 않으면 임의의 값이 들어감

 

#include <stdio.h>

int main(void)
{
	// 배열 크기는 항상 상수로 선언
	int size = 10;
	int arr[10]; //int arr[size] 불가
    
	int arr[10] = { 1,2 }; //3번째 값부터는 자동으로 0으로 초기화
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}

	int arr[] = { 1,2 }; //arr[2]와 동일

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

 

✏️ 문자 vs 문자열

#include <stdio.h>

int main(void)
{
	//문자 vs 문자열
	char c = 'A';
	printf("%c\n", c);


	//문자열 끝에는 '끝'을 의미하는 NULL문자 '\0'이 포함되어야 한다.
	char str[6] = "coding"; 
	char str[7] = "coding\0"; //[c][o][d][i][n][g][\0]
	printf("%s\n", str);

	char str[] = "coding";
	printf("%s\n", str);
	printf("%d\n", sizeof(str)); //자동으로 \0포함 문자열 길이 7이라고 나옴

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

	char kor[] = "나도코딩";
	printf("%s\n", kor);
	printf("%d\n", sizeof(kor));
	// 영어 한글자 : 1byte
	// 한글 한글자 : 2byte
	// char 크기 : 1byte

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

	char c_array[10] = { 'c', 'o', 'd','i','n','g' };
	printf("% s\n", c_array);
	for(int i = 0; i < sizeof(c_array); i++)
	{
		printf("%c\n", c_array[i]);
	}

	for(int i = 0; i < sizeof(c_array); i++)
	{
		printf("%d\n", c_array[i]); //ASCII 코드값 출력(NULL 문장은 0으로 출력)
	}
    
    return 0;
}

문자열은 항상 끝을 의미하는 '\0'이 포함되어 있다.

 

#include <stdio.h>

int main(void)
{

	//문자열 입력받기 : 경찰서 조서쓰기 예제
	char name[256];
	printf("이름을 입력하세요 : ");
	scanf_s("%s", name, sizeof(name));
	printf("%s\n", name);
    
    return 0;
}

이제 예전에 printf, scanf에서 활용했던 sizeof의 의미가 이해되는가?

 

✏️ ASCII코드

🔎 ASCII코드?

참고 : ASCII 코드? ANSI(미국표준협회) 에서 제시한 표준 코드 체계
 7bit, 총 128개 코드(0-127)

#include <stdio.h>

int main(void)
{
	// a : 97(문자 a의 아스키코드 정수값
	// A : 65
	// 0 : 48
	printf("%c\n", 'a');
	printf("%d\n", 'a');
	printf("%c\n", 'b');
	printf("%d\n", 'b');
	printf("%c\n", 'A');
	printf("%d\n", 'A');
	printf("%c\n", '\0');
	printf("%d\n", '\0');
	printf("%c\n", '0');
	printf("%d\n", '0');
	printf("%c\n", '1');
	printf("%d\n", '1');

	//참고2 : 0-127 사이의 아스키코드 정수값에 해당하는 문자 확인
	for (int i = 0; i < 128; i++)
	{
		printf("아스키코드 정수 %d : %c\n", i, i);
	}

	return 0;
}

✏️ 프로젝트

🔎 아빠는 대머리 게임

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

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

	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,0,0,0 }; //4개의 병
		do {
			cntShowBottle = rand() % 2 + 2; //보여줄 병 갯수(0-1, +2 -> 2, 3)
		} while (cntShowBottle == prevCntShowBottle);
		prevCntShowBottle = cntShowBottle;

		int isincluded = 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)
				{
					isincluded = 1;
				}
			}
			// 이미 선택된 병이면, 중복이므로 다시 선택
			else
			{
				j--;
			}
		}

		// 사용자에게 문제 표시
		for (int k = 0; k < 4; k++)
		{
			if (bottle[k] == 1)
				printf("%d", k + 1);
		}
		printf(" 물약을 머리에 바릅니다.\n\n");

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

		printf("\n .... 계속하려면 아무거나 누르세요...");
		getchar();
	}

	printf("\n\n 발모제는 몇 번일까요?");
	scanf_s("%d", &answer);

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

	return 0;
}

🍏 KEEP, 습관 중요한 것

배열의 크기는 항상 상수로만 입력해야 한다는 점이 새롭게 느껴졌다.

기본적인 문법을 잘 익혀야 겠다.

문자열의 끝부분에 '\0' 이 포함된다는 건 이번 정보처리기사 실기에도 나왔어서 더 인상깊었다.

 

🍎 PROBLEM, 이슈, 에러, 오류

프로젝트 코드를 열심히 따라 타이핑했는데 실행해보니 오류가 나서 오류를 해결하기 위해 코드를 차근차근 살펴봤다. for문 k를 i라고 오류가 발생한 것이었다.

오류를 해결하기 위해 코드를 차근차근 봐야겠다.

 

 🍉 TRY 시도

이번 프로젝트 코드는 어렴풋하게 이해되는 부분이라 다시 분석해봐야 할듯 하다.

댓글