利用结构体来实现高性能洗发扑克牌程序同时探讨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
- 利用结构体来实现高性能洗发扑克牌程序同时探讨const与指针
- 对洗发扑克牌程序的个人理解
- 程序性能优化探讨(3)——存储器层次结构与高速缓存
- C++中 const与指针的再探讨
- 高性能服务器探讨
- 利用cpu特性优化高性能程序
- const与const指针
- 探讨下关于CQRS架构如何实现高性能
- C++中指针,引用与const,以及const中的临时量对象的探讨
- 高性能ASP.NET应用程序的探讨与研究
- 高性能ASP.NET应用程序的探讨与研究
- 高性能ASP.NET应用程序的探讨与研究
- 指针:const与指针
- 第一天来认识认识指针与const
- 扑克牌生成与洗牌程序
- 从单链表创建中的内存变化来理解结构体指针与二级指针的用法
- 利用LVS+Keepalived 实现高性能高可用负载均衡
- 利用LVS+Keepalived 实现高性能高可用负载均衡
- 第8周项目5:定期存款利息计算器
- 一个简单的ACE网络库Server和Client Demo
- JMX(Java Management Extensions,即Java管理扩展)
- 枚举上月的日期
- 移动web前端开发之常见bug
- 利用结构体来实现高性能洗发扑克牌程序同时探讨const与指针
- Mac OS 中常用的svn命令
- network: Android 网络判断(wifi、3G与其他)
- div
- T售前经验谈
- 使用 VisualVM 进行性能分析及调优
- R语言注意事项列表
- 主流ETL工具选型
- 实现自己的strstr函数