数据结构纸牌游戏课程设计报告
纸牌游戏实验报告
纸牌游戏实验报告篇一:纸牌游戏Go Fish实验报告纸片游戏Go Fish课程设计一目的通过对GO FISH的课程设计,明白数据结构设计理念,理解并掌握链表的操作,进一步的了解数据结构的含义。
二需求分析决定玩家的数量,先简单化,建立两个玩家,完成设计;1、确定数据结构模版;2、建立数据结构类型;3、完成数据操作;4、确立算法设计。
三概要设计1、数据结构设计该课程设计采用链表和类相结合模式,建立牌堆和牌操作的链表结构:class Card{public:};牌堆类:采用整型数组建立牌堆,并用随机数打乱牌序。
class Node{public:Node(); Node(int value,Node *next);//初始化节点构造函数 int ListLength(Node* L); //链表的计数 int Search(Node* L , int num); //链表的查找Node* head_Insert(Node* head , int num);//从表头插入节点Node* Delete(Node* head , int num); //删除节点 void Print(Node *head);//链表输出 int card_num; char clore; Node *Link; void NewCard();//新建牌 void Shuffle();//洗牌int Licensing(int n);//发牌int CARD_A[52]; private: private:采用链表结构方式,来构造玩家手牌。
用链式结构进行操作进行删除和插入。
2、算法函数int Scoring(NodePtr &player,int score)//计分;int Players_operations(NodePtr &player1,NodePtr &player2,int Choose,int i,Card CardBign)//玩家操作;两个函数分别用来计算与进行牌的操作。
纸牌游戏实验报告doc
纸牌游戏实验报告doc
一、实验目的
本次实验的目的是培养学生对智能程序设计的基础知识,系统学习程序设计语言,并运用程序设计语言实现纸牌游戏的实现。
二、实验环境
本次纸牌游戏实验在Windows操作系统相关环境下使用VisualC#进行开发。
三、实验内容
(一)游戏规则
纸牌游戏是一种简单的游戏,其规则比较容易理解和记忆:首先,将所有的纸牌洗牌混乱,然后随机发牌给两个玩家,给每个玩家发5张牌,每个玩家只能看自己发的纸牌,其他没有看到,然后玩家们根据每张牌的花色和点数进行比大小,谁的牌大谁就赢。
(二)程序设计
本次实验主要实现了纸牌游戏的功能,包括:洗牌,发牌,输入牌,比牌,及比赛结果的输出等功能。
洗牌:此功能用于洗牌,算法思想是遍历整个牌组,从中随机选择一张牌,将其移至数组末端,再次随机选择,直到所有的牌组都完成洗牌。
发牌:此功能用于抽取纸牌,算法思想是从洗牌后的牌组中随机抽取5张牌发给玩家,最后将玩家手中的牌组保存到数据结构中,完成发牌功能。
数据结构与算法课设-纸牌游戏21点
目录备注: (2)一、游戏简介 (2)二、设计要求 (2)2.1 问题描述 (2)2.2 要求分析 (2)三、程序功能 (3)3.1 程序的主要功能描述 (3)3.2序流程图 (3)3.3主界面 (4)3.4功能测试 (4)四、源程序 (6)五、课设心得 (14)备注:由于这次课设开始时以为可以做其他题目,知道周四才知道不行。
但我的21点一几个基本成型,因此没有继续改动,希望老师能够理解。
一、游戏简介又名黑杰克,起源于法国,现已流传到世界各地。
现在在世界各地的赌场中都可以看到二十一点,随着互联网的发展,二十一点开始走向网络时代,比如菲律宾的博彩公司就有该游戏。
该游戏由 2 到 6 个人玩,使用除大小王之外的52 张牌,游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大。
有着悠久的历史。
1700年左右法国赌场就有这种21点的纸牌游戏。
1931年,当美国内华达州宣布赌博为合法活动时,21点游戏第一次公开出现在内华达州的赌场俱乐部,15年内,它取代掷骰子游戏,而一举成为非常流行的赌场庄家参与的赌博游戏。
二、设计要求编写程序实现游戏,该程序是模拟古老的“21点纸牌游戏”,实现一对一的人机大战。
要求游戏过程中任意一方牌的点数之和超过 21 点,则自动出局;在不超过 21 点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
2.1 问题描述本次C++课程设计题目是“21点纸牌游戏”,系统的主要功能是娱乐游戏,有电脑和玩家一起玩这个游戏,玩家设法使自己的牌达到总分21并要比电脑开的点数大而且不超过这个数值。
扑克牌的分值取它们的面值。
J,Q,K分别是11, 12和13分。
2.2 要求分析编写程序实现游戏,该程序是模拟古老的“21点纸牌游戏”,实现1对1的人机大战。
要求游戏过程中任意一方牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
数据结构课程设计报告—纸牌游戏
课题设计2:扑克牌游戏1、问题描述编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:这时正面向上的牌有哪些?存储结构:源程序:#include <stdio.h>void main(){int i,j,a[52];for(i=2;i<=52;i++)for(j=i-1;j<52;j+=i)a[j]=!a[j];printf("正面向上的牌有:");for(i=0;i<52;i++)if(a[i])printf("%4d",i+1);}测试结果:正面向上的牌有:1 4 9 16 25 36 49算法的时间复杂度:T(n)=O(n2)课题设计3:joseph环一. 需求分析:利用单向循环链表存储结构模拟此过程,按照出列的顺序输出各个人的编号。
首先创建一个空链表,初始化链表,构造出一个只有头结点的空链表,建立好一个约瑟夫环。
1. 输入的形式和输入值的范围本程序中,输入报数上限值m和人数上限l,密码,均限定为正整数,输入的形式为一个以“回车符”为结束标志的正整数。
2. 输出的形式从屏幕显示出列顺序。
3. 程序功能提供用户从键盘输入,Joseph约瑟夫环的必要数据,并显示出列顺序。
二、概要设计以单向循环链表实现该结构。
1. 抽象数据类型的定义为:ADT LNode{数据对象:D={ai | ai∈CharSet,i= 1,2,…,n,n≥0}数据关系:R1={< ai-1 ,ai > | ai ∈D,I=2,…,n} 三.源程序:#include<stdio.h>#include<stdlib.h>typedef struct Node{int key;//每个人持有的密码int num;//这个人的编号struct Node *next;//指向下一个节点}Node,*Link;void InitList(Link &L) //创建一个空的链表{L=(Node *)malloc(sizeof(Node));if(!L) exit(1);L->key=0;L->num=0;L->next=L;}void Creater(int n,Link &L) //初始化链表{Link p,q;q=L;for(int i=1;i<=n;i++){p=(Node *)malloc(sizeof(Node));if(!p) exit(1);printf("the key_%d is:",i);scanf("%d",&p->key);p->num=i;L->next=p;L=p;}L->next=q->next;free(q);}void main(){Link L,p,q;int n,x;L=NULL;InitList(L);//构造出一个只有头结点的空链表printf("please input the totle number of people:"); scanf("%d",&n);//总共的人数nprintf("the start key is:");scanf("%d",&x);//初始密码为xCreater(n,L);//建立好一个约瑟夫环p=L;for(int i=1;i<=n;i++){for(int j=1;j<x;j++)p=p->next;q=p->next;x=q->key;printf("%d ",q->num);p->next=q->next;free(q);}}四、测试数据:m的初值为20,n=7 ,7个人的密码依次为3,1,7,2,4,7,4输出:6 7 4 1 5 3 2课题设计4:商品货架管理1、需求分析:设计一个算法,每一次上货后始终保持生产日期越近的商品越靠近栈底。
纸牌游戏课程设计
攀枝花学院课程设计题目:纸牌游戏的设计与实现院(系):年级专业:姓名:学号:指导教师:二〇〇九年十二月十四日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书注:任务书由指导教师填写。
摘要纸牌游戏是数据结构大作业中比较经典的一个大作业,通过此课程设计能够启发我们的思维,对数据结构中的函数有更加清楚的认识,建立我们对数据结构的兴趣,通过此课程设计设同时也能够使我们对各方面的知识有了更加全面的认识与了解,丰富了我们的知识面,扩展了我们的思维。
通过课程设计的实践,我们可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
当前计算机软件技术和网络技术正飞速发展,软件系统日趋大型化、复杂化,软件对于一个计算机系统是至关重要的。
因此社会对软件开发者提出了比以往更高的要求,相应的系统要求也有了很大的提高。
本系统用C++作为程序语言,设计出的系统功能强大,操作方便灵活。
关键词纸牌游戏,数据结构,软件,系统-Ⅰ-目录摘要 (Ⅰ)1需求分析 (1)1.1需求来源 (1)1.2设计目的 (1)1.3设计要求 (1)2 功能需求描述 (1)3 总体设计 (1)3.1设计思想 (1)3.2系统模块结构 (2)3.3 系统总设计流程图 (2)4 概要设计 (4)4.1抽象数据类型定义 (4)4.2本程序所包含模块 (5)4.3系统功能的实现 (5)5 模块设计 (6)5.1洗牌模块 (6)5.2翻牌模块 (6)6 运行与分析 (6)6.1运行结果 (6)6.2结果分析 (7)致谢 (8)参考文献 (9)源程序 (10)1 需求分析1.1需求来源在本系统的需求分析环节中,会对软件开发的意图、开发的目标、作用范围和有关该软件开的背景材料进行详细的分析。
纸牌游戏作为一个用来娱乐的应用软件,在对其进行需求分析的过程中,需用要充分考虑系统的可用性和简单易用性,联系实际娱乐需要,从而得到合理的需求分析结论。
1.2设计目的该软件为用户提供一个在Windows系统上运行的纸牌游戏小系统。
纸牌游戏—数据结构实训报告
纸牌游戏—数据结构实训报告纸牌游戏—数据结构实训报告1. 项目背景和介绍1.1 项目背景在现代社会中,人们经常通过玩各种纸牌游戏来娱乐和消遣。
纸牌游戏可以帮助人们放松身心、提高思维能力和判断力。
为了更好地理解纸牌游戏的规则和操作方法,并掌握数据结构的应用,我们决定开展这个纸牌游戏的数据结构实训项目。
1.2 项目目标本项目的目标是设计并实现一个纸牌游戏系统,包括纸牌的洗牌、发牌和玩家的操作等。
通过这个项目,我们将学习和提高对数据结构的应用能力,同时也能够提高我们团队合作和项目管理的能力。
2. 需求分析2.1 功能需求2.1.1 纸牌洗牌功能实现纸牌的洗牌功能,确保每次发牌的牌都是随机的,避免出现重复或排序的情况。
2.1.2 纸牌发牌功能实现纸牌的发牌功能,能够按照规则将纸牌发给玩家,并保持每位玩家手中的牌都是不同的。
2.1.3 玩家操作功能实现玩家在游戏中的各种操作,如出牌、抽牌、跳过等,并能够根据规则进行相应的判断和处理。
2.1.4 游戏结束功能实现游戏的结束判断功能,当有玩家出完所有手牌时,游戏结束。
2.2 性能需求2.2.1 系统响应速度系统应能够在合理的时间内响应用户的操作,确保用户能够顺畅地进行游戏。
2.2.2 系统可扩展性系统应具备良好的可扩展性,方便后续的功能迭代和升级。
3. 系统设计3.1 数据结构设计3.1.1 纸牌数据结构设计设计一种合适的数据结构来表示一副纸牌,包括牌的花色、点数等信息,并能够支持洗牌、发牌和玩家操作等功能。
3.1.2 玩家数据结构设计设计一种合适的数据结构来表示玩家的手牌、出牌等信息,并能够支持玩家操作功能。
3.2 算法设计3.2.1 洗牌算法设计设计一种高效的洗牌算法,确保洗牌后每张牌的位置都是随机的。
3.2.2 发牌算法设计设计一种合理的发牌算法,保证每位玩家获得的牌都是不同的。
3.2.3 玩家操作算法设计设计一种算法来判断玩家的操作是否合法,并根据规则进行相应的处理。
纸牌游戏-课程设计报告
课程设计报告2009 ~2010 学年第2 学期课程数据结构与算法课程设计名称纸牌游戏2010年5月一、问题分析和任务定义1.题目:纸牌游戏2.要求和任务:①该题目的要求如下:(1)将52张牌编号。
(2)从2开始,依次作为基数对基数的倍数的牌进行翻转,直到以52为基数的翻转。
(3)最后输出正面向上的牌。
②基本任务为:(1)按照要求翻转纸牌。
(2)输出最后正面向上的纸牌的编号。
3.原始数据的输入及输出格式:原始数据要求输入纸牌的基础编号,编号的输入为整型。
输出的是经过规律翻转后正面向上的纸牌的编号。
输入的数据信息如下:纸牌:1、2、3……、51、52。
问题直观分析表:(注:图中“√”表示翻转一次。
)二.数据结构的选择和概要设计1.数据结构按照题目要求,整个主体包括一个嵌套的循环,外循环控制从2开始每张纸牌都作为基数进行翻牌,内循环控制对所有纸牌进行判断,如果是当前循环中基数的倍数,则对其进行翻转操作。
具体代码如下:for(i=2;i<=52;i++){for(j=1;j<=52;j++){if(j%i==0)data[j-1]=data[j-1]*Flag;}}2.概要设计按照题目的要求,首先,应对52张牌进行编号并且保存它们的编号信息,编号的类型为整型,而对于这样固定的数据,使用整型数组是最好的,因此,我们需要在程序的开始定义一共整型的数组,同时,为了方便对翻转过程的记录,在定义记录编号信息的同时,定义一个与之相对应的标记数组,数组类型为整型。
该程序的核心为一个嵌套的循环,所以定义两个变量i,j作为循环条件。
接着开始对变量进行初始化,首先是编号信息数组,使用for循环对数组进行1到52的赋值,代表52张纸牌,然后对标记数组赋值,将数组内的所有的值初始化为零,方便在接下来的循环中统计每张牌的翻牌数。
数据初始化结束后,开始按照要求对纸牌进行翻转,在嵌套循环中,定义了一个全局变量Flag,值为-1,负数定义为向下,正数定义为向上,这样,翻转一次,即乘以Flag,同时,符合翻转条件时,标记数组相应的编号的纸牌翻牌次数+1。
数据结构设计报告纸牌游戏
纸牌游戏一.需求分析1.编号为1-52张牌,正面向上2. 从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过3. 输出:这时正面向上的牌;4.测试数据52张牌二.概要设计1.数组抽象数据类型定义:ADT SqList{数据对象:ji=0,…,bi-1,i=1,2,…,n,D= {aj1j2…jn|n(>0)称为数组的维数,bi是数组第i维的长度, ji是数组第i 维的下标, aj1j2…jn∈ElemSet}数据关系:R={R1,R2,…,Rn}Ri={<aj1…ji…jn,aj1,…ji+1,…jn>|0≤jk≤bk-1,1≤k≤n且k≠I, 0≤ji≤bk-2, aj1…ji…jn,aj1,…ji+1,…jn∈D,i=2,…,n}基本操作:faceringt(L):操作结果:对纸牌进行翻转}ADT SqList2.本程序包含两个模块:(1)主程序模块void main(){定义一个二叉树;for(i=1;i<=52;i++){ L.r[i].num=i;L.r[i].visit=0;//用0来记正面}}(2)纸牌翻转模块——翻转纸牌各模块之间的调用关系如下:主程序模块纸牌翻转模块三.详细设计1.根据题目要求的数组存储结构#define MAXSIZE 100//给数组定义一个空间typedef struct{int num; //牌号int visit; //牌的正反面}RedType; //纸牌的信息typedef struct{RedType r[MAXSIZE+1]; //纸牌数组int length;}SqList;2.对纸牌进行翻转void faceringt(SqList L){for(i=2;i<=52;i++) //从第二张开始往后{for(j=i;j<=52;j++)if(L.r[j].num%i==0) //当是i的倍数时翻转{if(L.r[j].visit==0) //正面翻反面L.r[j].visit=1;elseL.r[j].visit=0;}}for(i=1;i<=52;i++) //显示正面号{if(L.r[i].visit==0)cout<<L.r[i].num<<" ";}cout<<endl;}3. 主函数void main(){for(i=1;i<=52;i++){L.r[i].num=i;L.r[i].visit=0;//用0来记正面}cout<<"这时是正面的编号为:"<<endl;faceringt(L);}4. 函数的调用关系反映了演示程序的层次结构主程序faceringt四. 调试分析1.用一个数组来存储52张牌2. 定义数组时由于每张牌要记录两个东西,就让每个数据包括两个数据项----纸牌号和记录纸牌正反面五.测试结果六. 附录(源代码)#include<iostream>#include<string>using namespace std;#define MAXSIZE 100//给数组定义一个空间typedef struct{int num; //牌号int visit; //牌的正反面}RedType; //纸牌的信息typedef struct{RedType r[MAXSIZE+1]; //纸牌数组int length;}SqList;//对纸牌进行翻转void faceringt(SqList L){int i,j;for(i=2;i<=52;i++) //从第二张开始往后{for(j=i;j<=52;j++)if(L.r[j].num%i==0) //当是i的倍数时翻转{if(L.r[j].visit==0) //正面翻反面L.r[j].visit=1;elseL.r[j].visit=0;}}for(i=1;i<=52;i++) //显示正面号{if(L.r[i].visit==0)cout<<L.r[i].num<<" ";}cout<<endl;}void main(){int i;SqList L;for(i=1;i<=52;i++){L.r[i].num=i;L.r[i].visit=0;//用0来记正面}cout<<"这时是正面的编号为:"<<endl; faceringt(L);}七. 心得体会。
纸牌游戏Go-Fish实验报告
CARD_A[i]=i;
}
洗牌操作,用随机数实现对数组的打乱操作:
void Card::Shuffle()
{ 中南民族大学计算机科学学院
专业 :软件工程 学 8
号:2012213660 姓名 :唐洁
int F_num,L_num; srand((int)time(NULL)); for(int i=0;i<52;i++) {
int Licensing(int n);//发牌
private:
int CARD_A[52];
};
class Node
{
public:
Node();
Node(int value,Node *next);//初始化节点构造函数
int ListLength(Node* L); //链表的计数
int Search(Node* L , int num); //链表的查找
专业 :软件工程 学 1
号:2012213660 姓名 :唐洁
牌堆类:采用整型数组建立牌堆,并用随机数打乱牌序。 class Node { public:
Node(); Node(int value,Node *next);//初始化节点构造函数 int ListLength(Node* L); //链表的计数 int Search(Node* L , int num); //链表的查找 Node* head_Insert(Node* head , int num);//从表头插入节点 Node* Delete(Node* head , int num); //删除节点 void Print(Node *head);//链表输出 private: int card_num; char clore; Node *Link; }; 采用链表结构方式,来构造玩家手牌。用链式结构进行操作进行 删除和插入。
数据结构课程设计-扑克牌的排序
课程设计报告课程设计名称:数据结构课程设计课程设计题目:扑克牌的排序目录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)附录(关键部分程序清单) (16)1 课程设计介绍1.1 课程设计内容编写算法能够用基数排序算法对扑克牌进行排序。
应能够选择按花色优先或按面值优先,初始扑克牌牌序要求能自动生成(随机生成)。
1.2课程设计要求1.花色的符号可自定,输出要求给出初始牌序和结果牌序。
2.参考相应资料,独立完成课程设计任务。
3.交规范课程设计报告和软件代码。
2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为三大模块。
此三个模块相互独立,没有嵌套调用的情况,以下是三个模块的大体分析:1.建立一个结构体数组存放整副扑克。
2.根据要求的扑克数及生成的随机数建立一个结构体数组存放需要排序的扑克。
3.用基数排序的方法对随机生成的扑克进行相应要求的排序2.2 原理图介绍2.2.1 功能模块图图2. 1 功能模块图2.2.2 流程图分析1图2.2生成随机扑克的流程图利用一个for循环及随机函数rand(),利用每次循环生成的随机数对应的数值num建立初始的无序扑克,同时将huase、value分别赋给关键字key[0]、key[1]以对其进行排序2. 对扑克进行花色优先排序的函数流程图,如图2.3所示:图2.3对扑克进行花色优先排序的流程图对长为n的数组R,利用next域建立为静态链表,进行关键字先key[1](面值)后key[0](花色)的基数排序,排序后的数组按关键字key[0](花色)优先的顺序存放,利用静态链表依次将其输出。
数据结构课程设计纸牌游戏
数据结构课程设计纸牌游戏一、课程目标知识目标:1. 学生能理解数据结构中栈和队列的基本概念及其在实际问题中的应用。
2. 学生能运用所学知识,设计并实现一个基于栈和队列的纸牌游戏。
3. 学生掌握栈和队列的操作原理,如入栈、出栈、入队、出队等基本操作。
技能目标:1. 培养学生运用数据结构解决实际问题的能力,提高编程技能。
2. 培养学生团队协作能力,通过小组合作完成纸牌游戏的设计与实现。
情感态度价值观目标:1. 学生能积极主动参与课程学习,培养对数据结构的兴趣和热情。
2. 学生在合作过程中,学会相互尊重、沟通与协作,培养良好的团队精神。
3. 学生通过解决实际问题,体会数据结构在实际应用中的价值,提高对计算机科学的认识。
课程性质:本课程为信息技术课程,以实践操作为主,结合理论讲解,帮助学生掌握数据结构的基本知识。
学生特点:学生为高中生,具备一定的编程基础和逻辑思维能力,对实际操作有较高的兴趣。
教学要求:教师需引导学生将所学知识应用于实际问题的解决,注重培养学生的动手能力和团队协作能力,使学生在实践中掌握数据结构的应用。
通过本课程的学习,学生应能够达到上述课程目标,实现具体的学习成果。
二、教学内容本课程教学内容主要包括以下几部分:1. 栈和队列的基本概念与性质- 栈的定义、特点及应用场景- 队列的定义、特点及应用场景- 栈与队列的异同点分析2. 栈和队列的操作原理- 栈的入栈、出栈操作- 队列的入队、出队操作- 栈与队列在实际问题中的应用案例分析3. 纸牌游戏设计与实现- 纸牌游戏规则设计- 使用栈和队列实现纸牌游戏的核心功能- 游戏界面设计及交互操作4. 编程实践- 使用教材指定的编程语言(如C++、Java等)进行编程实践- 学生分组合作,完成纸牌游戏的设计与实现- 教师指导与反馈,帮助学生优化代码和解决问题教学内容根据课程目标制定,注重科学性和系统性。
教学进度安排如下:1. 第1课时:栈和队列的基本概念与性质2. 第2课时:栈和队列的操作原理3. 第3课时:纸牌游戏规则设计4. 第4-6课时:编程实践,分组完成纸牌游戏设计与实现5. 第7课时:成果展示与评价,教师反馈与总结教学内容与教材关联紧密,旨在帮助学生将所学知识应用于实际问题解决,提高编程实践能力。
数据结构 纸牌游戏课程设计报告
桂林航天工业高等专科学校课程设计题目:纸牌游戏系别:计算机系专业:计算机应用技术姓名:***学号:************指导老师:**2010-12-28目录一.课程设计目的~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第3页二.课程设计目标~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第3页三.需求分析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第3页四.程序实现思想~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第3页五.设计说明~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第4页六.源代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第6页七.运行后的菜单展示~~~~~~~~~~~~~~~~~~~~~~~~~~~~第7页八.调试分析~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第7页九.课设总结~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~第8页一.课程设计目的:熟练掌握数据结构这门课程,掌握经性表、栈、队列、串、数组、广义表、树和二叉树以及图等基本类型的数据结构及其应用。
进一步熟悉抽象数据类型的定义和实现、如何利用数组的动态分酚实现顺序结构、继承的实现方式。
学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构、想念结构及基相应的算法并初步掌握算法的时间分析和空间分析的技术。
基本掌握程序设计的基本思路和方法。
利用所学的基本知识和技能,解决简单的程序设计问题各算法描述培养我们的数据抽象能力。
二.设计目标:题目:纸牌游戏任务:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:这时正面向上的牌有哪些?三.需求分析:用函数node()按照题目要求的规则,用几个循环体来实现.四.程序实现思想:首先必须确定实现这个课程设计的主算法是使用链式存储结构还是栈又或是数组和广义表。
数据结构课程设计报告-纸牌游戏
3.2错误分析在初次编写完成后出了一些语法和拼写上的小错误,导致运行结果不正确。
例如翻牌子程序中的用到了for循环:for(int i=2;i<k;i++) ,编译时没有错误,经验证,编号第52的牌应为反面朝上,因此上述运行结果并不正确。
于是我开始一句句研究代码,发现是循环条件出错了,应该为for(int i=2;i<=k;i++)。
出现这个错误是自己很大意,仿造上面的创建链表时的循环条件没有添加等于号而出错了。
这也警示我在编写代码时要边写边思考,防止出现大的错误。
3.3运行程序进入主界面后,用户可以根据窗口提示得到想要的结果。
即输入Y则运行该程序,得到所有正面朝上的牌的编号,输入Q则不运行该程序,退出运行窗口。
程序开始运行,进入界面,如图3所示。
图3程序开始界面用户想要执行程序,选择Y,进入下一界面,如图4所示。
图4执行程序界面用户不想要执行程序,选择Q,进入的界面,如图5所示。
图5不执行程序界面4设计体会设计一个程序需要按一个完整的步骤来进行。
首先必须弄懂程序要解决的是什么问题。
在弄懂之后大脑中就要开始构思要用是什么方法来解决问题,在此期间需要“不择手段”,就是可以问同学、老师或者查阅相关资料通过网络等等,动用一切渠道把握别人的精髓来解决问题。
完成后就要把方法赋之于行动,主要是画出流程图和结构图,依照图设计出解决问题的各种算法随后编写出程序。
最后完成调试和纠错。
这方,都觉得挺高兴的,只有经过这个过程才会提高自己的发现问题、分析问题、解决问题的能力,使得思维更加严谨。
虽然这次课程设计不是很难,不是做一个比较大的系统,代码不算多,但是我认为要成功地完成一个程序,包括完整的实验报告都要投入必要的时间和精力,认真对待,这样我们可以收获不少东西。
在这次程序设计中,遇到了许多的问题,深知自己学习的知识还远远不够。
这是一种全面综合训练,是与课堂听讲,自学和练习相辅相成的,必不可少的一个教学环节。
数据结构纸牌游戏课程设计报告
图1单链表结点数据类型
故可创建以单链表为存储结构的结构体,如下:
//自定义单链表结点数据类型
typedef struct node
{int number; //纸牌的编号
int times; //翻牌的次数
struct node *next; //指向下一个结点的指针
}LinkList;
2、概要设计
}LinkList;
2、子函数1:尾插法创建带有头结点的单链表LinkList *creat ()
首先建立一个只有头结点的空单链表,然后重复读入数据,,并将新结点总是插入到当前链表的表尾。建立的过程大致如下:一开始定义LinkList类型的三个指针变量*L、*R、*S:LinkList *L,*R,*S;L是头指针,R是尾指针。
定义了单链表中结点的数据类型后,接下来就要创建单链表。
(1)我选用的是尾插法创建带有头结点的单链表,首先建立一个只有头结点的空单链表,然后重复读入数据,,并将新结点总是插入到当前链表的表尾,在本实验中,读入52个数据则结束读入,该子函数的实现书上有源代码,比较简单。
(2)然后设计翻牌程序,本实验本来是要求输出翻牌51次之后所有正面向上的牌的编号,我自己加了另外的功能,即可以选择翻牌K(1<=K<=51)次之后输出所有正面向上的牌的编号。第一次从第二张牌开始,直到最后一张,是2的倍数的牌的翻牌次数加1;第二次从第三张开始,直到最后一张,是3的倍数的牌的翻牌次数加1;直到第K次,从第K+1张开始,直到最后一张,是K+1的倍数的牌的翻牌次数加1。
合肥学院
计算机科学与技术系
课程设计报告
2009~2010学年第二学期
课程
数据结构与算法
纸牌游戏 -数据结构与算法课程设计报告
合肥学院计算机科学与技术系课程设计报告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是奇数还是偶数也能处理问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、问题分析:编号为1的牌没有进行翻牌,即翻牌的次数为0,仍然为正面朝上;编号为2的牌在整个过程中只翻了一次,为反面朝上;编号为3的牌在整个过程中只翻了一次,为反面朝上;编号为4的牌在整个过程中翻了两次,为正面朝上;编号为5的牌在整个过程中翻了一次,为反面朝上;编号为6的牌在整个过程中翻了三次(由于6是2、3、6的倍数),为反面朝上;以此类推直至编号为52的牌,从上述过程可以总结出这样的规律:从编号为1的第一张牌到编号为52的最后一张牌,只要它翻过的次数为偶数则是正面朝上,反之则为反面朝上。因此我们可以依据每张牌翻过的次数来确定它最终是否为正面向上,从而输出实验所需要的结果:所有正面向上的牌的编号。
}LinkList;
2、子函数1:尾插法创建带有头结点的单链表LinkList *creat ()
首先建立一个只有头结点的空单链表,然后重复读入数据,,并将新结点总是插入到当前链表的表尾。建立的过程大致如下:一开始定义LinkList类型的三个指针变量*L、*R、*S:LinkList *L,*R,*S;L是头指针,R是尾指针。
}
5、主函数:void main( )
参照流程图具体主函数实现如下:
char ch;
int k;//K为翻牌次数
LinkList *List,*P;
printf("开始纸牌游戏吗?请输入Y或N\n");
scanf("%c",&ch);
while(1)
{
if(ch=='Y')
{
List=creat(); //将52张纸牌的信息用单链表存储
3、原始数据的输入、输出格式:用户选择开始游戏后,输入一个正整数K(1<=K<=51),窗口将显示翻牌K次之后所有正面向上的牌的编号,然后选择继续游戏或结束游戏。
二、数据结构的选择和概要设计
1、数据结构的选择
本实验可以选择顺序表或单链表存储52张纸牌的信息,我选用单链表这种数据结构来对52张牌进行链接存储。单链表是有限个具有相同类型的数据元素组成的链表,且该链表中的每一个结点只有一个指针域。根据第一部分的问题分析可知该单链表中每个结点应包括三个部分:存储该结点所对应的牌的编号信息number域、记录该结点所对应的牌的翻牌次数times域、存储其直接后继的存储位置的next域(指针域)。
}
printf("继续纸牌游戏吗?Y/N\n");
scanf("%s",&ch);
}
四、上机调试
1、调试的时候遇到的问题:
调试时遇到了一些语法错误,这些都很容易地解决了,在这里就不一一列举了。
图6运行时遇到的一个问题
可以看到输出两句“继续纸牌游戏吗”,然后自己对整个程序静态运行了一遍,觉得还是不应该输出两句“继续纸牌游戏吗?”,后来请教了班上的同学,他帮我解决了这个问题。在主函数里char ch,一开始scanf(“%c,&ch),选择是否开始游戏,进行了一次翻牌游戏之后,提醒用户再scanf(“%c,&ch),是否要继续游戏,同学说,这里的scanf(“%c,&ch)应改为scanf("%s",&ch);,至于为什么他也不清楚,只是自己以前遇到过这个问题。上网搜索之后也没查到为什么,但不管怎样该程序的运行问题还时解决了。
2、任务定义:实现本程序需要解决以下几个问题:
(1)如何存储52张牌,所选择的存储结构要便于实现题给要求的操作。
(2)如何设计翻牌程序。
(3)在经过所有的翻牌以后,如何知道每一张牌是否为正面向上。
(4)如何输出所有正面向上的牌的编号。
本问题的关键在于选择合适的数据结构存储52张牌,难点在于在所选的数据结构下实现题给要求的翻牌操作。最主要的难点在于如何设计翻牌程序。第二个难点在于所有的牌都进行了翻牌操作后,如何知道每一张牌是否为正面向上。
图9用户选择不执行此程序时界面显示
图10用户可以继续进行想要的选择时界面显示:
六、用户使用说明
进入主界面后,用户可以根据窗口提示得到想要的结果。首先窗口会提示用户是否要开始纸牌游戏,如果输入Y,再按ENTER键,则进入游戏,如果输入N,再按ENTER键,则结束游戏,并退出程序的运行。输入Y之后,按ENTER键,窗口会提示用户输入一个正整数K(1<=K<=51),按ENTER键,窗口将显示翻牌K次之后所有正面向上的牌的编号。窗口将提示是否要继续游戏,输入Y则又进入游戏,输入N则结束游戏,并退出程序的运行。
首先申请头结点空间:L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;R=L;
将结点链接成链表的核心操作如下:
for(int i=1;i<=52;i++) //用单链表存储52张纸牌的信息
{ S=(LinkList *)malloc(sizeof(LinkList));//申请新结点空间
printf("请输入正整数K(1<=K<=51),您将看到翻牌第K次之后的正面向上牌的编号\n");
scanf("%d",&k);
printf("第%d次翻牌之后,",k);
P=fanpai(List,k);//调用翻牌函数
print(P);//调用输出函数
}
else if(ch=='N')
{
printf("游戏结束!\n");break; //结束while循环
Q=Q->next; //Q指针后移
}
}
return(B);
4、子函数3:输出正面朝上的牌的编号函数voidprint(LinkList *A)
接着设计输出函数,从头至尾扫描链表,当链表中的结点的times为偶数时,即该张纸牌为正面向上,则输出该结点的number。
参照流程图具体输出函数实现如下:
定义一个LinkList类型指针q:LinkList *q;
七、参考文献
[1]《C程序设计》(第三版).北京:清华大学出版社,2005
[2]王昆仑,李红.数据结构与算法.北京:中国铁道出版社,2007
八、附录:带有注释的源程序
# include<stdio.h>
# include<malloc.h>
# include<stdlib.h>
参照流程图具体翻牌函数实现如下:
for(int i=1;i<=j;i++)
{
Q=B->next; //Q指向首元素结点
while(Q!=NULL)
{
if((Q->number)%(i+1)==0) //若牌的编号能被基数i+1整除,则使Q->times++
Q->times++; //Q指针指向的结点的翻牌次数加1
2、时间、空间性能分析:本算法的空间复杂度很低,只需要一个含有52个结点的单链表来存储已编号的52张牌。但是该算法的时间复杂度有点高,每个子函数中都用到了循环语句,尤其是在翻牌子程序中用到了双重循环。。
3、算法设计、调试的经验和体会:刚开始拿到这个问题时,对题目意思理解不清楚,感觉无从下手,自己对如何设计算法没有一点头绪。后来经过和同学讨论才理解清楚题目的具体意思,接着结合这学期学的数据结构与算法的只是一步步分析问题,并找到了解决问题的思路:用单链表去存储,既不耗费空间又方便操作。在确定了存储结构后,我感觉问题都迎刃而解,自己也信心倍增。在了解翻牌及结果如何表示的思想后,我画出了各程序流程图,很快编写了翻牌程序和输出结果的子程序。尽管刚开始时有一些语法和逻辑上的错误,但我仍然很高兴,因为这些可以经过不断调试去解决。和同学讨论后改正了所有错误,最终程序得以运行输出正确结果。
(3)接着设计输出函数,从头至尾扫描链表,当链表中的结点的times为偶数时,即该张纸牌为正面向上,则输出该结点的number。
(4)最后编写主函数,主函数中调用子函数,并输出一些提示信息。
为了实现程序所需的功能,程序中用到三个子函数和一个主函数:
子函数1:创建带有头结点的链表的函数creat()
子函数2:翻牌函数fanpai()
通过这次课程设计,我深知自己学习的知识还远远不够。这是一种全面综合训练,是与课堂听讲,自学和练习相辅相成的,必不可少的一个教学环节。这次的课程设计为以后的学习打下了坚实的基础。感谢老师给予我们这次机会,我会Biblioteka 续努力,在学习的这条路上不断攀登!
五、测试结果及分析
图7程序一开始运行界面显示
图8用户选择执行此程序时界面显示
count
图1单链表结点数据类型
故可创建以单链表为存储结构的结构体,如下:
//自定义单链表结点数据类型
typedef struct node
{int number; //纸牌的编号
int times; //翻牌的次数
struct node *next; //指向下一个结点的指针
}LinkList;
2、概要设计
4、经验和体会:做完本次实验我最大的体会是:设计一个程序需要按一个完整的步骤来进行。首先必须弄懂程序要解决的是什么问题,该问题可以分解成哪几个子问题,在弄清楚之后大脑中就要开始构思要用是什么方法来解决一个个子问题,在此期间需要“不择手段”,就是可以问同学、老师或者查阅相关资料通过网络等等,动用一切渠道把握别人的精髓来解决问题。完成后就要把方法赋之于行动,主要是画出流程图和结构图,依照图设计出解决问题的各种算法。只有经过自己独立思考,才会提高自己的发现问题、分析问题、解决问题的能力,使得思维更加严谨。虽然这次课程设计不是很难,不是做一个比较大的系统,代码不算多,但是我认为要成功地完成一个程序,包括完整的实验报告都要投入必要的时间和精力,认真对待,这样我们可以收获不少东西。