数据结构课程设计纸牌游戏.docx
《数据结构课程设计纸牌游戏.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计纸牌游戏.docx(29页珍藏版)》请在冰豆网上搜索。
数据结构课程设计纸牌游戏
攀枝花学院
学生课程设计(论文)
题目:
纸牌游戏
学生姓名:
00000学号:
2
所在院(系):
数学与计算机学院
专业:
网络工程
班级:
2012级1班
指导教师:
李世文职称:
教授
2014年01月03日
攀枝花学院教务处制
攀枝花学院本科学生课程设计任务书
题 目
纸牌游戏
1、课程设计的目的
通过本课程设计教学所要达到的目的是:
培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)
任务:
编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:
这时正面向上的牌有哪些?
3、主要参考文献
[1]《数据结构》(C语言版),严蔚敏,清华大学出版社,2003.
[2]《数据结构题集》,严蔚敏,清华大学出版社,2005.
[3]《数据结构》(C语言版),刘大有,高等教育出版社,2004.
[4]《DataStructurewithC++》,WilliamFord.WilliamTopp,清华大学出版社,2003.
4、课程设计工作进度计划
序号
时间(天)
内容安排
备注
1
1
分析设计准备
周一
2
2
编程调试阶段
周二至周三
3
1
编写课程设计报告
周四
4
1
考核
周五
总计
5(天)
指导教师(签字)
日期
年月日
教研室意见:
年月日
学生(签字):
接受任务时间:
年月日
注:
任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表
题目名称
纸牌游戏
评分项目
分值
得分
评价内涵
工作
表现
20%
01
学习态度
6
遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。
02
科学实践、调研
7
通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。
03
课题工作量
7
按期圆满完成规定的任务,工作量饱满。
能力
水平
35%
04
综合运用知识的能力
10
能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。
05
应用文献的能力
5
能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。
06
设计(实验)能力,方案的设计能力
5
能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。
07
计算及计算机应用能力
5
具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。
08
对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)
10
具有较强的数据收集、分析、处理、综合的能力。
成果
质量
45%
09
插图(或图纸)质量、篇幅、设计(论文)规范化程度
5
符合本专业相关规范或规定要求;规范化符合本文件第五条要求。
10
设计说明书(论文)质量
30
综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11
创新
10
对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名:
年 月 日
摘要
数据结构课程是计算机专业中必修的核心课程之一,也是一门理论性很强的一门课程,同时也是一门锻炼程序涉及能力的实践课程,“数据结构”成为计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其它理工专业的热门选修课。
主要包括线性表、树和二叉树以及图等基本类型的数据结构。
数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和运算等的学科,包括数据的逻辑结构、数据的存储结构和数据的运算这三个方面的内容,其中逻辑结构可分为线性结构和非线性结构;存储结构可分为顺序存储和链式存储两类,图则属于逻辑结构中的非线性结构。
广度优先搜索(BFS)用的队列一步一步完成的,从而找到的是最短路径。
纸牌游戏课程设计包括纸牌信息的建立、了解其翻拍的原理、并简明阐述翻牌的具体步骤与流程、最后输出与打印翻牌结果,整个过程使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
掌握一般软件设计的基本内容和设计方法,培养学生进行规范化软件设计的能力。
而且使学生掌握使用各种计算机资料和有关参考资料的方法,提高学生进行程序设计的基本能力。
关键词:
数据结构,纸牌游戏,BFS,遍历
Abstract
Datastructurecourseisoneofrequiredcorecurriculumincomputermajor,courseisaverypractical,isalsoanexerciseprograminvolvestheabilitytopracticecurriculum,"hasbecomeanimportanttheoreticalandtechnicalfoundationofcomputerprogramdesigndatastructure",itisnotonlythecorecourseofcomputerscience,andhasbecomeahotelectivecourseforothersciencemajors.Mainlyincludesthebasicdatastructuretypelineartable,treeandbinarytreeandgraphoftwo.Datastructureisaresearchofnoncomputerprogramofnumericalcalculationdesignproblemsinoperatingtheobjectsandtheirrelationshipsandoperationsandotherdisciplines,includinglogicstructure,storagestructureanddataoperationdataofthethreeaspectsofcontent,thelogicalstructurecanbedividedintolinearandnonlinearstructures;storagestructurecanbedividedintosequentialstorageandchainstoretwo,graphbelongstononlinearstructureinthelogicalstructure.Breadthfirstsearch(BFS)withcohortcompletedstepbystep,soastofindtheshortestpath.
AcardgameSolitaire,curriculumdesignincludesinformationaboutitsprinciple,andexpoundstheflopremakeoftheconcretestepsandprocesses,thefinaloutputandprintflopresults,thewholeprocesstoenablestudentstounderstandandmasterthevariousbasicabstractdatatypescienceclasslogicalstructure,storagestructureandoperationoftherealizationofalgorithm,andtheirintheprocessofusingthemethod.Tomasterthebasiccontentandthegeneraldesignmethodofsoftwaredesign,trainingstudents'abilityofdesignsoftwarespecification.Andtomakethestudentsmastertheuseofvariouscomputerdataandmethodsforreference,toimprovethestudents'basicabilityofprogramdesign.
Keywords:
datastructure,cardgames,BFS,traversal
1前言
《数据结构》是软件工程专业的必修课之一,是一门综合性的专业基础课。
本课程较系统地介绍了软件设计中常用的数据结构以及相应的实现算法,如线性表、栈、队列、树和二叉树,图、检索和排序等,并对性能进行分析和比较,内容非常丰富。
1.1课题背景
“数据结构”旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运算,把现实世界中的问题转化为计算机内部的表示和处理,这是一个良好的程序设计技能训练的过程。
“数据结构”课程设计不仅可以帮助学生充分理解、巩固所学的基本概念、原理和方法,更重要的是能够针对实际问题来选择数据结构,设计相应的存储结构并加以实现,从而最终解决问题。
结合数据结构所学知识,要求学生用C语言编程实现一个简单的纸牌游戏设计。
1.2课程设计目的
(1)使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。
(2)使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。
(3)使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。
2相关技术分析
2.1概要设计
按照题目的要求,首先,应对52张牌进行编号并且保存它们的编号信息,编号的类型为整型,而对于这样固定的数据,使用整型数组是最好的,因此,我们需要在程序的开始定义一共整型的数组,同时,为了方便对翻转过程的记录,在定义记录编号信息的同时,定义一个与之相对应的标记数组,数组类型为整型。
该程序的核心为一个嵌套的循环,所以定义两个变量i,j作为循环条件。
接着开始对变量进行初始化,首先是编号信息数组,使用for循环对数组进行1到52的赋值,代表52张纸牌,然后对标记数组赋值,将数组内的所有的值初始化为零,方便在接下来的循环中统计每张牌的翻牌数。
数据初始化结束后,开始按照要求对纸牌进行翻转,在嵌套循环中,定义了一个全局变量Flag,值为-1,负数定义为向下,正数定义为向上,这样,翻转一次,即乘以Flag,同时,符合翻转条件时,标记数组相应的编号的纸牌翻牌次数+1。
当每个号码每次遇到是某个数的倍数时,都会相应的翻一次,这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两次,结果就只是要输出在经过各个不同次数的翻牌后,正面向上的牌都有哪几个。
举例说明一下,比如24,第一次它是2的倍数时要从正面翻到背面,当进行到3时,就又要从背面翻回来,而到4时还要在翻,同理呢,到6.8.12…它都要来回的翻。
如果它在多次的翻牌后,正面还向上了,那么它就是要输出的结果之一。
循环结束后,编号数组中的数据已经更新,因此对数组进行扫描,大于零的即为正面向上的纸牌,输出其编号即可,同时,输出标记数组中的值,显示每张牌的翻牌记录,方便观察或者寻找规律。
到此,整个题目结束。
2.2设计原始数据的输入及输出格式
原始数据要求输入纸牌的基础编号,编号的输入为整型。
输出的是经过规律翻转后正面向上的纸牌的编号。
输入的数据信息如下:
纸牌:
1、2、3……、51、52。
问题直观分析表:
1
2
3
4
5
6
7
8
9
10
11
12
……
1
2
√
√
√
√
√
√
3
√
√
√
√
4
√
√
√
5
√
√
6
√
√
7
√
8
√
9
√
10
√
11
√
12
√
……
……
……
……
……
……
(注:
图中“√”表示翻转一次。
)
2.3算法流程图
2.1:
算法设计图
3设计与实现
3.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;
}
}
3.2详细设计和编码
3.2.1定义全局变量:
作为判断纸牌是否向上的依据,我们需要定义一个全局变量Flag=-1,在循环中对所有纸牌进行操作。
3.2.1主要程序代码与分析如下:
#defineFlag-1
(考虑到最后要判断哪些纸牌是正面向上的,所以必须要有一共判断条件,因此定义一个全局变量作为正反面的判断条件。
)
voidmain()
{
inti,j,data[52],flag[52];
charm;
(在程序开始,建立了两个数组,一个存放52张牌的编号,另外一个存放相应编号的纸牌的翻牌记录,便于后面对翻牌次数的输出。
)
for(i=1;i<=52;i++)
{
data[i-1]=i;
(通过for循环,向数组中录入1-52个数,作为52张牌的编号,以便进行接下来的操作)
flag[i-1]=0;
(将flag数组中的相应编号纸牌的翻牌数初始化为0,在接下来的循环中,需要对翻牌次数进行统计。
)
}
for(i=2;i<=52;i++)
(嵌套循环的外循环,保证基数的循环。
)
{
for(j=1;j<=52;j++)
(嵌套循环的内循环,对每张纸牌进行基数的倍数条件判断)
{
if(j%i==0)
{
data[j-1]=data[j-1]*Flag;
flag[j-1]++;
(翻牌一次,则相应的标记数组中该编号的位置数值+1,即将翻牌次数记入flag数组中。
)
}
}
}
printf("最后所有正面向上的牌有:
");
for(i=0;i<52;i++)
{
if(data[i]>0)
(该题目中将大于零的编号定义为正面向上的纸牌的编号)
printf("第%d张牌",i+1);
}
printf("\n");
}
以上为程序主要代码的分析。
在程序中,主要还包括功能界面,如下:
printf("\t-----------------------------------------------------------\n");printf("\t-----------------------------------------------------------\n");
printf("\t---------欢迎进入纸牌游戏-----------\n");
printf("\t---------1.查看题目-----------\n");
printf("\t---------2.查看所有纸牌的翻牌次数-----------\n");
printf("\t---------3.查看指定编号纸牌翻牌记录-----------\n");
printf("\t---------4.查看最终正面向上的纸牌编号-----------\n");
printf("\t---------5.制作人信息-----------\n");
printf("\t---------0.按0键结束-----------\n");
printf("\t-----------------------------------------------------------\n");
printf("\t-----------------------------------------------------------\n");
同时,整个功能实现由do-while语句和switch语句组合而成,do-while语句可以保证界面最少运行一次,switch语句保证每个功能独立实现,通过choice的输入来进入不同的功能,同时在每个小的独立功能内,我都添加了独立判断是否回到主菜单的语句,如下:
printf("是否回到主菜单?
(Y/N):
");
n=getchar();
n=getchar();
if(n=='Y')break;
elseif(n=='N')
choice=0;
elseprintf("***********(提示:
输入错误,默认为继续。
)******\n");
整个do-while语句的结束条件为:
choice=0,所以如果用户输入为N,则直接将0赋值给choice,则符合循环结束的条件,则直接结束程序,如果输入为Y,则break,继续循环,输入错误,没有对choice任何的赋值操作,即不能满足结束条件,则无论输入什么都默认为继续,break后继续循环。
由于程序默认的将回车操作通过getchar()赋值给n,导致不能正常的实现下面的判断,而直接显示为输入错误,所以加入两个n=getchar()语句,保证第二句能够正确的实现功能,让用户自行输入条件,进行下一步的操作。
在整个程序中,存在着大量的输入判断条件,如下:
if(num<1&&num>52)
printf("\t输入错误!
\n");
这两句代码就是对输入的num值进行判断,由于纸牌序号为1-52,所以不在这个范围的值都为错误值,需要有一个错误信息的反馈,所以需要对输入的信息进行判断,然后通过不同的值对数据进行相应的操作,这对于程序的正确运行,有着至关重要的作用。
3.3上机调试过程
该程序任务相对比较简单,思路较明确。
在一开始编写代码的时候,在嵌套循环中,外循环for的条件(i=2;i<=52;i++),写成(i=1;i<=52;i++),导致对每个纸牌的翻转都多判断了一次,按照一开始定义的大于零的编号数为正面向上的条件,最后输出的结果正好相反,经过修改调试后,问题解决。
在每个case中加入独立的判断是否回到主菜单的语句,一开始getchar()总是不能正确录入,没有输入就直接运行下一个语句,在加入控制语句后经过调试发现,程序把上一个输入的回车直接默认赋值给getchar(),导致没有输入,直接进行下一个语句,后来使用了两个连续的getchar()语句,第一个getchar()语句默认为回车,但是后面一个getchar()语句可以正确的重新输入判断值,经过重新的调试,运行正常,问题解决,但是希望能找到更完善的答案。
在判断是否继续输入纸牌编码的功能中,同样遇到了这个问题,按照相同的解决办法解决。
整个程序由一个大的do-while语句和switch语句组合实现界面的不同功能,do-while语句通过choice=0作为结束的条件,在case3中,有一个小的do-while语句实现纸牌编号的重复输入,在整个程序中有很多信息的输入,需要根据输入的信息正确与否来反馈信息,否则会导致程序出错,所以在调试的过程中加入了很多判断条件,可以解决信息输入错误的情况,但是仍然存在输入非整型值程序出错的问题,所以在输入条件中加入提示信息,以保证信息类型输入正确。
5测试结果及其分析
1.测试结果如下图5.1-5.11;
2结果分析以注释的形式写在图的下方;
图5.1:
MessageBox制作的一个欢迎提示
5.2:
纸牌游戏程序的主功能界面
5.3:
纸牌游戏程序功能1:
查看题目
5.4:
纸牌游戏程序功能2:
查看所有纸牌的翻牌次数
5.4.1:
续5.4
第一章题目与要求
5.4.2:
续5.4
5.5:
纸牌游戏程序功能3:
查看指定编号纸牌翻牌记录
5.6:
纸牌游戏程序功能4:
查看最终正面向上的纸牌编号
5.7:
纸牌游戏程序结束画面
5.8:
主界面输入错误提示
5.9:
功能3输入错误提示以及判断是否需要继续查询纸牌编码
5.10:
回主菜单判断以及输入错误提示
5.11:
功能5输出制作人信息
6用户使用说明
用户运行程序,按操作提示进行操作。
程序运行环境VC++6.0。
7源代码
见附录
结论
这个学期是我第一次接触《数据结构》,在完成设计的过程中,我遇到了一系列的问题,能明显感觉到自己在很多方面的不足,但另一方面,问题是要分析解决的,找出问题以便为完善学习计划,改变学习内容与方法提供实践依据。
所以在整个过程中,我不断加深了对数据结构的理解与一些程序写书时要注意的事项,体会了《数据结构》这门课程在解决现实生活问题上的可行性,也更进一步地激发了我的学习热情。
做一个课程设计要注意很多方面,无论是格式,还是书写的内容和要表达的思想都得严格要求自己,所以做起来真的不算容易。
本次课程设计涉及了很多知识,由于往日没有学得很扎实,对某些问题仍然比较疑惑,所以要进行充足的补习。
期间,我翻阅了很多书籍,知识总是联系很紧密的,