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

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

꾸준함. 2017. 8. 28. 18:07

[1번 문제]

/*

응용 7.2.2에서는 컴퓨터나 사용자가 1~10 사이의 중복되지 않는 숫자를 생성하거나 입력하도록 되어 있는데,

이를 변형하여 상대방이 사용한 숫자는 사용할 수 없도록 제어하여 최초로 50이 넘으면 게임의 승자가 되도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

void intro_game(void);

void game_control(void);

int computer_number(int i, int com_array[]);

int user_number(int i, int user_array[]);

void number_display(int i, int com_array[], int user_array[], int sum);

void conclusion(int win);

void gotoxy(int x, int y);

void press_any_key(void);

 

int visit[10] = { 0, };

 

int main(void)

{

        srand((unsigned)time(NULL));

        intro_game();

        game_control();

        return 0;

}

 

/*

게임 규칙 또는 진행에 대한 설명 출력 함수

*/

void intro_game(void)

{

        system("cls");

        printf("50을 넘어라 게임\n\n");

        printf("컴퓨터와 사용자가 번갈아가며\n");

        printf("숫자를 입력하되 1~10 사이의 \n");

        printf("중복되지 않는 숫자를 입력하여 \n\n");

        printf("최초로 50을 넘기면 승자가 됩니다. \n\n");

        printf("컴퓨터가 먼저 시작합니다. \n");

        printf("아무키나 누르면 시작합니다.");

        getch();

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

컴퓨터가 제시하는 난수를 생성하는 함수

*/

int computer_number(int i, int com_array[])

{

        int again = 0, random;

        while (!again)

        {

               random = rand() % 10 + 1;

               if (visit[random-1])

                       again = 0;

               else

               {

                       again = 1;

                       visit[random-1] = 1;

               }

        }

        com_array[i] = random;

        return com_array[i];

}

 

/*

사용자가 제시하는 숫자의 입력과 처리 함수

*/

int user_number(int i, int user_array[])

{

        int number, again = 0;

        while (!again)

        {

               gotoxy(1, 7);

               printf("사용자 숫자 입력후 Enter>");

               scanf("%d", &number);

               if (visit[number-1])

               {

                       again = 0;

                       gotoxy(1, 7);

                       printf("                                                 "); //글자를 지운다

               }

               else

               {

                       again = 1;

                       visit[number-1] = 1;

               }

        }

        user_array[i] = number;

        return user_array[i];

}

 

/*

컴퓨터와 사용자가 제시한 숫자를 화면에 출력하는 함수

*/

void number_display(int i, int com_array[], int user_array[], int sum)

{

        int j;

        gotoxy(1, 2);

        printf("컴퓨터 숫자: ");

        for (j = 0; j <= i; j++)

               printf("%2d ", com_array[j]);

        gotoxy(1, 3);

        printf("사용자 숫자: ");

        for (j = 0; j <= i; j++)

               if (user_array[j] == 0)

                       continue;

               else

                       printf("%2d ", user_array[j]);

        gotoxy(1, 5);

        printf("현재 합계: %3d\n", sum);

}

 

/*

게임의 결과(승패)를 출력하는 함수

*/

void conclusion(int check)

{

        if (check == 1)

               printf("컴퓨터가 이겼습니다. \n");

        else

               printf("사용자가 이겼습니다. \n");

}

 

/*

프로그램의 진행을 멈추게 하는 함수

*/

void press_any_key(void)

{

        gotoxy(1, 10);

        printf("아무키나 누르시오..");

        getch();

}

 

/*

100을 넘어라 게임을 제어하는 함수

*/

void game_control(void)

{

        int max = 50;

        int com_array[10] = { 0 }, user_array[10] = { 0 }, number;

        int i, sum = 0, win;

        for (i = 0; i < 10; i++)

        {

               system("cls");

               number = computer_number(i, com_array);

               sum += number;

               number_display(i, com_array, user_array, sum);

               if (max < sum)

               {

                       win = 1;

                       break;

               }

               number = user_number(i, user_array);

               sum += number;

               number_display(i, com_array, user_array, sum);

               if (max < sum)

               {

                       win = 2;

                       break;

               }

               press_any_key();

        }

        conclusion(win);

}

 


[2번 문제]

/*

응용 7.2.2에서 홀수와 짝수를 번갈아가며 입력하도록 합니다.

먼저 입력한 숫자가 짝수라면 다음에는 홀수만을 입력하도록 수정하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

void intro_game(void);

void game_control(void);

int computer_number(int i, int com_array[]);

int user_number(int i, int user_array[]);

void number_display(int i, int com_array[], int user_array[], int sum);

void conclusion(int win);

void gotoxy(int x, int y);

void press_any_key(void);

 

int main(void)

{

        srand((unsigned)time(NULL));

        intro_game();

        game_control();

        return 0;

}

 

/*

게임 규칙 또는 진행에 대한 설명 출력 함수

*/

void intro_game(void)

{

        system("cls");

        printf("100을 넘어라 게임\n\n");

        printf("컴퓨터와 사용자가 번갈아가며\n");

        printf("숫자를 입력하되 1~10 사이의 \n");

        printf("중복되지 않는 숫자를 입력하여 \n\n");

        printf("최초로 100을 넘기면 승자가 됩니다. \n\n");

        printf("또한 홀수번 째 차례에는 홀수, 짝수번 째 차례에는 짝수를 입력해야합니다\n");

        printf("컴퓨터가 먼저 시작합니다. \n");

        printf("아무키나 누르면 시작합니다.");

        getch();

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

컴퓨터가 제시하는 난수를 생성하는 함수

*/

int computer_number(int i, int com_array[])

{

        int j, number;

again:;

        if (i % 2 == 1)

        {

               do

               {

                       number = rand() % 10 + 1;

               } while (number % 2 == 1);

        }

        else

        {

               do

               {

                       number = rand() % 10 + 1;

               } while (number % 2 == 0);

        }

        for (j = 0; j < i; j++)

               if (com_array[j] == number)

                       goto again;

        com_array[i] = number;

        return com_array[i];

}

 

/*

사용자가 제시하는 숫자의 입력과 처리 함수

*/

int user_number(int i, int user_array[])

{

        int j, number;

again:;

        gotoxy(1, 7);

        printf("사용자 숫자 입력후 Enter>");

        scanf("%d", &number);

        if (i % 2 == 1)

        {

               if (number % 2 == 0)

               {

                       gotoxy(1, 8);

                       printf("홀수를 입력할 차례입니다\n");

                       goto again;

               }

               for (j = 0; j < i; j++)

                       if (user_array[j] == number)

                       {

                              gotoxy(1, 8);

                              printf("중복된 숫자를 입력했습니다\n");

                              goto again;

                       }

        }

        else

        {

               if (number % 2 == 1)

               {

                       gotoxy(1, 8);

                       printf("짝수를 입력할 차례입니다\n");

                       goto again;

               }

               for (j = 0; j < i; j++)

                       if (user_array[j] == number)

                       {

                              gotoxy(1, 8);

                              printf("중복된 숫자를 입력했습니다\n");

                              goto again;

                       }

        }

        user_array[i] = number;

        return user_array[i];

}

 

/*

컴퓨터와 사용자가 제시한 숫자를 화면에 출력하는 함수

*/

void number_display(int i, int com_array[], int user_array[], int sum)

{

        int j;

        gotoxy(1, 2);

        printf("컴퓨터 숫자: ");

        for (j = 0; j <= i; j++)

               printf("%2d ", com_array[j]);

        gotoxy(1, 3);

        printf("사용자 숫자: ");

        for (j = 0; j <= i; j++)

               if (user_array[j] == 0)

                       continue;

               else

                       printf("%2d ", user_array[j]);

        gotoxy(1, 5);

        printf("현재 합계: %3d\n", sum);

}

 

/*

게임의 결과(승패)를 출력하는 함수

*/

void conclusion(int check)

{

        if (check == 1)

               printf("컴퓨터가 이겼습니다. \n");

        else

               printf("사용자가 이겼습니다. \n");

}

 

/*

프로그램의 진행을 멈추게 하는 함수

*/

void press_any_key(void)

{

        gotoxy(1, 10);

        printf("아무키나 누르시오..");

        getch();

}

 

/*

100을 넘어라 게임을 제어하는 함수

*/

void game_control(void)

{

        int max = 100;

        int com_array[10] = { 0 }, user_array[10] = { 0 }, number;

        int i, sum = 0, win;

        for (i = 0; i < 10; i++)

        {

               system("cls");

               number = computer_number(i, com_array);

               sum += number;

               number_display(i, com_array, user_array, sum);

               if (max < sum)

               {

                       win = 1;

                       break;

               }

               number = user_number(i, user_array);

               sum += number;

               number_display(i, com_array, user_array, sum);

               if (max < sum)

               {

                       win = 2;

                       break;

               }

               press_any_key();

        }

        conclusion(win);

}

 


[3번 문제]

/*

컴퓨터가 아닌 두 사람이 번갈아 입력하면서 게임의 승자를 구분하도록 프로그램을 수정하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

void intro_game(void);

void game_control(void);

int user1_number(int i, int user1_array[]);

int user2_number(int i, int user2_array[]);

void number_display(int i, int user1_array[], int user2_array[], int sum);

void conclusion(int win);

void gotoxy(int x, int y);

void press_any_key(void);

 

int main(void)

{

        srand((unsigned)time(NULL));

        intro_game();

        game_control();

        return 0;

}

 

/*

게임 규칙 또는 진행에 대한 설명 출력 함수

*/

void intro_game(void)

{

        system("cls");

        printf("100을 넘어라 게임\n\n");

        printf("사용자끼리 번갈아가며\n");

        printf("숫자를 입력하되 1~10 사이의 \n");

        printf("중복되지 않는 숫자를 입력하여 \n\n");

        printf("최초로 100을 넘기면 승자가 됩니다. \n\n");

        printf("사용자1 님이 먼저 시작합니다. \n");

        printf("아무키나 누르면 시작합니다.");

        getch();

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

컴퓨터가 제시하는 난수를 생성하는 함수

*/

int user1_number(int i, int user1_array[])

{

        int j, number;

again:;

        gotoxy(1, 7);

        printf("첫 번째 사용자 숫자 입력후 Enter>");

        scanf("%d", &number);

        for (j = 0; j < i; j++)

               if (user1_array[j] == number)

               {

                       gotoxy(1, 8);

                       printf("중복된 숫자를 입력했습니다\n");

                       goto again;

               }

        user1_array[i] = number;

        return user1_array[i];

}

 

/*

사용자가 제시하는 숫자의 입력과 처리 함수

*/

int user2_number(int i, int user2_array[])

{

        int j, number;

again:;

        gotoxy(1, 10);

        printf("두 번째 사용자 숫자 입력후 Enter>");

        scanf("%d", &number);

        for (j = 0; j < i; j++)

               if (user2_array[j] == number)

               {

                       gotoxy(1, 11);

                       printf("중복된 숫자를 입력했습니다\n");

                       goto again;

               }

        user2_array[i] = number;

        return user2_array[i];

}

 

/*

컴퓨터와 사용자가 제시한 숫자를 화면에 출력하는 함수

*/

void number_display(int i, int user1_array[], int user2_array[], int sum)

{

        int j;

        gotoxy(1, 2);

        printf("첫 번째 사용자 숫자: ");

        for (j = 0; j <= i; j++)

               if (user1_array[j] == 0)

                       continue;

               else

                       printf("%2d ", user1_array[j]);

        gotoxy(1, 3);

        printf("두 번째 사용자 숫자: ");

        for (j = 0; j <= i; j++)

               if (user2_array[j] == 0)

                       continue;

               else

                       printf("%2d ", user2_array[j]);

        gotoxy(1, 5);

        printf("현재 합계: %3d\n", sum);

}

 

/*

게임의 결과(승패)를 출력하는 함수

*/

void conclusion(int check)

{

        gotoxy(1, 24);

        if (check == 1)

               printf("사용자1 님이 이겼습니다. \n");

        else

               printf("사용자2 님이 이겼습니다. \n");

}

 

/*

프로그램의 진행을 멈추게 하는 함수

*/

void press_any_key(void)

{

        gotoxy(1, 15);

        printf("아무키나 누르시오..");

        getch();

}

 

/*

100을 넘어라 게임을 제어하는 함수

*/

void game_control(void)

{

        int max = 100;

        int user1_array[10] = { 0 }, user2_array[10] = { 0 }, number;

        int i, sum = 0, win;

        for (i = 0; i < 10; i++)

        {

               system("cls");

               number = user1_number(i, user1_array);

               sum += number;

               number_display(i, user1_array, user2_array, sum);

               if (max < sum)

               {

                       win = 1;

                       break;

               }

               number = user2_number(i, user2_array);

               sum += number;

               number_display(i, user1_array, user2_array, sum);

               if (max < sum)

               {

                       win = 2;

                       break;

               }

               press_any_key();

        }

        conclusion(win);

}

 


[5번 문제]

/*

함수 7.2.6과 함수 7.2.7에 대해 goto문을 사용하지 않는 사용자 정의함수로 작성하시오

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

void intro_game(void);

void game_control(void);

int computer_number(int i, int com_array[]);

int user_number(int i, int user_array[]);

void number_display(int i, int com_array[], int user_array[], int sum);

void conclusion(int win);

void gotoxy(int x, int y);

void press_any_key(void);

 

int main(void)

{

        srand((unsigned)time(NULL));

        intro_game();

        game_control();

        return 0;

}

 

/*

게임 규칙 또는 진행에 대한 설명 출력 함수

*/

void intro_game(void)

{

        system("cls");

        printf("100을 넘어라 게임\n\n");

        printf("컴퓨터와 사용자가 번갈아가며\n");

        printf("숫자를 입력하되 1~10 사이의 \n");

        printf("중복되지 않는 숫자를 입력하여 \n\n");

        printf("최초로 100을 넘기면 승자가 됩니다. \n\n");

        printf("컴퓨터가 먼저 시작합니다. \n");

        printf("아무키나 누르면 시작합니다.");

        getch();

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

/*

컴퓨터가 제시하는 난수를 생성하는 함수

*/

int computer_number(int i, int com_array[])

{

        int random, again;

        do

        {

               again = 1;

               random = rand() % 10 + 1;

               for (int j = 0; j < i; j++)

                       if (com_array[j] == random)

                              again = 0;

        } while (!again);

        com_array[i] = random;

        return com_array[i];

}

 

/*

사용자가 제시하는 숫자의 입력과 처리 함수

*/

int user_number(int i, int user_array[])

{

        int number, again;

        do

        {

               again = 1;

               gotoxy(1, 7);

               printf("사용자 숫자 입력 후 Enter >");

               scanf("%d", &number);

               for (int j = 0; j < i; j++)

                       if (user_array[j] == number)

                       {

                              gotoxy(1, 8);

                              printf("중복된 숫자를 입력했습니다\n");

                              again = 0;

                       }

        } while (!again);

        user_array[i] = number;

        return user_array[i];

}

 

/*

컴퓨터와 사용자가 제시한 숫자를 화면에 출력하는 함수

*/

void number_display(int i, int com_array[], int user_array[], int sum)

{

        int j;

        gotoxy(1, 2);

        printf("컴퓨터 숫자: ");

        for (j = 0; j <= i; j++)

               printf("%2d ", com_array[j]);

        gotoxy(1, 3);

        printf("사용자 숫자: ");

        for (j = 0; j <= i; j++)

               if (user_array[j] == 0)

                       continue;

               else

                       printf("%2d ", user_array[j]);

        gotoxy(1, 5);

        printf("현재 합계: %3d\n", sum);

}

 

/*

게임의 결과(승패)를 출력하는 함수

*/

void conclusion(int check)

{

        if (check == 1)

               printf("컴퓨터가 이겼습니다. \n");

        else

               printf("사용자가 이겼습니다. \n");

}

 

/*

프로그램의 진행을 멈추게 하는 함수

*/

void press_any_key(void)

{

        gotoxy(1, 10);

        printf("아무키나 누르시오..");

        getch();

}

 

/*

100을 넘어라 게임을 제어하는 함수

*/

void game_control(void)

{

        int max = 100;

        int com_array[10] = { 0 }, user_array[10] = { 0 }, number;

        int i, sum = 0, win;

        for (i = 0; i < 10; i++)

        {

               system("cls");

               number = computer_number(i, com_array);

               sum += number;

               number_display(i, com_array, user_array, sum);

               if (max < sum)

               {

                       win = 1;

                       break;

               }

               number = user_number(i, user_array);

               sum += number;

               number_display(i, com_array, user_array, sum);

               if (max < sum)

               {

                       win = 2;

                       break;

               }

               press_any_key();

        }

        conclusion(win);

}

 


[6번 문제]

/*

네 명(A, B, C, D)이 순서대로 주사위를 던져서 제일 높은 눈금과 제일 낮은 눈금을 곱하고,

나머지 눈금을 곱하여 곱한 숫자가 낮은 두 사람을 우승자로 하는 게임 프로그램을 작성하시오.

눈금이 같을 경우, 던진 순서를 우선으로 결정하고, 다음 번 순서는 낮은 눈금의 사람부터 시작하되 총 10회를 반복하시오

*/

/*

100을 넘어라 게임 프로그램

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <Windows.h>

#include <conio.h>

 

void intro_game(void);

void game_control(void);

int roll_dice(int j);

void gotoxy(int x, int y);

void press_any_key();

void conclusion(int A, int B, int C, int D);

 

int a = 0, b = 0, c = 0, d = 0;

 

int main(void)

{

        srand((unsigned)time(NULL));

        intro_game();

        game_control();

        return 0;

}

 

/*

게임 규칙 또는 진행에 대한 설명 출력 함수

*/

void intro_game(void)

{

        system("cls");

        printf("주사위 게임\n");

        printf("2:2 팀 게임입니다\n");

        printf("제일 높은 눈금과 제일 낮은 눈금의 곱 vs 나머지 두 눈금의 곱\n");

        printf("둘 중 낮은 점수를 가진 팀이 이기는 게임입니다\n");

        printf("10번을 진행하며 팀은 매번 바뀔 수 있습니다\n");

        printf("네 명 중 제일 많이 우승한 사람이 이깁니다\n");

        printf("인지하셨다면 키보드를 누르세요\n");

        getch();

}

 

void gotoxy(int x, int y)

{

        COORD Pos = { x - 1, y - 1 };

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

int roll_dice(int j)

{

        int num = 0;

        num = rand() % 6 + 1;

        printf("%d번째 %d\n", j, num);

        return num;

}

 

void press_any_key(void)

{

        gotoxy(1, 10);

        printf("인지하였다면 아무키나 누르세요\n");

        getch();

}

 

void game_control(void)

{

        int i, j, k, next = 1;

        int multiple = 1;

        int max, min;

        int current[4]; //현재 게임 진행자들

        int repeat;

        for (i = 0; i<10; i++)

        {

               int check1 = 0, check2 = 1;

               int check3 = 2, check4 = 3;

               system("cls");

               for (j = 0; j<4; j++)

               {

                       current[j] = roll_dice(j);

                       if (j == 1)

                       {

                              while (current[1] == current[0]) //숫자가 겹치지 않도록 했습니다

                              {

                                      current[1] = roll_dice(j);

                              }

                       }

                       else if (j == 2)

                       {

                              while (current[2] == current[1] || current[2] == current[0]) //숫자가 겹치지 않도록 했습니다

                              {

                                      current[2] = roll_dice(j);

                              }

                       }

                       else if (j == 3)

                       {

                              while (current[3] == current[2] || current[3] == current[1] || current[3] == current[0]) //숫자가 겹치지 않도록 했습니다

                              {

                                      current[3] = roll_dice(j);

                              }

                       }

               }

               system("cls");

               for (j = 0; j<4; j++)

               {

                       printf("%d번째 주사위:%d\n", j + 1, current[j]);

               }

               max = 0; //최대는 0으로

               min = 6; //최소는 6으로 설정하고

               for (j = 0; j<4; j++)

               {

                       if (current[j]>max)

                       {

                              max = current[j]; //최대를 찾는다

                              check1 = j;

                       }

               }

               for (j = 0; j<4; j++)

               {

                       if (current[j]<min) //최소를 찾는다

                       {

                              min = current[j];

                              check2 = j;

                       }

               }

               printf("최대:%d, 최소:%d\n", max, min);

               printf("최대 최소 곱:%d\n", max*min);

               for (j = 0; j<4; j++)

               {

                       if (j != check1 && j != check2)

                       {

                              check3 = j;

                              break;

                       }

               }

               for (j = 0; j<4; j++)

               {

                       if (j != check1 && j != check2 && j != check3)

                              check4 = j;

               }

               printf("A:%d 번째 주사위, B:%d 번째 주사위, C:%d 번째 주사위, D:%d 번째 주사위\n", check1+1, check2+1, check3+1, check4+1);

               multiple = (current[check3] * current[check4]);

               printf("최대도 최소도 아닌 곱: %d \n", multiple);

               if (multiple>max*min)

               {

                       printf("%c %c가 이겼다\n", (char)(check1+65), (char)(check2+65));

                       switch (check1)

                       {

                       case 0:

                              a++;

                              break;

                       case 1:

                              b++;

                              break;

                       case 2:

                              c++;

                              break;

                       case 3:

                              d++;

                              break;

                       }

                       switch (check2)

                       {

                       case 0:

                              a++;

                              break;

                       case 1:

                              b++;

                              break;

                       case 2:

                              c++;

                              break;

                       case 3:

                              d++;

                              break;

                       }

                       conclusion(a, b, c, d);

               }

               else if(multiple<max*min)

               {

                       printf("%c %c가 이겼다\n", (char)(check3+65), (char)(check4+65));

                       switch (check3)

                       {

                       case 0:

                              a++;

                              break;

                       case 1:

                              b++;

                              break;

                       case 2:

                              c++;

                              break;

                       case 3:

                              d++;

                              break;

                       }

                       switch (check4)

                       {

                       case 0:

                              a++;

                              break;

                       case 1:

                              b++;

                              break;

                       case 2:

                              c++;

                              break;

                       case 3:

                              d++;

                              break;

                       }

                       conclusion(a, b, c, d);

               }

               else

               {

                       printf("비겼습니다\n");

                       a++;

                       b++;

                       c++;

                       d++;

                       conclusion(a, b, c, d);

               }

               press_any_key();

        }

}

 

void conclusion(int A, int B, int C, int D)

{

        gotoxy(1, 20);

        printf("우승한 횟수:\nA:%d, B:%d, C:%d, D:%d\n", a, b, c, d);

}

 


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] 명품 C언어 프로젝트 안기수 저


*4번 문제는 토의 문제였기 때문에 생략했습니다.

반응형