数据结构课程设计《 排队购票问题》.docx

上传人:b****5 文档编号:12307469 上传时间:2023-04-18 格式:DOCX 页数:27 大小:190.50KB
下载 相关 举报
数据结构课程设计《 排队购票问题》.docx_第1页
第1页 / 共27页
数据结构课程设计《 排队购票问题》.docx_第2页
第2页 / 共27页
数据结构课程设计《 排队购票问题》.docx_第3页
第3页 / 共27页
数据结构课程设计《 排队购票问题》.docx_第4页
第4页 / 共27页
数据结构课程设计《 排队购票问题》.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

数据结构课程设计《 排队购票问题》.docx

《数据结构课程设计《 排队购票问题》.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计《 排队购票问题》.docx(27页珍藏版)》请在冰豆网上搜索。

数据结构课程设计《 排队购票问题》.docx

数据结构课程设计《排队购票问题》

2014-1-7

东北大学信息科学与工程学院

数据结构课程设计报告

题目排队购票问题

课题组长XXX

课题组成员XXXXX

专业名称计算机科学与技术

班级计算机1206

指导教师杨雷

 

2014年1月

 

题目:

排队购票问题

问题描述:

欧洲杯足球赛正在激烈进行。

决赛门票处于热卖。

为使门票公平、安全的销售,售票处决定采用如下售票规则:

(1)购票者到购票处领取一个随机编号。

(2)购票者按随机编号从小到大排序。

(3)随机编号处于最小编号与最大编号之间的购票者,可直接到窗口排队购票。

(4)售票窗口空闲时随机发出0或1指令,指令为0时,最小编号者到窗口购票,指令为1时,最大编号者到窗口购票。

设计要求:

设计算法实现按上述规则的排队售票程序。

(1)采用STL的双端队列等数据结构。

(2)实现STL的双端队列类deque。

(3)尝试采用不同数据结构的多种解法。

指导教师签字:

年月日

 

1课题概述1

1.1课题任务1

1.2课题原理1

1.3相关知识3

2需求分析4

2.1课题调研4

2.2用户需求分析5

3方案设计7

3.1总体功能设计7

3.2数据结构设计8

3.3函数原型设计10

3.4主算法设计12

3.5用户界面设计14

4方案实现15

4.1开发环境与工具15

4.2程序设计关键技术16

4.3个人设计实现(按组员分工)

4.3.1XX设计实现17

4.3.2XXX设计实现19

4.3.3XXX设计实现21

5测试与调试23

5.1个人测试(按组员分工)23

5.1.1XX测试23

5.1.2XXX测试26

5.1.3XXX测试30

5.2组装与系统测试33

5.3系统运行36

6课题总结39

6.1课题评价39

6.2团队协作40

6.3团队协作41

6.4个人设计小结(按组员分工)42

6.4.1XX设计小结42

6.4.2XXX设计小结45

6.4.3XXX设计小结48

7附录A课题任务分工50

A-1课题程序设计分工50

A-2课题报告分工51

附录B课题设计文档(光盘)52

B-1课程设计报告(电子版)52

B-2源程序代码(*.H,*.CPP)52

B-3工程与可执行文件)52

B-4屏幕演示录像文件(可选)52

附录C用户操作手册(可选)53

C.1运行环境说明53

C.2操作说明54

 

1课题概述

1.1课题任务

欧洲杯足球赛正在激烈进行。

决赛门票处于热卖。

为使门票公平、安全的销售,售票处决定采用如下售票规则:

(1)购票者到购票处领取一个随机编号。

(2)购票者按随机编号从小到大排序。

(3)随机编号处于最小编号与最大编号之间的购票者,可直接到窗口排队购票。

(4)售票窗口空闲时随机发出0或1指令,指令为0时,最小编号者到窗口购票,指令为1时,最大编号者到窗口购票。

1.2课题原理以及相关知识

设计算法实现按上述规则的排队售票程序。

(1)采用STL的双端队列等数据结构。

(2)实现STL的双端队列类deque。

(3)尝试采用不同数据结构的多种解法。

2系统需求分析

只需对来购票的人进行合理公平的随机分配即可,然后进行取票。

开发环境:

PC机

WindowsXP系统

使用软件:

编写实验报告:

MicrosoftOfficeWord

画图:

陈柯铮

制作程序:

MicrosoftVisualC++6.0

3算法流程

 

 

 

 

 

结束

 

