整理电脑,突然翻出一道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;
}
运行结果: