下面的这个程序会对一手牌进行读取和分类,手中的每张牌都有花色,(方块、梅花、红桃和黑桃)和等级(23456789JQKA)。不允许使用王牌,并且假设A是最高等级的。程序读取一手五张牌,然后把手中的牌分成下列某一类(列出的顺序从最好到最坏) 
1、同花顺(顺序相连又都是同花色)
2、四张(4张牌等级相同)
3、葫芦(3张是同样的花色,而另外2张牌是同样的花色)
4、同花(5张牌是同花色的)
5、顺子(5张牌的等级顺序相连)
6、三张(3张牌的等级相同)
7、两对
8、一对(两张牌的等级相同)
9、其他
为了便于输入 ,把牌的等级和花色简化如下(字母可以是大小写):
等级:2 3 4 5 6 7 8 9 t j q k a 
花色:c d h s 
如果用户输入非法牌或者输入同一张牌两次,程序将把此牌忽略掉,产生出错信息,然后要求输入另一张牌。如果输入20而不是一张牌,将会导致程序终止。
程序任务:
1、 读入一手五张牌(read_cards函数)
2、 分析对、顺子等情况(analyse_hand函数)
3、 显示一手牌的分类(print_result函数)
/***********************************************************************************/
/* Classifies a poker hand */
#include<stdbool.h>/*C99 only */
#include<stdio.h>
#include<stdlib.h>
#define NUM_RANKS 13
#define NUM_SUITS 4
#define NUM_CARDS 5
/* external vaviables */
int num_in_rank[NUM_RANKS];
int num_in_suit[NUM_SUITS];
bool straight,flush,four,three;
int pairs;
void read_cards();
void analyze_hand();
void print_result();
int main()
{
    for(;;)
    {
        read_cards();
        analyze_hand();
        print_result();
    }
    return 0;
}
void read_cards()
{
    bool card_exists[NUM_RANKS][NUM_SUITS];
    char ch,rank_ch,suit_ch;
    int rank,suit;
    bool bad_card;
    int cards_read=0;
    for(rank=0;rank<NUM_RANKS;rank++)
    {
        num_in_rank[rank]=0;
        for(suit=0;suit<NUM_SUITS;suit++)
          {
          card_exists[rank][suit]=false;
          }
    }
    for(suit=0;suit<NUM_SUITS;suit++)
      num_in_suit[suit]=false;
    while(cards_read<NUM_CARDS)
    {
        bad_card=false;
        printf("Please input a card:");
        rank_ch=getchar();
        switch (rank_ch)
        {
            case '0':         exit(EXIT_SUCCESS);
            case '2':              rank=0;break;
            case '3':              rank=1;break;
            case '4':              rank=2;break;
            case '5':              rank=3;break;
            case '6':              rank=4;break;
            case '7':              rank=5;break;
            case '8':              rank=6;break;
            case '9':              rank=7;break;
            case 'k': case 'K':    rank=8;break;
            case 't': case 'T':    rank=9;break;
            case 'j': case 'J':    rank=10;break;
            case 'q': case 'Q':    rank=11;break;
            case 'a': case 'A':    rank=12;break;
            default:               bad_card=true;
        }
        suit_ch=getchar();
        switch (suit_ch)
        {
            case 'c':case 'C':  suit=0;break;
            case 'd':case 'D':  suit=1;break;
            case 'h':case 'H':  suit=2;break;
            case 's':case 'S':  suit=3;break;
            default:            bad_card=true;
         }
         while((ch=getchar())!='\n')
        {
           if(ch!=' ')
             bad_card=true;
        }
         if(bad_card)
           printf("Bad card.ignored.\n");
         else
         {
           if(card_exists[rank][suit])
             printf("Duplicate card;ignored.\n");
         else
          {
            num_in_rank[rank]++;
            num_in_suit[suit]++;
            card_exists[rank][suit]=true;
            cards_read++;
          }
         }
    }
}
void analyze_hand()
{
    int num_consec=0;
    int rank,suit;
    straight=false;
    flush=false;
    three=false;
    pairs=0;
    for(suit=0;suit<NUM_SUITS;suit++)
    {
        if(num_in_suit[suit]==NUM_CARDS)
        {
            flush=true;
        }
    }
    rank=0;
    while(num_in_rank[rank]==0)
    {
      rank++;
    }
    for(;rank<NUM_RANKS && num_in_rank[rank]>0;rank++)
    {
        num_consec++;
    }
    if(num_consec==NUM_CARDS)
    {
        straight=true;
        return;
    }
    for(rank=0;rank<NUM_RANKS;rank++)
    {
        if(num_in_rank[rank]=4)
          four=true;
        if(num_in_rank[rank]=3)
          three=true;
        if(num_in_rank[rank]=2)
          pairs++;
    }
}
void print_result()
{
    if(straight&&flush)
      printf("staight flush");
    else if(four)
      printf("Four of a kind");
    else if(three&&pairs==1)
      printf("FUll house");
    else if(flush)
      printf("Flush");
    else if(straight)
      printf("straight");
    else if(three)
      printf("Three of a kind");
    else if(pairs==2)
      printf("Two pairs");
    else if(pairs==1)
      printf("Pairs");
    else
      printf("High card");
    printf("\n\n");
}
/************************************************************************************/