4方案实现与关键技术

双端队列

是一种具有队列和栈的性质的数据结构。

双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。

双端队列是限定插入和删除操作在表的两端进行的线性表。

这两端分别称做端点1和端点2(如下图(a)所示)。

也可像栈一样,可以用一个铁道转轨网络来比喻双端队列,如下图(b)所示。

在实际使用中,还可以有输出受限的双端队列(即一个端点允许插入和删除,另一个端点只允许插入的双端队列)和输入受限的双端队列(即一个端点允许插入和删除,另一个端点只允许删除的双端队列)。

而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。

双端队列就是一个两端都是结尾的队列。

队列的每一端都可以插入数据项和移除数据项。

这些方法可以叫作insertLeft()和insertRight(),以及removeLeft()和removeRight()。

如果严格禁止调用insertLeft()和removeLeft()方法(或禁用右段的操作),双端队列功能就和栈一样。

禁止调用insertLeft()和removeRight()(或相反的另一对方法),它的功能就和队列一样了。

双端队列与栈或队列相比,是一种多用途的数据结构,在容器类库中有时会用双端队列来提供栈和队列两种功能。

5程序实现

5.1个人程序实现

5.1.1杨兵程序实现

voidOP1(deque&Data,int*Result,intPeopleCount,intTicketCount)

{

Result[PTR]=Data.front();

PTR++;

Data.pop_front();

PeopleCount--;

TicketCount--;

cout<<"通知:

队首请购票"<

}

voidOP2(deque&Data,int*Result,intPeopleCount,intTicketCount)

{

Result[PTR]=Data.back();

PTR++;

Data.pop_back();

PeopleCount--;

TicketCount--;

cout<<"通知:

队尾请购票"<

}

voidOP3(deque&Data,int*Result,int*Stack,intPeopleCount,intTicketCount,int*x)

