利用結構體來實現高性能洗髮撲克牌程序同時探討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;
} 

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