数据结构课程设计扑克牌的排序_第1页
数据结构课程设计扑克牌的排序_第2页
数据结构课程设计扑克牌的排序_第3页
数据结构课程设计扑克牌的排序_第4页
数据结构课程设计扑克牌的排序_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课课 程程 设设 计计 报报 告告 课程设计名称:数据结构课程设计数据结构课程设计 课程设计题目:扑克牌的排序扑克牌的排序 目目 录录 1 课程设计介绍课程设计介绍.1 1.1 课程设计内容.1 1.2 课程设计要求.1 2 课程设计原理课程设计原理.2 2.1 课设题目粗略分析.2 2.2 原理图介绍.2 2.2.1 功能模块图.2 2.2.2 流程图分析.3 3 数据结构分析数据结构分析.6 3.1 存储结构.6 3.2 算法描述.6 4 调试与分析调试与分析.12 4.1 调试过程.12 4.2 程序执行过程.12 参考文献参考文献.15 附附 录(关键部分程序清单)录(关键部分程序清单

2、).16 1 课程设计介绍课程设计介绍 1.1 课程设计内容课程设计内容 编写算法能够用基数排序算法对扑克牌进行排序。应能够选择按花色优 先或按面值优先,初始扑克牌牌序要求能自动生成(随机生成) 。 1.2 课程设计要求课程设计要求 1花色的符号可自定,输出要求给出初始牌序和结果牌序。 2参考相应资料,独立完成课程设计任务。 3交规范课程设计报告和软件代码。 2 课程设计原理课程设计原理 2.1 课设题目粗略分析课设题目粗略分析 根据课设题目要求,拟将整体程序分为三大模块。此三个模块相互独立, 没有嵌套调用的情况,以下是三个模块的大体分析: 1建立一个结构体数组存放整副扑克。 2根据要求的扑克

3、数及生成的随机数建立一个结构体数组存放需要排序 的扑克。 3用基数排序的方法对随机生成的扑克进行相应要求的排序 2.2 原理图介绍原理图介绍 2.2.1 功能模块图功能模块图 随机生成需排序的扑克 对扑克按花色优先排序 并输出 对扑克按面值优先排序并 输出 图 2. 1 功能模块图 初始化生成整副扑克 2.2.2 流程图分析流程图分析 1随机生成需排序的扑克函数流程图,如图 2.2 所示: y y 图 2.2 生成随机扑克的流程图 开始 i+ i=1 i=t n=rand() ri.huase=pokern.huase ri.num=pokern.num ri.order=pokern.ord

4、er ri.key0=pokern.huase ri.key1=pokern.order k=(n+2)%13 k=0,1,11,12 2111111 以%c 输出 value 以%d 输 出 value n 结束 ri.huase=pokern.huase ri.num=pokern.num ri.order=pokern.order ri.key0=pokern.huase ri.key1=pokern.order k=(n+2)%13 利用一个 for 循环及随机函数 rand(),利用每次循环生成的随机数对应的 数值 num 建立初始的无序扑克,同时将 huase、value 分别赋给

5、关键字 key0、 key1以对其进行排序 2. 对扑克进行花色优先排序的函数流程图,如图 2.3 所示: y 图 2.3 对扑克进行花色优先排序的流程图 开始 i=0 in-1 ri.next=i+1 i+ rn.next=0 i=0 i=1 调用 distribute()、 collect() 函数 i+ i!=0 输出人 ri.huase ri.value 结束 i=r0.next i y y n y n 对长为 n 的数组 r,利用 next 域建立为静态链表,进行关键字先 key1 (面值)后 key0(花色)的基数排序,排序后的数组按关键字 key0(花色) 优先的顺序存放,利用静

6、态链表依次将其输出。 3. 对扑克进行面值优先排序的函数流程图如图 2.4 所示: y 图 2.4 对扑克进行面值优先排序的流程图 开始 i=0 i=0 调用 distribute()、 collect() 函数 i- i!=0 输出人 ri.huase ri.value 结束 i=r0.next i y y n y n 对长为 n 的数组 r,利用 next 域建成静态链表,进行关键字先 key0 (花色)后 key1(面值)的基数排序,排序后的数组按关键字 key1(面值) 优先的顺序存放,利用静态链表依次将其输出。 3 数据结构分析数据结构分析 3.1 存储结构存储结构 typedef

7、struct int value ; / 扑克面值 char huase; / 扑克花色 int num; / 控制面值输出形式 int order; / 在同一花色扑克的位置 int key2; / 排序用的关键字 int next; / 下一个扑克的位置 apoker; / 定义一个结构体表示一张扑克 apoker poker52; / 定义一个大小为 52 的结构体数,组存放整副扑克 apoker unsortpokermax ; / 定义一个足够大的结构体数组,存放需排序的扑 克 typedef int tempradix; / 大小为关键字的基数的整形数组,用于基数排 序的分配、收集

