《数据结构课程设计--纸牌游戏.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计--纸牌游戏.docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据结构课程设计-纸牌游戏 学生课程设计(论文) 题目:数据结构课程设计 纸牌游戏 学生姓名:学号: 所在院(系): 专业: 班级: 指导教师:职称: 年月日 课程设计(论文)指导教师成绩评定表 攀枝花学院本科学生课程设计任务书 摘要 数据结构课程是计算机专业中必修的核心课程之一,也是一门理论性很强的一门课程,同时也是一门锻炼程序涉及能力的实践课程,此次课程设计从数据结构的基本特点出发,结合数据结构中经常涉及到的指针、数组以及链表循环结构等。 纸牌游戏课程设计包括纸牌信息的建立、了解其翻拍的原理、并简明阐述翻牌的具体步骤与流程、最后输出与打印翻牌结果,整个过程使学生进一步理解和掌握课堂上所学各
2、种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。掌握一般软件设计的基本内容和设计方法,培养学生进行规范化软件设计的能力。而且使学生掌握使用各种计算机资料和有关参考资料的方法,提高学生进行程序设计的基本能力。 关键词数据结构,纸牌游戏,C语言,代码 目录 摘要 (4) 1前言 (6) 1.1 问题提出 (6) 1.2 涉及知识点 (6) 2 功能设计 2.1. 程序设计内容功能实现分析 (7) 2.2.程序设计内容功能实现与打印 (7) 3 程序代码设计 (10) 4 程序测试与结果分析 (11) 4.1 结果与分析 (11) 4.2程序调试情况 (12) 5
3、课程设计总结 (13) 6参考文献 (14) 7附页 (14) 1前言 1.1 问题提出 “数据结构”旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据逻辑结构和存储结构,以及相应的运算,把现实世界中的问题转化为计算机内部的表示和处理,这是一个良好的程序设计技能训练的过程。“数据结构”课程设计不仅可以帮助学生充分理解、巩固所学的基本概念、原理和方法,更重要的是能够针对实际问题来选择数据结构,设计相应的存储结构并加以实现,从而最终解决问题。结合数据结构所学知识,要求学生用C语言编程实现一个简单的纸牌游戏设计。 纸牌游戏程序通过测试,能够正常运行,任务:编号为1-52张牌
4、,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;.再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:这时正面向上的牌有哪些? 输出的纸牌号为: 1 4 9 16 25 36 49 1.2 涉及知识点 结构、数组、循环、函数、分支、指针 1.3 功能要求 纸牌游戏基本内容具体要求包扩: (1)建立纸牌信息完成对编号为1-52张牌编码,假定正面向上; (2)从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌
5、; (3)然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌; (4)然后从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌,再依次5的倍数的牌翻一次,6的,7的直到以52为基数的 翻过 2 功能设计 2.1 算法设计 1.程序设计内容功能实现分析 当每个号码每次遇到是某个数的倍数时,都会相应的翻一次,这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两次,结果就只是要输出在经过各个不同次数的翻牌后,正面向上的牌都有哪几个。 举例说明一下,比如24,第一次它是2的倍数时要从正面翻到背面,当进行到3时,就又要从背面翻回来,而到4时还要在翻,同理呢,到 6.8
6、.12它都要来回的翻。如果它在多次的翻牌后,正面还向上了,那么 它就是要输出的结果之一。 2.程序设计内容功能实现与打印 用#define OPPOSITE(i) i = i?0:1这个宏将牌的状态标志求反,也即为翻牌操作。 将所有的牌建立一个数组,运用for的循环嵌套执行以下操作:把52张牌初始化成正面朝上、控制基数和翻牌次数,判断最终的纸牌朝向并打印出结果,具体实现算法参看详细设计。 2.2 程序流程图 3 程序代码设计 #include #define OBVERSE 0 /正面朝上 #define ADVERSE 1 /背面朝上 #define OPPOSITE(i) i = i?0:
7、1 /这个宏是将牌的状态标志求反,也即为翻牌操作 void main() int card52;/52张牌 for (int i = 0; i 52; i+) cardi = OBVERSE; /将52张牌初始化成正面朝上 for (int j=2; j=52; j+) /此层循环是控制基数的 for (int k = j; k = 52 ; k+)/此层循环是控制从第几张牌开始 if (k%j = 0)/判断第k张牌除以基数j后的余数是否为0,如为0就是能整除 OPPOSITE(cardk-1);/翻牌 for (int h = 0; h 52; h+)/开始打印 if (cardh = O
8、BVERSE)/判断牌的状态是否为正面朝上 printf(第%d张牌正面朝上n, h+1); 4 程序测试与结果分析 4.1 结果与分析 1时间复杂度是O(52)。 2虽然本次程序的题目难度与其他问题相比不是很高,但仍有很多问题是很容易忽视的,其一:在理解题目的要求时,翻牌的次数可能有多次;其二:for循环的嵌套使用在书写时很容易漏掉大括弧。 3运用更多的基础算法,使得程序和算法思想得到更好的表现,为增强算法的可读性,则算法改进如下: #include void main() int i,j,card52; for(i=0;i52;i+)/52张牌所有状态均为1,即均为正面 cardi=1; for(j=2;j=52;j+) /对52张牌(序号放在i里)对2,3.52(放在j里)按i+1是否是j的倍数进行状态翻转。 for(i=0;i52;i+) if(i+1)%j=0) cardi=cardi?0:1; printf(positive card are:); for(i=0;i52;i+)/对翻转处理后状态仍然是正面的(card保持为1)的将其编号输出。 if(cardi) printf(%d ,i+1);