{

if(PeopleCount<3)

{

*x--;

return;

}

intp=MakeSrand(1,Data.size()-1);

inti;

for(i=0;i

{

InStack(Stack,Data.front());

Data.pop_front();

}

Result[PTR]=Data.front();

Data.pop_front();

PTR++;

for(i=0;i

PeopleCount--;

TicketCount--;

cout<<"通知:

当前队列中第"<

}

voidDisplayResult(int*Result)

{

inti;

cout<

for(i=0;i

{

if(0==i%10)cout<

cout<

}

cout<

}

5.1.2王正海程序实现

#include

#include

#include

#include

#include

#include//搜索

#include

usingnamespacestd;

intMakeSrand(intx,inty);//产生x~y随机数的函数,不包括y

voidOP1(deque&Data,int*Resultint,intPeopleCount,intTicketCount);

voidOP2(deque&Data,int*Resultint,intPeopleCount,intTicketCount);

voidOP3(deque&Data,int*Result,int*Stack,intPeopleCount,intTicketCount,int*x);

voidDisplayResult(int*Result);//展示购票结果

voidInStack(int*Stack,intElement);//辅助栈的进栈函数

intOutStack(int*Stack);//辅助栈的出栈函数

intPTR=0;//结果数组Result的游标

intPOP=-1;//辅助栈的顶指针

voidInStack(int*Stack,intElement)

{

POP++;

Stack[POP]=Element;

}

intOutStack(int*Stack)

{

POP--;

returnStack[POP+1];

}

5.1.3陈柯铮程序实现

voidmain()

{

srand((unsigned)time(NULL));//随机种子,这行语句必须放在主函数中,切记

//------------------------------------------------------------------------------------

intPeopleCount;//初始化排队人数和总票数

intTicketCount;

printf("\t\t========================================\n");

printf("\t\t**\n");

printf("\t\t**\n");

printf("\t\t*请输入排队购票的人数和总票数,以空格隔开*\n");

printf("\t\t**\n");

printf("\t\t**\n");

printf("\t\t========================================\n");

cin>>PeopleCount>>TicketCount;

//------------------------------------------------------------------------------------

constintMAX=(PeopleCount>TicketCount?

PeopleCount:

TicketCount);//根据具体人数和票数判断情形并构造辅助数据结构

intMIN=(PeopleCount

PeopleCount:

TicketCount);

intSituation=(PeopleCount>TicketCount?

1:

2);//情形1:

人多票少;情形2:

票多人少.

int*Result=newint[MAX];//构建结果数组,存放购票结果

int*Stack=newint[PeopleCount];//构建辅助栈,辅助OP3函数的操作

//------------------------------------------------------------------------------------

dequeData;//构建队列并给队列中的每一个人编号

inti;

cout<

for(i=1;i<=PeopleCount;i++)Data.push_back(i);

cout<

//------------------------------------------------------------------------------------

intDecide;//根据随机函数结果判定摇号方式

for(i=0;i

{

Decide=MakeSrand(0,3);

switch(Decide)

{

case0:

OP1(Data,Result,PeopleCount,TicketCount);break;//队首购票

case1:

OP2(Data,Result,PeopleCount,TicketCount);break;//队尾购票

case2:

OP3(Data,Result,Stack,PeopleCount,TicketCount,&i);break;//队中随机编号的人购票

}

}

//------------------------------------------------------------------------------------

switch(Situation)//本次购票模拟结束,展示结果

{

case1:

cout<

case2:

cout<

}

DisplayResult(Result);

cout<

}

intMakeSrand(intx,inty)

{intn;

n=rand()%(y-x);

returnn+x;

}

 

6.1个人测试

6.1.1陈柯铮测试

6.1.2杨兵测试

7.1个人总结

7.1.1陈柯铮总结

在编写的时候只使用了相对较为简单的基础语言,代替了相对较为复杂的语言,降低了运行效率。

测试输入的数据也有一定的局限性,但是基本可以满足订票系统的需求。

1总体过程

编译和调试工具:

选择VisualC++6.0,该工具稳定,其中有一个强大的调试工具,但我不是熟悉。

还需要进一步的练习。

2在一周半的时间里,不断地对程序及各模块进行修改、编译、调试、运行,其间遇到很多问题:

(1)因本人能力有限,在编写的时候只使用了相对较为简单的基础语言,代替了相对较为复杂的语言,降低了运行效率。

(2)程序在起初设计的时候,经常出现溢出错误,而且不只一处。

为了修正这些溢出错误,耗费了大量的时间,修正解释之后再看源程序,才发现原来只是因为开始的函数定义的数据类型出现了问题,对函数的定义不清楚,字符的不正确定义造成了后期大量的纠错工作,

(3)由于忘记了一些c语言的规范使得在调试过程中一些错误没有发现。

例如,调用函数时,数组只需要传递数组名即可;字符‘0’和整形的0是不同的文明不可以直接对其画等号。

(4)测试用例具有一定的广泛性。

运行程序时输入了多种不同字符信息,经过多次修改结果达到了预期效果。

说明程序具有一定的可靠性和稳定性。

3通过调试我自己认为,在哈夫曼编码译码系统中用出栈入栈进行哈夫曼译码编码译码要简单于使用数组,而使用结构体数组来存储待编译的字符,编码译码时通过结构体数组来实现要优于使用链表。

4.调试体会

经过这次实习,我对调试掌握的更加熟练了,改变了过去只调试不知道如何对照程序语言修改程序的坏习惯,对调试也有了新的认识,意识到了程序语言的规范性以及我们在编程时要有严谨的态度,同时在写程序时如果加一定量的注释,既增加了程序的可读性,也可以使自己在读程序时更容易。

7.1.2杨兵总结

通过对这一课题的设计和实现,我认识到编程时要养成良好的风格,注意相同内容的缩进和对齐。

这样做,可以使程序代码出错的情况下,可以快速并且便捷的查找到错误的行,利于很好的修改。

通过这次编程我们深深的感受到对代码的变量命名,代码内注释格式,甚至嵌套中行缩进的长度和函数间的空行数字都有明确规定,良好的编写习惯,不但有助于代码的移植和纠错,也有助于不同人员之间的协作。

这个程序设计主要涉及到了《数据结构》中的随机函数、顺序栈及双端队列操作等内容,只有充分掌握了这些内容,才有可能组织好这些代码,使之符合运算逻辑,得到理想的结果。

善于总结,也是学习能力的一种体现,每次完成一个编程任务,完成一段代码,都应当有目的的跟踪该程序的应用状况,随时总结,找到自己的不足,这样所编写的程序才能逐步提高,生活就是这样,汗水预示着结果也见证着收获。

劳动是人类生存生活永恒不变的话题。

通过实际动手做,我们才真正领略到“艰苦奋斗”这一词的真正含义,我们想说,编程确实有些辛苦,但苦中也有乐,在这个团队的任务中,一起的工作可以让我们有说有笑,相互帮助,配合默契。

对我们而言,知识上的收获重要,精神上的丰收是可喜的。

挫折是一份财富,经历是一份拥有。

这次实际操作必将成为我们人生旅途上一个非常美好的回忆!

回顾起此次课程设计,我至今仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在这段日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。

通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。

同时,在助教老师的身上我学得到很多实用的知识,在此表示感谢!

同时,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!

7.1.3王正海总结

在课程结束之际,我们按老师要求进行了课程设计。

在课程设计的过程中,我收获颇丰,不仅深切感受到了团队合作的优势,而且也对课堂上所学的知识有了进一步的了解。

这次的课程设计让我更熟悉了从理论到实践的跨越。

从当初的查阅图书,请教老师及同学,到现在的程序成功运行,这中间有很多值得回味的地方。

记得从几周前开始准备的时候,我们常常在一些简单的问题上花费大量的时间。

按照安排,我主要负责栈的基本操作。

课程设计可以检验学生对知识的掌握程度。

同时更反映了一个学生对课程设计的态度,对待任何事都要认真,可以不会,可以做的不是最好的,但是一定要尽自己最大的努力去完成一件哪怕再小的事。

在这次课程设计中学到了很多新的知识,同时也巩固了之前学过知识。

对拓扑排序有了更深的理解。

虽然,最后根据要求完成了任务,但期间还是出现了种种的问题。

同时,为了更好的完成任务还查阅了好多资料,不懂的就到处搜索,去图书馆借相应的书籍来看,锻炼了自己查阅资料的能力。

除此之外,我觉得本此课程设计最大的收获就是学会按部就班的完成任务。

首先想好用什么数据结构,主要的思想要明确的认定。

然后选一个简单的例子,按照你选定的思想,一步一步的走程序,才能更早的发现程序还存在那些没有考虑到的缺陷。

特别忌讳的是到写程序的时候,对主要思想和数据结构还不是很确定。

最后在调试程序的阶段,这次我开始用设置断点的方法,一步一步看是否达到你要的理想结果,从而来找出程序中出错的地方。

还有,一种方法也是用一个输出语句,分别放在程序的不同位置,通过输出结果,也可以快速判断出程序不能运行的是那一个语句了。

从而方便你修改,快速得到正确的结果。

还有,这次调试的过程中,我表现的比以前要更有耐心,这也是一个很好的收获。

还有一个更重要的体会就是,遇到不会的地方,我开始习惯到图书馆或是网上去找资料。

这是一个很好的学习过程,它不仅仅是可以解决这个问题,关键是你会从找资料学习的过程中,会学好很多很多意想不到的知识。

可能会比你手头上要学习的知识多得多。

8源代码

#include

#include

#include

#include

#include

#include//搜索

#include

usingnamespacestd;

intMakeSrand(intx,inty);//产生x~y随机数的函数,不包括y

voidOP1(deque&Data,int*Resultint,intPeopleCount,intTicketCount);

voidOP2(deque&Data,int*Resultint,intPeopleCount,intTicketCount);

voidOP3(deque&Data,int*Result,int*Stack,intPeopleCount,intTicketCount,int*x);

voidDisplayResult(int*Result);//展示购票结果

voidInStack(int*Stack,intElement);//辅助栈的进栈函数

intOutStack(int*Stack);//辅助栈的出栈函数

intPTR=0;//结果数组Result的游标

intPOP=-1;//辅助栈的顶指针

voidmain()

{

srand((unsigned)time(NULL));//随机种子,这行语句必须放在主函数中,切记

//------------------------------------------------------------------------------------

intPeopleCount;//初始化排队人数和总票数

intTicketCount;

printf("\t\t========================================\n");

printf("\t\t**\n");

printf("\t\t**\n");

printf("\t\t*请输入排队购票的人数和总票数,以空格隔开*\n");

printf("\t\t**\n");

printf("\t\t**\n");

printf("\t\t========================================\n");

cin>>PeopleCount>>TicketCount;

//------------------------------------------------------------------------------------

constintMAX=(PeopleCount>TicketCount?

PeopleCount:

TicketCount);//根据具体人数和票数判断情形并构造辅助数据结构

intMIN=(PeopleCount

PeopleCount:

TicketCount);

intSituation=(PeopleCount>TicketCount?

1:

2);//情形1:

人多票少;情形2:

票多人少.

int*Result=newint[

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1