훈, IT 공부/C,C++,MFC

[프로그램]강아지와 병아리 ( 다리개수 ) +손코딩연습

IT훈이 2018. 2. 28.
반응형

강아지와 병아리 숫자맞춰!!

핸드메이드 

 

 이번에 소개하는 게임은 강아지와 병아리의 총합과 강아지와 병아리의 다리개수 만 가지고 계산하여서 각각 강아지와 병아리가 몇마리씩 나타나게 되는지 알고리즘을 작성하는 프로그램입니다. 옛날에 이런문제를 봤던 기억이 있는데, 이번에는 컴파일러로 바로 작성하는것이 아니라 손코딩을 하고난 뒤에 컴파일러에 옮겨보고 컴파일 해보는 방법으로 진행 해볼 것입니다.

 부지런히 손코딩을 하게 되면, 자질구레한 오류들을 잡을 수 있고, 자신의 본래의 실력이 드러나게 되고, 또한 실력또한 성장 할 수 있을 것입니다. 

 

● 강아지와 병아리는 몇마리 있는가요?

 

 

강아지와 병아리 문제

 

조건

1. 강아지와 병아리의 합 1000 이하, 다리의 합 4000 이하의 음이 아닌 정수가 입력되어야한다.

- 예외가 발생되면 "INPUT ERROR!" 문자열을 출력한다.

2. 하나의 결과가 나온 이후에도 계속해서 새로운 입력을 받는다.

- 입력은 공백으로 구분하여서 받는다.

3. 사용자가 0 0 을 입력하게 되면 종료된다.

4. 주어진 데이터로 계산이 되지 않을 경우에는 "0"을 출력한다.

 

● 프로그램 작성 손코딩

 

손코딩 증거물

  카페에서 자리잡고 손코딩을 시작합니다. 사진은 손코딩을 한 증거로 제출합니다. 

 

 제일먼저 하는것은 설계!! C/C++을 배우고 있는 현재상태에서 설계란 정말 중요한 것임을 알고 있기에 프로그램에 대한 큰 틀을 만들었습니다. 설계에서 다른것 보다 변수명과 함수이름을 정한다는 것이 정말 어렵더군요. 실무영어를 잘 알고 활용을 하는 방법이 중요한거같습니다!! 

 설계를 마치고, 다음 시작한 것은 알고리즘 설계입니다. 딱히 대단한 알고리즘이 아니기에 저보다 더 뛰어나신 프로그래머가 이 코드를 본다면, 혀를 "쯧쯧쯧" 찰수도 있을 것입니다. 더 좋은 알고리즘이 생각나면 수정을 해보고 더 좋을 프로그램을 만들기위해 좀더 노오력을 해보아야 겠습니다.

 

최대한 함수화를 하여서 유지보수가 편안하게 하려 노력을 하였습니다. 사용자는 딱히 작성을 할 부분이 많이 없도록 배려하는 프로그래머였습니다. o-o

 

 

소스코드

#include<stdio.h>

static const int dog = 4, cheken=2;

void result_func(const int d, const int c)
{
    if (d == 0 && c == 0)
        puts("0");
    else
        printf("강아지:%d 병아리:%d\n", d, c);
}

// 사용자의 입력확인
int input_check_func(const int nSum, const int nLeg)
{
    // 강아지와 병아리 합은 최대 1000마리
    if (nSum > 1000 || nSum < 0)
        return 1;

    // 다리의 총 합은 최대 4000개
    if (nLeg > 4000 || nLeg < 0)
        return 1;
    
    // 입력값이 0 0 일 경우 프로그램 종료
    if (nLeg == 0 || nSum == 0)
        return 2;

    return 0;
}

// 숫자와 다리 분리
int dog_cheken_func(const int sum, const int leg)
{
    int dog_cnt = sum;
    int cheken_cnt = 0;

    // 개와 병아리 분리
    while((dog_cnt*dog) + (cheken_cnt*cheken) != leg)
    {
        dog_cnt--;
        cheken_cnt++;

        // 병아리와 강아지 숫자가 결정되지 않을 때
        if (cheken_cnt == sum && (cheken_cnt*cheken)!=leg)
        {
            result_func(0, 0);
            return 0;
        }
    }

    result_func(dog_cnt, cheken_cnt);
    return 1;
}

// 손코딩으로 작성한 것이 아닌 UI 함수
void UI(void){
    printf("병아리와 강아지 합친 수를 보고 다리 개수를 찾는 게임\n");
    puts("첫번째 값은 강아지 병아리합 // 두번째 값은 다리의 합");
    puts("ex)25 80");
    puts("************");
}

int main(){
    
    int nDog_Cheken = 0, nLeg = 0;
    int flag = 0;
    UI();
    while (flag == 0)
    {
        printf(">>");
        scanf("%d %d", &nDog_Cheken, &nLeg);
        flag = input_check_func(nDog_Cheken, nLeg);

        // 입력 오류
        if (flag == 1)
            printf("INPUT ERROR!!\n");

        // 정상적일 경우
        if (flag == 0)
            dog_cheken_func(nDog_Cheken, nLeg);

        // 종료 코드 입력시
        if (flag == 2)
            return 0;
        else
            flag = 0;
    }

    return 0;
}

 

● 프로그램 작성 후기

 

 프로그램을 작성하는 시간은 약 1시간 30분정도?? ( 가물가물... ) 걸렸다. 손코딩을 하면서 포인터 생각이  갑자기 나서 다른쪽 방향으로 새어버릴뻔 했다. 

 손코딩을 하게되면 컴파일러의 친절한 오류발생을 볼 수 없기 때문에, 순수한 나의 머리에서 나온 지식으로만 작성을 해야한다. 나는 손코딩을 하면서 느낀 것이 프로그램을 만들기 전에, 손으로 코딩을 종종 해야한다는 것이다. 손코딩을 하게 되면, 나름대로 궁금점도 생기게 되고, 또한 복잡한 코드를 손으로 작성하게 되면 처음에는 어렵게 느껴지던 것들이 나중에 컴파일러에 다시 작성을 하게 될 때는 수월하여 지기 때문이다. 복잡한 코드란 포인터가 마구마구 여기저기 사용된 경우.... 예를면 int const *a, int* const a 이런 코드를 손으로 작성하는 것이다. 컴파일러로 작성을 할 때는 못느끼지만 손코딩을 한다면 갈팡질팡하게 되는경우가 발생하긴 한다.

 

 손코딩을 해봐라고 한번씩 들었던 기억이 난다. 이 말을 듣고도 사람들은 귀찮고, 그냥 데스크톱으로 작성하는 것이 편하기에 무시하곤한다. 그러나 손코딩은 그렇게 무시할만큼 가벼운것은 아닌것같다. 그렇다고 손코딩을 안하면 잘못되었거나 그런것은 아니다. 손코딩을 안하더라고 프로그램을 잘 작성하면 그만이다 @_@. 팩트다. 잘하려고 노력하는 방법중 한 가지이기 때문에 자신의 스타일에 맞춰서 역량을 늘려가면 될 것이라 생각한다. 

 

 

성장하는 C C/C++ 프로그래머가 되어가겠습니다.

 

 

 

 

소스코드 파일 첨부

code.c
다운로드

 

반응형

댓글