题 目: 纸牌游戏
目录
一、 需求分析…………………………………………………3 二、 概要设计…………………………………………………3 三、 详细设计…………………………………………………4 四、 调试分析和测试结果……………………………………7 五、 总结………………………………………………………8 六、 参考文献…………………………………………………8 七、 致谢………………………………………………………8 八、 附录………………………………………………………9
一、 需求分析
按以下规则进行翻牌:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次, 直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的 直到 以52为基数的翻过,最后输出正面向上的牌有哪些?
用函数obv1 、obv2按照题目要求的规则,用for循环来实现.
二、 概要设计
1.当从第二个编号开始的每张牌每次遇到是其倍数时,都会相应的翻一次,这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两次,而结果只是要输出在经过各个不同次数的翻牌后,正面向上的牌都有哪几张。比如24,第一次它是2的倍数时要从正面翻到背面,当进行到3时,就又要从背面翻回来,而到4时还要在翻,同理呢,到6.8.12…它都要来回的翻。如果它在多次的翻牌后,正面还向上了,那么它就是要输出的结果之一。
2.建立代表52张牌的线性表——调用翻牌算法按照规则翻牌——输出翻牌算法的结果
最为主要的翻牌算法的实现: void obv2 (SqList L,int n) { }
for (int i=2;i<=n;i++) }
以上是通过for循环对是当前基数倍数的牌进行翻牌 3、根据算法思想,流程图如下:
for (int j=i;j<=L.length;j++)
if (j%i==0){
if (L.data[j]==1)
L.data[j]=0;
else if (L.data[j]==0)
L.data[j]=1;
开始 建立一个线性表L,将所有变量赋初值为0,表示牌正面向上 i>=2&&i<=52 j>=i&&j<=5222 j%i=0 翻牌,如果L.data[j]=1,则变为0 翻牌,如果L.data[j]=0,则变为1 j++ 输出线性表中正面向上的牌的编号 结束 三、详细设计 1、预处理
#include #define SIZE 100 //线性表存储空间的初始分配量 2、数据类型定义 定义一个结构体类型SqList,结构体中数组指针elem指示线性表的基地址,length指示线性表的当前长度。Listsize指示顺序表当前分配的存储空间大小,一旦因插入元素而空间不足时,可进行再分配。 typedef struct{ int * elem; //存储空间基址 int * data; int length; //当前长度 int listsize; //当前分配的存储容量 }SqList; 3、主要函数功能介绍 构造一个空的线性表L用来存储分配: void InitList_Sq(SqList &L) { // 构造一个空的线性表L。 L.elem = (int *)malloc(SIZE*sizeof(int)); if (!L.elem) cout<<\"ERROR\"; // 存储分配失败 L.data = (int *)malloc(SIZE*sizeof(int)); if (!L.data) cout<<\"ERROR\"; // 存储分配失败 L.length = 0; // 空表长度为0 L.listsize = SIZE; // 初始存储容量 } // InitList_Sq 调用PrintList_Sq函数用来显示线性表中的数据: void PrintList_Sq(SqList L) { //显示线性表中所有数据 for(int i=1;i<=L.length;i++) { if (L.data[i]==1) cout< 调用函数obv1,确保翻牌前每张牌都是正面向上: void obv1 (SqList L) { } 调用函数obv2,按照规则翻牌: void obv2 (SqList L,int n) { } for (int i=2;i<=n;i++) } for (int i=1;i<=L.length;i++) L.data[i]=1; cout< if (j%i==0){ if (L.data[j]==1) L.data[j]=0; else if (L.data[j]==0) L.data[j]=1; 4、主函数 void main() { SqList L; int n=52; InitList_Sq(L); } for(int i=1;i<=n;i++) { } obv1 (L); obv2 (L,n); cout<<\"正面向上的牌的编号是:\"< 四、调试分析和测试结果 在编写程序时应该用规范化的格式输入源程序,同时注意不要忘了编写头文件#include 在调用指针时应先将其初始化,如果没有初始化指针就调用它,这样很不安全,虽然你有时可以运行,却有了不安定的因素。如:int *data;可以成定义:int data [52];这里的data是一个常量地址,也是一个数组名,因此不用担心它没有 被初始化。 五、总结 通过这次的数据结构课程设计,我明显感觉到自己在很多方面的不足,但问题总是要解决的,必须找出问题然后将其一一解除。所以在整个过程中,我不断加深了对数据结构的理解与一些程序写书时要注意的事项,也让我对这门课程有了进一步的了解和认识。完成一个课程设计要注意很多方面,无论是格式、书写的内容还是要表达的思想,所以我们必须严格要求自己。本次课程设计涉及了很多知识,由于往日学得不扎实,对某些问题仍然存在疑惑,我查阅了相关书籍,以便将疑难问题解决,同时更加进一步的掌握相关知识。 此次的课程设计不仅让我深刻体会到了学习这门课程的重要性与必要性,也让我懂得了学习是思考一个的过程,我们应该主动去思考学到的知识以及学到后怎么去运用,而不是一味地被动地接受。数据结构及其算法在解决现实生活中的常见问题和书写软件设计方面上都有着重要的意义,我们应该好好掌握它的相关知识,在以后的学习过程中,更多的去学会如何运用知识。 六、参考文献 [1]刘振鹏 张晓莉 郝杰.数据结构.北京:中国铁道出版社.2005 [2]谭浩强 .C语言程序设计(第二版).北京:清华大学出版社.2008 [3]严蔚敏 吴伟民.数据结构(C语言版).北京:清华大学出版社.2010 [4]黄国瑜 叶乃菁.数据结构(C语言版).北京:清华大学出版社.2002 [5]朱站立.数据结构(第三版).西安:西安交通大学出版社.2004 七、致谢 感谢学校为我们提供的学习及完成课程设计的机会,也感谢徐晓蓉老师的教导和同学们对我的帮助与支持。 八、附录 程序源码: #include #define SIZE 100 //线性表存储空间的初始分配量 typedef struct{ int * elem; //存储空间基址 int * data; int length; //当前长度 int listsize; //当前分配的存储容量 }SqList; void InitList_Sq(SqList &L) { // 构造一个空的线性表L。 L.elem = (int *)malloc(SIZE*sizeof(int)); if (!L.elem) cout<<\"ERROR\"; // 存储分配失败 L.data = (int *)malloc(SIZE*sizeof(int)); if (!L.data) cout<<\"ERROR\"; // 存储分配失败 L.length = 0; // 空表长度为0 L.listsize = SIZE; // 初始存储容量 } // InitList_Sq void PrintList_Sq(SqList L) { //显示线性表中所有数据 for(int i=1;i<=L.length;i++) { if (L.data[i]==1) cout< cout< void up(SqList L) { } void down(SqList L,int n) { } for (int i=2;i<=n;i++) } for (int i=1;i<=L.length;i++) L.data[i]=1; for (int j=i;j<=L.length;j++) if (j%i==0){ if (L.data[j]==1) L.data[j]=0; else if (L.data[j]==0) L.data[j]=1; void main() { SqList L; int n=52; } InitList_Sq(L); for(int i=1;i<=n;i++) { } up(L); down(L,n); cout<<\"正面向上的牌的编号是:\"< 因篇幅问题不能全部显示,请点此查看更多更全内容