본문 바로가기

C

[C언어 문법] 20장 도전 프로그래밍 3

728x90

교재 : 열혈 C 프로그래밍

 

https://dottak.github.io/c%20%EC%96%B8%EC%96%B4/2020/04/25/Chapter20-%EB%8F%84%EC%A0%84-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D3/#%EB%8F%84%EC%A0%84-1

 

[C 언어] Chapter20 - 도전 프로그래밍3 · DoTTak Blog

본 글은 ‘윤성우 저 열혈강의 C 프로그래밍’ 교재를 학습 후 정리한 글입니다.

dottak.github.io

 

도전 1

void TurnOfReck(int(*arr)[4], int len) {
    int i, j;
    int tempArr[4][4];

	//바꾸기
    for (i = 0; i < len; i++) {
        for (j = 0; j < len; j++) {
            tempArr[j][4 - 1 - i] = arr[i][j];  //핵심 코드!!
        }
    }
 
    //원본 배열 변환
    for (i = 0; i < len; i++) {
        for (j = 0; j < len; j++) {
            arr[i][j] = tempArr[i][j];
        }
    }
    printf("\n");
}


도전 2

    int arr[4][4];
    int num = 4;  
    int count = 0;  //배열에 들어가는 값
    int sw = 1;     //방향, -1이 되면 문워크 함
    int row = 0, col = -1;

    while (num) {
        // 열 삽입
        for (int i = 0; i < num; i++) {
            col += (1 * sw);  //★★★★
            arr[row][col] = count;
            count++;
        }

        num -= 1; //가로나 세로로 하나 채워졌으므로
        for (int i = 0; i < num; i++) {
            row += (1 * sw);  //★★★★
            arr[row][col] = count;
            count++;
        }

        // 방향 변경
        sw *= -1;  //★★★★
    }

 


 

도전 3

rand함수를 이용하여 0이상 99이하의 난수를 총 5개 생성하는 프로그램을 작성
  #include <stdio.h>
  #include <stdlib.h>

  int main(void)
  {   
      int i;
      printf("난수의 범위: 0부터 %d까지 \n", RAND_MAX);
        
      for(i=0;i<6;i++){
          printf("%d \n", rand()%100); //★★★★
      }
      return 0;
  }

 RAND_MAX로 하면 32767까지 돼서 %100d을 해주는 듯!

 


 

도전 4

srand함수, rand함수, time함수를 이용하여 주사위를 출력하는 프로그램을 작성
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void){
    srand((int)time(NULL));  //★★★

    printf("주사위 결과: %d \n", rand() % 6); 
    // 0~MAX 사이의 난수를 쓰고 싶으면 그 수로 나누면 될 듯

    return 0;
}

 


도전 5

  가위 바위 보 게임을 만들자. 사용자는 가위 바위 보 중에서 하나를 입력
  그리고 컴퓨터는 난수를 생성해서 가위 바위 보 중에서 하나를 선택 그리고 이를 비교해서 승자와 패자를
  가리는 프로그램을 생성
  단, 사용자가 질 때까지 계속하되 마지막에서 게임의 결과를 출력
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    int num;
    int win = 0, draw = 0, lose = 0;
    char* arr[4] = { "가위", "바위", "보" };

    while (lose == 0) {  //사용자가 질 때까지
        printf("가위는 0, 바위는 1, 보는 2: ");
        scanf_s("%d", &num);

        if (num<3) {  
        	//컴퓨터는 0~2사이의 랜덤한 숫자
            srand((int)time(NULL) + num); 
            int com_num = rand() % 3;

            printf("당신은 %s선택, 컴퓨터는 %s선택, ", arr[num], arr[com_num]);
            if (num - com_num == 0) printf("비겼습니다.\n");
            else if (num - com_num == -1 || num - com_num == 2) {
                printf("당신이 졌습니다.\n");
                lose++;
            }
            else if (num - com_num == -2 || num - com_num == 1) {
                printf("당신이 이겼습니다. \n");
                win++;
            }

        }else {
            printf("잘못된 입력입니다.\n");
        }
    }

    printf("\n게임의 결과 : %d승, %d무\n", win, draw);

    return 0;

}

 

 결과 판독법은. 경우의 수를 따져서 컴퓨터가 이기는 경우, 사용자가 이기는 경우에 관해서 살펴 봤다. 

 

 


 

도전 6

  숫자 맞추기 게임(야구게임)을 컴퓨터와 할 수 있도록 프로그램을 작성

  컴퓨터는 0에서 9까지 서로 다른 세 개의 숫자를 고르고 사용자는 이것을 맞추기
  [조건]
  - 숫자의 순서도 정확히 맞춰야 함
  - 사용자가 예상한 숫자를 입력할 때마다 컴퓨터는 입력된 숫자와 컴퓨터 자신이 생각한 숫자가 얼마나 비슷한지 알려줘야함.
      - 컴퓨터가 1, 4, 9 이고 사용자가 4, 0, 9
          -  두개의 숫자 4, 9가 일치
              - 9는 숫자와 위치까지 일치(1 strike)
              - 4는 숫자만 일치(1 ball)
  - 이 때 몇 번만에 3 strike를 얻었는지도 출력
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void){
    int pc[3];
    int score[2] = { 0, 0 };  // Strike Ball 
    int count = 1;

    srand((int)time(NULL));
    printf("숫자 맞추기 게임을 시작합니다.\n");

    int n = 1;
    while (n) {
        int n1 = rand() % 9;
        int n2 = rand() % 9;
        int n3 = rand() % 9;

        //세 수가 모두 다를 때
        if (n1 != n2 && n1 != n3 && n2 != n3) {
            pc[0] = n1;
            pc[1] = n2;
            pc[2] = n3;
            n = 0;
        }
    }

    // printf("%d %d %d \n", pc[0], pc[1], pc[2]);

    while (score[0] != 3) {
        score[0] = 0;
        score[1] = 0;

        int user[3];

        printf("[%d판 진행] 0~9까지 서로다른 숫자 3자리를 입력해주세요: ", count);
        scanf_s("%d %d %d", &user[0], &user[1], &user[2]);

        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                if (pc[i] == user[j]) {  //배열 안에 사용자가 입력한 수가 있는지
                    if (i == j) {        //인덱스가 똑같은 지(같은 위치)
                        score[0] += 1;
                    }else {
                        score[1] += 1;
                    }
                }
            }
        }
        printf("결과: %d Strike, %d Ball \n", score[0], score[1]);
        count += 1;
    }

    printf("3 Strike \n");

    return 0;
}