学生搭配问题论文Word格式文档下载.doc
《学生搭配问题论文Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《学生搭配问题论文Word格式文档下载.doc(13页珍藏版)》请在冰点文库上搜索。
![学生搭配问题论文Word格式文档下载.doc](https://file1.bingdoc.com/fileroot1/2023-4/28/72baa5d4-2255-4d5c-9831-aa99e0c74dad/72baa5d4-2255-4d5c-9831-aa99e0c74dad1.gif)
男2和女2
.........
第四首:
男1和女4
三.概要设计
1.队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。
循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元依次存放从队列头到队列尾的元素外,尚需附设两个指针front和rear分别指示队列头元素和队列尾元素的位置。
循环队列两个,将男生、女生两组人分别存放,以实现循环配对输出。
循环队列的入队,出队,判队满,判队空。
首先,要模拟动态地显示出现题目中所要求的循环,我们要先建立两个循环队列SqQueue和SqQueue2。
然后,将男生、女生两组人分别存入这两个队列。
以实现他们的循环配对输出,这是循环队列固有的特性。
接着,利用循环队列的特性,将男女生分别进行入队列和出队列操作,且实现搭配输出。
循环队列的长度分别设为男女生的个数即可。
最后,在计算机终端输出的结果是:
根据要求输出男生女生搭配情况
主要是循环队列的应用
数据模型为逻辑结构:
循环队列两个,将男生、女生两组人分别存放,以实现循环配对输出。
存储结构为循环链表
核心算法是循环队列的入队,出队,判队满,判队空。
输入数据为男生人数、女生人数,歌曲数量
输出数据为每一首歌曲播放时,男生和女生搭配情况,只输出编号即可。
当要查找的男女搭配时输出歌曲编号,和他们搭配的总次数。
通过以上分析,该程序具有可行性。
2.各模块函数介绍:
1)classcirularQueue
作用:
定义一个一个循环队列
2)~cirularQueue()
定义析构函数,使对象在撤销时释放
3)boolIsFull()
判断队列是否已满
4)boolIsEmpty()
判断队列是否为空,用于出队列前使用
5)voidpush(Tinfo)
入队。
每对舞伴跳完舞之后,做入队处理,到达队尾,等待下次跳舞。
6)voidPop(T&
info)
出队。
每取曲子响起时男生队列和女生队列作出队处理,两人跳舞。
7)voidGetHead(T&
info)
取队首元素,对出队的男女进行识别。
8)voidInitqueue(cirularQueue<
int>
&
int);
初始化队列
9)voiddisplay(int,int);
根据男生和女生的人数和曲目的数目,来判断每曲歌的男女配对情况
10)voidcharge(int,int);
作用:
判断指定组合能否配对成功
2.主函数调用关系图
voidGetHead(T&
info)
classcirularQueue
~cirularQueue()
主函数
k曲配对
每曲配对
数据输入
输出
编号
voidpush(Tinfo)
voidPop(T&
boolIsFull()
IsEmpty()
初始化男女循环队列
3.每曲配对函数调用关系图voiddisplay(int,int)
k<
=songnumm
man.pop(x)
woman.pop(y)
否
是
输出k首男x女y跳舞
end
k++
4.第k曲配对函数调用图voidcharge(int,int)
输出他们不会一起跳
break
count<
count++
(x==a)&
(y==b)
man.push(x)
woman.push(y)
男a女b第count跳
5.队满判断boolIsFull()
首尾顺序相邻
队列为满
6.对空判断原则boolIsEmpty()
首尾指针相等
队列为空
7.入队流程voidpush(Tinfo)
不能入队
队满
队尾进入
尾指针移到
8.出队流程voidPop(T&
不能出队
队空
队头出列
头指针移到
四.详细设计
1.算法的流程图
2.建立两个链式循环队列来分别存储男生和女生,然后调用入队出队函数实现循环队列的配对输出。
充分利用向量空间,将向量空间想象为一个首尾相接的圆环,存储在其中成为循环队列。
在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝前移动。
只不过当头尾指针指向向量上界时、其加1操作是指向向量的下界。
这样就可以通过出队再入队来实现男生女生的循环搭配。
课程设计过程中的关键算法如下:
(1)关键算法之一:
voidInitQ(LinkQueue&
Q)
{
QueuePtrp;
p=(QueuePtr)malloc(sizeof(QNode));
Q.front=p;
Q.rear=p;
Q.front->
next=NULL;
}
(2)关键算法之二:
入队函数
voidEnQueue(LinkQueue&
Q,intnum)//入队函数
p->
num=num;
Q.rear->
next=p;
(3)关键算法之三:
出队函数
voidDeQueue(LinkQueue&
Q,int&
num)//出队函数
QueuePtrp,q;
if(Q.front==Q.rear)
printf("
队列为空"
);
p=Q.front->
next;
num=p->
num;
next=p->
q=p->
if(Q.rear==q)
Q.rear=Q.front;
free(p);
(4)关键算法之四:
输出第i首曲子时女队的情况
voidprintF(LinkQueue&
F,inti)//输出第i首曲子时女队的情况
intn=1;
while(n<
i)
{
_"
n++;
}
p=F.front->
while(F.rear!
=p)
{
%d"
p->
num);
p=p->
printf("
%d\n"
五.源代码
#include<
string.h>
#include<
stdio.h>
time.h>
malloc.h>
#defineMAXSIZE60
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-1
typedefintsystem;
typedefstructQNode{
intnum;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
voidsleep(clock_twait)//延迟函数
{
clock_tgoal;
goal=wait+clock();
while(goal>
clock());
Q)//建立空队列
Q,intnum)
num)
F,inti)//打印第i首曲子时女队的情况
voidprintM(LinkQueue&
M,inti)//打印第i首曲子时男队的情况
p=M.front->
while(M.rear!
voidmain()
intm,n,k,i,a,b;
intcount=0,num;
LinkQueueF;
//女生队
LinkQueueM;
//男生队
请输入女生数量:
"
scanf("
%d"
&
m);
请输入男生数量:
n);
请输曲子号:
k);
请输入要查找的男生编号:
a);
请输入要查找的女生编号:
b);
InitQ(F);
InitQ(M);
for(i=1;
i<
=m;
i++)
EnQueue(F,i);
=n;
EnQueue(M,i);
=k;
system("
CLS"
第%d首曲子\n"
i);
printF(F,i);
printM(M,i);
p=F.front->
q=M.front->
目前跳舞的是第%d号女生和第%d号男生\n"
num,q->
if(p->
num==a&
q->
num==b)
{
count++;
printf("
第%d曲是要查找的男女生跳舞\n"
}
sleep(3000);
DeQueue(F,num);
EnQueue(F,num);
DeQueue(M,num);
EnQueue(M,num);
该对男女生共跳舞%d次\n"
count);
六.运行结果及分析
测试及运行结果:
测试输入数据:
男生数10人,女生数8人,曲子数5,要查找的男生编号4,要查找的女生编号6
输出结果为:
每首曲子男女生搭配的情况
程序运行界面:
八、收获及体会
通过解决学生搭配问题,让我对循环队列有了更深的了解,同时也让我提高了解决实际问题的能力。
我们要不断的通过上机来提高自己的学习水平,在上机的同时改正了自己对某些算法的错误使用,使自己在通过程序解决问题时抓住关键算法,有了算法设计思想和流程图,并用C语言描绘出关键算法。
以前我对数据结构(C语言描述)的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
让自己有一定的能力去改正一些常见的错误语法,很高兴这一次的学习让我对数据结构(C语言描述)有了新的认识,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
在这次课程设计对我来说都是一种锻炼,一个知识积累的过程,一种能力的提高。
要打好基础,才能用更好的办法,更简洁明了的程序解决实际问题,只有这样才能进一步的取得更好的成绩。
我们会更加努力,努力的去弥补自己的缺点,发展自己的优点,去充实自己,只有在了解了自己的长短之后,我们会更加珍惜拥有的,更加努力的去完善它,增进它。
在解决实际问题时如果遇到了难题,我们要学会去查找大量的有关这方面的资料,还要借助于网络不断扩大自己的知识面和阅读量。
这样也可以锻炼我们的自主学习能力和解决问题的能力,学到了许多以前没学到的东西。
在课程设计中的程序都比较复杂,所以需要我们要更加地细心,认真的完成每一步的操作,修改语法。
与此同时也让我们增加了对程序和算法进一步理解。