본문 바로가기
College Computer Science/C Language

[C 프로그래밍 실습] Report 03

by 2den 2021. 1. 4.
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

 

아래 실행 예시와 같이 주어진 배열 ab를 오름차순으로 각각 정렬하고, 정렬된리스트를 배열 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

댓글