分享
分销 收藏 举报 申诉 / 19
播放页_导航下方通栏广告

类型数据结构实训-学生分配问题.doc

  • 上传人:二***
  • 文档编号:4576745
  • 上传时间:2024-09-30
  • 格式:DOC
  • 页数:19
  • 大小:442KB
  • 下载积分:5 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    数据结构 学生 分配 问题
    资源描述:
    . . XX工学院 算法设计技能训练实习报告 题目: 学生搭配问题 系 (院):计算机工程学院 专 业: 微软 班 级: 计1137 学 号: 1131317726 姓 名: 陆炎炜 指导教师: 周海岩 学年学期: 2014 ~ 2015 学年 第 1 学期 2015年 1月 1 日 算法设计技能训练任务书 课题 名称 学生搭配问题 设计 目的 1、 通过算法设计技能训练,深入理解算法设计的意义和重要性,更好地掌握 算法设计的知识。 2、 能够针对某一具体问题,设计算法进行解决。 3、 锻炼实践动手能力,提高解决问题的能力。 实验 环境 硬件:1、PC机,奔腾Ⅳ以上CPU, 512MB以上内存,80G以上硬盘; 软件:Visual C++编程工具 任务 要求 1、 应用数据结构基础知识进行实际问题求解与分析 2、 作为一个完整的系统,应具有友好的界面和较强的容错能力 3、 上机能正常运行代码 4、 分析算法的运行效率 5、 按要求撰写课程设计报告和设计总结 工作进度计划 序号 起止日期 工 作 容 1 2014.12.29 任务下达,查阅文献资料 2 2014.12.29~2014.12.31 总体设计、素材搜集、课题详细设计、调试 3 2014.12.31~2015.1.3 完善设计、撰写报告 4 2015.1.4 答辩 指导教师(签章): 年月日 摘要 针对学生搭配问题,循环队列是一种重要的链式结构,其特殊性在于需附设 两个指针front和rear分别指示对头元素及队尾元素的位置且对头和队尾相邻接。在程序的设计过程中,运用了各种基本的算法,有判断队空及队满,出队,入队等.循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元依次存放从队列头到队列尾的元素外,尚需附设两个指针front和rear分别指示队列头元素和队列尾元素的位置。学生搭配问题是典型的只有采用循环队列才能解决的问题,实验表明该算法的空间复杂度优于其他算法。 本文用循环队列会很好的把这个程序设计出来,会有很好的效果。得出的程序运行结果能够很形象的把结果表示出来。 关键词: 学生搭配数据结构 循环队列目录 一、设计目的............................................ 二、课程设计............................................ 1、设计内容....................................... 2、设计思想....................................... 3、关键算法....................................... 4、测试结果....................................... 三、实验程序........................................... 四、结论............................................... 五、 致谢.............................................. 六、参考文献........................................... . .word.. . . 一、设计目的 1、通过算法设计技能训练,深入理解算法设计的意义和重要性,更好地掌握 算法设计的知识。 2、能够针对某一具体问题,设计算法进行解决。 3、锻炼实践动手能力,提高解决问题的能力。 二、 课程设计 1.设计内容 一班有m个女生,有n个男生(m不等于n),现要开一个舞会. 男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴. 请设计一系统模拟动态地显示出上述过程,要求如下: 1) 输出每曲配对情况 2) 计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的 情况.至少求出K的两个值. 3) 尽量设计出多种算法及程序,可视情况适当加分 2、设计思想 队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表。 循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元依次存放从队列头到队列尾的元素外,尚需附设两个指针front和rear分别指示队列头元素和队列尾元素的位置。 循环队列(两个),将男生、女生两组人分别存放,以实现循环配对输出。循环队列的入队,出队,判队满,判队空。 (1) 要模拟动态地显示出现题目中所要求的循环,我们要先建立两个循环队列SqQueue和SqQueue2。 (2) 将男生、女生两组人分别存入这两个队列。以实现他们的循环配对输出,这是循环队列固有的特性。 (3) 利用循环队列的特性,将男女生分别进行入队列和出队列操作,且实现搭配输出。 (4) 循环队列的长度分别设为男女生的个数即可。 (5) 在计算机终端输出的结果是:根据要求输出男生女生搭配情况。 3、关键算法 建立两个链式循环队列来分别存储男生和女生,然后调用入队出队函数实现循环队列的配对输 出。为充分利用向量空间,克服上述假上溢现象的方法是将向量空间想象为一个首尾相接的圆 环,存储在其中成为循环队列。在循环队列中进行出队、入队操作时,头尾指针仍要加1,朝 前移动。只不过当头尾指针指向向量上界时、其加1操作是指向向量的下界。这样就可以通过 出队再入队来实现男生女生的循环搭配。 课程设计过程中的关键算法如下: 1)关键算法之一:初始化队列 void InitQ(LinkQueue &Q)   {    QueuePtr p;    p=(QueuePtr)malloc(sizeof(QNode));   Q.front=p;   Q.rear=p;    Q.front->next=NULL;  } (2)关键算法之二:入队函数  void EnQueue(LinkQueue &Q,int num)//入队函数  {    QueuePtr p;     p=(QueuePtr)malloc(sizeof(QNode));   p->num=num;   p->next=NULL;   Q.rear->next=p;   Q.rear=p;  } (3)关键算法之三:出队函数   void DeQueue(LinkQueue &Q, int &num)//出队函数  {    QueuePtr p,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首曲子时女队的情况   void printF(LinkQueue &F,int i) //输出第i首曲子时女队的情况  {   QueuePtr p;    int n=1;   while(n<i)   {    printf("_ ");    n++;    }    p=F.front->next;   while(F.rear!=p)   {     printf("%d ",p->num);    p=p->next; }    printf("%d \n",p->num);  } . .word.. . . 4、测试结果: . .word.. . . 三、实验程序 #include<iostream> template <class T> class cirularQueue //定义一个一个循环队列 { private: int MaxSize; int front; //头指针 int rear; //尾指针 T *data; public: cirularQueue(int MaxLength) { MaxSize=MaxLength; front=rear=0; data=new T[MaxLength]; } ~cirularQueue() //定义析构函数,使对象在撤销时释放 { front=rear=0; delete []data; } void Initqueue() //队列的申明 { for(int i=0;i<maxSize-1;i++) push(i); } bool IsFull() //判断队列是否已满 { if((rear+1)%MaxSize==front) return true; else return false; } bool IsEmpty() //判断队列是否为空 { if(front==rear) return true; else return false; } void push(T info) //入队 { if(IsFull()) { cout<<"错误!队列已满!"<<endl; exit(-1); } else { data[rear]=info; rear=(rear+1)%MaxSize; } } void Pop(T &info) //出队 { if(IsEmpty()) { cout<<"错误!队列为空!"<<endl; exit(-1); } else { info=data[front]; front=(front+1)%MaxSize; } } void GetHead(T &info) //取队首元素 { if(IsEmpty()) { cout<<"错误!队列为空!"<<endl; exit (-1); } else { info=data[front]; } } }; void Initqueue(cirularQueue<int>&,int); void display(int,int); void charge(int,int); using namespace std; static int songnum=0; //定义歌曲的数量并初始化为0 static int m=0,n=0; //男生和女生的人数 int main() //主函数 { cout<<"请分别输入男生和女生的人数:"; cin>>m>>n; display(m,n); int a=0,b=0; //男生和女生的编号,以判断他们在第几首歌时能在一起跳舞 char quit='y'; //判断是否继续输入,如果继续输入,则输入'y';否则输入'n' while(quit!='n') { cout<<"请输入男生和女生的编号:"; cin>>a>>b; while((a>m)||(b>n)) //如果输入错误 { cout<<"输入的编号过大,请重新输入:"; cin>>a>>b; } charge(a,b); cout<<"是否继续(是请输入'y',否则请输入'n'):"; cin>>quit; } return 0; } void Initqueue(cirularQueue<int> &Q,int m) //初始化队列 { for(int i=1;i<=m;i++) Q.push(i); } void display(int m,int n) { cirularQueue<int> man(m+1); cirularQueue<int> woman(n+1); Initqueue(man,m); Initqueue(woman,n); cout<<"请输入曲目数:"; cin>>songnum; cout<<"每曲的配对情况为:"<<endl; for(int k=1;k<=songnum;k++) { int x=0,y=0; //男生和女生的编号 man.Pop(x); //男生按顺序出对跳舞 woman.Pop(y); //女生按顺序出对跳舞 cout<<"第"<<k<<"曲:\t"<<x<<"号男生<->"<<y<<"号女生"<<endl; //他们在一起跳舞 man.push(x); //跳完舞后男生再次进入队列等在下一次跳舞 woman.push(y); //跳完舞后男生再次进入队列等在下一次跳舞 } } void charge(int a,int b) { int count=0; //定义舞曲计数以记录他们能在第几曲时在一起跳舞 cirularQueue<int> man1(m+1); cirularQueue<int> woman1(n+1); Initqueue(man1,m); Initqueue(woman1,n); while(count<=songnum) { int x, y; count++; man1.Pop(x); woman1.Pop(y); man1.push(x); woman1.push(y); if((x==a)&&(y==b)) { cout<<"第"<<count<<"首曲:\t"<<a<<"号男生<->"<<b<<"号女生"<<endl; break; } } //如果他们在这个舞会上不能在一起跳舞,则输出 if(count==songnum+1) cout<<"他们在这个舞会上不可能在一起跳舞"<<endl; } 结 论 设计采用的是循环队列的基本操作顺利的解决学生舞曲搭配问题,主要利用用循环队列的环状结构,循环地执行出列入列操作并在出队列时进行配对并输出配对情况,而整个过程不需要不需要移动元素使程序在空间复杂度上降到最小,采用指针的移动大大加快了程序的执行效率。并且对输入进行了改进,以防止用户随意输入时出现的各种意想不到的错误。 本次程序设计中所用语言为C++,程序开始定义了类cirular,其中有头指针,尾指针及数据域等。随之定义了析构函数,释放对象,然后进行了队列的基本操作,有队列的申明,判断队空及队满,出队,入队,其核心是display()函数和charge()函数,其中display()用于对各位同学编号和每队的输出情况,charge()用于计算已编号的同学在第几曲中进行配对。循环队列是一种环状的队列并且对头元素指向队尾元素,学生搭配问题是典型的只有采用循环队列才能解决的问题,实验表明该算法的空间复杂度优于其他算法。 致 踉踉跄跄地忙碌近三四天,我的实训报告也终将告一段落。点击运行,也基本达到预期的效果,虚荣的成就感在没人的时候也总会冒上心头。但由于能力和时间的关系,总是觉得有很多不尽人意的地方。可是,我又会有点自恋式地安慰自己:做一件事情,不必过于在乎最终的结果,可贵的是过程中的收获。以此语言来安抚我尚没平复的心。感谢,衷心的感谢。在实训设计完成之际,衷心感谢我的老师周海岩老师对我的导和教诲。周老师开阔的思维、敏锐的洞察力以及详细的修改意见给我大的启发。金老师不仅专业学识渊博、治学严谨,待人平易近人;同时他对工作的积极热情、对学生认真负责、实事求是的态度,给我留下了深刻的印象,使我受益非浅。唯一的遗憾是我自己不够主动,错过了许多与您交流的机会。在此,我再次向周老师表示衷心的感谢和深深的敬意。 感谢我的母校给我们授课的各位尊敬的老师和计算机系培养我的领导与辅导老师,正是由于他们的以言传身教、解惑,让我学到了专业知识和许多做人的道理。我要特别感谢我的实训老师,与他们在相处的时间里,从他们身上学到了如何求知治学、如何为人处事。我也要感谢我的母校,是她为我提供了良好的学习环境和生活环境,让我的大学生活丰富充实,为我的人生留下了一段难忘的回忆。 感谢在整个实训设计期间和我密切合作的同学,在我弄实训设计过程中,他们热切关心我的设计进度,认真帮忙提出设计的修改意见,为我提供免费的设计数据并帮助我收集查找一些资料。 感谢我的朋友,感谢他们在我失意时给我鼓励,在失落时给我支持,感谢他们和我一路走来,让我在此过程中倍感温暖。 感谢我的家人和亲人,没有他们,就不会有今天的我。他们给予我的关爱、理解和支持是我勇于进取的动力。 参 考 文 献 1、 殷人昆编著。数据结构实用教程(C/C++描述)。:清华大学 2007 2、 钱能编著。C++程序设计教程。:清华大学 1999 3、 孙巧萍主编。数据结构实训教程。 : 科学 , 2000 4、 严蔚敏,数据结构题集(C语言版)。:清华大学,2006 指导教师评语 学号 班级 选题 名称 序号 评价内容 权重(%) 得分 1 考勤记录、学习态度、工作作风与表现。 5 2 自学情况: 上网检索机时数、文献阅读情况(笔记)。 10 3 论文选题是否先进,是否具有前沿性或前瞻性。 5 4 成果验收: 是否完成设计任务;能否运行、可操作性如何等。 20 5 报告的格式规X程度、是否图文并茂、语言规X及流畅程度;主题是否鲜明、重心是否突出、论述是否充分、结论是否正确;是否提出了自己的独到见解。 30 6 文献引用是否合理、充分、真实。 5 7 答辩情况: 自我陈述、回答问题的正确性、用语准确性、逻辑思维、是否具有独到见解等。 25 合计 指导教师(签章): 年月日 . .word..
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:数据结构实训-学生分配问题.doc
    链接地址:https://www.zixin.com.cn/doc/4576745.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork