/*

 * cards_2.c

 * This program picks up five cards and prints them.

 */

 

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

 

/* The value of a card: A, 2-10, J, Q and K: */

enum _Value

{

  ACE = 1,

  TWO,

  THREE,

  FOUR,

  FIVE,

  SIX,

  SEVEN,

  EIGHT,

  NINE,

  TEN,

  JACK,

  QUEEN,

  KING

};

 

/* The possible suits. */

enum _Suit

{

  HEARTS,

  SPADES,

  DIAMONDS,

  CLUBS,

 

  N_SUITS

};

 

typedef enum _Value Value;

typedef enum _Suit  Suit;

 

/* A data structure for a card. */

struct _Card

{

  Value value;

  Suit  suit;

};

 

typedef struct _Card Card;

 

#define N_CARDS 5

 

int main ()

{

  Card       cards[N_CARDS];

  const char *suit_names[N_SUITS] = {"hearts", "spades", "diamonds", "clubs"};

  const char *name;

  int        is_unique;

  int        i, j;

 

  /* In order to get different cards each time: */

  srand (time (NULL));

 

  for (i = 0; i < N_CARDS; i++)

  {

    /* Pick up the current card. */

    do

    {

      cards[i].value = (Value)(1 + rand() % KING);

      cards[i].suit = (Suit)(rand() % N_SUITS);

     

      /* Make sure the card is unique. */

      is_unique = 1;

      for (j = 0; j < i; j++)

      {

        if (cards[i].value == cards[j].value &&

            cards[i].suit == cards[j].suit)

        {

          /* We already have this card: */

          is_unique = 0;

          break;

        }

      }

    } while (! is_unique);

 

    /* Print the card. */

    name = suit_names[cards[i].suit];

 

    switch (cards[i].value)

    {

    case ACE:

      printf ("A of %s", name);

      break;

 

    case JACK:

      printf ("J of %s", name);

      break;

 

    case QUEEN:

      printf ("Q of %s", name);

      break;

 

    case KING:

      printf ("K of %s", name);

      break;

 

    default:

      printf ("%d of %s", cards[i].value, name);

    }

    printf ("\n");

  }

 

  return (0);

}