网络流宇宙旅行.docx
《网络流宇宙旅行.docx》由会员分享,可在线阅读,更多相关《网络流宇宙旅行.docx(46页珍藏版)》请在冰豆网上搜索。
![网络流宇宙旅行.docx](https://file1.bdocx.com/fileroot1/2023-2/23/072f8c20-f9d0-4cab-a64d-75f29bba0bd2/072f8c20-f9d0-4cab-a64d-75f29bba0bd21.gif)
网络流宇宙旅行
软件综合课程设计
网络流:
宇宙旅行
图书借阅管理系统
二〇一四年六月
《数据结构课程设计》报告
一、网络流:
宇宙旅行
1.问题陈述
在走遍了地球上的所有景点以后,旅游狂人开始计划他的宇宙旅行项目。
经过谨慎调查,他目前掌握了一张各卫星空间站可以临时容纳的旅客人数列表。
但旅客从一个星球飞往另一个星球时,需要在若干卫星空间站临时停靠中转,而这些空间站不能接待任何旅客驻留,旅客必须立刻转乘另一艘飞船离开,所以空间站不能接待超过自己最大容量的旅客流。
为了估计预算,现在旅游狂人需要知道终点星球的接待站应该设计多大容量,才能使得每艘飞船在到达时都可以保证让全部旅客下船。
输入要求:
输入若干组测试数据组成。
每组测试数据的第1行包含旅行的起点星球和终点星球的名称和一个不超过500的正整数N(N为0标志全部测试结束,不要对该数据做任何处理)。
接下来的N行里,数据格式为:
sourceicapacityi,其中sourcei和destinationi是卫星空间站的名称或起点、终点星球的名称,正整数capacityi是飞船从sourcei到destinationi一次能运载的最大旅客流量。
每个名称是由A~Z之间三个大写字母组成的字符串,例如:
ZJU。
测试数据中不包含任何到达起点星球的信息以及任何从终点星球出发的信息。
输出要求:
对每一组测试,在一行里输出终点星球接待站应具有的最小容量,使得每艘飞船在到达时都可以保证让全部旅客下船。
2.程序代码(一部分)
#include
#include"Graph.h"
#include"Queue1.h"
#defineN10
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
//typedefintdataType;//抽象数据类型dataType定义为int
Graph:
:
Graph()//初始化图的结点集合和邻接矩阵
{
inti,j;
for(i=0;ivertex[i]='';
for(i=0;ifor(j=0;jif(i==j)
mat[i][j]=0;//数据元素权值为0
else
mat[i][j]=MaxCost;//权值为无穷大
vertCount=0;//当前结点数为0
edgeCount=0;//当前边数为0
}
Graph:
:
~Graph()
{
}
voidGraph:
:
createGraph(intn,charvert[],intm,EdgeNode1edge[])
{//以结点集合和边集合构造一个图
vertCount=n;//图的结点个数
inti,j,k;
for(i=0;ivertex[i]=vert[i];
edgeCount=m;//图的边数
for(k=0;k{
i=edge[k].init;//边的起点
j=edge[k].end;//边的终点
mat[i][j]=edge[k].weight;//边的权值
}
}
voidGraph:
:
unvisited()//设置未访问标记
{
for(inti=0;ivisited[i]=0;
}
ostream&operator<<(ostream&out,Graph&g1)
{//输出图的结点集合和邻接矩阵
cout<<"图的结点集合为{";
inti,j;
for(i=0;icout<cout<cout<<"图的邻接矩阵为"<for(i=0;i{
for(j=0;jif(g1.mat[i][j]==MaxCost)//权值为无穷大时
cout<<"∞\t";
else
cout<cout<}
returnout;
}
//顺序循环队列类图的广度优先遍历算法中,同样需要使用成员变量visited数组。
算法实现如下:
voidGraph:
:
breadthfs(intk)//从结点k开始的广度优先遍历
{//k为起始结点下标
Queue1q1(vertCount);//设置空队列
inti=k;
char*vert[N]={"EAR","AAA","BBB","CCC","DDD","EEE","FFF","GGG","DFE","EAM"};
cout<";//访问起始结点
visited[i]=1;//设置访问标记
q1.enQueue(i);//访问过的结点k入队
while(!
q1.isEmpty())//队列不空时
{
i=q1.deQueue();//出队,i是结点k的数组下标
intj=0;
while(jif(i!
=j&&mat[i][j]>0&&mat[i][j]{
cout<";//访问结点
visited[j]=1;
q1.enQueue(j);//入队
}
else
j++;
}
}
voidGraph:
:
breadthFirstSearch()//图的广度优先遍历
{//k为起始结点下标
cout<<"请按照以下代号所提供的景点参观:
"<unvisited();
breadthfs(k);
cout<}
voidGraph:
:
depthfs(intk)//从结点k开始的深度优先遍历
{
inti=k,j=0;//i下标从0开始
char*vert[N]={"EAR","AAA","BBB","CCC","DDD","EEE","FFF","GGG","DFE","EAM"};
cout<";//访问结点
visited[i]=1;//设置访问标记
while(jif(i!
=j&&mat[i][j]>0&&mat[i][j]depthfs(j);//递归
else
j++;
}
voidGraph:
:
depthFirstSearch()//图的深度优先遍历
{
cout<<"请按照以下代号所提供的景点参观:
"<unvisited();//设置未访问标记
depthfs(k);
cout<}
///////////////////////////求原点到某一点的最短路径/////////////////////////////////////////
voidGraph:
:
ShortestPath_1(Graph&G)
{//v0顶点到其余结点的最短距离P[v]及路径长度D[v]
inti,v,w,pre,min,v0=0;
intfinal[MaxSize];
int*P,*D;
char*vert[N]={"EAR","AAA","BBB","CCC","DDD","EEE","FFF","GGG","DFE","EAM"};
D=newint[G.vertCount];
P=newint[G.vertCount];
for(v=0;v{
D[v]=G.mat[v0][v];
if(D[v]!
=MaxCost)
P[v]=v0;
else
P[v]=0;
}
for(i=0;ifinal[i]=0;
final[v0]=1;
//开始主循环,每次求得v0到某个v顶点的最短路径,并加v到集合
for(i=1;i{
min=MaxCost;
for(w=0;wif((!
final[w])&&(D[w]{
min=D[w];
v=w;
}
final[v]=1;
for(w=0;wif((!
final[w])&&(D[w]>D[v]+G.mat[v][w]))
{
D[w]=D[v]+G.mat[v][w];
P[w]=v+1;
}
}
cout<<"您现在的位置是0:
地球宇宙旅行服务中心"<cout<<"--------------------------------"<for(i=0;i{
cout<<"★到达景点"<"<pre=P[i];
cout<<"路径如下:
"<while(pre!
=0)
{
cout<<"<--"<pre=P[pre-1];
}
cout<<"<--"<}
cout<<"终点需要的容量在各个景点介绍中涉及----------------"<}
//////////////////////建立最小生成树////////////////////////////////////////////////////////////
voidGraph:
:
MiniSpanTree_PRIM(Graph&G)
{//从序号为0的顶点出发,建立最小生成树,n为结点个数,存于数组closevertex中
intlowcost[MaxSize],mincost;
inti,j,k;
int*closevertex;
char*vert[N]={"EAR","AAA","BBB","CCC","DDD","EEE","FFF","GGG","DFE","EAM"};
closevertex=newint[G.vertCount];
cout<"<for(i=1;i{
lowcost[i]=G.mat[0][i];
closevertex[i]=1;
}
lowcost[0]=0;
closevertex[0]=1;
k=1;
intb[MaxSize],a=0;
cout<for(i=1;i{
mincost=MaxCost;
j=1;
while(j{
if(lowcost[j]!
=0&&lowcost[j]{
mincost=lowcost[j];
k=j;
}
j++;
}
cout<<"-->"<b[i]=mincost;
lowcost[k]=0;
for(j=1;j{
if(G.mat[k][j]{
lowcost[j]=G.mat[k][j];
closevertex[j]=k+1;
}
}
}
for(i=1;ia+=b[i];
cout<"<cout<<"终点站需要500的容量"<}
3.运行结果
宇宙旅行运行界面:
各个景点介绍及空间站容量
寻找到某景点的最短路径
提供一种旅游的一种最佳路径
4.设计体会与总结
通过这两周的数据结构课程设计,我又了解到了很多关于数据结构方面的知识。
这次的课程设计即帮我巩固了数据结构方面的知识,又帮我巩固了C++方面的知识。
数据结构课程设计是我们在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的可用程序,都是一个很好的学习和锻炼的过程。
使我们巩固了原有的理论知识,培养了我们灵活运用所学过的知识来分析、解决实际问题的能力。
这次我的题目是网络流:
宇宙旅行;在这个题目中我发现我自己还有很多关于数据结构知识不知道,算法也不是很会。
经过这个题目设计,我学到了如何计算网络六,最短路径算法。
进一步的了解数据结构更广方面的知识。
二、图书借阅管理系统
1.问题陈述
图书管理(增加图书、查询图书、删除图书、图书借阅、还书);
会员管理(增加会员、查询会员、删除会员、借书信息);
2.需求分析
本程序是提供了10个功能:
增加图书、查询图书、删除图书、图书借阅、还书
增加会员、查询会员、删除会员、借书信息;本程序的目的是为了让了人们能更方便的借阅图书,能更快的知道图书的数量,查询图书时也能更精准的查到哪一本书的详细信息,更快的知道它有或没有。
图书管理员可以更好管理图书:
增加图书、查询和删除图书,方便的借阅图书、还书;还能方便的管理会员,了解会员,方便的添加会员,删除会员等。
这样的管理才更快捷方便,功能也样样俱全。
所以这个系统在当今是很重要,能方便地管理图书。
3.概要设计
(1)采用了C语言的相关数据类型:
根据设计的要求,所用到了图书信息,会员信息;所用到的相关数据类型结构体有:
typedefstructBookInfo/////图书结构
{intb_Code;////图书编号
charb_Name[20];/////名称
floatb_price;/////价格
intb_person;///借阅人
intb_Total;/////总数
intb_Out;///借出数
BookInfo*nextbook;//////下一类图书
}BookInfo;
typedefstructMemberInfo///会员结构
{longm_Code;/////会员编号
charm_Name[20];////会员名字
charm_Sex[20];///会员的性别
intm_Age;///会员的年龄
intl_Codes[6];/////以借书的编号,最多5
MemberInfo*nextmember;////下一会员
}MemberInfo;
typedefstructSystem///管理系统结构
{BookInfo*BI;
MemberInfo*MI;
intBookTotal;////图书类库存量
intMemberTota;/////会员数量
}System;
(2)函数调用的关系图
4.详细设计
(1)各模块的代码算法
增加图书
voidAddBook(System*S)
{
BookInfo*p=S->BI;
BookInfo*t;
BookInfo*m;
do{
input:
"输入图书编号";
if(m=SearchBook(S,Tempcode)){
input:
"这类书已有库存.\n输入图书的入库量"
m->b_Total+=num;
}
else{
t=(BookInfo*)malloc(sizeof(BookInfo));
t->b_Code=Tempcode;
input:
"输入图书的名称:
";
input:
"输入图书价格:
";
input:
"输入图书的入库量:
";
t->b_Out=0;
t->nextbook=p->nextbook;
p->nextbook=t;
S->BookTotal++;
}
}while
(1);
}
查询图书
BookInfo*SearchBook(System*S,intcode){
BookInfo*bi=S->BI->nextbook;
intbookcode;
if(code==-1){
input:
"请输入要查询的图书编号:
";
}
elsebookcode=code;
while(bi&&bi->b_Code!
=bookcode)bi=bi->nextbook;
if(code==-1){
if(!
bi)cout<<"没找到你所要的图书."<else{
input:
"图书编号为:
"<b_Code
input:
"图书名称为:
"<b_Name
input:
"图书价格为:
"<b_price
input:
"借阅人编号为:
"<b_person
input:
"图书库存量为:
"<b_Total
input:
"图书借出量为:
"<b_Out
}
}
returnbi;
}
删除图书
voidDelBook(System*S){
BookInfo*bi;
BookInfo*pl=S->BI;
MemberInfo*memi;
do{
pl=S->BI;
bi=pl->nextbook;
memi=S->MI->nextmember;
input:
"请输入要删除的图书的编号:
";
while(bi){
if(bi->b_Code==tempcode)break;
pl=bi;
bi=bi->nextbook;
}
if(bi==0)
input:
"没有找到要删除的图书";
else{
pl->nextbook=bi->nextbook;
S->BookTotal--;
while(memi){
for(i=1;i<=memi->l_Codes[0];i++){
if(memi->l_Codes[i]==tempcode)break;
}
if(i<=memi->l_Codes[0]){
for(;il_Codes[0];i++)memi->l_Codes[i]=memi->l_Codes[i+1];
memi->l_Codes[0]--;
}
memi=memi->nextmember;
}
free(bi);
}
input:
"还有图书要删除吗?
(Y/N)";
if(sel=='N'||sel=='n'){
input:
"删除图书结束!
"
return;
}
}while
(1);
}
借书处理
voidBorrowBook(System*S)
{
BookInfo*bi=S->BI->nextbook;
BookInfo*p;
MemberInfo*mp;
do{
input:
"输入要借出的书号:
";
p=SearchBook(S,tempcode);
if(!
p){
input:
"没有找到要借出的图书."
}
else{
input:
"此书的现存量为"<<(p->b_Total-p->b_Out);
if(!
(p->b_Total-p->b_Out))cout<<"0."<else{
input:
"请输入会员编号:
";
mp=SearchMember(S,memcode);
if(!
mp)
input:
"会员编号输入错误,外借失败"<else{
if(mp->l_Codes[0]==5)
input:
"借书量不能超过5本";
else{
p->b_Out++;
mp->l_Codes[++mp->l_Codes[0]]=tempcode;
input:
"外借成功."
p->b_person=mp->m_Code;
}
}
}
}
input:
"\n还有图书要借出吗?
(Y/N)";
if(sel=='N'||sel=='n'){
input:
"外借操作结束."
return;
}
}while
(1);
}
还书处理
voidTurnBackBook(System*S)
{
BookInfo*bi=S->BI->nextbook;
BookInfo*p;
MemberInfo*mp;
do{
input:
"输入归还书号:
";
p=SearchBook(S,tempcode);
if(!
p){
input:
"书号输入错误.";
}
else{
input:
"此书的现存量为"<<(p->b_Total-p->b_Out);
input:
"请输入会员编号:
";
if(!
(mp=SearchMember(S,membercode)))
input:
"会员编号输入错误,归还失败"<else{
p->b_Out--;
for(i=1;i<=mp->l_Codes[0];i++){
if(mp->l_Codes[i]==tempcode)break;
}
while(il_Codes[0]){
mp->l_Codes[i]=mp->l_Codes[i+1];
i++;
}
mp->l_Codes[0]--;
}
}
input:
"还有要归还的图书吗?
(Y/N)";
if(sel=='N'||sel=='n'){
input:
"归还