#include <stdio.h>
 #include <stdlib.h>
 #include <time.h>
 void shuffle(int [][13]);
 void print_trump(int [][13], int*, int*);
 int main(void){
    int trump_mark[4] = {100, 200, 300, 400};  //トランプの「柄」を格納する配列（print_trump関数内での表示用）
    int trump_num[13] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};   //トランプの「数字」を格納する配列（print_trump関数内での表示用）
    
    int deck[4][13]={0};  //52枚のトランプの各要素は、それぞれどのトランプなのか決まっている（例：deck[0][0]：ハートのエース）。この配列に順番を記録する
   
    srand(time(NULL));
    shuffle(deck);
    print_trump(deck, trump_mark, trump_num);
    
    return 0; 
}
void shuffle(int de[][13])   //初期化（すべての配列の値0）された（つまり、まだ引く順番が決まっていない）トランプを受け取る
{
    int card_num, row, column;
    
    for(card_num=1; card_num<=52; card_num++){  //シャッフルによって、デッキからランダムに引かれたトランプ（の要素）に1-52の数字を格納していく
        do{
            row = rand()%4;         //要素番号：0,1,2,3のいずれか1つを選択
            column = rand()%13;     //要素番号：0,1,2,3,4,5,6,7,8,9,10,11,12のいずれか1つを選択
           
        }while(de[row][column] !=0);    //選択したトランプ（例：エースの1）に「順番」が既に割り当てられているならやり直し（再度トランプを選択）
        
        de[row][column] = card_num;  //トランプの各要素に1-52までの番号を振る
    }
 }
 //card_numの番号通りにカードを表示する関数（シャッフルされたトランプを表示する関数）
void print_trump(int de[][13], int *tm, int *tn)
 {
    int card_num, row, column;
    
    for(card_num=1; card_num<=52; card_num++){
        for(row=0; row<4; row++){
            for(column=0; column<13; column++){
                if(de[row][column] == card_num){     //トランプが引かれる順番とcard_num番号が一致したら表示する
                    printf("%2d:%d-%d\n", card_num, tm[row], tn[column]);
                }
            }
        }
    }
 }