728x90
Program 1
다음 내용을 참고로 구조체와 열거형을 이용하여 카드 게임을 할 수 있는 기본적인 자료형을 만들어보고, 카드를 나눠주는 프로그램을 작성하시오.
- 카드는 총 52장
- 모양 4가지 : "♥(Hearts)", "◆(Diamonds)", "♣(Clubs)", "♠(Spades)"
- 숫자 13가지 : ace(1)부터 10까지 그리고 jack(11), queen(12), king(13)
- 3명의 Player에게 7장의 카드를 나누어주는 과정을 다음과 같이 출력하도록 한다
- filldeck()- 무늬와 숫자의 52장 카드덱 구성, shuffle() – 카드 섞기, deal() – 카드 분배
- 순위 결정은 다음 3가지 규칙을 사용한다. (Triple이 가장 높음)
- Triple = 같은 숫자 3쌍 / Two pair = 같은 숫자 2쌍 / One pair = 같은 숫자의 카드 두장
1) 문제 해결 방법에 대한 설명
- 카드를 랜덤 함수를 이용하여 분배
- 사람 별로 카드를 검사하고 winner를 검사
- 동점이 있는지 검사
- 결과 출력
- 나머지 설명은 주석으로 대신
2) 소스 코드
#include <stdio.h>
#include <time.h>
// 열거형
enum num { ace = 1, jack = 11, queen = 12, king = 13 };
// 카드 구조체
struct Card {
int number;
int shape;
};
// 52장의 카드
struct Card card_all[52];
// 선수마다 갖게 되는 카드 7장
struct Player {
struct Card card_player[7];
};
void shuffle()
{
// 52장의 카드를 랜덤한 인덱스번째 카드와 하나씩 뒤바꾸어 줌
srand(time(NULL));
for (int i = 0; i < 52; i++)
{
int index = rand() % 52;
struct Card temp = card_all[index];
card_all[index] = card_all[i];
card_all[i] = temp;
}
}
void filldeck()
{
int i = 0;
// 4개의 모양과 13개의 숫자를 짝지어서 카드 만듦
for (int j = 0; j < 4; j++)
{
for (int k = 0; k < 13; k++)
{
card_all[i].number = k;
card_all[i].shape = j;
i++;
}
}
}
void deal(struct Player player[])
{
// 섞어진 카드를 앞에서부터 나누어줌
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 7; j++)
{
player[i].card_player[j] = card_all[i * 7 + j];
}
}
}
int main(void)
{
char name1[10], name2[10], name3[10];
printf("포커 게임의 참여자 3명을 차례로 입력하시오.\n");
printf("선수1: "); scanf(" %s", name1);
printf("선수2: "); scanf(" %s", name2);
printf("선수3: "); scanf(" %s", name3);
struct Player player[3];
while (1) {
printf("카드게임에 3명의 선수가 참여합니다...\n");
filldeck(); shuffle(); printf("52장의 카드를 섞어 줍니다.\n");
deal(player); printf("카드를 7장씩 나누어 줍니다.\n");
printf("%s %s %s\n", name1, name2, name3);
// 7개의 카드를 출력
for (int i = 0; i < 7; i++) {
// 사람마다 번갈아가며 1장씩
for (int j = 0; j < 3; j++)
{
switch (player[j].card_player[i].number) {
// 특별한 숫자일 경우
case ace:
printf("A");
break;
case jack:
printf("J");
break;
case queen:
printf("Q");
break;
case king:
printf("K");
break;
default:
printf("%d", player[j].card_player[i].number);
break;
}
printf(" of ");
switch (player[j].card_player[i].shape) {
case 0:
printf("♥ ");
break;
case 1:
printf("◆ ");
break;
case 2:
printf("♣ ");
break;
case 3:
printf("♠ ");
break;
}
printf(" ");
}
printf("\n\n");
}
printf("%s %s %s\n", name1, name2, name3);
int result[3] = { 0, }; int winner = 0; int winnerstats = 0; int tie = 0;
// 사람 3명
for (int i = 0; i < 3; i++) {
// 카드 7장을 돌아가며 해당 카드 뒤에 같은 카드가 몇장 있는지 확인
int same[7] = { 0, };
for (int j = 0; j < 7; j++) {
for (int k = j + 1; k < 7; k++) {
if (player[i].card_player[j].number == player[i].card_player[k].number) {
same[j]++;
}
}
}
// 같은 카드(쌍)이 있으면 pair를 증가하고, 3개가 같으면 triple 증가
int pair = 0; int triple = 0;
for (int j = 0; j < 7; j++)
{
if (same[j] == 1) {
pair++;
}
if (same[j] >= 2) {
triple++;
}
}
// 트리플이 있으면 결과는 트리플(3)
if (triple) {
result[i] = 3;
}
// 두쌍 이상일 경우 투페어(2)
else if (pair >= 2) {
result[i] = 2;
}
// 한쌍일 경우 원페어(1)
else if (pair == 1) {
result[i] = 1;
}
// 한쌍도 없고 트리플 없을경우(0)
else {
result[i] = 0;
}
switch (result[i]) {
case 1:
printf("one pair ");
break;
case 2:
printf("two pair ");
break;
case 3:
printf("triple ");
break;
default:
printf("none ");
break;
}
// 셋중에서 결과 우선순위가 높은 사람 찾기
if (winnerstats < result[i]) {
winner = i + 1;
winnerstats = result[i];
tie = 0;
}
// 동점인 사람수 세기
else if (winnerstats == result[i]) {
tie++;
}
}
printf("\nThe winner is ");
switch (winner) {
case 1:
printf("%s", name1);
break;
case 2:
printf("%s", name2);
break;
case 3:
printf("%s", name3);
break;
default:
printf("no one");
break;
}
printf(" (+%d) ", tie);
printf("by rank of ");
switch (winnerstats) {
case 1:
printf("one pair");
break;
case 2:
printf("two pair");
break;
case 3:
printf("triple");
break;
default:
printf("none");
break;
}
char answer;
printf("\n\n계속?");
scanf(" %c", &answer);
if (answer == 'y') continue;
else break;
}
return 0;
}
3) 입력/출력 결과
Program 2
한 변의 길이(원소의 수)가 홀수인 정방 행렬에서 가로, 세로, 대각선 원소들의 합이 같은 행렬을 마방진(magic square)이라한다. 마방진을 만드는 프로그램을 쓰시오.
- 마방진을 생성하는 알고리즘
- 첫번째 숫자를 1행의 중앙열에 넣는다.
- 대각선 방향(한 칸 위와 한 칸 옆)으로 이동한 곳에 다음 숫자를 넣는다. 만약 위치가 영역을 벗어날 경우 반대편 행(또는 열)의 위치에 숫자를 넣는다.
- 위의 단계를 n회 반복하면 이미 숫자가 저장되어 있는 상황을 맞이한다.
- 위와 같이 이미 정한 장소에 이미 숫자가 저장되어 있으면 마지막 숫자를 넣은 곳에서 바로 아래 칸에 다음의 숫자를 넣고 위의 2번 단계서부터 다시 반복하여 모든 수를 저장한다.
- 5 x 5 마방진의 예 : 1행의 합이 65이며, 대각선의 합, 5열의 합도 모두 65
1) 문제 해결 방법에 대한 설명
- 첫번째 숫자를 1행의 중앙열에 넣는다.
- 대각선 방향으로 이동한 곳에 다음 숫자를 넣고, 위치가 영역을 벗어날 경우 반대편에 숫자를 넣음
- n회 반복
- 나머지 설명은 주석으로 대신
2) 소스 코드
#include <stdio.h>
int main(void)
{
int input, col, row, num = 1;
int nc, nr;
int ma[100][100];
while (1)
{
printf("마방진을 구할 홀수 정수 n을 입력하세요 >> ");
scanf(" %d", &input);
if (input <= 2 || input % 2 == 0)
{
printf("다시 입력하세요 >>\n");
continue;
}
break;
}
for (row = 0; row<input; row++)
{
for (col = 0; col<input; col++)
{
ma[row][col] = 0;
}
}
col = 0, row = input / 2;
ma[row][col] = num;
while (num <= input*input)
{
ma[row][col] = num;
nc = col - 1;
nr = row - 1;
if (nr<0)
nr = input - 1;
if (nc<0)
nc = input - 1;
if (ma[nr][nc] != 0)
col++;
else {
col = nc, row = nr;
}
num++;
}
printf("n이 %d인 마방진의 결과는 다음과 같습니다. \n", input);
int csum, rsum[input];
for (row = 0; row<input; row++)
{
rsum[row] =0;
for (col = 0; col<input; col++)
{
printf("%4d", ma[col][row]);
csum += ma[col][row];
rsum[row] += ma[row][col];
}
printf(" | %d", csum);
csum = 0;
printf("\n\n");
}
for(int i=0; i<input; i++)
{
printf("--- ");
}
printf("\n");
for(int i=0; i<input; i++)
{
printf("%4d", rsum[i]);
}
return 0;
}
3) 입력/출력 결과
Program 3
구조체로 복소수를 정의하고 복소수의 더하기, 빼기, 곱하기 및 절대값을 구하는 함수를 만들어 계산의 예를 출력하는 프로그램을 작성하시오.
- 복소수 a+bi와 c+di 더하기 정의: (a+c) + (b+d)i
- 복소수 a+bi와 c+di 빼기 정의: (a-c) + (b-d)i
- 복소수 a+bi와 c+di 곱하기 정의: (ac-bd) + (ad + bc)i
- 복소수 a+bi 절대값 정의: √(a2 + b2)
1) 문제 해결 방법에 대한 설명
- 복소수 구조체 생성
- 더하기, 곱하기, 빼기 함수 생성
- 출력
- 나머지 설명은 주석으로 대신
2) 소스 코드
#include <stdio.h>
#include <math.h>
struct complex {
double r;
double im;
};
struct complex add(struct complex x, struct complex y) {
struct complex result;
result.r = x.r + y.r;
result.im = x.im + y.im;
return result;
}
void multiple(struct complex x, struct complex y, struct complex* partial) {
partial -> r = x.r * y.r - x.im * y.im;
(*partial).im = x.r * y.im + x.im * y.r;
}
struct complex subtract(struct complex x, struct complex y) {
struct complex result;
result.r = x.r - y.r;
result.im = x.im - y.im;
return result;
}
void absolute (struct complex x) {
double v = sqrt(x.r * x.r + x.im * x.im);
printf("(%lf + %lf i) = (%lf) \n", x.r, x.im, v);
}
int main()
{
struct complex x, y, result;
printf("첫 번째 복소수를 실수로 입력하세요 >> "); scanf("%lf %lf", &x.r, &x.im);
printf("두 번째 복소수를 실수로 입력하세요 >> "); scanf("%lf %lf", &y.r, &y.im);
result = add(x,y);
printf("덧셈\n");
printf("(%lf + %lf i) + (%lf + %lf i) = (%lf + %lf i) \n", x.r, x.im, y.r, y.im, result.r, result.im);
result = subtract(x,y);
printf("뺄셈\n");
printf("(%lf + %lf i) - (%lf + %lf i) = (%lf + %lf i) \n", x.r, x.im, y.r, y.im, result.r, result.im);
multiple(x,y,&result);
printf("곱셈\n");
printf("(%lf + %lf i) * (%lf + %lf i) = (%lf + %lf i) \n", x.r, x.im, y.r, y.im, result.r, result.im);
printf("절대값\n");
absolute(x); absolute(y);
return 0;
}
3) 입력/출력 결과
Program 4
아래 실행 예시와 같이 주어진 배열 a와 b를 오름차순으로 각각 정렬하고, 정렬된리스트를 배열 c에 통합 저장하는 프로그램을 쓰시오.
void printlist(int *list, int cnt); // 배열 출력
void sort(int *list, int cnt); // 배열 오름차순으로 정렬
void mergesort(int *clist, int *alist, int *blist, int alen, int blen); // 배열 통합
1) 문제 해결 방법에 대한 설명
- 배열을 크기순으로 정렬하여 서로 다른 배열을 합함
- 배열 초기화후 출력
2) 소스 코드
#include <stdio.h>
#include <string.h>
void printl(int *list, int cnt) {
for(int i=0; i<cnt; i++)
{
printf("%d ",list[i]);
}
printf("\n");
}
void sortl(int *list, int cnt)
{
int temp;
for(int i=0; i<cnt; i++)
{
for(int j=0; j<cnt-i-1; j++)
{
if(list[j]>list[j+1])
{
temp = list[j];
list[j] = list[j+1];
list[j+1] = temp;
}
}
}
for(int i=0 ; i<cnt ; i++)
{
printf("%d ",list[i]);
}
printf("\n");
}
void mergesort(int *c, int *a, int *b, int alen, int blen)
{
for(int i=0; i<8; i++)
{
c[i] = a[i];
}
for(int i=8; i<13; i++)
{
c[i] = b[i-8];
}
sortl(c, 13);
}
int main()
{
int a[] = {15, 8, 19, 1, 9, 4, 12, 5};
int b[] = {10, 17, 3, 7, 2};
printf("original list a : ");
printl(a, 8);
printf("original list b : ");
printl(b, 5);
printf("sorted list a : ");
sortl(a, 8);
printf("sorted list b : ");
sortl(b, 5);
int c[13];
printf("\nmerged list : ");
mergesort(c, a, b, 8, 5);
return 0;
}
3) 입력/출력 결과
728x90
'College Computer Science > C Language' 카테고리의 다른 글
[C 프로그래밍 실습] 3인 블랙잭 Blackjack 카드 게임 만들기 (Term Project) (1) | 2021.01.07 |
---|---|
[C 프로그래밍 실습] 함수와 포인터 활용 1 (Lab 10) (0) | 2021.01.06 |
[C 프로그래밍 실습] 구조체와 공용체 (Lab 09) (0) | 2021.01.04 |
[C 프로그래밍 실습] 변수 유효범위 (Lab 08) (0) | 2021.01.03 |
[C 프로그래밍 실습] 중간고사 문제 (0) | 2021.01.03 |
댓글