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