Chapter20. 도전! 프로그래밍3
문제1.
길이가 4x4인 int형 2차원 배열을 선언하고, 모든 요소를 아래와 같이 초기화하자. 그리고 배열의 요소들을 오른쪽 방향으로 90도씩 이동시켜서 그 결과를 출력하는 프로그램을 작성해 보자. 참고로 배열이 변경되는 형태는 다음과 같다.
1 2 3 4
#define _CRT_SECURE_NO_WARNINGS
#include
void RotateArr(int (*arrptr) [4])
{
int i, j;
int temp[4][4];
for (i = 3; i >= 0; i--)
for (j = 0; j < 4; j++)
temp[j][3-i] = arrptr[i][j];
for (i = 0; i < 4; i++)
for (j = 0; j < 4; j++)
arrptr[i][j] = temp[i][j];
}
void Output(int(*arrptr1)[4])
{
int i, j;
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
printf("%3d ", arrptr1[i][j]);
printf("\n");
}
printf("--------------------------------------\n");
}
int main(void)
{
int arr[4][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12}, {13,14,15,16} };
printf("현재상태 \n");
Output(arr);
for (int i = 1; i < 5; i++)
{
printf("%d회전 \n", i);
RotateArr(arr);
Output(arr);
}
return 0;
}
도전2
달팽이 배열을 만들어서 이를 출력하는 프로그램을 작성하고자 한다. 여기서 말하는 달팽이 배열은 다음과 같다.
위의 그림은 4x4의 달팽이 배열이다. 입력한 숫자 n을 압력받고 n x n의 길이에 해당하는 달팽이 배열을 출력해주는 프로그램을 작성해 보자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void Dal(int a)
{
int i = 0, j = -1, k = a, l, turn = 1, num = 1;
int arr[100][100];
while (1)
{
for (l = 0; l < k; l++);
{
j += turn;
arr[i][j] = num++;
}
k--;
for (l = 0; l < k; l++)
{
i += turn;
arr[i][j] = num++;
}
turn *= -1;
if (k == 0)
break;
}
for (i = 0; i < a; i++)
{
for (j = 0; j < a; j++)
printf("%6d", arr[i][j]);
printf("\n");
}
}
int main(void)
{
int i, j, n, num = 1;
int arr[100][100];
printf("숫자를 입력하시오 : ");
scanf("%d", &n);
Dal(n); // 달팽이함수 호출
}
도전3
난수란 임의의, 정해지지 않은, 무엇이 될지 모르는 수를 의미한다. ANSI 표준에는 난수를 생성할 때 호출할 수 있는 함수를 제공하고 있다. rand함수를 사용하여 0이상 99이하의 난수를 총 5개 생성하는 프로그램을 작성해보자
(RAND_MAX는 난수의 최댓값을 의미한다. 즉, rand 함수는 0이상 RAND+MAX 이하의 값을 반환한다.)
#include <stdlib.h>
int rand(void); // 의사 난수(pseudo=random number)를 반환
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int i = 0 , j;
printf("난수의 범위: 0부터 %d까지 \n", RAND_MAX);
while (1)
{
j = rand();
if (0 <= j && 99 >= j)
{
printf("난수 출력: %d \n", j);
i++;
}
if (i >= 5)
break;
}
return 0;
}
int main(void)
{
int i = 0, j;
printf("난수의 범위: 0부터 %d까지 \n", RAND_MAX);
for (i = 0; i < 5; i++)
printf("난수 출력: %d \n", rand()%100);
return 0;
}
도전4
도전3은 출력되는 난수가 규칙적이다. 규칙적인 난수는 예측이 가능하기 때문에 진짜 난수라 할 수 없다.
그래서 rand 함수가 반환하는 난수를 가리켜 '의사 난수(pseudo-random number)'라 한다. 의사 난수는 가짜 난수를 의미한다. 그래서 ANSI 표준에서는 이러한 문제를 어느 정도 해결할 수 있도록 srand라는 함수를 정의하였다.
#include <stdlib.h>
void srand(unsigned int seed); // 발생할 난수의 씨드 값 지정
위의 함수는 하나의 값을 전달받는다. 그리고 그 전달된 값은 난수를 생성하는데 필요한 씨앗으로 사용된다. 그래서 이 값을 가리켜 씨드(seed) 값이라 한다. 씨드 값이 무엇이냐에 따라서 rand 함수가 반환하는 난수의 형태가 달라진다.
time 함수와 srand, rand 함수를 이용해 주사의 결과를 출력하는 프로그램을 만들어보자.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i = 1, j;
srand((int)time(NULL));
while (i < 3)
{
j = rand();
if (j <= 6 && != 0)
{
printf("주사위 %d의 결과 %d \n", i, j);
i++;
}
}
}
도전5
가위 바위 보 게임을 만들어 보자. 사용지로부터 가위 바위 보 중에서 하나를 입력 받는다. 그리고 컴퓨터는 난수 생성을 통해서 가위 바위 보 중에서 하나를 선택하게 한다. 이 둘을 비교해서 승자와 패자를 가려주는 프로그램을 작성해 보자. 단 프로그램의 진행은 사용자가 질 때까지 계속되어야 하고, 마지막에 가서는 게임의 결과(예: 4승 3무) 까지 출력해 주도록 하자
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
int i, n, draw = 0, win = 0;
printf("가위 바위 보 게임 \n ------------------------------------ \n");
while(1)
{
printf("바위는 1, 가위는 2, 보는 3: ");
scanf("%d", &n);
srand((int)time(NULL));
i = rand() % 3 +1;
if (n == 1)
{
if (i == 1)
{
printf("당신은 바위 선택, 컴퓨터는 바위 선택, 비겼습니다! \n");
draw++;
}
else if (i == 2)
{
printf("당신은 바위 선택, 컴퓨터는 가위 선택, 이겼습니다! \n");
win++;
}
else if (i == 3)
{
printf("당신은 바위 선택, 컴퓨터는 보 선택, 당신이 졌습니다! \n\n");
break;
}
}
else if (n == 2)
{
if (i == 1)
{
printf("당신은 가위 선택, 컴퓨터는 바위 선택, 당신이 졌습니다! \n\n");
break;
}
else if (i == 2)
{
printf("당신은 가위 선택, 컴퓨터는 가위 선택, 이겼습니다! \n");
draw++;
}
else if (i == 3)
{
printf("당신은 가위 선택, 컴퓨터는 보 선택, 이겼습니다! \n");
win++;
}
}
else if (n == 3)
{
if (i == 1)
{
printf("당신은 보 선택, 컴퓨터는 바위 선택, 이겼습니다! \n");
win++;
}
else if (i == 2)
{
printf("당신은 보 선택, 컴퓨터는 가위 선택, 당신이 졌습니다! \n");
break;
}
else if (i == 3)
{
printf("당신은 보 선택, 컴퓨터는 보 선택, 비겼습니다!\n");
draw++;
}
}
}
printf("게임의 결과: %d승, %d무", win, draw);
}
if문 사용
-----------------------------------------------------------------------------------------------------------------
switch문 사용
void Vsf(int i, int j, int* w1, int* m1, int* vs1)
{
switch (i)
{
case 1:
if (j == 1)
{
printf("당신은 바위 선택, 컴퓨터는 바위 선택, 비겼습니다! \n");
*m1 += 1;
}
else if (j == 2)
{
printf("당신은 바위 선택, 컴퓨터는 가위 선택, 이겼습니다! \n");
*w1 += 1;
}
else
{
printf("당신은 바위 선택, 컴퓨터는 보 선택, 졌습니다! \n");
*vs1 += 1;
}
break;
case 2:
if (j == 1)
{
printf("당신은 가위 선택, 컴퓨터는 바위 선택, 졌습니다! \n");
*vs1 += 1;
}
else if (j == 2)
{
printf("당신은 가위 선택, 컴퓨터는 가위 선택, 비겼습니다! \n");
*m1+= 1;
}
else
{
printf("당신은 가위 선택, 컴퓨터는 보 선택, 이겼습니다! \n");
*w1 += 1;
}
break;
default:
if (j == 1)
{
printf("당신은 보 선택, 컴퓨터는 바위 선택, 이겼습니다! \n");
*w1 += 1;
}
else if (j == 2)
{
printf("당신은 보 선택, 컴퓨터는 가위 선택, 졌습니다! \n");
*vs1 += 1;
}
else
{
printf("당신은 보 선택, 컴퓨터는 보 선택, 비겼습니다! \n");
*m1 += 1;
}
break;
}
}
int main(void)
{
int w = 0, m = 0, vs = 0;
int n, n1;
srand((int)time(NULL));
do
{
n1 = rand() % 3 + 1;
printf("바위는 1, 가위는 2, 보는 3 : ");
scanf("%d", &n);
Vsf(n, n1, &w, &m, &vs);
} while (vs == 0);
printf("게임의 결과 : %d승, %d무", w, m);
return 0;
}
도전6
친구와 둘이서 숫자 맞추기 게임을 해 본적이 있을 것이다. 니것을 컴퓨터와 할 수 있도록 프로그램을 작성해보자. 게임의 방식은 다음과 같다.
컴퓨턴터는 0에서 9사이의 숫자 중에서 서로 다른 세 개의 숫자를 고르고, 사용자는 이것을 맞춰야 한다. 중요한 것은 숫자의 순서까지 정확히 맞춰야 한다는 것이다. 단 사용자가 예상한 숫자를 입력할 때마다 컴퓨터는 입력된 숫자와 컴퓨터 자신이 생각한 숫자가 얼마나 비슷한지를 알려줘야 한다.
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
int main(void)
{
int com[3];
int user[3];
int strike = 0, ball = 0, count = 1;
srand((int)time(NULL));
printf("Start Game! \n");
for (int i = 0; i < 3; i++)
com[i] = rand() % 10;
do
{
printf("3개의 숫자 선택: ");
scanf("%d %d %d", user, user + 1, &user[2]);
for (int j = 0; j < 3; j++)
{
for (int k = 0; k < 3; k++)
{
if (j == k && user[j] == com[k])
strike++;
else if (j != k && user[j] == com[k])
ball++;
}
}
printf("%d번째 도전 결과: %dstrike, %dball!! \n", count, strike, ball);
count++;
if (strike < 3)
strike = ball = 0;
} while (strike < 3);
printf("Game Over!");
}