C/명품 C언어 프로젝트(안기수 저)

명품 C언어 프로젝트 7.2.1장 개선과 확장

꾸준함. 2017. 8. 27. 16:19

[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장에서는 제시한 문제가 없었습니다

반응형