数据结构实训-学生分配问题
- 格式:doc
- 大小:465.50 KB
- 文档页数:16
数据结构实训总结一、引言数据结构是计算机科学中的重要基础知识,它研究数据的组织、存储和管理方式,以及数据之间的关系和操作。
数据结构实训是为了让学生通过实践掌握数据结构的基本概念和常用算法,提升解决实际问题的能力。
本文将对我在数据结构实训中的学习和实践进行总结和归纳。
二、实训内容1. 实训目标数据结构实训的主要目标是通过实践掌握以下内容:- 理解数据结构的基本概念,如栈、队列、链表、树等;- 掌握常用的数据结构操作和算法,如插入、删除、查找等;- 能够设计和实现基于数据结构的算法,解决实际问题。
2. 实训任务在数据结构实训中,我们完成了以下任务:- 实现栈的基本操作:包括入栈、出栈、判空和取栈顶元素等;- 实现队列的基本操作:包括入队、出队、判空和取队头元素等;- 实现链表的基本操作:包括插入、删除、查找和遍历等;- 实现树的基本操作:包括创建、插入、删除和遍历等;- 实现排序算法:包括冒泡排序、插入排序和快速排序等。
三、实训过程1. 学习理论知识在实训开始之前,我们首先学习了数据结构的基本概念和常用算法。
通过阅读教材和参考资料,我们了解了栈、队列、链表、树等数据结构的特点和操作方法,以及排序算法的原理和实现方式。
2. 编写代码在学习理论知识的基础上,我们开始编写代码实现各种数据结构和算法。
我们使用C++语言进行编程,通过实践加深对数据结构和算法的理解。
在编写代码的过程中,我们遵循了良好的编码规范,注重代码的可读性和可维护性。
3. 调试和测试在编写完代码后,我们进行了调试和测试工作。
通过输入不同的测试数据,我们验证了代码的正确性和性能。
在调试过程中,我们发现了一些错误和问题,并进行了修复和优化。
通过不断的调试和测试,我们逐渐完善了代码的功能和性能。
四、实训收获通过数据结构实训,我获得了以下收获:1. 理论知识的巩固:通过实践,我对数据结构的基本概念和常用算法有了更深入的理解,巩固了课堂上学到的知识。
《数据结构和算法》实验指导书实验及学时数分配序号实验名称学时数(小时)1 实验一线性表 42 实验二树和二叉树 23 实验三图 24 实验四查找 25 实验五内部排序 2合计12几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。
二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。
上机时签到;下机时验收签字。
三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。
实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。
1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。
《数据结构》课程实训任务书学期:2014~2015学年第三学期班级:131时间:1--4周机房:博学楼,70X实验室一、目的和要求1、进一步掌握常用算法的思想及实现;2、进一步理解和运用结构化程序设计的思想和方法;3、初步掌握开发一个小型实用系统的基本方法;4、掌握调试中小程序的基本方法;5、掌握流程图的表示方法;6、掌握书写程序设计开发文档的能力;7、锻炼和提高查找资料和自学能力;8、从“二、设计任务”中选择一个项目来完成,用C语言实现,系统的各个功能模块要求用函数的形式实现。
以小组为单位进行。
小组人数以3~4人为宜。
9、强调独立完成,强调实际成果;重视软件测试,重视文档写作。
10、课程实训结束后,每人要求提供以下电子文档:1)每组提交一份源程序文件2)每人提交一份实训报告。
实训报告的具体格式参考“三、课程设计报告格式”。
每组同学根据自己在小组中的任务不同,完成自己的模块的相关任务书。
3)每组一个演示文稿,答辩使用。
11、答辩以小组为单位,按照提交次序按组答辩。
二、设计任务课题一:宿舍管理查询系统1)任务:为宿舍管理员编写一个宿舍管理查询系统2) 程序要求A、采用交互工作方式(键盘、鼠标均可,控制台或者图形界面均可)B、建立数据文件,数据文件按关键字(姓名、学号、房号)进行排序(冒泡、选择、插入、快速排序任选一种)C、用二分查找实现以下操作:按姓名查询、按房号查询、按学号查询D、打印任一查询结果课题二:各种排序算法时间性能的比较1) 问题描述对各种排序方法(直接插入排序、希尔排序、起泡排序、快速排序、直接选择排序、堆排序和归并排序)的时间性能进行比较。
2) 基本要求(1) 设计并实现上述各种排序算法;(2) 产生正序和逆序的初始排列分别调用上述排序算法,并比较时间性能;(3) 产生随机的初始排列分别调用上述排序算法,并比较时间性能。
3) 设计思想上述各种排序方法都是基于比较的内排序,其时间主要消耗在排序过程中进行的记录的比较次数和移动次数,因此,统计在相同数据状态下不同排序算法的比较次数和移动次数,即可实现比较各种排序算法的目的。
数据结构课程安排之阳早格格创做题目: 教死拆配问题教院:班级:教死姓名:教死教号:指导教师:2012 年 12 月 3 日戴要针对于教死拆配问题,循环行列是一种要害的链式结构,其特殊性正在于需附设二个指针front战rear分别指示对于头元素及队尾元素的位子且对于头战队尾相邻交.正在步调的安排历程中,使用了百般基原的算法,有推断队空及队谦,出队,进队等.循环行列是正在行列的程序保存结构中,除了用乙组天面连绝的保存单元依次存搁从行列头到行列尾的元素中,尚需附设二个指针front 战rear分别指示行列头元素战行列尾元素的位子.教死拆配问题是典型的惟有采与循环行列才搞办理的问题,真验标明该算法的空间搀纯度劣于其余算法.原文用循环行列会很佳的把那个步调安排出去,会有很佳的效验.得出的步调运止截止不妨很局里的把截止表示出去.闭键词汇:教死配对于,数据结构,循环行列.目录纲要错误!未定义书签。
1安排题目错误!未定义书签。
2运止环境13算法安排的思维14 算法的过程图25 算法安排分解26 源代码37 运止截止分解88 支获及体验8参照文件9致开9教死拆配问题一班有m个女死,有n个男死(m出有等于n),现要启一个舞会. 男女死分别编号坐正在舞池的二边的椅子上.每直启初时,依次从男死战女死中各出一人配对于跳舞, 原直出乐成配对于者坐着等待下一直找舞陪.请安排一系统模拟动向天隐现出上述历程,央供如下:(1)输出每直配对于情况(2)估计出所有一个男死(编号为X)战任性女死(编号为Y),正在第K直配对于跳舞的情况.起码供出K的二个值.原课题的步调安排战尝试等关节皆是正在Windows7支配系统下完毕,硬件的编译尝试环境为vc6.0 以c谈话编写的.硬件的硬件运止需要非常矮,所有估计机皆可运止.基原思路:行列(Queue)是只允许正在一端举止拔出,而正在另一端举止简略的运算受限的线性表.循环行列是正在行列的程序保存结构中,除了用乙组天面连绝的保存单元依次存搁从行列头到行列尾的元素中,尚需附设二个指针front战rear分别指示行列头元素战行列尾元素的位子.循环行列(二个),将男死、女死二组人分别存搁,以真止循环配对于输出.循环行列的进队,出队,判队谦,判队空.(1)要模拟动向天隐现出现题目中所央供的循环,咱们要先修坐二个循环行列SqQueue战SqQueue2.(2)将男死、女死二组人分别存进那二个行列.以真止他们的循环配对于输出,那是循环行列固有的个性.(3)利用循环行列的个性,将男女死分别举止进行列战出行列支配,且真止拆配输出.(4)循环行列的少度分别设为男女死的个数即可.(5)正在估计机末端输出的截止是:根据央供输出男死女死拆配情况闭键问题: 循环行列的应用办理要领:数据模型(逻辑结构): 循环行列(二个),将男死、女死二组人分别存搁,以真止循环配对于输出.保存结构: 循环链表核心算法: 循环行列的进队,出队,判队谦,判队空.输进数据: 男死人数、女死人数,歌直数量输出数据: 每一尾歌直播搁时,男死战女死拆配情况(只输出编号即可)当要查找的男女拆配时输出歌直编号,战他们拆配的总次数.通过以上分解,该步调具备可止性.调试历程中出现的问题及办理要领:“空”仍旧“谦”,果此,正在进队支配即拔出一个新元素动做新的队尾元素时出现了问题,即末尾一位共教无法进队.办理要领:将行列调配的最大空间起码再减少一个6.源代码#include <string.h>#include<stdio.h>#include <time.h>#include <malloc.h>#define MAXSIZE 60#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1//typedef int system; typedef struct QNode{int num;struct QNode *next;}QNode,* QueuePtr;typedef struct{QueuePtr front;QueuePtr rear;}LinkQueue;void sleep( clock_t wait ) {clock_t goal;goal = wait + clock(); while( goal > clock() ) ; }void InitQ(LinkQueue &Q) {QueuePtr p;p=(QueuePtr)malloc(sizeof(QNode)); Q.front=p;Q.rear=p;Q.front->next=NULL;}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;}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);}void printF(LinkQueue &F,int 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);}void printM(LinkQueue &M,int i) {QueuePtr p;int n=1;while(n<i){printf("_ ");n++;}p=M.front->next;while(M.rear!=p){printf("%d ",p->num);p=p->next;}printf("%d \n",p->num);}int main(){int m,n,k,i,a,b;int count=0,num;QueuePtr p,q;LinkQueue F;LinkQueue M;printf("请输进女死数量:");scanf("%d",&m);printf("请输进男死数量:");scanf("%d",&n);printf("请输直子号:");scanf("%d",&k);printf("请输进要查找的男死编号:"); scanf("%d",&a);printf("请输进要查找的女死编号:"); scanf("%d",&b);InitQ(F);InitQ(M);for(i=1;i<=m;i++){EnQueue(F,i);}for(i=1;i<=n;i++){EnQueue(M,i);}for(i=1;i<=k;i++){system("CLS");printf("第%d尾直子 \n",i);printF(F,i);printM(M,i);p=F.front->next;q=M.front->next;printf("暂时跳舞的是第%d号女死战第%d号男死\n",p->num,q->num); if(p->num==a&&q->num==b){count++;printf("第%d直是要查找的男女死跳舞\n",i);}sleep(3000);DeQueue(F,num);EnQueue(F,num);DeQueue(M,num);EnQueue(M,num);}printf("该对于男女死共跳舞%d次\n",count);system("PAUSE");return 0;}尝试及运止截止尝试输进数据:男女死的个数直子数战要查找的男女死编号输出截止为:每尾直子男女死拆配的情况步调运止界里:通过一周的教习战试验,办理本质问题(教死拆配问题),让尔对于循环行列有了更深的相识,对于数据结构爆收了浓薄的兴趣,共时也让尔普及了办理本质问题的本领.咱们要出有竭的通过上机去普及自己的教习火仄,正在上机的共时改正了自己对于某些算法的过失使用,使自己正在通历步调办理问题时抓住闭键算法,有了算法安排思维战过程图,并用C谈话描画出闭键算法.参照文件[1] 数据结构(C谈话版)宽蔚敏吴伟明编著,浑华大教出版社[2] C谈话步调安排(第三版)谭浩强著,浑华大教出版社致开最先,尔要感动书籍院给咱们提供了此次课程安排的机会,能让共教们正在所有教习与钻研,让咱们有机会对于所教的表里知识举止试验.其次,尔还要特天感动尔的领导教授弛太收教授,正在他的粗心领导战助闲下,尔的安排才得以乐成完毕,并使所教知识得以真真的应用.对于他为尔的安排所提出的贵沉意睹表示忠心的感动!末尾,正在安排历程中,也得到了许多共教的贵沉修议,共时还到许多校友的支援战助闲,正在此一并致以诚挚的开意.课程安排评阅书籍。
数据结构课程设计题目: 学生搭配问题学院:班级:学生姓名:学生学号:指导教师:2012 年 12 月 3 日课程设计任务书摘要针对学生搭配问题,循环队列是一种重要的链式结构,其特殊性在于需附设两个指针front和rear分别指示对头元素及队尾元素的位置且对头和队尾相邻接。
在程序的设计过程中,运用了各种基本的算法,有判断队空及队满,出队,入队等.循环队列是在队列的顺序存储结构中,除了用乙组地址连续的存储单元依次存放从队列头到队列尾的元素外,尚需附设两个指针front和rear分别指示队列头元素和队列尾元素的位置。
学生搭配问题是典型的只有采用循环队列才能解决的问题,实验表明该算法的空间复杂度优于其他算法。
本文用循环队列会很好的把这个程序设计出来,会有很好的效果。
得出的程序运行结果能够很形象的把结果表示出来。
关键词:学生配对,数据结构,循环队列。
目录摘要................................... 错误!未定义书签。
1 设计题目............................. 错误!未定义书签。
2 运行环境 (1)3 算法设计的思想 (1)4 算法的流程图 (2)5 算法设计分析 (2)6 源代码 (3)7 运行结果分析 (8)8 收获及体会 (8)参考文献 (9)致谢 (9)学生搭配问题1.设计题目一班有m个女生,有n个男生(m不等于n),现要开一个舞会. 男女生分别编号坐在舞池的两边的椅子上.每曲开始时,依次从男生和女生中各出一人配对跳舞, 本曲没成功配对者坐着等待下一曲找舞伴。
请设计一系统模拟动态地显示出上述过程,要求如下:(1)输出每曲配对情况(2)计算出任何一个男生(编号为X)和任意女生(编号为Y),在第K曲配对跳舞的情况.至少求出K的两个值。
2.运行环境本课题的程序设计和测试等环节都是在Windows7操作系统下完成,软件的编译测试环境为vc6.0 以c语言编写的。
《数据结构与算法》技能实训题目1.运动会分数统计(限1 人完成)任务:参加运动会有n个学校,学校编号为1……n。
比赛分成m个男子项目,和w个女子项目。
项目编号为男子1……m,女子m+1……m+w。
不同的项目取前五名或前三名积分;取前五名的积分分别为:7、5、3、2、1,前三名的积分分别为:5、3、2;哪些取前五名或前三名由学生自己设定。
(m<=20,n<=20)功能要求:1)可以输入各个项目的前三名或前五名的成绩;2)能统计各学校总分,3)可以按学校编号或名称、学校总分、男女团体总分排序输出;4)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
5)数据存入文件并能随时查询6)规定:输入数据形式和范围:可以输入学校的名称,运动项目的名称输出形式:有合理的提示,各学校分数为整形界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计,但是要求运动会的相关数据要存储在数据文件中。
(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构;测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。
进行程序测试,以保证程序的稳定。
测试数据及测试结果请在上交的资料中写明;2.飞机订票系统(限1 人完成)任务:通过此系统可以实现如下功能:录入:可以录入航班情况(数据可以存储在一个数据文件中,数据结构、具体数据自定)查询:可以查询某个航线的情况(如,输入航班号,查询起降时间,起飞抵达城市,航班票价,票价折扣,确定航班是否满仓);可以输入起飞抵达城市,查询飞机航班情况;订票:(订票情况可以存在一个数据文件中,结构自己设定)可以订票,如果该航班已经无票,可以提供相关可选择航班;退票:可退票,退票后修改相关数据文件;客户资料有姓名,证件号,订票数量及航班情况,订单要有编号。
《数据结构与算法》实验指导书实验及学时数分配几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。
二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。
上机时签到;下机时验收签字。
三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。
实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。
1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。
(从键盘接受删除元素位置i,实现删除;显示删除后的线性表)二、用C语言编程实现建立一个单链表,并在此表中插入一个元素和删除一个元素。
数据结构实验队列的基本操作《数据结构》是计算机相关专业的一门核心基础课程,也是很多高校研究生入学考试专业课必考课程之一。
它主要介绍线性结构、树型结构、图形结构三种逻辑结构元素的存储实现,在此基础上介绍一些典型算法及时、空效率分析。
这门课程的主要任务是培养学生的算法分析、设计能力及良好的程序设计习惯。
通过学习,要求学生能够掌握典型算法的设计思想及程序实现,能够根据实际问题选取合适的存储方案,设计出简洁、高效、实用的算法,为后续课程的学习及软件开发打下良好的基础。
学习这门课程,习题和实验是两个关键环节。
学生理解算法的最佳途径是上机实验。
因此,实验环节的好坏是学生能否学好《数据结构》的关键。
为了更好地配合学生实验,特编写该实验指导书。
一、实验目的、要求和任务计算机编程中加工处理的对象是数据,而数据具有一定的组织结构,所以学习编写计算机程序仅仅了解计算机语言是不够的,还必须掌握数据组织、存储和运算的一般方法,这是数据结构课程中学习和研究的内容。
由于数据结构的原理和算法较抽象,而该课程一般在本科低年级开设,对于计算机程序设计知识的初学者,理解和掌握其中的原理就显得较为困难。
1.熟练掌握C语言的编辑、编译、调试程序。
2.会书写类C语言的算法,并将算法转变为程序实现。
3.正确理解各种数据结构的逻辑特性和存储表示和基本操作的算法实现。
4.有较强的逻辑分析能力。
5.针对问题的不同选择合适的数据结构,提高算法设计的能力和动手实验的技能。
6.学会分析研究计算机加工的数据结构的特性,以便为应用设计的数据选择适当的逻辑结构、存储结构及其相应的算法,并初步掌握算法的时间分析和空间分析的技术。
7.本课程的学习过程也是复杂程序设计的训练过程,要求学生编写的程序结构清楚、正确易读,符合软件过程的规范,从而培养学生的数据抽象能力。
8.通过若干数据结构应用实例,引导学生学习数据类型的使用,为今后学习面向对象的程序做一些铺垫。
二、实验基本内容及学时分配为了达到实验目的,本课程安排了4个实验单元,训练的重点在于基本的数据结构,而不是强调面面俱到。
一、实训目的通过本次实训,使学生掌握队列数据结构的基本概念、特点、实现方法以及在实际问题中的应用。
同时,培养学生运用队列解决实际问题的能力,提高编程技能。
二、实训内容1. 队列基本概念及特点队列是一种先进先出(FIFO)的线性表,它允许在一端进行插入操作(称为队尾),在另一端进行删除操作(称为队头)。
队列具有以下特点:(1)顺序存储:队列中的元素按照一定的顺序存储,元素之间通过指针或索引进行连接。
(2)先进先出:队列中的元素按照进入队列的顺序依次出队,先进入队列的元素先出队。
(3)插入和删除操作:队列的插入和删除操作都在一端进行,即队尾插入、队头删除。
2. 队列的存储结构队列的存储结构主要有两种:顺序存储结构和链式存储结构。
(1)顺序存储结构:使用数组来实现队列,队列的元素存储在数组中,通过头指针和尾指针来表示队列的队头和队尾。
(2)链式存储结构:使用链表来实现队列,队列的元素存储在链表的节点中,通过头指针和尾指针来表示队列的队头和队尾。
3. 队列的基本操作(1)初始化队列:创建一个空队列,头指针和尾指针都指向队列的初始位置。
(2)判断队列是否为空:判断头指针是否指向队列的初始位置。
(3)判断队列是否已满:对于顺序存储结构,判断队列的长度是否达到数组的最大长度;对于链式存储结构,判断尾指针是否指向队列的最后一个节点。
(4)入队:在队尾插入一个新元素,更新尾指针。
(5)出队:删除队头元素,更新头指针。
(6)获取队头元素:返回队头元素,但不删除队头元素。
(7)获取队列长度:返回队列中元素的个数。
4. 队列的应用实例(1)作业调度:在计算机系统中,作业调度是一种常用的队列操作。
作业按照提交的顺序进入队列,系统根据一定的调度策略,从队列中取出作业执行。
(2)打印队列:在打印队列中,文档按照提交打印的顺序进入队列,打印机按照队列的顺序依次打印文档。
(3)购物车:在购物车中,商品按照添加的顺序进入队列,顾客从队头开始依次结账。
中南大学“数据结构”课程设计(学生管理系统)专业:计算机类班级:姓名:学号:完成日期:二〇一〇年七月六日目录:1 问题描述2 基本要求3系统分析与设计4 测试数据及结果5 总结6 附录:源程序清单学生信息管理系统1.问题描述设计一个学生信息管理系统,实现对学生基本信息的添加、删除、修改和查询等操作。
2.基本要求:程序采用图形界面下进行交互的工作方式,完成如下功能:(1)多种方式建立学生信息●每个学生信息由学号、姓名、数学、英语和语文组成;●可以通过手工录入每个学生信息,并在StudentFile.txt保存;●也可以导入某个路径下存放学生信息的文本文件。
(2)浏览所有学生信息。
(3)按照学号对所有学生信息进行升序、降序排列,并输出●可选用冒泡、选择、快速排序等算法;●不仅输出屏幕显示,还需要写入存放学生信息的文件。
(4)按姓名、学号等方式,实现对学生信息精确查询、模糊查询,并输出屏幕显示●精确查询结果演示查询“姓名是刘梅”同学信息,则输出学号姓名数学英语语文………..2004112011 刘梅88 90 78 ……....●模糊查询结果演示查询“姓刘”的同学信息,则输出学号姓名数学英语语文………..2004112011 刘梅88 90 78 ……....2004112011 刘强87 80 98 ……....2004112011 刘星86 70 58 ……....●能够实现连续多次查询(5)学生信息的插入、删除、修改。
●通过插入、删除和修改后,保持所有学生信息的有序性;●插入、删除和修改后,对存放所有学生信息的文件及时更新。
(6)数据的统计功能●统计每个学生的平均分和总分;●统计每个科目的平均分和最高分、最低分;●将上述统计结果,写入存放学生信息的文件。
3系统分析与设计流程图:学生信息由一个学生结构体保存其个人信息。
学生结构体存放于一个结构体数组中,即线性表。
各个学生按照学号排序,此处用到了直接插入排序。
淮阴工学院算法设计技能训练实习报告题目:学生搭配问题系(院): 计算机工程学院专业:微软班级:计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、测试结果.......................................三、实验程序...........................................四、结论...............................................五、致谢..............................................六、参考文献...........................................一、设计目的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);}4、测试结果:三、实验程序#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;}结论设计采用的是循环队列的基本操作顺利的解决学生舞曲搭配问题,主要利用用循环队列的环状结构,循环地执行出列入列操作并在出队列时进行配对并输出配对情况,而整个过程不需要不需要移动元素使程序在空间复杂度上降到最小,采用指针的移动大大加快了程序的执行效率。