-
2-2 음식메뉴 소개 프로그램Computer Science/Boostcourse CS50 2021. 12. 24. 02:23728x90
C언어를 이용한 두번째 프로그램으로 설명해 볼 프로그램은
요일을 입력했을 때 각 요일별로 어떤 음식이 나오는지 프로그램 사용자에게 알려주는 프로그램입니다.
이번 프로그램의 소스코드 길이는 짧으므로 두개의 문단으로 나누어 소개해보겠습니다.
#include <stdio.h> #include <string.h> #define SIZE 10 void food_list(char* day, int* replay); // 음식 리스트 int main() { int replay; char day[SIZE], check; printf("===============THIS WEEK FOOD MENU===============\n"); while(1) { printf("요일을 입력하세요: "); scanf("%s",day); food_list(day, &replay); // 음식 메뉴 보기 if(replay == 1) { // 요일을 잘못 입력한 경우 replay = 0; continue; } printf("\n계속 메뉴를 보시겠습니까? (Y/N)\n"); getchar(); // 개행문자에 대한 버퍼 비우기 scanf("%c",&check); if(check == 'y' || check == 'Y') { printf("================================================\n"); continue; } else if(check == 'n' || check == 'N') { printf("\n프로그램을 종료합니다.\n"); printf("=================================================\n"); break; } } return 0; }
우선 전처리 과정에 있는 헤더파일부터 말씀드리자면, stdio.h은 기본적으로 대부분 알고 있는 입출력 라이브러리이기에 앞으로 설명은 생략하도록 하겠습니다. string.h을 포함시킨 이유는 사용자가 입력한 단어와 요일이 일치하는지 확인하기 위해 strcmp 함수 사용이 필요하여 include 하였습니다.
main 함수에 선언할 char형 배열의 사이즈를 보기 좋게 표현하기 위해 SIZE라는 기호 상수를 정의하였고, food_list 함수는 사용자 입력과 요일 일치를 체크하고 음식 메뉴를 보여주는 기능으로 다음 문단에서 자세히 설명해보겠습니다.
main 함수에는 요일을 입력할 때 잘못 입력된 경우를 체크하기 위한 정수형 변수인 replay, 요일 입력을 위한
문자형 배열 변수 day, 반복문 내에서 메뉴를 이어서 볼 것인지 종료할 것인지 확인하기 위한 문자형 변수 check를 선언하였습니다.
while문에는 먼저 요일에 해당하는 메뉴를 보여주기 위해 문자열 형식으로 입력을 받고, food_list에 인자로 문자열과 replay 변수를 전달해 지역 변수를 다른 함수에서도 사용할 수 있게끔 food_list에서 포인터형으로 자료형을 지정해주었습니다.
이후 요일이 잘 입력되었다면 메뉴를 출력하고, 잘못 입력되었다면 예외 처리를 해주기 위해 food_list 함수에서 replay값을 1로 초기화해주고, main 함수로 돌아와서 replay 값이 1인지 물어본 후 1이라면 다시 0으로 정의해놓고 continue를 통해 다음 반복문으로 넘어가 다시 요일을 물어보게 됩니다.
if문을 넘어가게 되면 이제 메뉴를 계속 확인할 것인지 Y 또는 N(대소문자 구분 X)을 입력하게 유도한 후 Y를 입력하게되면 또 다음 반복문으로 돌아가 요일을 물어보고, N을 입력한다면 반복문을 탈출하고 프로그램이 종료되게 코드를 작성했습니다.
여기서 피드백을 해본다면 Y 또는 N을 입력하지 않았을 때에 예외처리도 해주었다면 더 나은 소스코드가 되지 않았을까 생각해봅니다..ㅎ
void food_list(char* day, int* replay) { if(strcmp(day, "월요일") == 0) { printf("%s: 청국장\n", day); } else if(strcmp(day, "화요일") == 0) { printf("%s: 비빔밥\n", day); } else if(strcmp(day, "수요일") == 0) { printf("%s: 된장찌개\n", day); } else if(strcmp(day, "목요일") == 0) { printf("%s: 칼국수\n", day); } else if(strcmp(day, "금요일") == 0) { printf("%s: 냉면\n", day); } else if(strcmp(day, "토요일") == 0) { printf("%s: 소불고기\n", day); } else if(strcmp(day, "일요일") == 0) { printf("%s: 오삼불고기\n", day); } else { *replay = 1; printf("\n다시 입력하셔야 합니다.\n"); } }
food_list 함수에서는 이름 그대로 음식들을 요일별로 나열한 것으로 main 함수에서의 사용자 입력에 따라 음식 메뉴를 소개하는 기능을 구현한 것입니다.
main 함수에서 입력받은 day라는 문자열 변수는 배열의 이름 day가 &day[0]과 같으니 주소를 저장해주는 포인터 변수로 인자를 전달받았고, replay는 main 함수의 while문 안에서 요일을 잘못 입력했는지 확인하기 위해 결국 다른 함수에서도 사용되는 것이므로 주소값을 받아야하기 때문에 이 또한 포인터 변수로 전달받도록 하였습니다.
이 함수에서 strcmp 문자열 비교 함수를 통해 입력한 문자열과 요일이 일치하여 해당 조건문이 맞으면 입력한 요일의 음식 메뉴가 나오게 조건과 출력문을 작성하였으며, 마지막 else문에서는 replay 포인터 변수가 가르키고 있는 값을 1로 초기화시켜줌으로써 main 함수에서는 반복문 처음으로 돌아가 요일을 다시 입력하게 되는 것입니다.
사실 if/else문으로 하는 것이 그닥 깔끔하지 않아보여 switch/case문으로 바꾸려고, case에 정수형 변수가 아닌 문자열을 넣는 방법은 없을까 구글링해보았는데, 해쉬 함수를 이용하면 가능하다는 것을 발견 했습니다.
그러나, 해쉬 함수를 사용했을 때에 코드가 더 길어지고 가독성도 떨어질거라는 생각이 들어 if/else 조건문으로 작성을 하였습니다.
실행 결과는 다음과 같습니다.
다음에는 아마 더 복잡한 프로그램을 만들게 되어 쓸 내용도 많아지겠지만,
그만큼 제가 배운 것을 더 많이 익힌다는 것이니 유익한 시간으로 남게될 것 같습니다. 감사합니다.
728x90'Computer Science > Boostcourse CS50' 카테고리의 다른 글
3-1 학점 계산 프로그램 (0) 2021.12.24 3. 배열 (0) 2021.12.24 2-1 재고량 관리 프로그램 (0) 2021.12.24 2. C언어 (0) 2021.12.24 1. 컴퓨팅 사고 (0) 2021.12.24