8、 3.2 算法描述算法描述 1初始化建立扑克的算法描述说明如下: 结构体名定义为 apoker,poker52,unsortpokermax是 apoker 类型,对 其赋上每个结点的名字,每个名字对应自己的一个 num,以控制面值的输出 形式,value 对应扑克的面值,huase 对应扑克的花色。 for(i=0;i52;i+)/*建立整副扑克*/ j=i/13;/*将扑克分为四种花色*/ k=(i+2)%13; /*控制面值的输出形式*/ m=i%13;/*同一花色中所处的位置*/ pokeri.order=m; if(j=0) pokeri.huase=3;/*花色赋值*/ else

9、if(j=1) pokeri.huase=4; else if(j=2) pokeri.huase=5; else pokeri.huase=6; if(k=0) pokeri.value=75;/*面值赋值*/ else if(k=1) pokeri.value=65; else if(k=11) pokeri.value=74; else if(k=12) pokeri.value=81; else pokeri.value=k; pokeri.num=i; 2随机生成初始扑克的算法描述如下: 利用一个 for 循环及随机函数 rand(),利用每次循环生成的随机数对应的 数值 num 建

10、立初始的无序扑克,同时将 huase、value 分别赋给关键字 key0、 key1以对其进行排序。根据 num 控制扑克 value 的输出格式。 for(i=1;i=t;i+)/*生成 t 张扑克*/ n=rand()%51; /*随机生成 52 以内的数*/ unsortpokeri.huase=pokern.huase;/*结构体赋值*/ unsortpokeri.value=pokern.value; unsortpokeri.num=pokern.num; unsortpokeri.order=pokern.order; unsortpokeri.key0=unsortpoker

11、i.huase; /*关键字赋值*/ unsortpokeri.key1=unsortpokeri.order; k=(n+2)%13; /*用 num 控制 value 输出形式*/ if(k=0|k=1|k=11|k=12) printf (%c%c ,pokern.huase,pokern.value); else printf (%c%d ,pokern.huase,pokern.value); 3按第 i 个关键字对记录分配算法如下: 按第 i 位关键字 keyi建立 radix 个队列,同一队列中的 keyi相同。 headi和 taili分别指向各队列中第一个和最后一个记录。he

12、adj=0 表示相应 队列为空队列。 void distribute(apoker r,int i,temp head,temp tail) int j,p; for(j=0;jradix;j+) headj=0;tailj=0; /*将个队列初始化为空队列*/ p=r0.next; /*p 指向链表中的第一个记录*/ while(p!=0) j=rp.keyi;/*用记录中第 i 位关键字求相应队列号*/ if(headj=0) headj=p;/*将 p 所指向的结点加入第 i 个结点中*/ else rtailj.next=p; tailj=p; p=rp.next; 4将分配后记录收集

13、、连接算法如下: 从 0 到 radix-1 依次扫描各队列,将所有非空队列首尾相接,重新链接成 一个链表。 void collect(apoker r,temp head,temp tail) int j; int t; j=0; while(headj=0)/*找第一个非空队列*/ j+; r0.next=headj; t=tailj; while(jradix-1)/*寻找并串接所有非空队列*/ j+; while(jradix-1) if(headj!=0)/*链接非空队列*/ rt.next=headj; t=tailj; rt.next=0;/*t 指向最后一个非空队列中的最后一个

14、结点*/ 5按面值优先对扑克排序接算法如下: 对长为 len 的数组 r 进行关键字先 key0(花色)后 key1(面值)的基数排序, 排序后的数组按关键字 key1(面值)优先的顺序存放,利用 num 控制输出格 式将其输出。 void valuepresort(apoker r,int len) int i,n,k; n=len; temp head,tail; n=len; for(i=0;i=n-1;i+) ri.next=i+1;/*构造静态链表*/ rn.next=0; for(i=0;i=1;i+)/*从最低位关键字开始,进行分配收集*/ distribute(r,i,head

15、,tail); collect(r,head,tail); printf(按面值优先排序后的扑克:n); for(i=r0.next;i!=0;i=ri.next) k=(ri.num+2)%13; /*用 num 控制 value 输出形式*/ if(k=0|k=1|k=11|k=12) printf (%c%c ,ri.huase,ri.value); else printf (%c%d ,ri.huase,ri.value); 6按花色优先对扑克排序算法如下: 对长为 len 的数组 r 进行关键字先 key1(面值)后 key0(花色)的基数排序, 排序后的数组按关键字 key0(花色

16、)优先的顺序存放,利用 num 控制输出格 式将其输出。 void huasepresort(apoker r,int len) int i,n,k; n=len; temp head,tail; n=len; for(i=0;i=0;i-) /*从最低位关键字开始,进行分配收集*/ distribute(r,i,head,tail); collect(r,head,tail); printf(按花色排序后的扑克:n); for(i=r0.next;i!=0;i=ri.next) k=(ri.num+2)%13; /*用 num 控制 value 输出形式*/ if(k=0|k=1|k=11|

17、k=12) printf (%c%c ,ri.huase,ri.value); else printf (%c%d ,ri.huase,ri.value); 4 调试与分析调试与分析 4.1 调试过程调试过程 在调试过程中,使用函数 rand()时,出现rand : undeclared identifier,意识到 是由于没有添加#includes这个头文件造成的,修改后就可以运行了;还 有一个出现的问题是,在一个 for 循环中将 i 错写为 j,导致程序无法正常运行, 通过单步跟踪,找出问题。在字符 ch 的输入时少写了取地址符,使程序无法运 行,加上后程序运行正常。 4.2 程序执行过

