[코딩 자율학습단 17기] 17일차

네버릭스·2025년 10월 29일
post-thumbnail

// 2025년 10월 28일


Day 17 : 다양한 자료형 하나로 묶기 : 구조체

오늘은 9장을 마무리하는 프로젝트 '너, 내 집사가 되어라' 를 진행했다.

프로젝트 : 너 내 집사가 되어라

큰 상자에서 고양이를 뽑아서 작은 상자에 넣고, 작은 상자에 서로 다른 고양이 5마리가 모이면 끝나는 게임이다. 큰 상자를 클릭할 때마다 어떤 고양이가 나올지 모르고, 같은 고양이가 나오면 뽑지 않은 다른 고양이가 나올 때까지 계속 뽑아야 한다.

고양이 정보 초기화하기

큰 상자에서 뽑는 고양이는 5마리이다.
이름 / 나이 / 특징 / 레벨 총 4가지 정보로 구분하고, - cats 구조체
정의한 구조체를 이용해 고양이 정보를 초기화한다. - initCats() 함수

큰 상자에서 고양이 뽑기

게임이 시작되면, 큰 상자에서 고양이를 뽑아야 한다.
작은 상자 5개에 서로 다른 고양이 5마리가 들어갈 때까지 반복한다.
무작위로 뽑히게 하기 위해 난수를 사용하고, - 헤더 파일 추가, srand(time(NULL))
고양이를 담을 상자를 배열을 사용해 만든다. - collection[5]
작은 상자를 다 채울 때까지 반복하므로 while 문으로 무한 반복하고,
뽑은 고양이를 정수형 변수를 선언해 저장한다. 이 숫자가 고양이 5마리의 번호이자 구조체 배열 cats의 인덱스가 된다. - int selected

💡 getchar() 경고 메시지
getchar() 함수에서 반환값이 무시됐다는 경고 메시지가 나타나도, 실행하는 데에는 아무런 문제가 없다. 또는 (void)를 추가해 경고를 없애도 되지만, 필자는 그냥 한다.

void printCat(int selected);

printCat(selected);

printCat() 함수를 선언해 어떤 고양이를 뽑았는지 알려주고, 간단한 안내 문구와 고양이 정보를 출력한다.
main() 함수에서 뽑은 고양이 번호를 매개변수 selected로 받아, 구조체 배열 cats에서 매개변수의 값을 인덱스로 하는 멤버의 정보를 출력한다.
그리고 고양이의 레벨을 별표(★)로 출력하는 코드까지 작성한다.

작은 상자에 고양이 모으기

int checkCollection();

collection[selected] = 1;
int collectAll = checkCollection();

고양이를 넣었다는 표시를 collection 배열로 처리하기로 했으니, collection[selected]의 값을 1로 수정한다. = selected 변수의 값을 인덱스로 하는 요소에 뽑은 고양이를 넣는다는 뜻.

고양이 5마리를 다 모았는지 확인하는 checkCollection() 함수를 선언하고,
printf() 문으로 보유한 고양이 목록을 안내하는 문구를 출력한다. 이 때 실행결과에서 문자열을 10칸 간격으로 출력하도록 서식 지정자를 %10s 로 설정한다.
반복문은 상자에 고양이가 있을 때와 없을 때 수행할 내용이 달라지므로 if-else 문으로 작성한다.

if (collectAll == 1)
{
	break;
}

고양이 5마리를 다 모았을 때 main() 함수에 반환하는 값을 저정할 정수형 변수 collectAll 을 선언한다.
일단 다 모았다고 가정하고 1로 초기화 하고, 고양이가 상자에 없다면 값을 0으로 변경하게끔 작성한다.
모든 고양이를 다 모았다면 초깃값 1을 반환하고, 빈 상자가 하나라도 있다면 0을 반환한다.
게임 종료 멘트를 if 문을 사용해 출력하고, collectAll 변수의 값이 1이면 실행되게 한다.
이 때 main() 함수 안에 무한 반복문을 탈출하기 위해 break 문을 추가한다.

💡 C 언어의 참, 거짓
C 언어에서는 1을 참, 0을 거짓으로 인식한다.

전체 코드 확인하기

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

typedef struct
{
	char *name;
	int age;
	char *character;
	int level;
} CAT;

CAT cats[5];
int collection[5] = { 0, 0, 0, 0, 0 };

void initCats();
void printCat(int selected);
int checkCollection();

int main(void)
{
	srand(time(NULL));
	initCats();
	while (1)
	{
		printf("두근두근! 어느 고양이의 집사가 될까요?\nEnter를 눌러 확인하세요!");
		getchar();
		int selected = rand() % 5;
		printCat(selected);
		collection[selected] = 1;
		int collectAll = checkCollection();
		if (collectAll == 1)
		{
			break;
		}
	}
	return 0;
}

void initCats()
{
	cats[0].name = "먼지";
	cats[0].age = 5;
	cats[0].character = "얌전하고 조용함";
	cats[0].level = 1;
	cats[1].name = "치즈";
	cats[1].age = 3;
	cats[1].character = "애교가 넘침";
	cats[1].level = 2;
	cats[2].name = "후추";
	cats[2].age = 7;
	cats[2].character = "도도하고 까칠함";
	cats[2].level = 3;
	cats[3].name = "까미";
	cats[3].age = 2;
	cats[3].character = "장난끼가 많음";
	cats[3].level = 4;
	cats[4].name = "콩이";
	cats[4].age = 1;
	cats[4].character = "사고뭉치임";
	cats[4].level = 5;
}

void printCat(int selected)
{
	printf("\n\n=== 네버릭스 님은 다음 고양이의 집사가 됐어요! ===\n\n");
	printf(" 이름 : %s\n", cats[selected].name);
	printf(" 나이 : %d\n", cats[selected].age);
	printf(" 특징 : %s\n", cats[selected].character);
	printf(" 레벨 : ");
	for (int i = 0; i < cats[selected].level; i++)
	{
		printf("%s", "★");
	}
	printf("\n\n");
}

int checkCollection()
{
	int collectAll = 1;
	printf("\n\n=== 보유한 고양이 목록이에요. ===\n\n");
	for (int i = 0; i < 5; i++)
	{
		if (collection[i] == 0)
		{
			printf("%10s", "(빈 상자)");
			collectAll = 0;
		}
		else
		{
			printf("%10s", cats[i].name);
		}
	}
	printf("\n==================================================\n\n");
	if (collectAll)
	{
		printf("\n\n축하합니다! 고양이 5마리를 모두 모았어요. 열심히 키워 주세요.\n\n");
	}
	return collectAll;
}

17일차 후기

오늘 학습한 프로젝트를 통해, 서로 연관된 여러 변수를 '구조체'라는 하나의 자료형으로 선언하는 방법에 대해서 자세히 배웠다.
구조체 사용법이 크게 어렵지 않다고 느껴지는데, 내 공부 경험 상 이러면 위험한 거다.
생각보다 쉬운데? 라는 생각이 들어서 한번 더 복습해야될 필요가 있는 것 같다. ㅋㅋㅋㅋㅋㅋㅋ
아무튼 벌써 9장도 끝! 이제 마지막 10장만 남았다.
끝까지 파이팅!!!


이미지 출처 : https://cafe.naver.com/gilbutitbook (길벗 코딩 자율학습단 공식 카페)
그 외의 모든 코딩 화면은 직접 작성하고, 실행하였습니다.

profile
도망친 곳에 낙원은 없다.

0개의 댓글