U E D R , A S I H C RSS

새싹교실/2015/의사양반/Forgetfulness Of Santa Claus

주의 : 인터페이스가 몹시 더러움
콘솔 프로그램은 예쁘게 만들려면.. 귀찬타


1. 소개

Forgetfulness of Santa Claus
산타 클로스는 10개의 집에 100개의 선물을 나누어줘야 한다.
10개의 집은 일렬로 나열돼 있으며, 산타는 현재 굴뚝에서 옆집 굴뚝으로 점프할 수 있다.
산타는 한 번에 하나의 굴뚝을 점프할 수 있으며, 선물을 전부 나눠주고 끝났다고 생각되면 퇴근한다.
퇴근한 산타는 선물을 잘못 나누어주었다는 사실을 깨닫는다.
올바른 선물 갯수를 종이에 적은 산타는 선물을 회수하여 올바르게 분배하기 위해 다시 출발한다.
선물의 분배는 갯수만 맞으면 완료된 것으로 간주한다.
올바른 분배가 완료된 산타는 정말로 퇴근한다.

2. 프로젝트 구성

  • myfunc.h : 헤더파일
  • main.c : 메인
  • myfunc.c : 함수정의부

3. 코드

3.1. myfunc.h

#include <stdio.h>
#pragma warning(disable:4996)

//define DEBUG here when you're debugging
#ifdef DEBUG

#ifndef SHOW_INIT
#define SHOW_INIT
#endif

#endif

#define HOUSE_NUMBER 10
#define MAX_PACKAGE 100

#define SHOW_INIT

void printHouse(const int* arr);
void printHouseSelected(const int* arr, int n);

void presentHouse(int* pack, int* house);

char getInput(void);
void showRealAssignment(int* arr);
int chkResult(int* base, int* cmp);

3.2. main.c

#include "myfunc.h"

int main(void) {
	int package = MAX_PACKAGE;
	int houses[HOUSE_NUMBER];
	int correct[HOUSE_NUMBER] = { 15, 6, 8, 12, 5, 2, 6, 19, 17, 10 };

	for (int i = 0; i < HOUSE_NUMBER; i++) houses[i] = 0;
	printf("시작합니다.\n\n");

#ifdef SHOW_INIT
	printHouse(houses);
	printf("\n");
#endif

	int now = 0;
	int phase = 0;
	while (phase < 2) {
		char c = -1;
		
		c = getInput();
		switch (c) {
		case '<':
			if (now <= 0) now = 0;
			else now--;

			printf("\n\n");
			printHouseSelected(houses, now);
			break;
		case '>':
			if (now >= (HOUSE_NUMBER - 1)) now = HOUSE_NUMBER - 1;
			else now++;

			printf("\n\n");
			printHouseSelected(houses, now);
			break;
		case 'q':
			if (package > 0) {
				printf("아직 선물이 남아있습니다.\n\n");
				break;
			}

			if (phase == 0) {
				phase = 1;
				showRealAssignment(correct);
			} else
				if (chkResult(houses, correct) == 1) {
					printf("\n\n축하합니다!\n");
					return 0;
				} else {
					printf("분배가 틀렸습니다.");
					showRealAssignment(correct);
				}

			break;
		case 'a':
			presentHouse(&package, &(houses[now]) );

			break;
		default:
			printf("ERROR");
			return 0;
		}


	}

	return 0;
}

3.3. myfunc.c

#include "myfunc.h"

void printHouse(const int* arr) {
	printf("Printing houses...\n");
	for (int i = 0; i < HOUSE_NUMBER; i++) {
		printf("%6d ", arr[i]);
	}
	printf("\n");
}

void printHouseSelected(const int* arr, int n) {
	printf("Printing houses...\n");
	for (int i = 0; i < HOUSE_NUMBER; i++) {
		if (i == n) printf("[%4d] ", arr[i]);
		else printf("%6d ", arr[i]);
	}
	printf("\n");
}

void presentHouse(int* pack, int* house) {
	int input;

	printf("선물을 주거나 회수합니다. (양수: 선물주기, 음수: 선물회수)\n");

	while (1) {
		printf("입력(%d) : ", *pack);
		scanf("%d", &input);
		fflush(stdin);

		if (input > 0) {
			if (input > *pack)
				printf("그만큼 주기엔 선물이 부족합니다.\n");
			else {
				*pack -= input;
				*house += input;
				printf("\n");
				return;
			}
		} else if (input < 0) {
			if (input > *house)
				printf("이 집에서 회수할 수 있는 양이 아닙니다.\n");
			else {
				*pack -= input;
				*house += input;
				printf("\n");
				return;
			}
		}
		else {
			printf("올바르지 못한 입력입니다.\n\n");
		}

	}
}

char getInput(void) {
	char input;

	printf("조작 : ");
	printf("왼쪽[<] 오른쪽[>] 선물증감[a] 퇴근하기[q]\n");
	while (1) {

		printf("입력 : ");
		scanf("%c", &input);
		fflush(stdin);

		if (input == 'a' || input == 'q' || input == '<' || input == '>')
			return input;

		printf("입력 값이 부적절합니다.\n\n");
	}

	//이 줄에 도달하는 것은 불가능함
	return (char)-1;
}

void showRealAssignment(int* arr) {
	printf("사실 원래는 이렇게 나눠주어야 했다고 한다.\n");
	printHouse(arr);
	printf("\n");
}

int chkResult(int* base, int* cmp) {
	for (int i = 0; i < HOUSE_NUMBER; i++)
		if (*(base+i) != *(cmp+i)) return 0;
	return 1;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2015-05-05 19:32:47
Processing time 0.0104 sec