도전1
4 x 4 int형 2차원 배열을 선언하고, 모든 요소를 아래 그림의 왼쪽에 있는 형태와 동일하게 초기화하자. 그리고 배열의 요소들을 오른쪽 방향으로 90도씩 이동시켜서 출력하는 프로그램을 작성해보자. 배열이 변경되는 형태는 다음과 같다.
도전2
달팽이 형태의 배열을 만들어 주는 프로그램을 작성해 보자. 다음 그림은 달팽이 형태의 배열이 무엇을 의미하는지 보여주고 있다.
위 그림에서는 4 x 4의 달팽이 배열과 5 x 5의 달팽이 배열을 보여주고 있다. 사용자로부터 하나의 숫자 n을 입력받아서 n x n의 달팽이 배열을 출력해 주는 프로그램을 작성해 보자.
도전3
프로그램을 구현하다 보면 난수(Random Number)를 발생시켜야 하는 경우가 종종 있다. 여기서 말하는 난수란 임의의, 정해지지 않은, 무엇이 될지 모르는 수를 의미하는 것으로서 무작위로 값을 생성해야 함을 의미한다.
ANSI 표준에서는 이렇게 난수를 생성할 때 사용할 수 있는 함수 rand를 제공하고 있다.
1 2 3 4 | #include <stdlib.h> // 의사 난수(presudo-random number)를 반환 int rand(void); | cs |
다음 예에서는 rand 함수의 사용 방법과 난수의 범위를 보여준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <stdio.h> #include <stdlib.h> int main(void) { int i; // stdlib.h에 선언되어 있는 상수 RAND_MAX를 출력. 이 값이 생성될 수 있는 난수의 최대값에 해당한다. printf("난수의 범위 : 0부터 %d까지 \n", RAND_MAX); for(i=0; i<5; i++) printf("난수 출력 : %d \n", rand()); return 0; } | cs |
이제 문제를 제시하겠다. 위 예에서는 0이상 RAND_MAX 이하의 난수를 총 5개 생성한다. 이 예제를 적절히 변경해서 0 이상 99 이하의 난수를 총 5개 생성하는 프로그램을 작성해 보자(힌트: % 연산자를 적절히 활용하면 된다.)
도전4
위 문제에서 제시한 예제를 여러 번 돌려보면 '난수가 규칙적으로 발생한다'는 특징을 발견할 수 있다.
EX) 처음 실행했을 때 생성된 난수가 21, 1, 43, 2라면 다시 실행해 봐도 동일하게 생성된다는 것이다.
이는 진짜로 난수가 생성되는 것이 아니기 때문에 문제다. 그래서 rand 함수를 가리켜 의사 난수(pseudo-random number)를 생성하는 함수라고 하는 것이다. 즉, 의사 난수는 가짜 난수를 의미한다.
srand 함수를 사용하면 이 문제를 해결할 수 있다.
1 2 3 4 5 | #include <stdlib.h> // 함수 srand는 seed값(인자)을 전달 받는다. // 난수 생성을 위해 씨앗을 심는 용도로 사용되는 함수이다. void srand(unsigned int seed); | cs |
다음 예제는 씨드 값을 입력받아서 srand 함수를 호출하는 예제이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int seed, i; // 현재 시간을 이용해서 씨드 설정 /* 헤더파일 time.h에 선언되어 있는 time 함수를 호출하면서 NULL을 인자로 전달하고 있다. 이렇게 되면 1970년 1월 1일을 기준으로 현재의 시간을 초 단위로 계산해서 반환해 준다. */ srand((int)time(NULL)); for(i=0; i<5; i++) printf("정수 출력 : %d \n", rand()); return 0; } | cs |
이제 문제를 제시하겠다. 두 개의 주사위를 던졌을 때 그 결과를 나타내 주는 프로그램을 작성해 보자. 단 매번 실행할 때마다. 다른 결과가 나와야 한다.
EX) 주사위 결과: 2, 3
도전5
가위 바위 보 게임을 만들어 보자. 사용자로부터 가위 바위 보 중에서 하나를 입력받는다. 그리고 컴퓨터는 난수 생성을 통해서 가위 바위 보 중에서 하나를 선택하게 한다. 이 둘을 비교해서 승자와 패자를 가려주는 프로그램을 작성해 보자. 단 프로그램의 진행은 사용자가 질 때까지 계속되어야 하고, 마지막에 가서는 게임의 결과(a승 b무)까지 출력해 주도록 하자.
EX)
바위는 1, 가위는 2, 보는 3: 2
당신은 가위 선택, 컴퓨터는 가위 선택, 비겼습니다.
바위는 1, 가위는 2, 보는 3: 1
당신은 바위 선택, 컴퓨터는 바위 선택, 비겼습니다.
바위는 1, 가위는 2, 보는 3: 3
당신은 보 선택, 컴퓨터는 가위 선택, 당신이 졌습니다.
게임의 결과: 0승, 3무
도전6
친구와 둘이서 숫자 맞추기 게임을 해 본적이 있을 것이다(보통은 야구 게임이라고 불리고 있다).
이것을 컴퓨터와 할 수 있도록 프로그램을 작성해 보자. 게임의 방식은 다음과 같다.
컴퓨터는 0에서 9사이의 숫자중에서 서로 다른 세 개의 숫자를 고르고, 사용자는 이것을 맞추는 게임이다. 중요한 것은 숫자의 순서까지 정확히 맞춰야 한다는 것이다. 단, 사용자가 예상한 숫자를 입력할 때마다 컴퓨터는 입력된 숫자와 컴퓨터 자신이 생각한 숫자가 얼마나 비슷한지를 알려준다.
예를 들어서 컴퓨터가 고른 숫자가 "1 4 9" 이고, 사용자가 입력한 숫자가 "4 0 9" 라고 하면 두 개의 숫자 4와 9가 일치한다. 9는 숫자와 위치까지 일치하지만(1 strike), 4는 숫자만 일치한다(1ball), 이런 경우 컴퓨터는 다음과 같은 메시지를 출력해 준다. "1strike, 1ball", 만약에 사용자가 "1 4 9"를 입력하였다면 "3strike, 0ball"이 되어서 프로그램은 종료하게 된다. 이때 몇 번 만에 3strike를 얻어냈는지에 대해서도 출력해 주기로 하자(진행하면서 "몇 번째 도전입니다."라는 메
시지를 출력해 줘도 좋다).
EX)
Start Game!
3개의 숫자 선택: 1 2 8
1번째 도전 결과: 1strike, 1ball!!
3개의 숫자 선택: 3 0 8
2번째 도전 결과: 2strike, 1ball!!
3개의 숫자 선택: 2 0 8
3번째 도전 결과: 3strike, 0ball!!
Game End!
|
'Books > 열혈강의 C 프로그래밍' 카테고리의 다른 글
[열혈C] 08. Part4 Chapter21 문자와 문자열 처리 함수2 (0) | 2018.05.04 |
---|---|
[열혈C] 07. Part4 Chapter21 문자와 문자열 처리 함수 (0) | 2018.04.27 |
[열혈C] 05. Part3 Chapter19 함수 포인터와 void 포인터 (0) | 2018.04.26 |
[열혈C] 04. Part3 Chapter18 다차원 배열과 포인터의 관계 (0) | 2018.04.25 |
[열혈C] 03. Part3 Chapter16-17 내용 정리 (다차원 배열 / 포인터의 포인터) (0) | 2018.04.24 |