[Tmax 연수] C - 환풍구 관리 시스템

#include <stdio.h>

#define SIZEOFBAR 71   /* 메뉴에 필요한 상/하단 바 길이 */
#define SIZEOFFAN 8    /* FAN SIZE */

unsigned char fan;     /* 환풍구 상태 - 0 : 닫힘, 1 : 열림 */
                       /* 전역으로 선언시 기본값 0으로 초기화 됨을 이용 */
unsigned char bitMask; /* 공통으로 쓰일 bitMask 변수 */

void fanOpen();        /* 특정 환풍구 열기 함수 */
void fanClose();       /* 특정 환풍구 닫기 함수 */
void fanToggle();      /* 환풍구 전체 전환 함수 */
void printBar();       /* 메뉴에 필요한 상/하단 바 출력 */
void printFanStatus(); /* FAN의 상태를 출력하는 함수 */
int  run();            /* 프로그램 실행 함수 */

void fanOpen() {
    int idx;           /* 환풍구 인덱스를 위한 변수 */
    int inp;           /* OPEN 할 환풍구 번호 */

    printBar();
    printf("%20cFAN 열기 작업 실행 화면\n",' ');
    printBar();

    do {
        printf(" * OPEN할 FAN 번호를 입력하시오(1-8) : ");
        scanf("%d",&inp);

        if ( inp > SIZEOFFAN || inp < 1 )
            printf(" ! 1~%d 사이의 번호를 입력하시오. ",SIZEOFFAN);
    } while( inp > SIZEOFFAN || inp < 1 );

    bitMask = 1<<(inp-1);

    if ( !(fan&bitMask) )
        fan |= bitMask; /* 입력한 번호의 FAN Toggle */
    else
        printf(" ! 이미 열려있습니다.\n");
}

void fanClose() {
    int idx;           /* 환풍구 인덱스를 위한 변수 */
    int inp;           /* CLOSE 할 환풍구 번호 */

    printBar();
    printf("%20cFAN 닫기 작업 실행 화면\n",' ');

    printBar();

    do {
        printf(" * CLOSE할 FAN 번호를 입력하시오(1-%d) : ",SIZEOFFAN);
        scanf("%d",&inp);
        if ( inp > SIZEOFFAN || inp < 1 )
            printf(" ! 1~%d 사이의 번호를 입력하시오. ",SIZEOFFAN);
    } while( inp > SIZEOFFAN || inp < 1 );

    bitMask = 1<<(inp-1);

    if ( fan&bitMask )
        fan &= (~bitMask); /* 입력한 번호의 FAN Toggle */
    else
        printf(" ! 이미 닫혀 있습니다.\n");
}

void fanToggle() {
    int idx;           /* 환풍구 인덱스를 위한 변수 */

    printBar();
    printf("%20cFAN 전체 전환 작업 실행 화면\n",' ');
    printBar();

    bitMask = 1;

    for ( idx = 0 ; idx < SIZEOFFAN ; idx++, bitMask <<= 1 )   /* 하위 비트 Toggle */
        fan ^= bitMask;

    printf("%10c전체 FAN의 상태가 전환되었습니다. (ON, OFF 상태 뒤바뀜)\n",' ');
}

void printBar() {
    int idx;                            /* 환풍구 인덱스를 위한 변수 */

    for ( idx = 0 ; idx < SIZEOFBAR ; idx++ )
        printf("-");
    printf("\n");
}

void printFanStatus() {                     /* FAN의 상태를 출력하는 함수 */
    int idx;                            /* FAN Index를 위한 변수 */
    printBar();
    printf("%25c현재 FAN 상태 화면\n",' ');
    printBar();
    printf(" ");

    for ( idx = SIZEOFFAN ; idx > 0 ; idx-- ) {     /* FAN 이름 출력 */
        if ( idx != SIZEOFFAN ) printf("   ");  /* FAN 사이의 공백 출력 */
        printf("%d번FAN",idx);
    }
    printf("\n ");

    bitMask = 1<<(SIZEOFFAN-1);

    for ( idx = SIZEOFFAN ; idx > 0 ; idx--, bitMask>>=1 ) {     /* FAN 개폐 상태 출력 */
        if ( idx != SIZEOFFAN ) printf("   ");  /* FAN 사이의 공백 출력 */
        printf("%6s",(fan&bitMask)?"ON":"OFF");
    }
    printf("\n");
    printBar();
}

int run() {
    int job;
    printf("[ 환풍구 관리 프로그램 ]\n");
    do {
        printFanStatus();
        printf("1. 환풍구 열기 / 2. 환풍구 닫기 / 3. 환풍구 전체 전환 / 4. 종료 : ");
        scanf("%d",&job);
        printf("\n");

        switch(job) {
            case 1: fanOpen();        /* 환풍구 열기 */
                    printf("\n\n");
                    break;
            case 2: fanClose();       /* 환풍구 닫기 */
                    printf("\n\n");
                    break;
            case 3: fanToggle();      /* 환풍구 전체 전환 */
                    printFanStatus();
                    break;
            case 4:
                    break; /* 종료 */

        }

    } while(job != 4 );

    return 0;
}

int main() {
    run(); /* 프로그램 실행 */
    return 0;
}
Back