数据结构课程设计 纸牌游戏

合集下载

纸牌游戏实验报告

纸牌游戏实验报告

纸牌游戏实验报告篇一:纸牌游戏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)//玩家操作;两个函数分别用来计算与进行牌的操作。

数据结构课程设计——纸牌游戏

数据结构课程设计——纸牌游戏

题目:纸牌游戏目录一、需求分析 (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 (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;}}以上是通过for循环对是当前基数倍数的牌进行翻牌3、根据算法思想,流程图如下:1、预处理#include<iostream.h>#include<stdlib.h>#define SIZE 100 //线性表存储空间的初始分配量2、数据类型定义定义一个结构体类型SqList,结构体中数组指针elem指示线性表的基地址,length指示线性表的当前长度。

数据结构与算法课设-纸牌游戏21点

数据结构与算法课设-纸牌游戏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={&lt; ai-1 ,ai &gt; | 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语言课程设计纸牌游戏

c语言课程设计纸牌游戏

c语言课程设计纸牌游戏一、课程目标知识目标:1. 理解C语言中数组、循环和条件判断等基本概念,并能运用这些知识实现纸牌游戏的逻辑结构;2. 学会使用C语言中的函数,掌握模块化编程思想,实现纸牌游戏的不同功能模块;3. 掌握C语言中字符串处理和文件操作,实现纸牌游戏的存取和读取功能。

技能目标:1. 能够运用所学知识,独立设计并编写简单的纸牌游戏程序;2. 提高编程实践能力,通过编写纸牌游戏,熟练运用C语言编程技巧;3. 学会分析问题,运用合适的算法和数据结构优化纸牌游戏性能。

情感态度价值观目标:1. 培养学生合作学习的意识,通过小组讨论和分工,共同完成纸牌游戏设计;2. 激发学生对编程的兴趣,提高对计算机科学的认识和热爱;3. 引导学生树立正确的价值观,认识到编程对于解决实际问题的意义和价值。

课程性质:本课程为实践性较强的学科,旨在通过设计纸牌游戏,让学生在实际操作中掌握C语言编程知识。

学生特点:学生具备一定的C语言基础,具有较强的逻辑思维能力和动手实践能力。

教学要求:教师需引导学生主动探究,注重培养学生的编程思维和实际操作能力。

在教学过程中,关注学生的个体差异,提供有针对性的指导。

通过课程目标的分解,确保学生在课程结束后能够独立完成纸牌游戏的设计与实现。

二、教学内容1. C语言基本语法回顾:数组、循环(for、while)、条件判断(if-else)、函数定义与调用;2. 纸牌游戏设计原理:游戏流程分析、模块化设计、算法选择;3. 编程实践:- 纸牌数据结构设计:使用数组表示牌面,结构体表示牌组;- 游戏初始化:洗牌算法实现,牌组分配;- 玩家操作:输入输出设计,操作逻辑实现;- 游戏逻辑:回合制控制,胜负判断;- 游戏存取:文件操作,保存和加载游戏状态;4. 优化与拓展:算法优化,提高游戏性能;添加新功能,如计分系统、多人对战;5. 教学案例解析:结合教材相关章节,分析典型纸牌游戏案例,提炼关键技术和实现方法;6. 实践项目:分组进行纸牌游戏设计,按进度完成各阶段任务,最终实现一个完整的纸牌游戏。

数据结构课程设计纸牌游戏

数据结构课程设计纸牌游戏

数据结构课程设计纸牌游戏(共27页)-本页仅作为预览文档封面,使用时请删除本页-攀枝花学院学生课程设计(论文)题目:纸牌游戏学生姓名: 00000 学号:0000所在院(系):数学与计算机学院专业:网络工程班级: 2012级1班指导教师:李世文职称:教授2014年 01月 03日攀枝花学院教务处制攀枝花学院本科学生课程设计任务书注:任务书由指导教师填写。

课程设计(论文)指导教师成绩评定表摘要数据结构课程是计算机专业中必修的核心课程之一,也是一门理论性很强的一门课程,同时也是一门锻炼程序涉及能力的实践课程,“数据结构”成为计算机程序设计的重要理论技术基础,它不仅是计算机学科的核心课程,而且已成为其它理工专业的热门选修课。

主要包括线性表、树和二叉树以及图等基本类型的数据结构。

数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和运算等的学科,包括数据的逻辑结构、数据的存储结构和数据的运算这三个方面的内容,其中逻辑结构可分为线性结构和非线性结构;存储结构可分为顺序存储和链式存储两类,图则属于逻辑结构中的非线性结构。

广度优先搜索(BFS)用的队列一步一步完成的,从而找到的是最短路径。

纸牌游戏课程设计包括纸牌信息的建立、了解其翻拍的原理、并简明阐述翻牌的具体步骤与流程、最后输出与打印翻牌结果,整个过程使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。

掌握一般软件设计的基本内容和设计方法,培养学生进行规范化软件设计的能力。

而且使学生掌握使用各种计算机资料和有关参考资料的方法,提高学生进行程序设计的基本能力。

关键词:数据结构,纸牌游戏,BFS,遍历AbstractData structure course is one of required core curriculum in computer major, course is a very practical, is also an exercise program involves the ability to practice curriculum, "has become an important theoretical and technical foundation of computer program design data structure", it is not only the core course of computer science, and has become a hot elective course for other science majors. Mainly includes the basic data structure type linear table, tree and binary tree and graph of two. Data structure is a research of non computer program of numerical calculation design problems in operating the objects and their relationships and operations and other disciplines, including logic structure, storage structure and data operation data of the three aspects of content, the logical structure can be divided into linear and nonlinear structures; storage structure can be divided into sequential storage and chain store two, graph belongs to nonlinear structure in the logical structure. Breadth first search (BFS) with cohort completed step by step, so as to find the shortest path.A card game Solitaire, curriculum design includes information about its principle, and expounds the flop remake of the concrete steps and processes, the final output and print flop results, the whole process to enable students to understand and master the various basic abstract data type science class logical structure, storage structure and operation of the realization of algorithm, and their in the process of using the method. To master the basic content and the general design method of software design, training students' ability of design software specification. And to make the students master the use of various computer data and methods for reference, to improve the students' basic ability of program design.Key words:data structure, card games, BFS, traversal目录摘要 ......................................................................................................................... Abstract .. (I)1 前言 (1)课题背景 (1)课程设计目的 (1)2 相关技术分析 (2)概要设计 (2)设计原始数据的输入及输出格式 (3)算法流程图 (5)3 设计与实现 (7)数据结构 (7)详细设计和编码 (7)定义全局变量: (7)主要程序代码与分析如下: (7)上机调试过程 (10)5 测试结果及其分析 (11)6 用户使用说明 (18)7 源代码 (18)结论 (19)参考文献 (20)附录 (21)1 前言《数据结构》是软件工程专业的必修课之一,是一门综合性的专业基础课。

纸牌游戏-课程设计报告

纸牌游戏-课程设计报告

课程设计报告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);}七. 心得体会。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

