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;
}
}
공부하는 과정입니다. 오류가 있을 수 있습니다!