C 数据结构大作业课程设计_第1页
C 数据结构大作业课程设计_第2页
C 数据结构大作业课程设计_第3页
C 数据结构大作业课程设计_第4页
C 数据结构大作业课程设计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++/数据结构大作业/课程设计一一【校园导游咨询】【停车场管理】娃娃们

可以收着以后用绝对纯手工打造内含类模块/一维指针数组(谨以此程序供

大家参考。运行结果后面有贴图)

目录

[11校园导游咨询程序设计源代码及截图

【2】停车场管理一方案一程序设计源代码及截图

【3】停车场管理一方案二程序设计源代码及截图

##############[1][【校园导游咨询】】####################

(ps:该校园导游咨询系统没有输入值,所有信息是都在classMGraph的构造函数中传输的,且校园景点信息皆为

【【上海电力学院】】景点信息。请大家注意,直接从文章copy到visualstutio中会出现中文字符,注意

删除,推荐大家在一行语句的分号后面,点出光标,按一下delete键,然后按一下enter键,完成visualstutio的

自动对齐,这样程序看起来一目了然,更易于操作和更改)

【问题描述】

设计一个校园导游程序,为来访的客人提供各种信息查询服务。

【基本要求】

(1)设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校内各景点,存放景点名称、代号、简介

等信息;以边表示路径,存放路径长度等相关信息。

(2)为来访客人提供图中任意景点相关信息的查询。

(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。

【选作内容】

(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。

**************************[]********************************

#include<iostream>

#include<iomanip>

usingnamespacestd;

constintMaxSize=18;

constintINFINITY=65535;〃最大值无穷

classdirection;

template<classT>classMGraph;

template<classT>

classVertexNode//定义头结点

(

friendclassMGraph<T>;

public:

intvex;〃顶点名称

Tvexname;〃顶点名称

Tvexinf;〃顶点信息

directiondir;〃存放顶点方位信息的direction类的dir。

);

classdirection

(

public:

intIn;〃存放在方向图中的横坐标,表示东西

intcol;〃存放在方向图中的纵坐标,表示南北

);

template<classT>

classMGraph〃定义无向图的邻接矩阵

(

public:

MGraph();

〃构造函数,初始化具有n个顶点的图

voidprintvexname();〃显示所有景点及景点代号

voidprintv函nf(inti);〃显示代号为i景点的名称及信息

voidprintroad(inti,intj);〃显示景点i~j的最短路径方案信息

voidprintdir(inti,intj);〃显示景点i到j的方向信息,如"向东100m,向南200m"

VertexNode<T>adjlist[MaxSze];〃存放景点全部信息的景点类数组

intvertexNum,arcNum;〃图的顶点数和边数

voidRoot(intp,intq);〃递归寻找pq间的最短路径

intPath[MaxSze][MaxSze],Dist[MaxSze][MaxSze];〃创建Path和Dist分别存放两点间最短路径的前驱节点,两点间

最短路径长度

intLine[MaxSize];〃Line存放路径

intkkk;〃Line口数组的标记

private:

Tvertex[MaxSze];〃存放图中顶点的数组

intarc[MaxSize][MaxSize];〃存放图中边的数组

};

*************************【以下为类的实现即类函数的定义】***********************************

template<classT>

MGraph<T>::MGraph()〃a[]为景点代号,b[]为景点名称,c□为景点信息,d口为景点方位信息的横坐标,e口为景点方

位信息的纵坐标

〃乱]为存放景点邻接矩阵信息的一维数组,根据其对称性可以用公式赋值给二维数组arc[][]

(

ints[]={0,

1,0,

0,2,0,

0,0,2,0,

0,0,2,3,0,

0,0,0,4,2,0,

0,0,0,0,2,3,0,

0,0,0,0,2,3,1,0,

0,0,2,0,2,0,0,2,0,

4,0,2,0,0,0,0,0,1,0,

0,0,0,0,0,0,0,0,0,2,0,

1,0,0,0,0,0,0,0,0,0,2,0,

0,0,0,0,0,0,0,0,0,3,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,2,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,

0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,2,0,

0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,2,0};

inta[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17);

char*b[]={"南门","实验楼","南图","大活","睿思楼大礼堂”,

"南4教","知行楼","国交楼","南3教","南2教","南1教”,

"北图","北3教","北4教","北2教","北1教","北门”};

char*c[]={"南校区正门”,“物理实验楼南校区图书馆“,”大学生活动中心”,

"教师办公楼、医务室及留学生公寓大礼堂,用于举办各种文艺演出“,”南校区第4教学楼实习基地,计算机房等”,

“国际交流中心,教职工餐厅",”南校区第3教学楼","南校区第2教学楼","南校区第1教学楼”,

"北校区图书馆“,”北校区第3教学楼",”北校区第4教学楼","北校区第2教学楼",

"北校区第1教学楼",”北校区正门"};

intd[]={8,6,4,4,1,0,0,1,3,4,6,8,4,323,5,8};

inte[]={8,8,8,10,8,10,7,6,6,6,6,6,3,1,0,0,0,2};

intij;

vertexNum=18;

arcNum=30;

for(i=0;i<vertexNum;i++)

(

adjlist[i].vex=a[i];

adjlist[i].vexname=b[i];

adjlist[i].vexinf=c[i];

adjlist[i].dir.ln=d[i];

adjlist[i].dir.col=e[i];

)

for(i=0;i<vertexNum;i++)〃初始化邻接矩阵

for(j=0;j<vertexNum;j++)

arc[i][j]=arc[j][i]=s[(i*(i+1))/2+j];〃根据s□的对称性,将一维数组中的数据赋给二维数组arc门□

)

template<classT>

voidMGraph<T>::printvexname()

inti;

for(i=0;i<vertexNum;i++)

cout<<adjlist[i].vex<<""<<adjlist[i].vexname<<endl;;

template<classT>

voidMGraph<T>::printvexinf(inti)

cout<<i<<""<<adjlist[i].vexname<<<adjlist[i].vexinf<<endl;

)

template<classT>

voidMGraph<T>::printdir(inti,intj)

(

intdx,nb;〃临时存放i与j之间的南北东西关系j在i的哪边??

dx=adjlist[j].dir.col-adjlist[i].dir.col;

nb=adjlist[j].dir.In-adjlist[i].dir.ln;

if(dx>0)〃即j在i的东边

else

cout<v"向西”vvdx*(0-100)<<"m,

if(nb>O)//BPj在i的南边

cout<v响南”vvnb*100<<"m";

else

cout<v“向北”vvnb*(0-100)<<"mn;

)

template<classT>

voidMGraph<T>::Root(intp,intq)

(

if(Path[p][q]>0)

(

Root(p,Path[p][q]);

Root(Path[p][q],q);

)

else

(

Line[kkk]=q;

kkk++;

template<classT>

voidMGraph<T>::printroad(inti,intj)

(

intp,q,m,k,item1,item2;

for(p=0;p<vertexNum;p++)

for(q=0;q<vertexNum;q++)

Dist[p][q]=arc[p][q],邻接矩阵赋值

for(k=O;k<vertexNum;k++)

for(p=0;p<vertexNum;p++)

if(Dist[p][k]>0)

for(q=0;q<vertexNum;q++)

if(Dist[k][q]>0)

if(((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==O))&&(p!=q))

(

Dist[p][q]=Dist[p][k]+Dist[k][q];

Path[p][q]=k;

)

coutvv”\n=====================================================\n";

cout<<adjlist[i].vexname;

kkk=2;

Root(iJ);

item2=Line[2];

cout<

printdir(i,item2);

cout<<"->"<<adjlist[item2].vexname;

for(m=3;m<=kkk-1;m++)

(

item1=Line[m];

cout<<"->n;

printdir(item1-1,item1);

cout<<"->"<<adjlist[item1].vexname;

)

cout<<endl;

cout<<"\n=====================================================\n";

)

*****************************[以下为主函数]**************************************

intfuncchoice()〃系统功能选择页面

(

intchoice;

cout<<"=============================================================="<<e

ndl;

cout<<"欢迎进入校园导游咨询平台"vvendl;

cout<<"1--显示校园所有景点信息”v<endl;

cout<<"2--查询校园景点信息”vvendl;

cout<<"3--问路查询系统"vvendl;

cout<<"4--退出导游资讯平台"vvendl;

cout<v”=============================================================="vve

ndl;

coutvv”请输入要选择的功能号:

cin>>choice;

returnchoice;

voidmain()

(

MGraph<char*>mg;

intfuncchoice();

intfc;

while(1)

fc=funcchoice();

if(fc==1)

inti;

for(i=0;i<mg.vertexNum;i++)

mg.printvexinf(i);

}

elseif(fc==2)

(

inti;

mg.printvexname();

cout<<endl<<”请输入所要查询景点代号:”;

cin>>i;

mg.printvexinf(i);

)

elseif(fc==3)

(

intij;

mg.printvexname();

COUtvv”请输入两景点代号(我们将把最短路线反馈予您):

cin>>i>>j;

mg.printroad(ij);

)

elseif(fc==4)

break;

else

coutvv”输入有误,请重新输入!”vv6ndI;

运行测试图

3

欢丸鼠曲符鳖镯I

?

-

12不园有息

显岳S

-询占息

1-

-

查,信

(

2-

”-统台

-短讯平

4-

4

4

1青鲁鞫匕号

月1

^匕

-

0实区正—门

W

1

实3驶

南:理

&

2图彳书

i

大区&

^

:

3

-动

v可

宴0

4

«

生公楼熊n留生公寓

:至

5易堂,文演出

:

相,皂等.乙

^襄

6国驿衫

R照

地.

7实基土

南:工

习源,

8

国父中^

倬:

?2都

9

^力

程驿教11

赣^

律R第

1区

:

0

鬟2

南i

糅.

1二区第

1

1

:

^

1整附

J

2二江

J

,

1

-第

^

H

3二区

:昌

1

4第

:区

二^

1

:

5区第

二穹

1

6区;第

1

7二

阱_国

x

_

£

O

他施符镖3好

有-

J园息

不占息5

L询八

2--酗统台

3--

-建讯

号:

的功能

要选择

请输入

程„

e

ex

3

3

欢以E簟野嚼好

显园占-息

示蓿息6

1-八

查询园

2-统平台

3-黑毒翦讯

4-

鲁入选择的功4匕号

目2

门匕

0实

1南

2图

大活

3思

4至

5易待

6国行

7

-

8南蓊

9律勒

0陀

11瘁

。1

2

-

1:二三

3

!:

!二

4

^

!二

5二

!!

/

6二

7一

!)

.

请输入所莪静

国交楼国厂8段

8

闻平台

导谑书

入校园

欢迎进

存息

有爵

板崩

显示

1一

信息

园搀点

查询校

2—

询系

路查

|可

3—

平台

箱春讯

逋由导

4一

族百二

蠢霹而

“扇翁云

■"C:\Users\gujibala\Desktop\Zl期工程\Debug'二期工程.exe"

蟹镯

施以

W3好

-

J有

园6

蓿息

L占

2--翠

平台

3---露

先择

的功

V4号3

0门

1验

2南

3活

4釐

5呈

6跨^

7国

8办

9南^

哲-

10-寸

2寸

11哲4

1寸

1匕0

2-7^

二7

13寸

3号

14匕44.

1匕

52主

1寸

61.看

17二

,芋

区1

刖lH

xr:80

国■

所)向东200m,向南190m-->南图—>向西0m,向北200m-->实验楼-->

50,向北1000m-->南门

■"C:\Users\gujibala\Desktop匚期工程\DebugVZ期工程cxe"

簪镖

蓿息

1-点

2-园

平台

3-翦

4-讯

请输入要选择的功能号:,4

Pressanykeytocontiniw

##############[2]【停车场管理系统【方案一程序】】#############

(ps:该程序有漏洞,若将要离开的车辆是停于便道上的,则对该车进行驶离操作时程序内部有错误数据,虽然做了

函数完成这一功能,但因时间有限,没能及时查找更正,现在懒得改了。。。大家将就看吧。不过运行是可以的)

【问题描述】

设停车场是一个可停放n辆汽车的长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺

序,依次由北向南排列(大门在最南端,最先到达的第一辆车信放在车场的最北端),若车场内已停满n辆汽车,则

后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开

时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场院,每辆停

放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。

【基本要求】

以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三

个数据项:汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息

为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间

和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。

【测试数据】

设n=2,输入数据为:(A,1,5),(A,2,15),(A,3,20),(A,4,25),(A,5,30),(D,2,35),

(D,4,40),(E,0,0)。其中:A表示到达(Arrival);D表示离去(Departure);E表示输入结束(End)。

**************************[白勺]*************************************

#include<iostream>

usingnamespacestd;

constintMax=2;〃车库最大容量

constdoubleprice=30;〃每小时的费用

〃思想:(报告第四页)

〃我的系统界面,输入信息为:(到达/离开/退出);车牌号;时刻

〃因此,我的停车场类分成车辆到达和车辆离开两个主要的函数实现。

〃车辆到达,有入栈和入队。车辆离开有出栈,出队和入栈操作。

〃因此我又编写入栈的类,队的类。与parkingmanagement进行友元。

〃************************************************************************************

classcar〃车的信息类

(

public:

doubletime;〃计费时间

intnumber;〃车牌号

car*next;〃存放car类型元素的数组初始地址

);

classcarstack//栈(停车场)的类

(

friendclassparkingmanagement;//parkingmanagement能访问carstack类中所有成员

public:

carstack();〃构造函数,栈的初始化

intempty。;〃判断栈是否为空

intfull。;〃判断栈是否为满

car*s;〃存放car类型栈元素的数组初始地址

inttop;〃栈顶指针

);

classcarqueue//队歹!J(便道)的类

(

friendclassparkingmanagement;//parkingmanagement能访问carstack类中所有成员

public:

carqueue();〃构造函数,队列的初始化

intfull();〃判断队列是否为满

car*front,*rear;〃存放car类型队列元素的数组初始地址

);

classparkingmanagement

(

public:

intpushstack(carstack&cs,intcnum,doublectime);〃入栈,cs栈内进行调整,返回栈内位置

voidpopstack(carstack&cs,intcnum);〃出栈,cs栈内进行调整,

〃根据车牌号把车弹出栈,将出栈car的number赋值给intpopstacknumber()

〃将出栈car的time赋值给doublepopstacktime(),无返回值!

intpushqueue(carqueue&cq,intcnum,doublectime);〃入队,队内进行调整,返回队内位置

intpopqueue(carqueue&cq);〃出队,队内进行调整,返回汽车车牌号

voidarrival(carstack&cs,carqueue&cq,intcnum,doublectime);〃车辆到达,

〃根据输入的车牌号、到达时间,变更函数参数;并cout车位信息

voidleave(carstack&cs,carqueue&cq,intcnum,doublectime);〃车辆离开,

〃根据输入的车牌号找到汽车,并进行出栈操作、出队操作和入栈操作;

〃并cout停留时间和收费情况

voiddeletequeue(carqueue&cq,inti);〃删除cq过道中第i辆车

intpopstacknumber;〃专门存放出栈的时候返回的车牌号

doublepopstacktime;〃专门存放出栈的时候返回的时刻

);

**********************************【以下为类的实现】***********************

carstack::carstack()〃构造函数,栈的初始化

(

top=-1;

s=newcar[Max];〃创建car类型栈元素的数组

if(s==NULL)

(

cout<<"栈空间分配不成功!"<<endl;

exit(1);

intcarstack::full()〃判断栈是否为满

(

returntop==Max-1;

)

carqueue::carqueue()〃构造函数,队列的初始化

(

rear=front=NULL;

)

intparkingmanagement::pushstack(carstack&cs,intcnum,doublectime)〃入栈,cs栈内进行调整,返回栈内位置

(

if(cs.top==Max-1)〃Max从1开始,top从0开始

coutcc"停车场已满!"vvendl;

returnMax;

else

(

cs.top++;

(cs.s[cs.top]).number=cnum;〃将cnum赋给栈顶位置的车的车牌号,s是car类型栈元素的数组

(cs.s[cs.top]).time=ctime;〃将ctime赋给栈顶位置的车的入栈时间,s是car类型栈元素的数组

return(cs.top+1);〃返回栈内位置加1,即停车场内车位从1号开始

voidparkingmanagement::popstack(carstack&cs,intcnum)〃出栈,cs栈内进行调整,

〃根据车牌号把车弹出栈,将出栈car的number赋值给intpopstacknumber

〃将出栈car的time赋值给doublepopstacktime,无返回值!

(

inti;

carp;

carstackstemp;〃定义一个carstack类型的临时存放出栈元素的栈

for(i=0;i<=cs.top;i++)

if((cs.s[i]).number==cnum)break;〃当要出栈的车的车牌号=栈内的车牌号元素时,跳出循环

p=cs.s[i];〃将要出栈的元素赋给car类型的p存放

while(cs.top>i)

stemp.s[++(stemp.top)]=cs.s[(cs.top)--];〃出栈的元素数组逐个赋给临时栈

popstacknumber=p.number;〃将这个车牌号信息传给intpopstacknumber()

popstacktime=p.time;〃将该车的时间信息传给doublepopstacktime()

cs.top--;〃栈顶指针回到原来位置

while(stemp.top>=0)

cs.s[++(cs.top)]=stemp.s[(stemp.top)--];〃临时栈出栈的元素逐个赋给原栈,完成先退再进的工作

)

intparkingmanagement::pushqueue(carqueue&cq,intcnum,doublectime)〃入队,队内进行调整,返回队内位置

(

car*p,*countp;

intcount(1);〃count用于记录车在过道上的位置信息,因队列为链式的,所以进行循环累加

p=newcar;〃创建一个car类型的指针

p->number=cnum;

p->time=ctime;

p->next=NULL;〃首先将指向存放car类型元素的数组初始地址置空

if(cq.front==NULL)〃第一次入队要判断头结点是否为空

(

cq.front=cq.rear=p;

)

else

{〃尾插法插入元素

p->next=(cq.rear)->next;

(cq.rear)->next=p;

cq.rear=(cq.rear)->next;

)

countp=(cq.front)->next;

while(countp!=NULL)

count++;

countp=countp->next;

}〃count即车在过道上的位置,【从1开始计!!!】

returncount;

)

intparkingmanagement::popqueue(carqueue&cq)〃出队,队内进行调整,返回汽车车牌号

(

carp;

p.number=((cq.front)->next)->number;//cq队里,从cq.front开始指向下一个元素的车牌号赋给car类型的车信息

p.time=((cq.front)->next)->time;//cq队里,从cq.front开始指向下一个元素的时刻

〃赋给car类型的车信息

p.next=((cq.front)->next)->next;//cq队里,从cq.front开始指向下一个元素的指针

〃赋给car类型的车信息的下一个元素的指针

returnp.number;

cq.front=(cq.front)->next;

)

voidparkingmanagement::arrival(carstack&cs,carqueue&cq,intcnum,doublectime)

〃车辆到达,根据输入的车牌号、到达时间,变更函数参数;并cout车位信息

(

intpos;

if(!(cs.full()))〃如果栈未满,车辆停入停车场

(

intfl(0),i;〃定义一个从0开始的标记fl

for(i=0;i<=cs.top;i++)

(

if(cs.s[i].number==cnum)〃如果到达的车的车牌号=栈内已有车辆的车牌号

(

fl=1;〃fl记1

break;

}

)

附1==1)〃如果到达的车的车牌号!=栈内已有车辆的车牌号

cout<<"输入错误!请重新输入!"vvendl;

else

(

pos=pushstack(cs,cnum,ctime)"/入栈,返回车位信息

cout<<"该停车场还有空位,请至『'<<pos<<"号车位进行泊车"<<endl;

cout<<endl;

)

)

else//如果栈满,车辆暂停便道

pos=pushqueue(cq,cnum,ctime);〃入队,返回车位信息

cout<<"该停车场已满,请将车停到便道"<<pos<<"号车位上"<<endl;

cout<<endl;

voidparkingmanagement::leave(carstack&cs,carqueue&cq,intcnum,doublectime)

{〃车辆离开,根据输入的车牌号找到汽车,并进行出栈操作、出队操作和入栈操作;并cout停留时间和收费情况

inti)flag(0),pstack,count(1),outcarnum;

doublehour;

car*p;

for(i=0;i<=cs.top;i++)

if((cs.s[i]).number==cnum)

(

flag=1;

break;

)

N(flag)〃如果输入的车牌号与栈内已有车辆的车牌号一致

(

popstack(cs5cnum);//出栈操作

hour=ctime-popstacktime;〃时间计算

outcarnum=popqueue(cq);〃将便道上的第一辆车出队,入栈。并将其车牌号赋给outcarnum

pstack=pushstack(cs3outcarnum,ctime);〃将便道上的第一辆车,入栈

8成<〈”该车在本停车场内停留时间为“〈〈11011「<<”分钟,应付金额"vvhour*(price/60)vv"元!"<<endl;

else〃如果输入的车牌号与队列里已有车辆的车牌号一致

(

p=cq.front;

while(p!=NULL)

(

count++;〃如果在过道中找到该车,则该车的位置为过道中的第count位置(count从1开始)

p=p->next;

Wp->number==cnum)〃在过道中找到要出去的车,则在队列中删除该car。

〃后面的车辆依然顺序排列,补足空位

(

deletequeue(cq,count);

if(count>Max)

(

coutvv”您的车在便道上的位置为“vvcountvv”号车位,请自行驶离,无需付费!"vvendl;

break;

if(p==NULL)

coutvv”您的车不在本停车场内,或输入有误,请重新输入!”vvend;

voidparkingmanagement::deletequeue(carqueue&cq,inti)

(

car*p,*q;

intj(0);

p=cq.front;

while(p&&j<i-1)

p=p->next;

j++;

}〃找到第i个节点(i从1开始)

if(!p11!p->next)

cout<<"i不合法”;

else

(

q=p->next;

p->next=q->next;

dele

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论