[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를 수십번 시도한 결과 풀 수 있었습니다...
'C > 명품 C언어 프로젝트(안기수 저)' 카테고리의 다른 글
명품 C언어 프로젝트 5.3장 연습문제 (2) | 2017.08.05 |
---|---|
명품 C언어 프로젝트 5.2장 연습문제 (0) | 2017.07.30 |
명품 C언어 프로젝트 4.6장 연습문제 (4) | 2017.07.18 |
명품 C언어 프로젝트 4.5장 연습문제 (0) | 2017.07.14 |
명품 C언어 프로젝트 4.4장 연습문제 (0) | 2017.07.11 |