[1번 문제]
/*
응용 7.2.1은 문제 생성에 있어서 난수를 이용하므로 출현빈도가 가장 많은 숫자가 유일하지 않을 수 있습니다.
이 부분을 해결하도록 수정하시오
*/
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#define MATRIX_SIZE 5
#define MAX_NUMBER 5
#define TIME_LIMIT 5
void intro_game(void);
void game_control(void);
void print_number(int n, int cnt[]);
int find_num(int cnt[]);
void check_result(int user, int answer, int cnt[]);
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명출력 함수 intro_game
*/
void intro_game(void)
{
printf("정방행렬에 나타난 숫자 중에서\n");
printf("가장 많이 출현한 숫자를 찾아라!\n\n");
printf("제한시간은 5초입니다\n\n");
printf("아무키나 누르면 시작합니다\n");
getch();
}
/*
정방행렬 모양으로 난수를 출력하는 함수 print_number
*/
void print_number(int n, int cnt[])
{
int i, j, r_num;
int same; //숫자가 같은지 판별
do
{
same = 0; //초기화
for (i = 0; i < MAX_NUMBER; i++)
cnt[i] = 0; //초기화
system("cls");
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
r_num = rand() % MAX_NUMBER;
cnt[r_num] += 1;
printf("%d ", r_num);
}
printf("\n");
}
for (int i = 0; i < 5; i++)
for (int j = i + 1; j < 5; j++)
if (cnt[i] == cnt[j]) //숫자가 동일하면 while문을 반복하도록
same++;
} while (same);
//잘 작동하나 확인하는 코드
/*
printf("\n");
for (int i = 0; i < 5; i++)
printf("%d ", cnt[i]);
*/
}
/*
빈도수가 가장 많은 숫자를 계산하는 함수 find_num
*/
int find_num(int cnt[])
{
int i, check, max_num = 0;
for (i = 0; i < MAX_NUMBER; i++)
{
if (max_num <= cnt[i])
{
max_num = cnt[i];
check = i;
}
}
return check;
}
/*
게임 규칙을 출력하는 함수 check_result
*/
void check_result(int user, int answer, int cnt[])
{
if (user == answer)
printf("\n맞았습니다\n");
else
printf("\n틀렸습니다\n");
printf("번호:%d, 횟수:%d \n", answer, cnt[answer]);
}
/*
출현 빈도가 가장 많은 숫자를 찾는 게임의 제어 함수 game_control
*/
void game_control(void)
{
int cnt[MAX_NUMBER], answer, user;
clock_t start, end;
double pst;
system("cls");
print_number(MATRIX_SIZE, cnt);
answer = find_num(cnt);
printf("\n\n");
printf("출현횟수가 가장 많은 숫자 입력 >");
start = clock();
while (!kbhit())
{
end = clock();
pst = (double)(end - start) / CLK_TCK;
if (TIME_LIMIT < pst)
{
printf("\n제한시간을 넘었습니다. \n");
exit(0);
}
}
user = getch() - '0';
printf("%d", user);
check_result(user, answer, cnt);
}
[2번 문제]
/*
응용 7.2.1은 출현빈도가 많은 숫자를 찾는 것인데, 반대로 출현빈도가 제일 적은 숫자를 찾도록 프로그램을 수정하시오
*/
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#define MATRIX_SIZE 5
#define MAX_NUMBER 5
#define TIME_LIMIT 5
void intro_game(void);
void game_control(void);
void print_number(int n, int cnt[]);
int find_num(int cnt[]);
void check_result(int user, int answer, int cnt[]);
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명출력 함수 intro_game
*/
void intro_game(void)
{
printf("정방행렬에 나타난 숫자 중에서\n");
printf("가장 많이 출현한 숫자를 찾아라!\n\n");
printf("제한시간은 5초입니다\n\n");
printf("아무키나 누르면 시작합니다\n");
getch();
}
/*
정방행렬 모양으로 난수를 출력하는 함수 print_number
*/
void print_number(int n, int cnt[])
{
int i, j, r_num;
int same; //숫자가 같은지 판별
do
{
same = 0; //초기화
for (i = 0; i < MAX_NUMBER; i++)
cnt[i] = 0; //초기화
system("cls");
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
r_num = rand() % MAX_NUMBER;
cnt[r_num] += 1;
printf("%d ", r_num);
}
printf("\n");
}
for (i = 0; i < 5; i++)
for (j = i + 1; j < 5; j++)
if (cnt[i] == cnt[j]) //숫자가 동일하면 while문을 반복하도록
same++;
} while (same);
//잘 작동하나 확인하는 코드
/*
printf("\n");
for (int i = 0; i < 5; i++)
printf("%d ", cnt[i]);
*/
}
/*
빈도수가 가장 적은 숫자를 계산하는 함수 find_num
*/
int find_num(int cnt[])
{
int i, check, min_num = 4; //최소숫자이므로 4를 초기값으로
for (i = 0; i < MAX_NUMBER; i++)
{
if (min_num >= cnt[i])
{
min_num = cnt[i];
check = i;
}
}
return check;
}
/*
게임 규칙을 출력하는 함수 check_result
*/
void check_result(int user, int answer, int cnt[])
{
if (user == answer)
printf("\n맞았습니다\n");
else
printf("\n틀렸습니다\n");
printf("번호:%d, 횟수:%d \n", answer, cnt[answer]);
}
/*
출현 빈도가 가장 많은 숫자를 찾는 게임의 제어 함수 game_control
*/
void game_control(void)
{
int cnt[MAX_NUMBER], answer, user;
clock_t start, end;
double pst;
system("cls");
print_number(MATRIX_SIZE, cnt);
answer = find_num(cnt);
printf("\n\n");
printf("출현횟수가 가장 많은 숫자 입력 >");
start = clock();
while (!kbhit())
{
end = clock();
pst = (double)(end - start) / CLK_TCK;
if (TIME_LIMIT < pst)
{
printf("\n제한시간을 넘었습니다. \n");
exit(0);
}
}
user = getch() - '0';
printf("%d", user);
check_result(user, answer, cnt);
}
[3번 문제]
/*
응용 7.2.1에서 출현빈도가 가장 많은 숫자와 가장 적은 숫자를 동시에 찾는 문제로 수정하시오
*/
/*
응용 7.2.1은 문제 생성에 있어서 난수를 이용하므로 출현빈도가 가장 많은 숫자가 유일하지 않을 수 있습니다.
이 부분을 해결하도록 수정하시오
*/
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <stdlib.h>
#define MATRIX_SIZE 5
#define MAX_NUMBER 5
#define TIME_LIMIT 5
void intro_game(void);
void game_control(void);
void print_number(int n, int cnt[]);
int find_max(int cnt[]);
int find_min(int cnt[]);
void check_result(int user, int answer, int cnt[]);
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명출력 함수 intro_game
*/
void intro_game(void)
{
printf("정방행렬에 나타난 숫자 중에서\n");
printf("가장 많이 출현한 숫자를 찾아라!\n\n");
printf("제한시간은 5초입니다\n\n");
printf("아무키나 누르면 시작합니다\n");
getch();
}
/*
정방행렬 모양으로 난수를 출력하는 함수 print_number
*/
void print_number(int n, int cnt[])
{
int i, j, r_num;
int same; //숫자가 같은지 판별
do
{
same = 0; //초기화
for (i = 0; i < MAX_NUMBER; i++)
cnt[i] = 0; //초기화
system("cls");
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
r_num = rand() % MAX_NUMBER;
cnt[r_num] += 1;
printf("%d ", r_num);
}
printf("\n");
}
for (int i = 0; i < 5; i++)
for (int j = i + 1; j < 5; j++)
if (cnt[i] == cnt[j]) //숫자가 동일하면 while문을 반복하도록
same++;
} while (same);
//잘 작동하나 확인하는 코드
/*
printf("\n");
for (int i = 0; i < 5; i++)
printf("%d ", cnt[i]);
*/
}
/*
빈도수가 가장 많은 숫자를 계산하는 함수 find_max
*/
int find_max(int cnt[])
{
int i, check, max_num = 0;
for (i = 0; i < MAX_NUMBER; i++)
{
if (max_num <= cnt[i])
{
max_num = cnt[i];
check = i;
}
}
return check;
}
/*
빈도수가 가장 적은 숫자를 계산하는 함수 find_min
*/
int find_min(int cnt[])
{
int i, check, min_num = 4;
for (i = 0; i < MAX_NUMBER; i++)
{
if (min_num >= cnt[i])
{
min_num = cnt[i];
check = i;
}
}
return check;
}
/*
게임 규칙을 출력하는 함수 check_result
*/
void check_result(int user, int answer, int cnt[])
{
if (user == answer)
printf("\n맞았습니다\n");
else
printf("\n틀렸습니다\n");
printf("번호:%d, 횟수:%d \n", answer, cnt[answer]);
}
/*
출현 빈도가 가장 많은 숫자를 찾는 게임의 제어 함수 game_control
*/
void game_control(void)
{
int cnt[MAX_NUMBER], answer1, answer2, user;
clock_t start, end;
double pst;
system("cls");
print_number(MATRIX_SIZE, cnt);
answer1 = find_max(cnt);
answer2 = find_min(cnt);
printf("\n\n");
printf("출현횟수가 가장 많은 숫자 입력 >");
start = clock();
while (!kbhit())
{
end = clock();
pst = (double)(end - start) / CLK_TCK;
if (TIME_LIMIT < pst)
{
printf("\n제한시간을 넘었습니다. \n");
exit(0);
}
}
user = getch() - '0';
printf("%d", user);
check_result(user, answer1, cnt);
printf("\n\n");
printf("출현횟수가 가장 적은 숫자 입력 >");
start = clock();
while (!kbhit())
{
end = clock();
pst = (double)(end - start) / CLK_TCK;
if (TIME_LIMIT < pst)
{
printf("\n제한시간을 넘었습니다. \n");
exit(0);
}
}
user = getch() - '0';
printf("%d", user);
check_result(user, answer2, cnt);
}
[4번 문제]
/*
응용 7.2.1을 이용하여 0~9 사이의 임의의 숫자 또는 A~Z까지의 임의의 문자에 대해
출현빈도가 많은 것을 찾도록 프로그램을 수정하시오.
또는 문자와 숫자가 섞여 나타나도록 수정하시오.
*/
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <Windows.h>
#include <stdlib.h>
#define MATRIX_SIZE 10
#define TIME_LIMIT 20
void intro_game(void);
void game_control(void);
void print_number(int n, int cnt[]);
int find_num(int cnt[]);
void check_result(int user, int answer, int cnt[]);
int main(void)
{
srand((unsigned)time(NULL));
intro_game();
game_control();
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명출력 함수 intro_game
*/
void intro_game(void)
{
printf("정방행렬에 나타난 숫자 중에서\n");
printf("가장 많이 출현한 숫자 또는 알파벳을 찾아라!\n\n");
printf("제한시간은 20초입니다\n\n");
printf("아무키나 누르면 시작합니다\n");
getch();
}
/*
정방행렬 모양으로 난수를 출력하는 함수 print_number
*/
void print_number(int n, int cnt[])
{
int i, j, r_num, random;
int same; //숫자가 같은지 판별
do
{
same = 0; //초기화
for (i = 0; i < 36; i++)
cnt[i] = 0; //초기화
system("cls");
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
random = rand() % 3; //알파벳이 더 많으므로 기회를 더 준다
if (random == 0) //숫자
{
r_num = rand() % 10;
cnt[r_num]++;
printf("%d ", r_num);
}
else
{
r_num = rand() % 26 + 65; //A~Z
cnt[r_num-55]++; //cnt[10]부터 cnt[35]까지 A~Z
printf("%c ", r_num);
}
}
printf("\n");
}
for (int i = 0; i < 36; i++)
if (cnt[i] == cnt[find_num(cnt)] && i != find_num(cnt))
same++; //최대 숫자와 같다면
} while (same);
//잘 작동하나 확인하는 코드
/*
printf("\n");
for (i = 0; i < 36; i++)
{
printf("%d ", cnt[i]);
if (i == 9)
printf("\n");
}
*/
}
/*
빈도수가 가장 많은 숫자를 계산하는 함수 find_num
*/
int find_num(int cnt[])
{
int i, check, max_num = 0;
for (i = 0; i < 36; i++)
{
if (max_num <= cnt[i])
{
max_num = cnt[i];
check = i;
}
}
return check;
}
/*
게임 규칙을 출력하는 함수 check_result
*/
void check_result(int user, int answer, int cnt[])
{
if (user == answer)
printf("\n맞았습니다\n");
else
printf("\n틀렸습니다\n");
if (answer <= 9)
printf("번호:%d, 횟수:%d \n", answer, cnt[answer]);
else
printf("알파벳:%c, 횟수:%d \n", answer+55, cnt[answer]);
}
/*
출현 빈도가 가장 많은 숫자 또는 문자를 찾는 게임의 제어 함수 game_control
*/
void game_control(void)
{
int cnt[36], answer, user; //36인 이유, 0~9+A~Z
clock_t start, end;
double pst;
system("cls");
print_number(MATRIX_SIZE, cnt);
answer = find_num(cnt);
printf("\n\n");
printf("출현횟수가 가장 많은 기호 입력 >");
start = clock();
while (!kbhit())
{
end = clock();
pst = (double)(end - start) / CLK_TCK;
if (TIME_LIMIT < pst)
{
printf("\n제한시간을 넘었습니다. \n");
exit(0);
}
}
if (answer <= 9)
{
user = getch() - '0';
printf("%d", user);
check_result(user, answer, cnt);
}
else
{
user = getch() - '0';
printf("%c", user+16);
check_result(user-39, answer, cnt);
}
}
[5번 문제]
/*
응용 7.2.1에 대해 게임의 난이도를 사용자가 결정할 수 있도록 수정하시오.
게임의 난이도는 제한시간, 출력할 숫자나 문자의 개수 등을 조절합니다
*/
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <Windows.h>
#include <stdlib.h>
enum {EASY=1, INTERMEDIATE, HARD};
void intro_game(void);
void game_control(int matrix_size, int time);
void print_number(int n, int cnt[]);
int find_num(int cnt[]);
void check_result(int user, int answer, int cnt[]);
int main(void)
{
int difficulty, size, time_limit;
srand((unsigned)time(NULL));
intro_game();
printf("난이도를 설정하세요-> 1. 쉬움, 2. 보통, 3. 어려움 ");
scanf("%d", &difficulty);
switch (difficulty)
{
case EASY:
size = 3;
time_limit = 9;
game_control(size, time_limit);
break;
case INTERMEDIATE:
size = 5;
time_limit = 7;
game_control(size, time_limit);
break;
case HARD:
size = 7;
time_limit = 5;
game_control(size, time_limit);
break;
default:
printf("다시 입력하세요\n");
return 1;
}
return 0;
}
/*
게임 규칙 또는 진행에 대한 설명출력 함수 intro_game
*/
void intro_game(void)
{
printf("정방행렬에 나타난 숫자 중에서\n");
printf("가장 많이 출현한 숫자 또는 알파벳을 찾아라!\n\n");
printf("난이도 설명\n");
printf("쉬움: 3X3 정방행렬에서 9초 안에 제일 많이 나오는 기호를 찾는다\n");
printf("보통: 5X5 정방행렬에서 7초 안에 제일 많이 나오는 기호를 찾는다\n");
printf("어려움: 7X7 정방행렬에서 5초 안에 제일 많이 나오는 기호를 찾는다\n");
printf("숙지하셨다면 키보드를 누르세요\n");
getch();
}
/*
정방행렬 모양으로 난수를 출력하는 함수 print_number
*/
void print_number(int n, int cnt[])
{
int i, j, r_num, random;
int same; //숫자가 같은지 판별
do
{
same = 0; //초기화
for (i = 0; i < 36; i++)
cnt[i] = 0; //초기화
system("cls");
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
random = rand() % 3; //알파벳이 더 많으므로 기회를 더 준다
if (random == 0) //숫자
{
r_num = rand() % 10;
cnt[r_num]++;
printf("%d ", r_num);
}
else
{
r_num = rand() % 26 + 65; //A~Z
cnt[r_num - 55]++; //cnt[10]부터 cnt[35]까지 A~Z
printf("%c ", r_num);
}
}
printf("\n");
}
for (int i = 0; i < 36; i++)
if (cnt[i] == cnt[find_num(cnt)] && i != find_num(cnt))
same++; //최대 숫자와 같다면
} while (same);
//잘 작동하나 확인하는 코드
/*
printf("\n");
for (i = 0; i < 36; i++)
{
printf("%d ", cnt[i]);
if (i == 9)
printf("\n");
}
*/
}
/*
빈도수가 가장 많은 숫자를 계산하는 함수 find_num
*/
int find_num(int cnt[])
{
int i, check, max_num = 0;
for (i = 0; i < 36; i++)
{
if (max_num <= cnt[i])
{
max_num = cnt[i];
check = i;
}
}
return check;
}
/*
게임 규칙을 출력하는 함수 check_result
*/
void check_result(int user, int answer, int cnt[])
{
if (user == answer)
printf("\n맞았습니다\n");
else
printf("\n틀렸습니다\n");
if (answer <= 9)
printf("번호:%d, 횟수:%d \n", answer, cnt[answer]);
else
printf("알파벳:%c, 횟수:%d \n", answer + 55, cnt[answer]);
}
/*
출현 빈도가 가장 많은 숫자 또는 문자를 찾는 게임의 제어 함수 game_control
*/
void game_control(int matrix_size, int time)
{
int cnt[36], answer, user; //36인 이유, 0~9+A~Z
clock_t start, end;
double pst;
system("cls");
print_number(matrix_size, cnt);
answer = find_num(cnt);
printf("\n\n");
printf("출현횟수가 가장 많은 기호 입력 >");
start = clock();
while (!kbhit())
{
end = clock();
pst = (double)(end - start) / CLK_TCK;
if (time < pst)
{
printf("\n제한시간을 넘었습니다. \n");
exit(0);
}
}
if (answer <= 9)
{
user = getch() - '0';
printf("%d", user);
check_result(user, answer, cnt);
}
else
{
user = getch() - '0';
printf("%c", user + 16);
check_result(user - 39, answer, cnt);
}
}
[쉬움]
[보통]
[어려움]
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 명품 C언어 프로젝트 안기수 저
*7.1장에서는 제시한 문제가 없었습니다
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 8.1장 예제 (0) | 2017.08.29 |
---|---|
명품 C언어 프로젝트 7.2.2장 개선과 확장 (0) | 2017.08.28 |
명품 C언어 프로젝트 6.3장 연습문제 (0) | 2017.08.26 |
명품 C언어 프로젝트 6.2장 연습문제 (0) | 2017.08.22 |
명품 C언어 프로젝트 6.1장 연습문제 (0) | 2017.08.21 |