分组游戏,约瑟夫环
分组游戏
一 、目的
1(根据所学知识,编写指定题目的C语言程序,并规范地完成课程设计
。通过课程设计,加深对《C语言程序设计》课程所学知识的理解,熟练掌握和巩固C语言的基本知识和语法规范,学会编制结构清晰、风格良好、数据结构适当的C语言程序,从而具备利用计算机编程
解决综合性实际问题的初步能力。
2.通过本次分组游戏题目的编写,学会利用结构体,指针,链
的关系进行链表的建立,删除,再通过数组,循环等对数据按题目要求进行输出。考查了学生对相应知识的掌握,和逻辑算法的考验。
二 、 需求分析
.1、 题目要求:
分组游戏:全班m个同学,成一队并确定一个随机循环数A,从队头第一个同学开始计数,到第A个同学将其分配到第一组,然后从下一个同学重新开始计数,再到第A个同学分配到第二组,循环至第n组,再继续计数到第A个同学分配给第一组,如此循环直到所有的同学都分配到相应的组为止。
请用一个程序模拟该分组过程,给定同学数、组数和循环数后自动生成每个组中分配的学生在初始队列中的序号:假设有10个同学,分为2组,循环数为5,则分组方式如下: 第一组,1,5,6,7,9
第二组2,3,4,8,10
2、数据的读入与建立
通过建立结构体,来实现一个具有连续数字的链表的形成。利用结构体指针指向结构体所在,并且为链表申请内存空间,存放数据。
3、数据的输出
需要进行链表的删除工作并用一维数组存入删除节点数据,利用循环语句进行数据的输出,以符合题目的输出要求。
4、主函数的建立
定义用户输入的数据,提示输出,并读入用户输入的数据,再执行两个子函数即可。 三 概要设计
1、程序主要包括三个模块
(1)主程序模块
int main()
{
定义及初始化
用户根据提示输入
链表的建立
链表的删除及数组数据的存入,然后再利用循环将数据按需求输出
}
(2)建立结构体
typedef struct node{}NODE;
NODE为结构体名,结构体里定义int型的变量number,和指向结构体本身的指针。
(3)建立链表
链表的建立: NODE *createlink(int n)
定义head,p,q,三个结构体指针。head 指向头结点,利用q申请内存空间而p指向该地址,并指向存入该空间的数据,所指向的空间依次存入由1至n的顺序数字,最后返回头结点。
链表的删除及数据的输出:void work(NODE *p,int n,int m,int A)
1)利用两个嵌套循环对相应节点进行删除,并将删除的节点的数据存入定义的一维数组a[ ]里。里面一个循环用指针“p”指向待删除节点的前一个,外面一个循环实现将“q”指向当前节点,将其数据存入数组,再将“p”指向删除节点的下一个位置,释放删除节点。循环至最后一个数据的存入。
2)利用两个循环对数据进行输出。根据分组要求先对第一行进行输出,由于第一行的数据在一维数组中的排列顺序是按组数跳跃式排列的,所以对数据的输出也按组数的
多少进行跳跃式输出,其他行的输出也是如此,所以形成一个内循环。再利用外循环,进行换行,再对下一行进行输出。
四 详细设计
1、定义结构体
定义一个名为NODE的结构体
typedef struct node
{
int number; /*定义结构体里的整形变量*/
struct node *next; /*指向结构体的指针变量*/
}NODE; /*结构体名*/
2、建立链表
NODE *createlink(int n) /*函数*/
NODE *head=NULL,*p=NULL,*q=NULL; /*定义三个结构体指针*/
int i=1;
/*初始化,赋值为1*/
head=p=(struct node*)malloc(sizeof(struct node)); /*申请内存空间*/
利用一个循环不断申请内存空间并存入数据
q=(struct node*)malloc(sizeof(struct node)); /*循环申请内存空间*/
p->next=q;
p=q; /*三个语句实现p指向q申请的内存空间并指出数据*/
p->number=i;
3、链表的删除与数据存入一维数组
void work(NODE *p,int n,int m,int A) /*函数*/
for(j=1;j
next;} /*循环语句使p指向删除节点前一位*/
外循环语句实现:
q=p->next;
p->next=q->next; /*q指向待删除的节点,p指向待删除的下一结点并存入待删除数据*/
a[k]=q->number;
free(q);
4、数据的输出
for(l=i;lnumber;
printf("%3d",a[k][i-1])
在利用二维数组输出数据这一块花的时间最多,却最终无法实现,从而转入利用一维数组输出数据。
(3)而在利用一维数组输出时,刚开始想着只用一个嵌套循环, 而设计嵌套循环时发现由于一维数组的特性限制,无法在对删除数据存入数组的同时进行所需要的分组输出,所以就将数据存入数组,和按分组输出数据分在了两个嵌套循环里。
六 测试结果
1、利用二维数组存入输出数据时出现的结果:
无法实现数据的分组,故而放弃利用二维数组形式的输出方法。
2、利用一维数组存入数据并输出时:
输出数据符合要求,最后进行程序的编排完善。
七 用户使用说明
1、根据提示选择石是否开始游戏,按Enter键
输入人数n,按Enter键。
输入随机数m,按Enter键。
输入组数A,按Enter键。
2、提示是否继续游戏,是则重复1操作,选择不继续则按任意键结束程序。 八 课程设计
1、程序内容
程序分成建立链表,删除链表,输出数据几大步骤,也按着这几个步骤逐步完成设计。每一块的设计都需要一定的知识掌握与运用能力。在这一过程中,让我了解到了链表的相关知识,并逐渐熟练掌握对链表的建立方法,利用结构体与琏表的关系,用于程序的设计之中。而通过算法设计,更提高了自身的逻辑性思维,形成一个较为完善的思维体系,更有利于今后编程能力的提高,和对相关知识的学习掌握能力。对于一些细小的错误,更提醒自己注意细节,注意每一个可能造成错误的地方,对于不熟悉的环节,更应该多动手利用,真正熟练掌握。