纸牌游戏1.课程设计目的本课程设计是为了配合《数据结构》课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。

2.设计方案论证2.1课程设计任务纸牌游戏,编号为1~52张牌,正面向上,从第二张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后从第三张牌开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;直到以52为基数的翻过,输出:这时输出正面向上的牌有哪些?2.2设计思路2.2.1程序思路编号为1的牌没有进行翻牌,即翻牌的次数为0,仍然为正面朝上;编号为2的牌在整个过程中只翻了一次,为反面朝上;编号为3的牌在整个过程中只翻了一次,为反面朝上;编号为4的牌在整个过程中翻了两次,为正面朝上;编号为5的牌在整个过程中翻了一次,为反面朝上;编号为6的牌在整个过程中翻了三次(由于6是2、3、6的倍数),为反面朝上;以此类推直至编号为52的牌,从上述过程可以总结出这样的规律:从编号为1的第一张牌到编号为52的最后一张牌,只要它翻过的次数为偶数则是正面朝上,反之则为反面朝上。

因此我们可以依据每张牌翻过的次数来确定它最终是否为正面向上,从而输出实验所需要的结果:所有正面向上的牌的编号。

2.2.2数据结构的选择因为编号为1~52的52张牌没有要求在物理位置上相邻接,且在翻牌操作时要对编号依次进行判断,很容易想到用指针来进行操作。

