ページ 11

トランプ

Posted: 2016年1月10日(日) 23:21
by T.Tanaka
手助けお願い致します。

ジョーカーを除くトランプ52枚全部のラインナップをすべて表示したいです。
例えば、スペードならば
SA S2 S3 ・・・ S10 SJ SQ SK
というような感じで出力したいです。
これをスペード(S)、ハート(H)、クラブ(C)、ダイヤ(D)全てで同じように出力したいです。
また、このプログラムを作るにあたって1から52の数字を出力するプログラムは載せておきますので参考にできればと思います。

コード:

#include <stdio.h>

int main(void)
{
 int a;
 int count = 0;

 for(a = 1; a <= 52; a++)
 {
  printf("%3d", a);
  count++;

  if(count == 13)
  {
   printf("\n");
   count = 0;
  }
 }

 return 0;
}
さらに、このプログラムとは別に違うプログラム上でSA S2 S3 ・・・ S10 SJ SQ SKと出力したものを実際のトランプカードをシャッフルするように出力したいです。
つまり、こんな感じです。
S7 HK CA H5 ・・・ SA D10
実際のトランプカードでもそうですが、重複は無しでお願いします。こちらはrandなどを使うのは大体予想できるのですが、これ以上考えても思いつかないため、手助け願います。

あと、シャッフルしない方のプログラムは一つだけ条件があります。
以下の構造体を使ってのプログラムでお願いしたいです。

コード:

typedef struct card
 {     
int id; /* 52枚のカードに割り振る番号 0〜51 */     
int suit_code; /*(0=スペード, 1=ハート, 2=クラブ, 3=ダイヤ) */     
int rank; /* カードの数字 1〜13 */     
char symbol[10]; /* スートとランクの組 (例:"SA ","S10","SJ ","SQ ","SK ") */ 
} CARD; 
申し訳ありませんが、できるだけ早めの対応をお願い致します。

Re: トランプ

Posted: 2016年1月11日(月) 17:10
by Bull
構造体は使っていないので、あまり参考にならないかもしれませんが。

コード:

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

#define SUIT(c) ((c) / 13)                  //絵柄を決定
#define RANK(c) ((c) % 13)                  //番号を決定

void shuffle (int array[], int n)
{
    while (n > 1)
    {
        int temp;
        int k = rand( ) % n;
        n--;
        temp     = array[n];
        array[n] = array[k];
        array[k] = temp;
    }
}

#define CARDS 52
int main(void)
{
    int     i;
    char    *suit[] = {                 //絵柄
        "S", "H", "C", "D"
    };
    char    *rank[] = {                 //番号
        "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"
    };
    int     deck[CARDS];                //52枚のカード
    srand((unsigned int)time(0));       //乱数列を初期化

    for (i = 0; i < CARDS; ++i)         //カードを初期化
        deck[i] = i;

    shuffle(deck, CARDS);               //シャッフル

    for (i = 0; i < 52; ++i) {          //すべてのカードを表示
        printf(i % 13 == 12 ? "%s%-2s\n" : "%s%-2s ", suit[SUIT(deck[i])], rank[RANK(deck[i])]);
    }
    return 0;
}

Re: トランプ

Posted: 2016年1月12日(火) 09:15
by T.Tanaka
Bullさん、回答ありがとうございます。
しかし、構造体を使ってないと駄目みたいなので、構造体を使った状態でお願いしたいです。
また期限が明日までなので、申し訳ありませんが早めにお願いします。

Re: トランプ

Posted: 2016年1月12日(火) 10:04
by usao
オフトピック
>あと、シャッフルしない方のプログラムは一つだけ条件があります。
>以下の構造体を使ってのプログラムでお願いしたいです。

シャッフルしない方…ということは単に羅列して表示するだけなんですよね?
一体どこで何のためにこの構造体を用いるのでしょう?
そういう指定のような事柄がなく,漠然と構造体を使えとだけ言われているのでしょうか?
(表示していくだけなら,あなたが提示したコードのように,素直に表示のためのコードを書けばよい気がするので
 構造体の出る幕が無いような…?)

Re: トランプ

Posted: 2016年1月12日(火) 10:45
by T.Tanaka
usaoさん
構造体を使わなくていいならばBullさんのようなプログラムで十分なのですが、構造体を使用する事が必須条件なので、、、構造体を使った状態でお願いしたいです。

Re: トランプ

Posted: 2016年1月12日(火) 10:47
by T.Tanaka
あと、シャッフルする方も引き続き構造体が必須条件でしたのでお願いします。

Re: トランプ

Posted: 2016年1月12日(火) 14:33
by かずま
T.Tanaka さんが書きました:あと、シャッフルする方も引き続き構造体が必須条件でしたのでお願いします。
構造体を使っています。while文を削除すればシャッフルしません。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define T0(x) x,x+1
#define T1(x) T0(x),T0(x+2)
#define T2(x) T1(x),T1(x+4)
#define T3(x) T2(x),T2(x+8)
#define T4(x) T3(x),T3(x+16)
#define T5(x) T4(x),T4(x+32)

int main(void)
{
    static char d[] = { T5(0) };
    struct { char c; } t;       // 構造体
    int i, n = 52;

    srand(time(0));
    while (n > 1) i = rand()%n--, t.c = d[n], d[n] = d[i], d[i] = t.c;
    for (i = 0; i < 52; i++)
        printf("%c%.2s%c", "SHCD"[d[i]/13],
            "A 2 3 4 5 6 7 8 9 10J Q K " + d[i]%13*2, " \n"[i%13==12]);
    return 0;
}
このまま提出すると、「なんだね。これは?」と説明を求められますよ。

Re: トランプ

Posted: 2016年1月12日(火) 14:39
by かずま
かずま さんが書きました:構造体を使っています。while文を削除すればシャッフルしません。
すみません。構造体の定義が与えられていたんですね。
見落としていました。これは駄目です。

Re: トランプ

Posted: 2016年1月13日(水) 02:52
by かずま
構造体の配列で、初期値を持っていれば簡単です。
途中を省略しているのでこれを補ってください。

コード:

typedef struct card {     
    int id;         /* 52枚のカードに割り振る番号 0~51 */     
    int suit_code;  /*(0=スペード, 1=ハート, 2=クラブ, 3=ダイヤ) */     
    int rank;       /* カードの数字 1~13 */     
    char symbol[4]; /* スートとランクの組 (例:"SA ","S10","SJ ","SQ ","SK ") */ 
} CARD;

CARD card[] = {
    {  0, 0, 1, "SA " },
    {  1, 0, 2, "S2 " },
       :::
    { 48, 3,10, "D10" },
    { 49, 3,11, "DJ " },
    { 50, 3,12, "DQ " },
    { 51, 3,13, "DK " },
};
No.1 のプログラムで、a の代わりに i を 0 から 51 までにして、
printf("%s ", card.symbol); にすれば出来上がり。

シャッフルの処理は、

コード:

    srand(time(0));             // 乱数の初期化
    for (i = 0; i < 52; i++) {  // すべてのカードについて、
        int j = rand() % 52;    // 交換相手を乱数で求め、
        CARD  t = card[i];      // 交換することによって、
        card[i] = card[j];      // シャッフルを
        card[j] = t;            // 行ったことになる
    }
srand, rand を使うので、#include <stdlib.h> が必要。<time.h> も必要。
これらを元に完成したプログラムをここに、省略なしに書いてみてください。