利用结构体来实现高性能洗发扑克牌程序同时探讨const与指针

利用结构体来实现洗发扑克牌同时探讨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;
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章