C++数据结构大作业课程设计复习过程.docx
- 文档编号:26819334
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:39
- 大小:481.73KB
C++数据结构大作业课程设计复习过程.docx
《C++数据结构大作业课程设计复习过程.docx》由会员分享,可在线阅读,更多相关《C++数据结构大作业课程设计复习过程.docx(39页珍藏版)》请在冰豆网上搜索。
C++数据结构大作业课程设计复习过程
C++数据结构-大作业课程设计
C++/数据结构大作业/课程设计——【校园导游咨询】【停车场管理】娃娃们可以收着以后用绝对纯手工打造内含类模块/一维指针数组(谨以此程序供大家参考。
运行结果后面有贴图)
【1】校园导游咨询程序设计源代码及截图
【2】停车场管理——方案一程序设计源代码及截图
【3】停车场管理——方案二程序设计源代码及截图
##############【1】【【校园导游咨询】】####################
(ps:
该校园导游咨询系统没有输入值,所有信息是都在classMGraph的构造函数中传输的,且校园景点信息皆为【【上海电力学院】】景点信息。
请大家注意,直接从文章copy到visualstutio中会出现中文字符,注意删除,推荐大家在一行语句的分号后面,点出光标,按一下delete键,然后按一下enter键,完成visualstutio的自动对齐,这样程序看起来一目了然,更易于操作和更改)
【问题描述】
设计一个校园导游程序,为来访的客人提供各种信息查询服务。
【基本要求】
(1)设计你所在学校的校园平面图,所含景点不少于10个。
以图中顶点表示校内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等相关信息。
(2)为来访客人提供图中任意景点相关信息的查询。
(3)为来访客人提供图中任意景点的问路查询,即查询任意两个景点之间的一个最短的简单路径。
【选作内容】
(6)扩充每个景点的邻接景点的方向等信息,使得路径查询结果能提供详尽的导向信息。
**************************【以下为类的定义】********************************
#include
#include
usingnamespacestd;
constintMaxSize=18;
constintINFINITY=65535;//最大值无穷
classdirection;
template
template
classVertexNode//定义头结点
{
friendclassMGraph
public:
intvex;//顶点名称
Tvexname;//顶点名称
Tvexinf;//顶点信息
directiondir;//存放顶点方位信息的direction类的dir。
};
classdirection
{
public:
intln;//存放在方向图中的横坐标,表示东西
intcol;//存放在方向图中的纵坐标,表示南北
};
template
classMGraph//定义无向图的邻接矩阵
{
public:
MGraph();
//构造函数,初始化具有n个顶点的图
voidprintvexname();//显示所有景点及景点代号
voidprintvexinf(inti);//显示代号为i景点的名称及信息
voidprintroad(inti,intj);//显示景点i~j的最短路径方案信息
voidprintdir(inti,intj);//显示景点i到j的方向信息,如“向东100m,向南200m”
VertexNode
intvertexNum,arcNum;//图的顶点数和边数
voidRoot(intp,intq);//递归寻找pq间的最短路径
intPath[MaxSize][MaxSize],Dist[MaxSize][MaxSize];//创建Path和Dist分别存放两点间最短路径的前驱节点,两点间最短路径长度
intLine[MaxSize];//Line存放路径
intkkk;//Line[]数组的标记
private:
Tvertex[MaxSize];//存放图中顶点的数组
intarc[MaxSize][MaxSize];//存放图中边的数组
};
*************************【以下为类的实现即类函数的定义】***********************************
template
MGraph
:
MGraph()//a[]为景点代号,b[]为景点名称,c[]为景点信息,d[]为景点方位信息的横坐标,e[]为景点方位信息的纵坐标
//s[]为存放景点邻接矩阵信息的一维数组,根据其对称性可以用公式赋值给二维数组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,3,2,3,5,8};
inte[]={8,8,8,10,8,10,7,6,6,6,6,6,3,1,0,0,0,2};
inti,j;
vertexNum=18;
arcNum=30;
for(i=0;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 for(j=0;j arc[i][j]=arc[j][i]=s[(i*(i+1))/2+j];//根据s[]的对称性,将一维数组中的数据赋给二维数组arc[][] } template voidMGraph : printvexname() { inti; for(i=0;i cout< } template voidMGraph : printvexinf(inti) { cout< "< } template voidMGraph : printdir(inti,intj) { intdx,nb;//临时存放i与j之间的南北东西关系j在i的哪边? ? dx=adjlist[j].dir.col-adjlist[i].dir.col; nb=adjlist[j].dir.ln-adjlist[i].dir.ln; if(dx>0)//即j在i的东边 cout<<"向东"< else cout<<"向西"< if(nb>0)//即j在i的南边 cout<<"向南"< else cout<<"向北"< } template voidMGraph : Root(intp,intq) { if(Path[p][q]>0) { Root(p,Path[p][q]); Root(Path[p][q],q); } else { Line[kkk]=q; kkk++; } } template voidMGraph : printroad(inti,intj) { intp,q,m,k,item1,item2; for(p=0;p for(q=0;q Dist[p][q]=arc[p][q];//邻接矩阵赋值 for(k=0;k for(p=0;p if(Dist[p][k]>0) for(q=0;q if(Dist[k][q]>0) if(((Dist[p][q]>Dist[p][k]+Dist[k][q])||(Dist[p][q]==0))&&(p! =q)) { Dist[p][q]=Dist[p][k]+Dist[k][q]; Path[p][q]=k; } cout<<"\n=====================================================\n"; cout<<"从"< "< cout< kkk=2; Root(i,j); item2=Line[2]; cout<<"-->"; printdir(i,item2); cout<<"-->"< for(m=3;m<=kkk-1;m++) { item1=Line[m]; cout<<"-->"; printdir(item1-1,item1); cout<<"-->"< } cout< cout<<"\n=====================================================\n"; } *****************************【以下为主函数】************************************** intfuncchoice()//系统功能选择页面 { intchoice; cout<<"=============================================================="< cout<<"欢迎进入校园导游咨询平台"< cout<<"1--显示校园所有景点信息"< cout<<"2--查询校园景点信息"< cout<<"3--问路查询系统"< cout<<"4--退出导游资讯平台"< cout<<"=============================================================="< cout<<"请输入要选择的功能号: "; cin>>choice; returnchoice; } voidmain() { MGraph intfuncchoice(); intfc; while (1) { fc=funcchoice(); if(fc==1) { inti; for(i=0;i mg.printvexinf(i); } elseif(fc==2) { inti; mg.printvexname(); cout< "; cin>>i; mg.printvexinf(i); } elseif(fc==3) { inti,j; mg.printvexname(); cout<<"请输入两景点代号(我们将把最短路线反馈予您): "; cin>>i>>j; mg.printroad(i,j); } elseif(fc==4) break; else cout<<"输入有误,请重新输入! "< } } 运行测试图 ##############【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 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//队列(便道)的类 { 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<<"栈空间分配不成功! "< 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开始 { cout<<"停车场已满! "< 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类型元素的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 数据结构 作业 课程设计 复习 过程