18、程程序执行过程 首先要输入需生成的扑克数,如图 4.1 所示: 图 4.1 进入系统的界面 生成需要张数的扑克如图 4.2 所示: 图 4.2 随机生成的扑克 选择按花色优先排序后的扑克,如图 4.3 所示: 图 4.3 按花色优先排序后的扑克 选择按面值优先排序后的扑克,如图 4.4 所示: 图 4.4 按面值优先排序后的扑克 直到输入操作选 c 退出系统,算法结束。如图 4.5 所示: 图 4.5 退出系统后的界面 参考文献参考文献 1 严蔚敏,吴伟民.数据结构m.北京:清华大学出版社,2007. 2 张长海,陈娟.c 程序设计m.北京:高等教育出版社,2004. 3 谭浩强.c 程序设计

19、m.北京:清华大学出版社,2005. 4 苏士华,黄学俊.数据结构 解析.习题.课程设计m.合肥:中国科学技术大学 出版社,2009. 5 张瑞军.数据结构m. 北京:清华大学出版社,2009. 6 刘怀亮. 数据结构 习题解析与实验指导m. 北京:冶金出版社,2009. 附附 录(关键部分程序清单)录(关键部分程序清单) 程序代码程序代码 #include #include #include #define radix 13 typedef struct int value ; char huase; int num; int order; int key2; int next; apoke

20、r; apoker poker52; typedef int tempradix; apoker *createpoker(apoker unsortpoker,int t) int i,j,k,m; int n ; for(i=0;i52;i+) j=i/13;k=(i+2)%13; m=i%13; pokeri.order=m; if(j=0) pokeri.huase=3; else if(j=1) pokeri.huase=4; else if(j=2) pokeri.huase=5; else pokeri.huase=6; if(k=0) pokeri.value=75; else

21、 if(k=1) pokeri.value=65; else if(k=11) pokeri.value=74; else if(k=12) pokeri.value=81; else pokeri.value=k; pokeri.num=i; printf(随机生成的扑克:n); for(i=1;i=t;i+) n=rand()%51; unsortpokeri.huase=pokern.huase; unsortpokeri.value=pokern.value; unsortpokeri.num=pokern.num; unsortpokeri.order=pokern.order; u

22、nsortpokeri.key0=unsortpokeri.huase; unsortpokeri.key1=unsortpokeri.order; k=(n+2)%13; if(k=0|k=1|k=11|k=12) printf (%c%c ,pokern.huase,pokern.value); else printf (%c%d ,pokern.huase,pokern.value); return unsortpoker; void distribute(apoker r,int i,temp head,temp tail) int j,p; for(j=0;jradix;j+) he

23、adj=0;tailj=0; p=r0.next; while(p!=0) j=rp.keyi; if(headj=0) headj=p; else rtailj.next=p; tailj=p; p=rp.next; void collect(apoker r,temp head,temp tail) int j; int t; j=0; while(headj=0) j+; r0.next=headj; t=tailj; while(jradix-1) j+; while(jradix-1) if(headj!=0) rt.next=headj; t=tailj; rt.next=0; v

24、oid valuepresort(apoker r,int len) int i,n,k; n=len; temp head,tail; n=len; for(i=0;i=n-1;i+) ri.next=i+1; rn.next=0; for(i=0;i=1;i+) distribute(r,i,head,tail); collect(r,head,tail); printf(面值优先排序排序后的扑克:n); for(i=r0.next;i!=0;i=ri.next) k=(ri.num+2)%13; if(k=0|k=1|k=11|k=12) printf (%c%c ,ri.huase,r

25、i.value); else printf (%c%d ,ri.huase,ri.value); void huasepresort(apoker r,int len) int i,n,k; n=len; temp head,tail; n=len; for(i=0;i=0;i-) distribute(r,i,head,tail); collect(r,head,tail); printf(花色优先排序后的扑克:n); for(i=r0.next;i!=0;i=ri.next) k=(ri.num+2)%13; if(k=0|k=1|k=11|k=12) printf (%c%c ,ri.huase,ri.value); else printf (%c%d ,ri.huase,ri.value); void main() int i,n; char ch; apoke

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论