学生搭配问题课程设计.docx
《学生搭配问题课程设计.docx》由会员分享,可在线阅读,更多相关《学生搭配问题课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
![学生搭配问题课程设计.docx](https://file1.bdocx.com/fileroot1/2023-7/9/183c366e-404d-4ab9-ad80-a2b8bee25de6/183c366e-404d-4ab9-ad80-a2b8bee25de61.gif)
学生搭配问题课程设计
课程设计
课程设计名称:
学生搭配问题
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:
2010-6-19---2010-6-23
专业数据结构课程设计任务书
学生姓名
班级
学号
题目
学生搭配问题
课题性质
工程设计
课题来源
自拟
指导教师
同组姓名
主要内容
一班有m个女生,有n个男生(m不等于n),现要开一个舞会.男女生分别编号坐在舞池的两边的椅子上.每曲开始时,男生和女生依次配对跳舞,本曲没成功配对者坐着等待下一曲找舞伴.
请设计一系统模拟动态地显示出上述过程,要求如下:
1) 输出每曲配对情况
2) 计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值.
3) 尽量设计出多种算法及程序,可视情况适当加分
提示:
用队列来解决比较方便.
任务要求
1.应用数据结构基础知识进行实际问题求解与分析
2.作为一个完整的系统,应具有友好的界面和较强的容错能力
3.上机能正常运行代码
4.分析算法的运行效率
5.按要求撰写课程设计报告和设计总结。
参考文献
1.《C程序设计(第二版)》,谭浩强,北京,清华大学出版社,1999.
2.《VisualC++实用教程(第一版)》,张荣梅、梁晓林,冶金工业出版社,2004.
3.《C++实用教程(第一版)》,杨明军、董亚卓、汪黎,人民邮电出版社,2002.
4.《数据结构(C语言版)》,严蔚敏,吴伟民,清华大学出版社,
审查意见
指导教师签字:
教研室主任签字:
年月日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1需求分析
核心问题:
循环队列的应用
数据模型(逻辑结构):
循环队列(两个),将男生、女生两组人分别存放,以后实现循环配对输出。
存储结构:
循环链表
核心算法:
循环队列的入队,出队,判队满,判队空。
输入数据:
男生人数、女生人数,歌曲数量
输出数据:
每一首歌曲播放时,男生和女生搭配情况(输出编号)
当要查找的男女搭配时输出歌曲编号,和他们搭配的总次数。
通过以上分析,该程序具有可行性。
2概要设计
算法设计思想
队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算限制的线性表。
循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元一次存放从队列头到队列尾的元素外,尚需附设两个指针front和rear分别指示队列头和队列尾元素的位置。
循环队列(两个),将男生、女生两组人分别存放,以实现循环配对输出。
循环队列的入队,出队,判队满,判队空。
(1)要模拟动态地显示出现题目中所要求的循环,我们要先建立两个循环队列SqQueue和SqQueue2.
(2)将男生、女生两组人分别存入这两个队列。
以实现他们的配对输出,这是循环队列固有的特性。
(3)利用循环队列的特性,将男女生分别进行入队列和出队列操作,且实现搭配输出。
(4)循环队列的长度分别设为男女生的个数即可。
在计算机终端输出的结果是:
根据要求输出男生女生搭配情况。
3运行环境
硬件开发环境:
PC机
软件开发环境:
操作系统环境:
WindowXP
4开发工具和编程语言
软件开发工具:
VisualC++6.0
编程语言:
C语言
5详细设计
建立链式循环队列来分别存储男生和女生,然后调用入队出队函数实现循环队列的配对输出。
为了充分利用向量空间,克服上述存储结构上溢现象的方法是将向量空间想象为一个首尾相接的圆环,存储在其中成为循环队列。
再循环队列中进行入队、出队操作时,头指针仍要加1,向前移动。
只不过当头指针指向上界时其加1操作变为指向下界,这样就可以通过出队再入队来实现男生女生的循环搭配了。
程序设计过程中的关键算法:
(1)关键算法之一:
初始化队列
VoidInitQueue(LinkQueue&Q)
{
QueuePtrp;
P=(QueuePtr)malloc(sizeof(QNode));
Q.front=p;
Q.rer=p;
Q.front->next=NULL;
}
(2)关键算法之二:
入队函数
VoidEnQueue(LinkQueue&Q,intnum)
{
QueuePtrp;
P=(QueuePtr)malloc(sizeof(QNode));
P->num=num;
p->next=NULL;
Q.rer->next=p;
Q.rer=p;
}
(3)关键算法之三:
出队函数
VoidDeQueue(LinkQueue&Q,int&num)
{
QueuePtrp,q;
If(Q.front==Q.rear)
Printf("队列为空");
P=Q.front->next;
Num=p->num;
Q.front->next=p->next;
q=p->next;
If(Q.rear==q)
Q.rear=Q.front;
Free(p);
}
(4)关键算法之四:
输出第i首曲子时女队的情况
Voidprintf(LinkQueue&F,inti)
{
QueuePtrp;
Intn=1;
While(n
{
Printf("_");
n++;
}
P=F.front->next;
While(F.rear!
=p)
{
Printf("%d",p->num);
P=p->next;
Printf("%d\n",p-num);
}
6调试分析
测试数据:
编号
1
2
3
4
5
男生(5人)
a
b
c
d
e
女生(3人)
aa
bb
cc
A(错误分类)
曲子数
10
测试图如下:
图6.1数据测试图
测试中出现的问题描述:
女生数量设定为3,但实际输入女生数超过3没有错误警告,说明程序还存在一定的漏洞。
在输入数据函数voidCreateList_L(LinkList&L1,LinkList&L2,int&m,int&n)中存在不健全,在接收男生或女生数据时没有对数据个数(m或n)进行合理性检测。
改进方法:
在输入数据函数voidCreateList_L(LinkList&L1,LinkList&L2,int&m,int&n)中加入限制语句
if(i>m)printf(“超出限制”);
删除刚输入数据;
提示重新输入;
使得输入男生数(女生数)大于预设值时进行提醒,并进行修正。
7测试结果
测试输入数据:
男女生的个数及姓名、曲子数和要查找的男女生编号
编号
1
2
3
4
5
男生
a
b
c
d
e
女生
aa
bb
cc
曲子数
10
输出结果为:
每首曲子男女生搭配的情况
程序运行界面如下:
图7.1输入数据时界面
图7.2输出每首曲子配对情况界面
参考文献
[1]边肇祺,模式识别(第二版),北京:
清华大学出版社,1988,25~35
[2]李永忠,几种小波变换的图像处理技术,西北民族学院学报(自然科学版),2001.6,22(3),15~18
[3]徐孝凯,数据结构实用教程(C/C++描述)。
北京:
清华大学出版社,1999,20~25
[4]严蔚敏,数据结构题集(C语言版)。
北京:
清华大学出版社,2006,36~40
[5]孙巧萍,数据结构实训教程。
北京:
科学出版社,2000,13~22
心得体会
通过一周的学习和实践,解决实际问题(学生搭配问题),让我对循环队列有了更深的了解,对数据结构产生了浓厚的兴趣,同时也使我提高了解决问题的能力。
以前我对数据结构(C语言描述)的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,是我在这几方面的认识有所提高。
让自己有一定的能力去改正一些常见的错误语法,很高兴这一周的学习让我对数据结构有了新的认识,所以在以后的学习过程中,我会更加注重实践操作,是自己更好的学好计算机。
在这次课程设计中我们要学会利用时间,在规定的时间内完成我们的任务,要逐渐养成用用C语言编写程序的良好习惯。
这些对我来说都是一种锻炼,一个知识积累的过程,一种能力的提高。
要打好基础,才能用更好的办法,更简洁明了的程序解决问题,只有这样才能进一步的取得更好的成绩。
在课程设计中的程序都比较复杂,所以需要我们要更加的细心,认真的完成每一步的操作,修改语法按照老师的指导思想来完成。
与此同时也让我们增加了对程序和算法的进一步理解。
总之我学到了很对东西,很感谢学校给我们这样一次锻炼的机会,也很感谢老师的指导。
附:
程序代码
#include
#include
#include
#include
#defineMAX200
#defineMAXNAME20
typedefstructLNode
{
intnum;//编号
charname[MAXNAME];
charsex;//性别,'F'表示女性,'M'表示男性
structLNode*next;
}LNode,*LinkList;
voidsleep(clock_twait)//延迟函数
{
clock_tgoal;
goal=wait+clock();
while(goal>clock());
}
voidCreateList_L(LinkList&L1,LinkList&L2,int&m,int&n)
{
printf("\n\n\t\t\t\t^o^参加舞会学生名单^o^\n");
printf("\n\n\t\t请输入女生数量:
");
scanf("%d",&m);
while(m<1)
{
printf("\n\n\t\t\t\tERROR\n\n\t\t\t请重新输入女生数量");
sleep(1000);//voidsleep(clock_twait)放在前
system("CLS");
printf("\n\n\t\t\t\t^o^参加舞会学生名单^o^\n");
printf("\n\n\t\t请输入女生数量:
");
scanf("%d",&m);
}
printf("\t\t请输入男生数量:
");
scanf("%d",&n);
while(n<1)
{
printf("\n\n\t\t\t\tERROR\n\n\t\t\t请重新输入男生数量");
sleep(1000);
system("CLS");
printf("\n\n\t\t\t\t^o^参加舞会学生名单^o^\n");
printf("\n\n\t\t请输入女生数量:
%d",m);
printf("\n\t\t请输入男生数量:
");
scanf("%d",&n);
}
inti,choice,numw,numn,b[MAX],j;
numw=numn=0;
chara[MAX][MAXNAME];
LinkListp1,p2,q;//,,不,一,样的
p1=p2=L1=L2=NULL;
printf("\t\t\t**************");
printf("\n\t\t\t*欢迎参加舞会*\n");
printf("\t\t\t**************\n");
printf("\t\t请输入学生的情况\n");
for(i=0;i<(m+n)&&i{
if(i>=5)
{
sleep(500);
system("CLS");
printf("\n\n\t\t\t\t^o^参加舞会学生名单^o^\n");
printf("\n\n\t\t请输入女生数量:
%d",m);
printf("\n\t\t请输入男生数量:
%d\n",n);
printf("\t\t\t**************");
printf("\n\t\t\t*欢迎参加舞会*\n");
printf("\t\t\t**************\n");
printf("\t\t请输入学生的情况\n");
for(j=i-4;j
{printf("\t\t第%d个人姓名:
%s\n",j+1,a[j]);
printf("\t\t性别<1girl,2boy>:
%d\n",b[j]);
}
}
printf("\t\t第%d个人姓名:
",i+1);
scanf("%s",a[i]);
printf("\t\t性别<1girl,2boy>:
");
scanf("%d",&choice);///////////////scanf("sex:
%d",&choice);错错
b[i]=choice;
q=(LinkList)malloc(sizeof(LNode));
if(q==NULL)exit(-1);
strcpy(q->name,a[i]);
if(choice==1)
{numw++;
q->num=numw;
if(L1==NULL)
{
L1=q;
p1=q;
}//不带头结点
else
{
p1->next=q;
p1=q;
}
p1->next=L1;//循环
}
else
{numn++;
q->num=numn;
if(L2==NULL){L2=q;p2=q;}//不带头结点
else{p2->next=q;p2=q;}
p2->next=L2;//循环
}
}
}
voidPrint1(LinkListL,intm)
{
LinkListp;
inti;
p=L;
for(i=1;i<=m;i++)
{
printf("%s",p->name);
printf("%3c",'');
p=p->next;
}
}
voidPrint2(LinkList&p,intm,intn)
{
inti;
LinkListq;
for(i=1;i<=m;i++)
{printf("%s",p->name);
printf("%3c",'');
p=p->next;
}
q=p;
for(;i<=n;i++)
{printf("%s",q->name);
printf("%3c",'');
q=q->next;
}
}
voidMatch(LinkListL1,LinkListL2,intm,intn)
{
intk,i,j;
LinkListp;
printf("\n\n\n\n\t\t\t\t^o^每曲配对情况^o^");
printf("\n\n\t\t请输入歌曲的编号:
<");
scanf("%d",&k);
printf(">");
while(k<=0)
{
printf("\n\t\t\tERROR!
!
!
\n\t\t请重新输入歌曲的编号");
sleep(1000);
system("CLS");
printf("\n\n\n\n\t\t\t\t^o^每曲配对情况^o^");
printf("\n\n\t\t请输入歌曲的编号:
<");
scanf("%d",&k);
printf(">");
}
if(m{
p=L2;
for(i=1;i<=k;i++)
{
system("CLS");
printf("\n\n\n\n\t\t\t\t^o^每曲配对情况^o^");
printf("\n\n\t\t请输入曲子编号:
<%d>",k);
printf("\n\n\n\n\n\t\t\t\t第<%2d>曲配对情况\n\n\n",i);
printf("\t\t");
Print1(L1,m);
printf("\n\t\t");
for(j=1;j<=m;j++)printf("|");
printf("\n\t\t");
Print2(p,m,n);
printf("\n\n");
sleep(1000);
}
}
else
{
p=L1;
for(i=1;i<=k;i++)
{
system("CLS");
printf("\n\n\n\n\t\t\t\t^o^每曲配对情况^o^");
printf("\n\n\t\t请输入曲子编号:
<%d>",k);
printf("\n\n\n\n\n\t\t\t\t第<%2d>曲配对情况\n\n\n",i);
printf("\t\t");
Print2(p,n,m);
printf("\n\t\t");
for(j=1;j<=n;j++)printf("|");
printf("\n\t\t");
Print1(L2,n);
sleep(1000);
printf("\n\n");
}
}
}
voidXXXXXX(LinkListL,intloc,LinkList&p)
{
inti;
if(loc==1)p=L;
else
{
p=L;
for(i=1;i{
p=p->next;
}
}
}
voidXHEY(LinkListL1,LinkListL2,intm,intn)
{
intx,y,flag=1,k,loc1,loc2,last;
LinkListp1,p2,p11,p22;
while(flag!
=2)
{system("CLS");
printf("\n\n\n\t\t\t\t^o^查找配对跳舞情况^o^\n\n");
printf("\n\t\t请输入你想知道的女生和男生的编号\n\t\t女生的编号:
");
scanf("%d",&y);
while(y>m||y<1)
{
printf("\t\t\tERROR!
!
!
\n\t\t请重新输入女生的编号");
sleep(1000);
system("CLS");
printf("\n\n\n\t\t\t\t^o^查找配对跳舞情况^o^\n");
printf("\n\t\t请输入你想知道的女生和男生的编号\n\t\t女生的编号:
");
scanf("%d",&y);
}
printf("\t\t男生的编号:
");
scanf("%d",&x);
while(x>n||x<1)
{
printf("\t\t\tERROR!
!
!
\n\t\t请重新输入男生的编号");
sleep(1000);
system("CLS");
printf("\n\n\n\t\t\t\t^o^查找配对跳舞情况^o^\n");
printf("\n\t\t请输入你想知道的女生和男生的编号\n\t\t女生的编号:
%d\n",y);
printf("\t\t男生的编号:
");
scanf("%d",&x);
}
printf("\n\t\t歌曲的编号:
");
scanf("%d",&k);
while(k<1)
{
printf("\t\t\tERROR!
!
!
\n\t\t请重新输入歌曲的编号");
sleep(1000);
system("CLS");
printf("\n\n\n\t\t\t\t^o^查找配对跳舞情况^o^\n");
printf("\n\t\t请输入你想知道的女生和男生的编号\n\t\t女生的编号:
%d\n",y);
printf("\t\t男生的编号:
%d\n",x);
scanf("%d",&k);
}
printf("\n\n\n");
if(m{
last=((k-1)*m)%n;
loc1=(x-last+n)%n;
XXXXXX(L2,x,p1);
if(loc1>0&&loc1<=m)
{
XXXXXX(L1,loc1,p11);
}
elseprintf("\t\t在第<%4d>曲编号为<%4d>的男生(%s)没有舞伴\n\n",k,x,p1->name);
XXXXXX(L1,y,p2);
loc2=(last+y)%m;
XXXXXX(L2,loc2,p22);
if(loc2==x||loc1==y)
printf("\t\t编号为<%4d>的男生(%s)和编号为<%4d>的女生(%s)在第(%4d)首歌配对跳舞\n\n\n",x,p1->name,y,p2->name,k);
else
{
if(loc1>0&&loc1<=m)
printf("\t编号为<%4d>的男生(%s)在第(%4d)首歌和编号为<%4d>的女生(%s)配对跳舞\n\n",x,p1->name,k,y,p11->name);
printf("\t编号为<%4d>的女生(%s)在第(%4d)首歌和编号为<%4d>的男生(%s)配对跳舞\n\n",x,p2->name,k,y,p22->name);
}
}
else
{
last=((k-1)*n)%m;
loc1=(y-last+m)%m;
XXXXXX(L1,y,p1);
if(loc1>0&&loc1<=n)
{
XXXXXX(L1,loc1,p11);
}
elseprintf("\t\t在第<%4d>曲编号为<%4d>的女生(%s)没有舞伴\n\n",k,x,p1->name);
XXXXXX(L2,x,p2);
loc2=(last+x)%m;
XXXXXX(L1,loc2,p22);
if(loc2==y||loc1==x)
printf("\t\t编号为<%4d>的男生(%s)和编号为<%4d>的女生(%s)在第(%4d)首歌配对跳舞\n\n\n",x,p1->name,y,p2->name,k);
else
{
printf("\t编号为<%4d>的男生(%s)在第(%4d)首歌和编号为<%4d>的女生(%s)配对跳舞\n\n",x,p2->name,k,y,p22->name);
if(loc1>0&&loc1<=m)
printf("\t编号为<%4d>的女生(%s)在第(%4d)首歌和编号为<%4d>的