풍성한 라벤더농장이 될때까지
article thumbnail

Card 정렬 (숫자 순 – 무늬 순)

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct card{
    int face;   //숫자
    int suit;   //무늬
};
typedef struct card CARD;

void init_deck(CARD arr[]);
void shuffle_deck(CARD arr[]);
void print_card(CARD *c);

void print_deck(CARD arr[]);
void sort(CARD arr[]);

int main(){
    CARD deck[52];

    init_deck(deck);

    shuffle_deck(deck);
    print_deck(deck);
    printf("\n");

    sort(deck);
    print_deck(deck);
    printf("\n");

    return 0;
}

void init_deck(CARD arr[]){
    int i, face, suit;
    i = 0;
    for(suit = 0; suit < 4; suit++){
        for(face = 1; face <= 13; face++){
            arr[i].suit = suit;
            arr[i].face = face;
            i++;
        }
    }

}

void shuffle_deck(CARD arr[]){
    int first, second;
    CARD s;
    srand(time(NULL));
    for(first = 0; first < 52; first++){
        second = rand()%52;
        s = arr[first];
        arr[first] = arr[second];
        arr[second] = s;
    }

}

void print_card(CARD *c){
    char *faces[] = { "", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
    char *suits[] = { "Hearts", "Diamonds", "Clubs", "Spades" }; 
    printf("%s-%s \t", faces[c -> face], suits[c -> suit]);

}

void print_deck(CARD arr[]){

    // 한 벌의 카드 출력
    // print_card()함수 이용
}

void sort(CARD arr[]){

    // arr[] 정렬
    // 첫번째 기준: 숫자
    // A, 2, 3, 4, ... ,J, Q, K
    // 두번째 기준(숫자가 동일할 떄): 무늬
    // Hearts, Diamonds, Clubs, Spades
}

위 코드에서 print_deck과 sort 부분을 완성시켜 카드를 숫자, 무늬 순으로 정렬시키는 과제.

결과가 이렇게 나오면 성공!

 


void print_deck(CARD arr[]){

    // 한 벌의 카드 출력
    // print_card()함수 이용
    int i;
    for(i = 0; i < 52; i++){
        print_card(&deck[i]);
        if(i % 4 == 3) printf("\n");
    }
}

void sort(CARD arr[]){

    // arr[] 정렬
    // 첫번째 기준: 숫자
    // A, 2, 3, 4, ... ,J, Q, K
    // 두번째 기준(숫자가 동일할 떄): 무늬
    // Hearts, Diamonds, Clubs, Spades
}

prog_2.c:73:21: error: use of undeclared identifier 'deck' print_card(&deck[i]); ^ 1 error generated.

바깥에 있는건 주소로 가져올수 없는 모양이다

 

prog_2.c:73:21: error: unexpected type name 'CARD': expected expression print_card(&CARD arr[i]); ^ 1 error generated.

저렇게 쓰는것도 아닌 모양이다

 

void print_deck(CARD arr[]){

    // 한 벌의 카드 출력
    // print_card()함수 이용
    int i;
    for(i = 0; i < 52; i++){
        print_card(&arr[i]);
        if(i % 4 == 3) printf("\n");
    }
}

print_deck 부분은 완성! 출력은 되었지만 아직 정렬되지 않은 모습. 이제 sort를 완성시켜서 올바르게 정렬시켜야 한다

 

 

void sort(CARD arr[]){

    // arr[] 정렬
    // 첫번째 기준: 숫자
    // A, 2, 3, 4, ... ,J, Q, K
    // 두번째 기준(숫자가 동일할 떄): 무늬
    // Hearts, Diamonds, Clubs, Spades

    int i, j, index;
    struct CARD temp;

    for(i = 0; i < 52; i++){
        index = i;
        for(j = i + 1; j < 52; j++){
            if(arr[index].face > arr[j].face)
            index = j;
        }
        temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
    }
}

prog_2.c:87:17: error: variable has incomplete type 'struct CARD' struct CARD temp; ^

prog_2.c:87:12: note: forward declaration of 'struct CARD' struct CARD temp;

typedef 문을 사용했던걸 신경쓰지 못했다, 아직 너무 초보적인 실수,,,

 

void sort(CARD arr[]){

    // arr[] 정렬
    // 첫번째 기준: 숫자
    // A, 2, 3, 4, ... ,J, Q, K
    // 두번째 기준(숫자가 동일할 떄): 무늬
    // Hearts, Diamonds, Clubs, Spades

    int i, j, index;
    CARD temp;

    for(i = 0; i < 52; i++){
        index = i;
        for(j = i + 1; j < 52; j++){
            if(arr[index].face > arr[j].face)
            index = j;
        }
        temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
    }
}

숫자 순서대로 정렬하는걸 성공했다. 이제 카드별로 정렬을 구현해야 한다.

 

void sort(CARD arr[]){

    // arr[] 정렬
    // 첫번째 기준: 숫자
    // A, 2, 3, 4, ... ,J, Q, K
    // 두번째 기준(숫자가 동일할 떄): 무늬
    // Hearts, Diamonds, Clubs, Spades

    int i, j, index;
    CARD temp;

    for(i = 0; i < 52; i++){
        index = i;
        for(j = i + 1; j < 52; j++){
            if(arr[index].face > arr[j].face)
            index = j;

            else if(arr[index].face = arr[j].face){
                if(arr[index].suit > arr[j].suit)
                index = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
    }
}

prog_2.c:95:37: warning: using the result of an assignment as a condition without parentheses [-Wparentheses] else if(arr[index].face = arr[j].face){

~~~~^ prog_2.c:95:37: note: place parentheses around the assignment to silence this warning else if(arr[index].face = arr[j].face){

^ ( ) prog_2.c:95:37: note: use '==' to turn this assignment into an equality comparison else if(arr[index].face = arr[j].face){

^ == 1 warning generated.

 

부호 사용에 주의하자.

값이 같을 때 ==

 

void sort(CARD arr[]){

    // arr[] 정렬
    // 첫번째 기준: 숫자
    // A, 2, 3, 4, ... ,J, Q, K
    // 두번째 기준(숫자가 동일할 떄): 무늬
    // Hearts, Diamonds, Clubs, Spades

    int i, j, index;
    CARD temp;

    for(i = 0; i < 52; i++){
        index = i;
        for(j = i + 1; j < 52; j++){
            if(arr[index].face > arr[j].face)
            index = j;

            else if(arr[index].face == arr[j].face){
                if(arr[index].suit > arr[j].suit)
                index = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
    }
}

구현 성공!

 


전체 코드

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

struct card{
    int face;   //숫자
    int suit;   //무늬
};
typedef struct card CARD;

void init_deck(CARD arr[]);
void shuffle_deck(CARD arr[]);
void print_card(CARD *c);

void print_deck(CARD arr[]);
void sort(CARD arr[]);

int main(){
    CARD deck[52];

    init_deck(deck);

    shuffle_deck(deck);
    print_deck(deck);
    printf("\n");

    sort(deck);
    print_deck(deck);
    printf("\n");

    return 0;
}

void init_deck(CARD arr[]){
    int i, face, suit;
    i = 0;
    for(suit = 0; suit < 4; suit++){
        for(face = 1; face <= 13; face++){
            arr[i].suit = suit;
            arr[i].face = face;
            i++;
        }
    }

}

void shuffle_deck(CARD arr[]){
    int first, second;
    CARD s;
    srand(time(NULL));
    for(first = 0; first < 52; first++){
        second = rand()%52;
        s = arr[first];
        arr[first] = arr[second];
        arr[second] = s;
    }

}

void print_card(CARD *c){
    char *faces[] = { "", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
    char *suits[] = { "Hearts", "Diamonds", "Clubs", "Spades" }; 
    printf("%s-%s \t", faces[c -> face], suits[c -> suit]);

}

void print_deck(CARD arr[]){

    // 한 벌의 카드 출력
    // print_card()함수 이용
    int i;
    for(i = 0; i < 52; i++){
        print_card(&arr[i]);
        if(i % 4 == 3) printf("\n");
    }
}

void sort(CARD arr[]){

    // arr[] 정렬
    // 첫번째 기준: 숫자
    // A, 2, 3, 4, ... ,J, Q, K
    // 두번째 기준(숫자가 동일할 떄): 무늬
    // Hearts, Diamonds, Clubs, Spades

    int i, j, index;
    CARD temp;

    for(i = 0; i < 52; i++){
        index = i;
        for(j = i + 1; j < 52; j++){
            if(arr[index].face > arr[j].face)
            index = j;

            else if(arr[index].face == arr[j].face){
                if(arr[index].suit > arr[j].suit)
                index = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[index];
        arr[index] = temp;
    }
}

 

 

공부하는 과정입니다. 오류가 있을 수 있습니다!

profile

풍성한 라벤더농장이 될때까지

@그레이라벤더

느리지만 꾸준히 굴러서 큰 바다가 되고싶은 개발 어린이