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