4年前的一道面试题

整理电脑,突然翻出一道4年前的面试题,那是大四上学期,也就是寒冬时节,记得是在一个周末,地上还有积雪。学校图书馆举行校招,是省内的一些IT公司。现在回想看来,那时的我真是一无所知,要毕业了才开始看C语言的书,我一般把2010年9月,也就是大三上学期,看作是自己学编程的开始时间。

我当时能做出此题,是因为那时正好看完《C Primer Plus》中文版。题目是这样的:

现在有54张扑克牌(包含四个花色和大小王),通过使用结构体,枚举,进行随机发牌处理,一共发出3副牌,最后剩下3张作为底牌。即斗地主相似。


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

#define CARDNUM 52
#define KINGNUM 2
#define NAMELEN 5
#define QUIT 'q'
enum colors {spade,heart,diamond,club,black,red};
struct card{
    char *name;
    enum colors color;
    int value;
    int remain;
};
int init(int values[15],struct card cards[54],char names[14][5],enum colors color[6]);
int randomAssign(struct card cards[54],struct card player[3][17],struct card remain[3]);
int sort(struct card *player);
int printfColor(struct card c);
int printResult(struct card player[3][17],struct card remain[3]);
int sortResult(struct card player[3][17]);
int main(void)
{
    struct card player[3][17]={NULL};
    struct card remain[3]={NULL};
    enum colors s=spade,h=heart,d=diamond,c=club,r=red,b=black;
    enum colors color[6]={s,h,d,c,b,r};
    struct card cards[54] = {NULL};
    int values[15];
    char names[14][5]={"3","4","5","6","7","8","9","10","J","Q","K","A","2","JOKER"};

    do
    {
        system("cls");
        init(values,cards,names,color);
        randomAssign(cards,player,remain);
        sortResult(player);
        printResult(player,remain);
        printf("按q退出,按其他键重新发牌\n");
    }while(getchar()!='q');
    return 0;
}
int sortResult(struct card player[3][17])
{
    sort(&player[0]);
    sort(&player[1]);
    sort(&player[2]);
    return 0;
}
int printResult(struct card player[3][17],struct card remain[3])
{
    int i = 0,j=0;
    printf("-------------排序后的结果-------------\n");
    printf("%12s%12s%12s\n","玩家1","玩家2","玩家3");
    for(i=0;i<17;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("%10s",player[j][i].name);
            printfColor(player[j][i]);
        }
        printf("\n");
    }
    printf("\n%30s\n","剩下的三张底牌");
    for(i=0;i<3;i++)
    {
        printf("%10s",remain[i].name);
        printfColor(remain[i]);
    }
    printf("\n\n");
    return 0;
}
int printfColor(struct card c)
{
    switch(c.color)
    {
        case 0:printf("\006 ");break;
        case 1:printf("\003 ");break;
        case 2:printf("\004 ");break;
        case 3:printf("\005 ");break;
        case 4:printf("小");break;
        case 5:printf("大");break;
    }
    return 0;
}
int randomAssign(struct card cards[54],struct card player[3][17],struct card remain[3])
{
    time_t t;
    int i = 0,j=0;
    int randnum = 0;
    struct card c={NULL};
    srand((unsigned)time(&t));
    while(i<54)
    {
        while(1)
        {
            randnum = rand()%54;
            if(cards[randnum].remain!=0)
            {
                break;
            }
        }
        if(i<51)
        {
            player[i%3][j] = cards[randnum];
        }else
        {
            remain[i-51] = cards[randnum];
        }
        cards[randnum].remain = 0;
        i++;
        if(i%3==0)
        {
            j++;
        }
    }
    return 0;
}

int sort(struct card *player)
{
    int i=0,j=0,k=0;
    struct card temp;
    for(j=0;j<17;j++)
    {
        for(k=0;k<17-j-1;k++)
        {
            if(player[k].value>player[k+1].value)
            {
                temp = player[k];
                player[k] = player[k+1];
                player[k+1]=temp;
            }
        }
    }
    return 0;
}
int init(int values[15],struct card cards[54],char names[14][5],enum colors color[6])
{
    int i=0;
    for(i=0;i<15;i++)
    {
        values[i] = i;
    }
    for(i=0;i<54;i++)
    {
        if(i==52)
        {
            cards[i].name=names[13];
            cards[i].color = color[4];
            cards[i].value=values[13];
        }else if(i==53)
        {
            cards[i].name=names[13];
            cards[i].color = color[5];
            cards[i].value=values[14];
        }else
        {
            cards[i].name = names[i%13];
            cards[i].color = color[i%4];
            cards[i].value = values[i%13];
        }
            cards[i].remain = 1;
    }
    return 0;
}

运行结果:


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值