为方便起见,我选用单链表这种数据结构来对52张牌进行链接存储。

单链表是有限个具有相同类型的数据元素组成的链表,且该链表中的每一个结点只有一个指针域。

根据第一部分的问题分析可知该单链表中每个结点应包括三个部分:存储该结点所对应的牌的编号信息data域、记录该结点所对应的牌的翻牌次数count域、存储其直接后继的存储位置的next域(指针域),其结点结构图如下(其中data、count为整型,next为指针类型):故可创建以单链表为存储结构的结构体,如下:type struct node{ int data ; //牌的编号int count ; //记录翻牌的次数struct node *next ; //指向下一个结点的指针} LinkList;//该单链表为LinkList类型2.2.3概要设计定义了单链表中结点的数据类型后,接下来就要创建单链表。

我选用的是尾插法创建带有头结点的单链表,运用malloc函数申请内存空间。

然后设计翻牌程序,利用j%i=o 的思想,并记录每张牌翻过的次数。

再编写输出结果程序,思想是:若翻牌的次数为偶数时则为正面朝上,输出该牌的编号。

最后编写主函数,主函数中调用子函数,并输出一些提示信息。

为了实现程序所需的功能,程序中用到三个子函数和一个主函数:子函数1:创建带有头结点的链表的函数 LinkList *creat (int k)子函数2:翻牌函数 LinkList *overcard (LinkList *head)子函数3:输出结果函数 void result(LinkList *head)主函数:void main ()各函数模块间的调用关系如图1所示。

maincreat overcard result图1各函数调用关系主函数流程图,如图2所示。

开始初始化工作:char ch;Int k=52; LinkList *head,*pNCh==‘Y’Y调用创建链表函数:Head=creat(k)调用翻牌函数:p=overcard(head,k)调用输出结果函数:result(p)重新选择操作,输入ch值结束图2主函数流程图2.2.4详细设计和编码(1)定义单链表结点类型:type struct node{ int data ; //牌的编号int count ; //记录翻牌的次数struct node *next ; //指向下一个结点的指针} LinkList; //该单链表为LinkList类型(2)子函数1:尾插法创建带有头结点的单链表 LinkList *creat (int k) 说明:形参k表示单链表中结点的个数建立的过程大致如下:一开始定义LinkList类型的三个指针变量 *head、*p、*q:LinkList *head,*p,*q;定义并初始化记录结点个数的变量i:int i=0;首先申请头结点空间:head=(LinkList *)malloc(sizeof(LinkList));指针p指向头结点head:p=head;然后利用指针q再申请结点空间:q=(LinkList *)malloc(sizeof(LinkList)); 将结点链接成链表的核心操作如下:while(i<k){q->data=i+1; //给每个结点的data赋值q->count=0; //给每个结点的count赋值p->next=q; //q链接到p之后p=q; //将q作为新的pq=q->next; //q指针后移q=(LinkList *)malloc(sizeof(LinkList));i++;}p->next=NULL; //将最后一个结点的next域赋为空return(head);}(3)子函数2:翻牌函数 LinkList *overcard(LinkList *head,int k)说明;形参分别指头指针、结点个数{定义一个LinkList类型指针p:LinkList *p因为翻牌时从基数2开始,可以使用for循环:for(int i=2;i<=k;i++){p=head->next; //p指向首元素结点while(p!=NULL){if((p->data)%i==0) //若牌的编号能被基数i整除,则使p->count++p->count++;p=p->next;} //p指针后移}return(head);}(4)子函数3:输出正面朝上的牌的编号函数 void result(LinkList *head){定义一个LinkList类型指针q:LinkList *q;q=head->next; //q指向首元素结点printf("正面向上的牌编号为:");while(q!=NULL){if((q->count)%2==0) //若翻页的次数为偶数则正面朝上,输出printf("%4d",q->data);q=q->next;}printf("\n");}}(5)主函数:void main( ){char ch;int k=52; //共有52张牌LinkList *head,*p;printf("执行此程序(Y),不执行此程序(Q)\n");scanf("%c",&ch);while(1){if(ch=='Y'){head=creat(k);p=overcard(head,k);result(p);}else if(ch=='Q'){printf("退出程序!\n");break;}scanf("%c",&ch);}}3.设计结果与分析3.1时间、空间性能分析本算法的空间复杂度很低,只需要一个含有52个结点的单链表来存储已编号的52张牌,因此空间复杂度为O(n)。

但是该算法的时间复杂度有点高,每个子函数中都用到了循环语句,尤其是在翻牌子程序中用到了双重循环,其时间复杂度为O(n2) 。

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设计体会设计一个程序需要按一个完整的步骤来进行。

首先必须弄懂程序要解决的是什么问题。

在弄懂之后大脑中就要开始构思要用是什么方法来解决问题,在此期间需要“不择手段”,就是可以问同学、老师或者查阅相关资料通过网络等等,动用一切渠道把握别人的精髓来解决问题。

完成后就要把方法赋之于行动,主要是画出流程图和结构图,依照图设计出解决问题的各种算法随后编写出程序。

最后完成调试和纠错。

这方,都觉得挺高兴的,只有经过这个过程才会提高自己的发现问题、分析问题、解决问题的能力,使得思维更加严谨。

虽然这次课程设计不是很难,不是做一个比较大的系统,代码不算多,但是我认为要成功地完成一个程序,包括完整的实验报告都要投入必要的时间和精力,认真对待,这样我们可以收获不少东西。

在这次程序设计中,遇到了许多的问题,深知自己学习的知识还远远不够。

这是一种全面综合训练,是与课堂听讲,自学和练习相辅相成的,必不可少的一个教学环节。

学习和掌握此门功课,掌握了面向对象程序设计方法,并能边学简单的程序。

在此基础上,通过课程设计的综合训练,培养了我们实际分析问题,编程和动手能力,更系统掌握该门课程的主要内容。

这次的课程设计为以后的学习打下了坚实的基础。

感谢老师给予我们这次机会,我会继续努力,在学习的这条路上不断攀登!5参考文献[1] 潘新民, 王燕芳. 微型计算机控制技术[M], 第2版. 北京: 电子工业出版社, 200 3.4:305-350[2] 谭浩强. C程序设计(第三版)[M] .北京:清华大学出版社,2005[3] 王昆仑.数据结构与算法[M] .北京:中国铁道出版社,2007[4] 谭浩强. C程序设计指导[M].北京:清华大学出版社,20056附录:带有注释的源程序#include<stdio.h>#include<malloc.h>typedef struct node{int data; //牌的编号int count; //记录翻牌的次数struct node *next; //指向下一个结点的指针}LinkList;LinkList *creat(int k) //创建链表函数{LinkList *head,*p,*q;int i=0;head=(LinkList *)malloc(sizeof(LinkList));//申请头结点空间p=head; //指针p指向头结点q=(LinkList *)malloc(sizeof(LinkList)); //申请结点空间while(i<k){q->data=i+1; //给每个结点的data赋值q->count=0; //给每个结点的count赋值p->next=q; //q链接到p之后p=q; //将q作为新的pq=q->next; //q指针后移q=(LinkList *)malloc(sizeof(LinkList));i++;}p->next=NULL; //将最后一个结点的next域赋为空return(head);}LinkList *overcard(LinkList *head,int k) //翻牌函数{LinkList *p;for(int i=2;i<=k;i++){p=head->next; //p指向首元素结点while(p!=NULL){if((p->data)%i==0) //若牌的编号能被基数i整除,则使p->count++ p->count++;p=p->next;} //p指针后移}return(head);}void result(LinkList *head) //输出结果函数{LinkList *q;q=head->next; //q指向首元素结点printf("正面向上的牌编号为:");while(q!=NULL){if((q->count)%2==0) //若翻过的次数为偶数则正面朝上,输出printf("%4d",q->data);q=q->next;}printf("\n");}void main(){char ch;int k=52; //共有52张牌LinkList *head,*p;printf("执行此程序(Y),不执行此程序(Q)\n");scanf("%c",&ch);while(1){if(ch=='Y'){head=creat(k);p=overcard(head,k);result(p);}else if(ch=='Q'){printf("退出程序!\n");break;} scanf("%c",&ch);}}沈阳大沈阳大沈阳大学。

相关文档
最新文档