纸牌游戏 -数据结构与算法课程设计报告
时间:2026-04-30
时间:2026-04-30
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
合肥学院
计算机科学与技术系
课程设计报告
2009~2010学年第二学期
课学学专指
业导
班教生
姓
程 数据结构与算法
纸牌游戏 曾辉 0804012041 08计本(2)班 王昆仑 张贯虹
名 号 级 师
课程设计名称
2010年5月
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
题目:(纸牌游戏)编号为1~52张牌,正面向上,从第二张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后从第三张牌开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;直到以52为基数的翻过,输出:这时输出正面向上的牌有哪些?
1、问题分析和任务定义
此程序需要完成如下要求:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;直到以52为基数的翻过,最后输出正面向上的所有的牌。 实现本程序需要解决以下几个问题: 1、如何表示编号1-52张牌。 2、如何表示正反面。
3、如何用数学计算算法处理翻牌。 4、如何用嵌套的循环来模拟翻牌。 5、如何把符合条件的牌输出。
本程序的关键就在于用嵌套额度循环来模拟翻牌以及经过多次翻牌处理怎么知道最后正面向上的牌的编号。
首先对于前面的问题我采用用外循环表示基数(从2到52),内循环处理把属于基数倍数的牌处理。
重点在于后面怎么知道最后正面向上的牌的编号,联想到以前学C++的时候老师说的标志位,所有牌都正面向上,我就用key=1表示正面向上,未翻牌的就一直key=1,像编号为1的牌,经过翻牌就key=0此时表示经过翻牌,属于反面向上,依次类推,后面的翻牌的次数不断增加但是每翻牌一次key就变化一次,最后选择正面向上的牌,就用key=1来判断,这样处理就使问题变得很简单了。
当时也想到这样处理,用key表示翻拍的次数,刚开始都是正面向上,经过奇数次翻牌其效果就像是反面向上,经过偶数次翻牌就正面向上,每翻牌一次,key++,这样最后判断key是奇数还是偶数也能处理问题。但是经过和许多同学讨论,还是感觉前一种方式更能让大家接受。
2、数据结构的选择和概要设计
数据结构的选择:本程序采用了链表的存储方式,属于连接存储结构。
因为编号为1-52的52张牌不一定存储在物理位置相邻的存储单元中,且在翻牌操作时要对编号依次进行判断,用指针来进行操作很简单。选用单链表这种数据结构来对52张牌进行链接存储。单链表的逻辑结构是有限个具有相同类型的数据元素组成的链表,且该链表中的每一个结点只有一个指针域。根据问题分析可知该单链表的存储结构是:每个结点应包括三个域:存储该结点所对应的牌的编号信息data域、表示牌的正反面的标志的key域、存储其直接后继的存储位置的next域(指针域),其结点结构图如下(其中data、key为整型,next为指针类型):
该结点的数据类型用C语言描述如下:
typedef struct node //定义结点 {
int data;
int key; //标志位当key=1时 正面向上
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
struct node *next; }node; 概要设计:
主要流程:建立代表52张牌的链表—输出这52张牌—调用翻牌算法处理—输出翻牌之后的结果
第一、建立代表52张牌的链表
本程序采用的是尾插法建单链表算法 for(i=1;i<=52;i++) //建立链表 {
s=(node*)malloc(sizeof(node)); //动态申请存储空间 s->data=i;s->key=1;
p->next=s; p=s; //尾插法建单链表 }
p->next=NULL; //最后一个结点的next赋值为空,便于后面循环截止 第二、输出这52张牌
第三、调用翻牌算法进行翻牌处理。主要算法如下: void fanpai(node *p) //翻牌算法 {
node *p1,*p2;
for(p1=p->next;p1!=NULL;p1=p1->next) {
for(p2=p1;p2!=NULL;p2=p2->next) {
if(p2->data%p1->data==0) //是当前基础的倍数则翻牌 {
if(p2->key==0) p2->key=1;
else p2->key=0; } }}}
第四、输出翻牌后的结果
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
主函数流程图:
图 主函数流程图
数据结构与算法课程设计 实验报告 完整版 带概要分析 详细分析 源代码 测试 参考文献等
3、详细设计和编码
1、定义单链表结点类型:
typedef struct node //定义结点 {
int data;
int key; //标志位当key=1时 正面向上 struct node *next; }node;
2、子函数1:尾插法建立单链表
建立的过程大致如下:一开始定义node类型的三个指针变量 *head、*p、*q :node *p,*head,*s定义并初始化记录结点个数的变量i:int i=0;
首先申请第一个结点空间p=(node*)malloc(sizeof(node));并初始化head=NULL; 再把p的地址赋 …… 此处隐藏:2197字,全部文档内容请下载后查看。喜欢就下载吧 ……