CSED101. Programming & Problem solving Spring, 2014 Programming Assignment #2 (60 points) 김용현 (gkyh0805@postech.ac.kr) Due: 2014. 04. 15 23:59 Development Environment: Windows Visual Studio 2010 제출물 C code file (assn2.c) 프로그램의소스코드를이해하기쉽도록반드시주석을붙일것. 보고서파일 (.doc(x) or.hwp) 예 ) assn2.doc(x) 또는 assn2.hwp AssnReadMe.pdf 를참조하여작성할것. 소스코드와보고서파일을 LMS를이용하여제출한다. 주의사항 각문제에해당하는요구사항을반드시지킬것. 컴파일 & 실행이안되면무조건 0점처리된다. 하루 late시 20% 가감점되며, 3일이상지나면받지않는다. (0점처리 ) 부정행위에관한규정은 POSTECH 전자컴퓨터공학부학부위원회의 POSTECH 전자컴퓨터공학부부정행위정의 를따른다. (LMS의과목공지사항의제목 [document about cheating] 의첨부파일인 disciplinary.pdf를참조할것.) assn2.c로제출할것. 그외의다른이름으로제출하면감점또는 0점처리된다. 이번과제에서는추가기능구현에대한추가점수는없습니다. 1
Problem: 숫자게임 ( 목적 ) 이숙제를통하여조건문, 반복문, 사용자정의함수및라이브러리함수사용법을익힌다. ( 문제 ) 숫자게임프로그램은암산게임의일종으로제한시간동안제공되는사칙연산 ( 덧셈, 뺄셈, 곱셈, 나눗셈 ) 을풀고최고점수를달성하는게임이다. 아래의설명을바탕으로 숫자게임 을작성해보도록하자. 단, 매실행마다다른문제가생성되도록작성한다. 전역변수는사용할수없으며, 아직수업시간에다루지않은배열, 구조체를사용하지않고프로그램을작성한다. ( 설명 ) 문제를해결하기전, 문제와함께제공된 assn2_game.exe를실행하여게임을즐겨보도록 (?) 하자. 게임을실행하면, 빈칸으로처리된수식과빈칸에대한정답후보 2개가주어진다. 사용자는 [, ] 키를통해좌, 우측의정답을선택한다. 정답을선택한경우 Score가 1점추가되고틀릴경우남은시간이 2초줄어든다. 프로그램을실행하면아래의그림과같이 숫자게임 이실행된다. 2
수식을출력하기위해수식을생성하는방법은아래와같다. 먼저프로그램은내부적으로완전한수식을생성한다. 수식은아래와같이숫자 3개와연산자하나로구성된다. 단, 아래의숫자 3개는모두자연수라고가정한다. 생성된수식의예 ) 17-8 = 9 왼쪽피연산자 (Left Operand): 17 연산자 (Operator): - 오른쪽피연산자 (Right Operand): 8 연산결과 : 9 수식생성및문제와정답후보출력방법 1. 연산자선택프로그램에서사용되는연산자는사칙연산자 (+, -, *, /) 중하나가랜덤하게선택된다. 2. 완전한수식생성 ( 내부수식 ) 선택된연산자를이용하여내부수식을생성한다. 생성될숫자의범위 : 1 ~ (9 + Score) 사용자가문제를맞출때마다문제의난이도를높이기위해서랜덤하게선택될숫자의범위를 1씩증가하도록한다. 즉, Score는 0으로시작해서사용자가문제를맞출때마다 1점씩증가하고랜덤하게선택될숫자의범위도 1씩증가한다. - 덧셈, 곱셈왼쪽피연산자, 오른쪽피연산자의숫자를제시된범위안에서랜덤하게선택하여수식완성 - 뺄셈, 나눗셈오른쪽피연산자, 연산결과의숫자를제시된범위안에서랜덤하게선택하여수식완성위의생성된수식으로설명을하면, 오른쪽피연산자가 8, 연산결과가 9로선택되면, 왼쪽피연산자의값은 17의값이되도록수식을완성한다. 3. 숨겨질숫자의위치선택왼쪽피연산자, 오른쪽피연산자, 연산결과중에서숨겨질숫자의위치를랜덤하게선택하도록한다. 숨겨질숫자가사용자가맞춰야할정답에해당한다. 4. 사용자가선택할정답 1개의후보생성오답인숫자를랜덤하게생성한다. 생성될숫자의범위는위와동일하다. 선택된오답이정답과같은값이나오지않도록한다. 5. 정답을포함하여 2개의정답후보의출력순서를랜덤하게결정한다. 위의과정이끝나면, 아래와같이화면에빈칸있는수식과함께 2개의정답후보가출력이된다. 화면출력예 ) 17 - [ ] = 9 3 <=> 8 사용자는 [, ] 키를통해좌, 우측의정답을선택한다. 정답을선택한경우 Score가 1점추가되고, 오답을선택한경우남은시간이 2초줄어든다. 그리고, 다음문제가출력된다. 사용자의정답입력중, [, ] 키외의입력은없다고가정한다. 3
게임중남은시간의실시간출력 [Time : xx.xx ]: 밀리초까지출력되게작성하며키입력으로인해시간출력이멈추지않도록한다. 남은시간계산을위해아래의 Tips 에서설명하고있는 clock() 함수를이용하도록한다. 남은시간을실시간을출력하기위해형식문자열 \r 을출력문에사용하도록한다. \r 을출력할경우출력화면의커서가해당라인의맨앞으로이동하게된다. 이를이용해남은시간을실시간으로출력할수있다. 아래의사용예제를참고하시오. 사용예제 printf( Hello World ); printf( \rkorea ); 실행결과 : Korea World ( 주의사항 ) 시간출력을위해전체화면을지우는 system( cls ) 를사용하지말것. ( 이를사용하게되면전체화면이깜빡이게됨.) 게임종료제한시간이경과하면게임이끝난다. 이게임에서의제한시간은 30초라고가정한다. 게임이끝나면, 현재점수와 Best Score를비교해서현재점수가 Best Score 보다더크면 Congratulations!! You got the best score. 를메시지를출력한다. ( 그렇지않은경우메시지가출력되지않는다.) 그후에, One more game? [y/n] 메시지가출력되고사용자의입력을기다린다. 사용자가 y 를선택하면다시게임이시작되고 Best Score가갱신되며, n 을선택하면게임이종료된다. ( y, n 을제외한다른문자입력에대해서는고려하지않아도된다.) 아래는제한시간이경과해서게임이종료됐을때의출력화면에해당한다. 4
아래는위의화면에서사용자입력을 y 로받은경우에해당한다. Best Score가갱신되고다시게임이시작된다. 사용자정의함수반드시아래의함수를정의해서사용해야하며, 아래함수외의필요한함수는정의해서사용할수있다. getletftime: 남은시간을리턴하는함수 printequation: 수식을출력하는함수수식출력시아래의출력문을사용 ( 아래의출력문을복사해서사용하세요.) - 왼쪽피연산자빈칸출력 : printf("[ ] %3c %3d = %3d\n", ); - 오른쪽피연산자빈칸출력 : printf("%3d %3c [ ] = %3d\n", ); - 연산결과빈칸출력 : printf("%3d %3c %3d = [ ]\n", ); getoperatortochar: 수식을구성하는연산자는 +, *, -, / 순서대로 0, 1, 2, 3의정수 (int) 에대응하여저장및사용한다. 이때연산자번호를함수의입력으로전달받아그번호에대응되는문자 (char) 즉, +, *, -, / 중하나를리턴하는함수이다. 수식출력등에사용할수있다. 그외의출력문 ( 복사해서사용하세요.) printf("---------------------------\n"); 문제의출력형식은채점을위해위쪽의실행예시와최대한비슷하게작성해주세요. 5
Tips 남은시간계산 clock_t clock(void): 프로그램실행후경과된시간을리턴하는함수 - 이함수는시스템으로부터현재시간을 millisecond 단위로가져오며 1초는 1000 밀리세컨드가된다. 경과된시간은 clock() 함수를이용하여현재시간과이전시간의차로계산한다. - <time.h> 에포함되어있음 clock_t 형은 long 형으로 time.h 에정의되어있다. 화면지우기 int system(char*): 명령프롬프트 (cmd) 상에정의되어있는명령어 (dir, cls 등 ) 을실행하는함수 - <stdlib.h> 에포함되어있음 - 사용예제 #include <stdlib.h> int main() { printf( Hello World\n ); system( cls ); // 화면에 Hello World 출력후, 화면을지움 대기없이키보드입력 scanf를사용하여키보드입력을받게되면입력라인에서프로그램이멈추게된다. 본프로그램은게임의형식을취하고있기때문에실시간입력이가능해야한다. 아래의두함수를응용하여키보드입력을받을수있다. int _kbhit(void): 키입력을체크하는함수 - 키입력이있으면 0 이외의값을, 아니면 0을리턴한다. - <conio.h> 에포함되어있음 int _getch(void): 화면에출력없이키보드로부터하나의문자를입력받는함수 - 엔터를누르지않고도키보드입력을받을수있고, 누른키가화면에출력되지않기때문에게임을엔터키없이진행할수있다. - 누른키보드의값을리턴한다. - <conio.h> 에포함되어있음 6