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

来源:互联网 发布:linux远程连接工具 编辑:程序博客网 时间:2024/04/30 12:52

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

0 0
原创粉丝点击