利用结构体来实现洗发扑克牌同时探讨const与指针
在之前的“对洗发扑克牌程序的个人理解”中我们用的是一个二维数组来实现52张牌的存放。在那个程序里,由于洗过的牌会被随机的重复选择,所以那个洗牌算法的执行时不确定的,即不确定性延迟。今天我们用结构体数组来表示52张牌,同时改进了之前的不确定延迟。
首先我们定义一个结构体来表示一张牌的信息。
typedef struct{
const char *face;
const char *suit;
}Card;
再定义一个有52个元素的数组Card pai[52],把一副牌存进数组。存牌函数可以利用循环来实现,即给数组中每个元素赋值。
void cunpai(Card *const pai,const char* face,const char *suit){
for(int =0;i<52;i++)
{
pai[i].face=face[i%13];
pai[i].suit=suit[i/13];
}
}
其中:
const char *suit[]={"红桃","黑桃","方片","梅花"};
const char *face[]={"一","二","三","四","五","六","七","八","九","十","勾","圈","k"} ;
洗牌的过程就是将每一张牌与一张随机的牌进行交换,
void xipai(Card *const pai){
int i;
int j;
Card temp;
for(i=0;i<52;i++)
{
j=rand()%52;
temp=pai[i];
pai[i]=pai[j];
pai[j]=temp;
}
}
发牌只需要输出数组元素即可:
void fapai(const Card *const pai){
for(int i=0;i<52;i++)
{
printf("%s %s %c",pai[i].suit,pai[i].face,(i+1)%2 ? '\t':'\n');
}
}
在程序里,我们用到了const:
Card *const pai表示pai是不可变的,*pai可变,即指向不可变,内容可变,也就是52张牌可以变化。
<span style="font-family: Arial, Helvetica, sans-serif;">const char* face 表示内容不可变,指向可变。</span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-family: arial, 宋体, sans-serif; line-height: 24px; text-indent: 28px;"><span style="color:#ff0000;"><span style="font-family: arial, 宋体, sans-serif; line-height: 24px; text-indent: 28px;">const Card* const pai </span>指针指向的变量的值不可变,指向也不可变,即洗完牌后就不改变牌了。</span></span></span>
完整程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct{
const char *face;
const char *suit;
}Card;
void cunpai(Card *const cpai,const char* cface[],const char *csuit[]){
for(int i=0;i<52;i++)
{
cpai[i].face=cface[i%13];
cpai[i].suit=csuit[i/13];
}
}
void xipai(Card *const pai){
int i;
int j;
Card temp;
for(i=0;i<52;i++)
{
j=rand()%52;
temp=pai[i];
pai[i]=pai[j];
pai[j]=temp;
}
}
void fapai(const Card *const pai){
for(int i=0;i<52;i++)
{
printf("%s %s %c",pai[i].suit,pai[i].face,(i+1)%2 ? '\t':'\n');
}
}
int main(void)
{
Card pai[52];
const char *suit[]={"红桃","黑桃","方片","梅花"};
const char *face[]={"一","二","三","四","五","六","七","八","九","十","勾","圈","k"} ;
srand(time(NULL));
cunpai(pai,face,suit);
xipai(pai);
fapai(pai);
return 0;
}