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

명품 C언어 프로젝트 5.1장 연습문제

꾸준함. 2017. 7. 26. 22:29

[1번 문제]

/*

[함수 5.1.3]을 이용하여 카드를 섞은 다음, 네 명의 사람에게 순서대로 7장씩의 카드를 나누어주고 받은 카드들을 출력하는 프로그램을 작성한다

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

 

typedef struct

{

        int order;

        char shape[3];

        int number;

}trump;

 

void make_card(trump m_card[]);

void display_card(trump m_card[]);

void shuffle_card(trump m_card[]);

 

int main(void)

{

        trump A[7], B[7], C[7], D[7]; //4명의 사람

        trump card[52];

        make_card(card);

        shuffle_card(card);

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

        {

               A[i] = card[4*i]; //28개만 필요하므로

               B[i] = card[4*i+ 1];

               C[i] = card[4*i + 2];

               D[i] = card[4*i + 3];

        }

        printf("A: ");

        display_card(A);

        printf("\n");

        printf("B: ");

        display_card(B);

        printf("\n");

        printf("C: ");

        display_card(C);

        printf("\n");

        printf("D: ");

        display_card(D);

        printf("\n");

        return 0;

}

 

void make_card(trump m_card[])

{

        int i, j;

        char shape[4][3] = { "", "", "", "" };

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

        {

               for (j = i * 13; j < i * 13 + 13; j++)

               {

                       m_card[j].order = i;

                       strcpy(m_card[j].shape, shape[i]);

                       m_card[j].number = j % 13 + 1;

                       switch (m_card[j].number)

                       {

                       case 1:

                              m_card[j].number = 'A';

                              break;

                       case 11:

                              m_card[j].number = 'J';

                              break;

                       case 12:

                              m_card[j].number = 'Q';

                              break;

                       case 13:

                              m_card[j].number = 'K';

                              break;

                       }

               }

        }

}

 

void display_card(trump m_card[])

{

        int i, count = 0;

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

        {

               printf("%s", m_card[i].shape);

               if (10 < m_card[i].number)

                       printf("%-2c ", m_card[i].number);

               else

                       printf("%-2d ", m_card[i].number);

               /*

               count++;

               if (i % 13 + 1 == 13)

               {

                       printf("\n");

                       count = 0;

               }

               */

        }

}

 

void shuffle_card(trump m_card[])

{

        int i, rnd;

        trump temp;

        srand(time(NULL));

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

        {

               rnd = rand() % 52;

               temp = m_card[rnd];

               m_card[rnd] = m_card[i];

               m_card[i] = temp;

        }

}


[4번 문제]

/*

5장의 임의의 카드에 대해 다음과 같은 표시 형식으로 출력하는 프로그램을 작성합니다

a. 같은 모양일 경우에는 번호에 대해 오름차순으로 표시

b. 모양은 다르지만 같은 숫자가 있을 경우에는 인접하여 표시

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

 

typedef struct

{

        int order;

        int number;

        char shape[3];

}trump;

 

void make_card(trump m_card[])

{

        char shape[4][3] = { "", "", "", "" };

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

        {

               for (int j = i * 13; j < i * 13 + 13; j++)

               {

                       m_card[j].order = i;

                       strcpy(m_card[j].shape, shape[i]);

                       int k = j % 13 + 1;

                       if (k == 1)

                              m_card[j].number = 'A';

                       else if (k == 11)

                              m_card[j].number = 'J';

                       else if (k == 12)

                              m_card[j].number = 'Q';

                       else if (k == 13)

                              m_card[j].number = 'K';

                       else

                              m_card[j].number = k;

               }

        }

}

 

void shuffle_card(trump m_card[])

{

        int rnd;

        trump temp;

        srand((unsigned)time(NULL));

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

        {

               rnd = rand() % 52;

               temp = m_card[rnd];

               m_card[rnd] = m_card[i];

               m_card[i] = temp;;

        }

}

 

void display_card(trump m_card[])

{

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

        {

               printf("%s", m_card[i].shape);

               if (10 < m_card[i].number)

                       printf("%-2c ", m_card[i].number);

               else

                       printf("%-2d ", m_card[i].number);

        }

}

 

int main(void)

{

        trump card[52], show[5];

        make_card(card);

        shuffle_card(card);

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

               show[i] = card[i]; //임의로 카드 5장 뽑기

 

        for (int i = 0; i < 4; i++) //모양부터 순서대로

        {

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

               {

                       if (show[j].order > show[j + 1].order)

                       {

                              trump temp = show[j + 1];

                              show[j + 1] = show[j];

                              show[j] = temp;

                       }

               }

        }

        for (int i = 0; i < 4; i++) //숫자 정렬

        {

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

               {

                       if ((show[j + 1].order == show[j].order) && (show[j + 1].number < show[j].number))

                       {

                              trump temp = show[j + 1];

                              show[j + 1] = show[j];

                              show[j] = temp;

                       }

               }

        }

 

        for (int i = 0; i < 4; i++) //모양은 다르지만 같은 숫자인 경우

        {

               for (int j = 1; j < 5; j++)

               {

                       if (show[i].number == show[j].number) //숫자가 같으면

                       {

                              for (int k = j; k > i + 1; k--) //붙인다

                              {

                                      trump temp = show[k];

                                      show[k] = show[k - 1];

                                      show[k - 1] = temp;

                              }

                       }

               }

        }

        display_card(show);

        printf("\n");

        return 0;

}


[5번 문제]

/*

문제 4에 대해서 3.5절 연습문제 2 [예제 3.5.5]를 응용하여 실제 카드모양과 유사하게 출력하는 프로그램을 작성한다

*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <time.h>

#include <Windows.h>

 

typedef struct

{

        int order;

        int number;

        char shape[3];

}trump;

 

void gotoxy(int x, int y)

{

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

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);

}

 

void make_card(trump m_card[])

{

        char shape[4][3] = { "", "", "", "" };

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

        {

               for (int j = i * 13; j < i * 13 + 13; j++)

               {

                       m_card[j].order = i;

                       strcpy(m_card[j].shape, shape[i]);

                       int k = j % 13 + 1;

                       if (k == 1)

                              m_card[j].number = 'A';

                       else if (k == 11)

                              m_card[j].number = 'J';

                       else if (k == 12)

                              m_card[j].number = 'Q';

                       else if (k == 13)

                              m_card[j].number = 'K';

                       else

                              m_card[j].number = k;

               }

        }

}

 

void shuffle_card(trump m_card[])

{

        int rnd;

        trump temp;

        srand((unsigned)time(NULL));

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

        {

               rnd = rand() % 52;

               temp = m_card[rnd];

               m_card[rnd] = m_card[i];

               m_card[i] = temp;;

        }

}

 

void display_card(trump m_card[]) //수정

{

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

        {

               gotoxy(18 * i+1, 1);

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

               {

                       if (j == 0)

                              printf(""); //ㅂ 한자

                       else if (j == 8)

                              printf("");

                       else

                              printf("");

               }

               printf("\n");

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

               {

                       gotoxy(18 * i + 1, 2+j);

                       for (int k = 0; k < 9; k++)

                       {

                              if (k == 0 || k == 8)

                                      printf("");

                              else

                                      printf("  "); //두칸 띄워야합니다

                       }

                       printf("\n");

               }

               gotoxy(18 * i + 1, 12);

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

               {

                       if (j == 0)

                              printf("");

                       else if (j == 8)

                              printf("");

                       else

                              printf("");

               }

               printf("\n");

        }

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

        {

               int temp = m_card[i].number;

               gotoxy(3+18*i, 2);

               printf(temp > 10 ? "%2c" : "%2d", temp);

               gotoxy(3+18*i, 3);

               printf("%s", m_card[i].shape);

               gotoxy(9+18*i, 6);

               printf("%s", m_card[i].shape);

               gotoxy(15+18*i, 10);

               printf("%s", m_card[i].shape);

               gotoxy(15+18*i, 11);

               printf(temp > 10 ? "%2c" : "%2d", temp);

        }

        gotoxy(1, 24); //커서 치우기 위해

}

 

int main(void)

{

        trump card[52], show[5];

        make_card(card);

        shuffle_card(card);

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

               show[i] = card[i]; //임의로 카드 5장 뽑기

 

        for (int i = 0; i < 4; i++) //모양부터 순서대로

        {

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

               {

                       if (show[j].order > show[j + 1].order)

                       {

                              trump temp = show[j + 1];

                              show[j + 1] = show[j];

                              show[j] = temp;

                       }

               }

        }

        for (int i = 0; i < 4; i++) //숫자 정렬

        {

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

               {

                       if ((show[j + 1].order == show[j].order) && (show[j + 1].number < show[j].number))

                       {

                              trump temp = show[j + 1];

                              show[j + 1] = show[j];

                              show[j] = temp;

                       }

               }

        }

 

        for (int i = 0; i < 4; i++) //모양은 다르지만 같은 숫자인 경우

        {

               for (int j = 1; j < 5; j++)

               {

                       if (show[i].number == show[j].number) //숫자가 같으면

                       {

                              for (int k = j; k > i + 1; k--) //붙인다

                              {

                                      trump temp = show[k];

                                      show[k] = show[k - 1];

                                      show[k - 1] = temp;

                              }

                       }

               }

        }

        display_card(show);

        printf("\n");

        return 0;

}



개발환경:Visual Studio 2017


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


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


*2번 문제는 토의 문제였기 때문에 풀지 않았습니다.

*3번 문제 같은 경우는 원카드 게임을 구현하는 문제였는데, 구현하는데 상당히 오래걸릴 것 같으므로 우선 1, 4, 5번부터 게시하겠습니다.

https://github.com/miki1029/OneCard/blob/master/onecard.c#L348 깃허브 원카드 소스(참고할 예정입니다)

*5번 문제에서는 gotoxy를 수십번 시도한 결과 풀 수 있었습니다...

반응형