本文實例為大家分享了C++實現景區信息管理系統的具體代碼,供大家參考,具體內容如下
1.1 建立主程序應用菜單選項
主程序應用菜單選項包含所實現的所有功能,并且對選項采用數字標識進行選擇,對其他錯誤輸入可以進行判別,提示輸入錯誤。
1.2 導游線路圖的創建級景區分布圖的輸出
用鄰接鏈表存儲景點分布圖的信息,(帶權無向)圖的鄰接鏈表。輸出景區景點分布圖(鄰接矩陣)。圖中邊的權值∞用32767表示。
1.3 輸出導游線路圖
景區旅游信息管理系統中制訂旅游景點導游線路策略,首先通過遍歷景點,給出一個入口景點,建立一個導游線路圖,導游線路圖用有向圖表示。
1.4 輸出導游線路圖中是否有回路
景區旅游信息管理系統中,創建好導游路線圖后,判斷該圖中是否存在回路。
1.5 查找及排序
l 查找功能: 可以根據用戶輸入的關鍵字進行景點的查找,關鍵字可以在景點名稱也可以在景點介紹中。查找成功則返回景點的相關簡介,如果查找不成功請給予正確提示。
l 排序功能:按景點歡迎度,景點的岔路數對景點進行排序并打印出來排序順序。
1.6 輸出兩個景點之間最短路徑和最短距離
求出兩個景點間的最短路徑和最短距離,并且輸出道路修建規劃圖。 算法采用迪杰斯特拉算法。
1.7 輸出道路修建規劃圖
道路建設首先要保證能連通所有景點,但又要花最小的代價。
1.8 輸出車輛的進出信息
1.8.1 具體需求:
停車場是一個可以停放n輛汽車,且只有一個大門可供汽車進出。汽車在停車場內按車輛到達時間的先后順序,依次排列,若車場內已停滿n輛車,后來的車只能在門外的便道上等候,一旦有車開走,則排在便道上的第一輛車即可開入;當停車場內某輛車要離開時,在它之后進入的車輛必須先退出車場為它讓路,待該輛車開出大門外,其它車輛再按原次序進入車場,每輛停放在車場的車在它離開停車場時必須按它停留的時間長短交納費用。輸出每輛車到達后的停車位置(停車場或便道上),以及某輛車離開停車場時應繳納的費用和它在停車場內停留的時間。
1.8.2 停車場的管理流程如下:
A.當車輛要進入停車場時,檢查停車場是否已滿,如果未滿則車輛進入停車場;如果停車場已滿,則車輛進入便道等候。
B.當車輛要求出棧時,先讓在它之后進入停車場的車輛退出停車場為它讓路,再讓該車退出停車場,讓路的所有車輛再按其原來進入停車場的次序進入停車場。之后,再檢查在便道上是否有車等候,有車則讓最先等待的那輛車進入停車場。
1.8.3 車輛出入清單:
每一組輸入數據包括三個數據項:汽車“到達”或“離去”信息、汽車牌照號碼以及到達或離去的時刻。對每一組輸入數據進行操作后的輸出信息為:若是車輛到達,則輸出汽車在停車場內或便道上的停車位置;若是車輛離去,則輸出汽車在停車場內停留的時間和應交納的費用(在便道上停留的時間不收費)。
1.9
退出整個程序。
完整代碼如下(直接編譯可運行):
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdio.h>
#include <cstring>
#include <iomanip>
#include <stack>
#include <queue>
#define MAX 20
#define MAX2 2
#define INFINITY 32767
int arr1[MAX][MAX];
using namespace std;
double arr[MAX][MAX];
class ArcNode {
public:
int adjvex;
ArcNode *nextarc;
double weight;
};
class VNode {
public:
string data1;
string data2;
int wel;
bool wc;
bool rest;
ArcNode *firstarc;
};
class ALGraph {
public:
VNode *vertices;
int vexnum, arcnum;
ArcNode *arcNode;
};
class zanlind
{
public:
int number;
int hour;
int minute;
};
int LocateVex(ALGraph G, string v) {
int i;
for(i = 0; v != G.vertices[i].data1 && i < G.vexnum; i++)
;
if(i >= G.vexnum)
return -1;
return i;
}
int LocateW(ALGraph G, int wel) {
int i;
for(i = 0; wel != G.vertices[i].wel && i < G.vexnum; i++)
;
if(i >= G.vexnum)
return -1;
return i;
}
void CreateUDN(ALGraph &G) {
G.arcNode=new ArcNode[MAX];
G.vertices=new VNode[MAX];
fstream file("info.txt");
if(file.fail())
{
cout << "error open!" << endl;
}
int j;
ArcNode *s, *t;
cout<<"請輸入頂點數和邊數:";
cin>>G.vexnum>>G.arcnum;
int i=0;
cout<<endl;
while(!file.eof())
{
file >>G.vertices[i].data1>>G.vertices[i].data2 >>
G.vertices[i].wel>> G.vertices[i].rest>>G.vertices[i].wc;
G.vertices[i].firstarc = NULL;
i++;
}
cout<<endl;
fstream file1("edge.txt");
if(file.fail())
{
cout << "error open!" << endl;
}
while(!file1.eof())
{
int weight;
string v1, v2;
file1>>v1>>v2>>weight;
int i = LocateVex(G, v1);
int j = LocateVex(G, v2);
s = new ArcNode();
t = new ArcNode();
s->adjvex = j;
s->nextarc = G.vertices[i].firstarc;
s->weight=weight;
G.vertices[i].firstarc =s;
t->adjvex = i;
t->nextarc = G.vertices[j].firstarc;
t->weight=weight;
G.vertices[j].firstarc =t;
}
file1.close();
file.close();
}
void PrintAdjList(ALGraph &G) {
cout<<"下面是圖的鄰接鏈表輸出:" <<endl;
ArcNode *p;
cout<<" 編號 "<<"頂點"<<" 相鄰邊編號"<<endl;
for(int i = 0; i < G.vexnum; i++) {
cout<<" "<<i<<" "<<G.vertices[i].data1;
for(p = G.vertices[i].firstarc; p; p = p->nextarc)
cout<<"--------->"<<p->adjvex;
cout<<endl;
}
}
void OutputGraph(ALGraph G) {
cout<<"下面是圖的鄰接矩陣輸出:"<<endl;
int m1=G.vexnum;
int m2=G.vexnum;
for(int i=0; i<m1; i++) {
for(int j=0; j<m2; j++) {
arr[i][j]=32767;
}
}
for(int k=0; k<m1; k++) {
ArcNode *p=G.vertices[k].firstarc;
for(int i2=0; i2<m2; i2++) {
if(k==i2) {
arr[k][i2]=0;
}
if(p) {
arr[k][p->adjvex]=p->weight;
p=p->nextarc;
}
}
}
cout<<" ";
for(int n1=0; n1<m1; n1++) {
cout<<setiosflags(ios::left)<<setw(11)<<G.vertices[n1].data1;
}
cout<<endl;
for(int n2=0; n2<m1; n2++) {
cout<<setiosflags(ios::left)<<setw(10)<<G.vertices[n2].data1;
for(int n3=0; n3<m1; n3++) {
cout<<setiosflags(ios::left)<<setw(10)<<arr[n2][n3];
}
cout<<endl;
}
}
bool visited[MAX];
stack<int> *s=new stack<int>();
bool isOver(ALGraph G,bool a[MAX]) {
for(int i=0; i<G.vexnum; i++) {
if(a[i]!=1) {
return false;
}
}
return true;
}
void DFSTraverse(ALGraph G)
{
bool sta[20];
int v;
for (v = 0; v<G.vexnum; v++)
{
sta[v] =true;
}
stack<int>status;
int n=0;
int num = -1;
int pk;
ArcNode *e;
cout << G.vertices[0].data1 << "->";
sta[0] =false;
status.push(0);
int aa, bb;
aa = 0;
while (n < G.vexnum-1){
e = NULL;
num = status.top();
e = G.vertices[num].firstarc;
while (e){
if (sta[e->adjvex] == false){
e = e->nextarc;
}
else{
status.push(e->adjvex);
cout << G.vertices[e->adjvex].data1<<"->";
aa = e->adjvex;
sta[e->adjvex] = false;
n++;
break;
}
}
if (e == NULL){
pk = status.top();
bb = pk;
if (aa != bb){
cout << G.vertices[pk].data1<<"->";
}
status.pop();
}
if (status.top() == 0){
cout << G.vertices[0].data1 << "->";
}
}
cout << endl;
}
bool IsEdge(ALGraph G) {
string s1, s2;
cin>>s1>>s2;
int iA=LocateVex(G,s1);
int jA=LocateVex(G,s2);
ArcNode *p=G.vertices[iA].firstarc;
while(p) {
if(p->adjvex==jA) {
return 1;
} else {
p=p->nextarc;
}
}
return 0;
}
int adjlist[MAX];
void FindInDegree( ALGraph &g) {
int i;
ArcNode *p;
for (i=0; i<g.vexnum; i++)
adjlist[i]=0;
for (i=0; i<g.vexnum; i++) {
p=g.vertices[i].firstarc;
while(p) {
adjlist[p->adjvex]++;
p=p->nextarc;
}
}
}
void JudgeCir(ALGraph G) {
FindInDegree(G);
int count=0;
int Q[MAX];
int front,rear,v;
front=rear=-1;
for(int i=0; i<G.vexnum; i++) {
if((adjlist[i]==0)||(adjlist[i]==1)) {
Q[++rear]=i;
count++;
}
}
while(front!=rear) {
v=Q[++front];
if(adjlist[v]==1) {
adjlist[v]=-1;
for(int j=0; j<G.vexnum; j++) {
if(arr[v][j]>0 && arr[v][j]<32767) {
adjlist[j]--;
if(adjlist[j]==1) {
Q[++rear]=j;
count++;
}
}
}
} else {
adjlist[v]=-1;
}
}
if(count<G.vexnum) {
cout<<"圖中有回路"<<endl;
} else
cout<<"圖中無回路"<<endl;
}
int in[MAX];
void LocateVex2(ALGraph G, string v) {
for(int i = 0;i < MAX; i++)
{
in[i]=10000;
}
for(int i = 0;i < G.vexnum; i++)
{
if(G.vertices[i].data1.find(v)<G.vertices[i].data1.length() ||
G.vertices[i].data2.find(v)<G.vertices[i].data2.length())
{
in[i]=i;
}
}
}
void Search(ALGraph G,string s) {
FindInDegree(G);
LocateVex2(G, s);
for(int i=0;i<G.vexnum;i++)
{
if(in[i]!=10000)
{
cout<<"您所要查詢的景點介紹為:"<<endl
<<endl<<"該景點名字是:"
<<G.vertices[in[i]].data1
<<" "<<endl
<<"該景點介紹為:"<<G.vertices[in[i]].data2<<endl
<<"該景點歡迎度為:"
<<G.vertices[in[i]].wel<<endl<<"有無休息區為:"
<<G.vertices[in[i]].rest
<<endl<<"有無廁所為:"<<G.vertices[in[i]].wc
<<endl<<endl;
}
}
}
void SortWel(ALGraph G) {
int ary[G.vexnum];
for(int i=0; i<G.vexnum; i++) {
ary[i]=G.vertices[i].wel;
}
int i, j, tmp;
for(i=0; i<G.vexnum; i++) {
tmp = ary[i];
for(j=G.vexnum-1; j>i; j--) {
if(tmp < ary[j]) {
ary[i] = ary[j];
ary[j] = tmp;
tmp = ary[i];
}
}
}
for(int j=0; j<G.vexnum; j++) {
int m=LocateW(G,ary[j]);
cout<<j+1<<"、 "<<G.vertices[m].data1<<endl;
}
}
bool isInN(ALGraph G,int a[MAX],int n)
{
for(int i=0;i<G.vexnum;i++)
{
if(a[i]==n)
{
return true;
}
}
return false;
}
void SortN(ALGraph G) {
int ary[G.vexnum];
int a[G.vexnum];
for(int j=0; j<G.vexnum; j++) {
a[j]=10000;
}
FindInDegree(G);
for(int i=0; i<G.vexnum; i++) {
ary[i]=adjlist[i];
}
int i, j, tmp;
for(i=0; i<G.vexnum; i++) {
tmp = ary[i];
for(j=G.vexnum-1; j>i; j--) {
if(tmp <= ary[j]) {
a[i]=j;
ary[i] = ary[j];
a[i]=j;
ary[j] = tmp;
tmp = ary[i];
}
}
}
for(int j=0;j<G.vexnum;j++)
{
for(int i=0;i<G.vexnum;i++)
{
if(ary[j]==adjlist[i])
{
if(!isInN(G,a,i))
{
a[j]=i;
}
else
{
continue;
}
}
}
}
for(int i=0;i<G.vexnum;i++)
{
cout<<i+1<<"、"<<G.vertices[a[i]].data1<<endl;
}
}
void ShortestPath_DIJ(ALGraph G,int v0, int p[][MAX], int D[]) {
int v, w, i, j, min;
bool final[10];
for(v=0; v<G.vexnum; v++) {
final[v]=false;
D[v]=arr[v0][v];
for(w=0; w<G.vexnum; w++)
p[v][w]=-1;
if(D[v]<INFINITY) {
p[v][0]=v0;
p[v][1]=v;
}
}
D[v0]=0;
final[v0]=true;
for(i=1; i<G.vexnum; i++) {
min=INFINITY;
for(w=0; w<G.vexnum; w++)
if(!final[w] && D[w]<min) {
v=w;
min=D[w];
}
final[v]=true;
for(w=0; w<G.vexnum; w++) {
if(!final[w] && min<INFINITY && arr[v][w]<INFINITY
&& (min+arr[v][w]<D[w])) {
D[w]=min+arr[v][w];
for(j=0; j<G.vexnum; j++) {
p[w][j]=p[v][j];
if(p[w][j]==-1) {
p[w][j]=w;
break;
}
}
}
}
}
}
bool isInVe(ALGraph G,string va)
{
for(int i=0;i<G.vexnum;i++)
{
if(G.vertices[i].data1==va)
{
return true;
}
}
return false;
}
void printShortestPath(ALGraph G)
{
int iA,jA;
string s1,s2;
int p[MAX][MAX];
int D[MAX];
cout<<"請輸入要查詢距離的兩個景點的名稱:";
cin>>s1>>s2;
if(isInVe(G,s1) && isInVe(G,s2))
{
iA=LocateVex(G,s1);
jA=LocateVex(G,s2);
ShortestPath_DIJ(G,iA, p, D);
cout<<"到各頂點的最短路徑及長度為:"<<endl;
if(jA!=0 && D[jA]!=INFINITY) {
cout<<"最短路徑為:";
for(int j=0; j<G.vexnum; j++) {
if(p[jA][j]>-1)
cout<<G.vertices[p[jA][j]].data1
<<" ";
}
cout<<endl;
cout<<"最短距離為:"<<D[jA];
} else if(D[jA]==INFINITY)
cout<<G.vertices[iA].data1<<"-"
<<G.vertices[jA].data1
<<":"<<"不可達"<<endl;
}
else
{
cout<<"您輸入的景點名稱不存在,請輸入正確的景點名稱:"<<endl;
printShortestPath(G);
}
}
void prim(ALGraph G,int v,double arr[MAX][MAX]) {
int lowcost[MAX];
int min;
int closest[MAX],i,j,k;
for(i=0; i<G.vexnum; i++) {
lowcost[i]=arr[v][i];
closest[i]=v;
}
for(i=1; i<G.vexnum; i++) {
min=INFINITY;
for(j=0; j<G.vexnum; j++) {
if(lowcost[j]!=0&&lowcost[j]<min) {
min=lowcost[j];
k=j;
}
}
cout<<"從"<<G.vertices[closest[k]].data1<<"到"
<<G.vertices[k].data1<<"修一條路"<<endl;
lowcost[k]=0;
for(j=0; j<G.vexnum; j++) {
if(arr[k][j]!=0 && arr[k][j]<lowcost[j]) {
lowcost[j]=arr[k][j];
closest[j]=k;
}
}
}
}
stack<zanlind> parking;
stack<zanlind> cars;
queue<zanlind> waits;
int z[MAX2];
bool isInZan(int zan[],int number)
{
for(int i=0;i<MAX2;i++)
{
if(zan[i]==number)
{
return true;
}
}
return false;
}
int indexZ(int z[],int n)
{
for(int i=0;i<MAX2;i++)
{
if(z[i]==n)
{
return i;
}
}
return -1;
}
void goIn()
{
int k1=0;
zanlind zan;
cout<<"車牌號為:";
cin>>zan.number;
cout<<endl;
/*
time_t t = time(0);
char tmp[64];
strftime(tmp,sizeof(tmp),"%X ",localtime(&t));
zan.time=tmp;
*/
struct tm *newtime;
time_t long_time;
time( &long_time ); //Get time as long integer
newtime = localtime( &long_time );
int h = newtime->tm_hour;//得到當前時間的小時
int m = newtime->tm_min;//得到當前時間的分鐘
zan.hour=h;
zan.minute=m;
cout<<"進場時間為:";
if(zan.minute>=1 && zan.minute<10)
{
cout<<zan.hour<<":0"<<zan.minute<<endl;
}
else
{
cout<<zan.hour<<":"<<zan.minute<<endl;
}
if(parking.size()<MAX2)
{
for(int m=0;m<MAX2;m++)
{
if(z[m]==0)
{
z[m]=zan.number;
break;
}
}
parking.push(zan);
cout<<"該車已進入停車場在: "<<k1++<<"號車道";
}
else
{
cout<<"停車場已滿,請等待其他車輛離開:";
waits.push(zan);
}
}
void goOut()
{
if(parking.size()<=0)
{
cout<<"停車場為空,沒有車要離開!";
}
else
{
cout<<"請輸入您的車牌號:";
int number;
cin>>number;
if(isInZan(z,number))
{
while(parking.top().number!=number)
{
cars.push(parking.top());
parking.pop();
}
int num=indexZ(z,parking.top().number);
z[num]=0;
/*
time_t t = time(0);
char tmp[64];
strftime(tmp,sizeof(tmp),"%X ",localtime(&t));
*/
struct tm *newtime;
time_t long_time;
time( &long_time ); //Get time as long integer
newtime = localtime( &long_time );
int h = newtime->tm_hour;//得到當前時間的小時
int m = newtime->tm_min;//得到當前時間的分鐘
cout<<"車牌號為:"<<parking.top().number<<"的車要離開了"<<endl
<<"停車時間為: "
<<(h*60+m)-(parking.top().hour*60+parking.top().minute)<<"分鐘"<<endl
<<"停車費用為:"
<<((h*60+m)-(parking.top().hour*60+parking.top().minute))*5<<"元"<<endl;
parking.pop();
while(!cars.empty())
{
parking.push(cars.top());
cars.pop();
}
while(parking.size()<MAX2)
{
if(waits.size()!=0)
{
for(int m=0;m<MAX2;m++)
{
if(z[m]==0)
{
z[num]=waits.front().number;
}
}
parking.push(waits.front());
waits.pop();
}
else
{
break;
}
}
}
else
{
cout<<"沒有該輛車!請輸入正確的車牌號:"<<endl;
}
}
}
void parkinglot()
{
r2:
cout<<endl<<" **停車場管理程序** "<<endl
<<"--------------------------------------------------"<<endl
<<"**"
<<"** A---汽車進車場 D---汽車出車場 E---退出程序 **"<<endl
<<"--------------------------------------------------"<<endl
<<"請選擇:<A ,D ,E>:";
char choose;
cin>>choose;
if(choose=='A' || choose=='D' || choose=='E')
{
switch(choose)
{
case 'A':
goIn();
goto r2;
case 'D':
goOut();
goto r2;
case 'E':
break;
}
}
else
{
cout<<"您的輸入有誤,請輸入 <A D E> 其中的一項。";
goto r2;
}
}
int main() {
int i, j;
int iAA;
ALGraph *G=new ALGraph();
int choose=0;
cout<<endl;
while(true) {
r:
cout<<"------------------------------------------"<<endl
<<" 歡迎使用景區信息管理系統 "<<endl
<<" ***請選擇菜單*** "<<endl
<<"------------------------------------------"<<endl
<<" 1、創建景區景點分布圖 "<<endl
<<" 2、輸出景區景點分布圖 "<<endl
<<" 3、輸出導游線路圖 "<<endl
<<" 4、輸出導游線路圖的回路 "<<endl
<<" 5、查找及排序 "<<endl
<<" 6、求兩個景點間的最短路徑和最短距離 "<<endl
<<" 7、輸出道路修建規劃圖 "<<endl
<<" 8、停車場車輛進出記錄信息 "<<endl
<<" 0、退出系統 "<<endl
<<"請輸入您要選擇的菜單項: ";
cin>>choose;
if(choose<=8 && choose>=0) {
if(choose>1 && G->vexnum==0 &&choose!=8) {
cout<<endl<<"************您的圖為空,請先創建您的圖**********:"
<<endl<<endl;
goto r;
} else {
switch(choose) {
case 1:
CreateUDN(*G);
break;
case 2:
PrintAdjList(*G);
cout<<endl;
OutputGraph(*G);
break;
case 3:
cout<<"導游路線為:";
//CreatTourSortGraph(*G);
//DFSTraverse(*G);
break;
case 4:
JudgeCir(*G);
break;
case 5:
while(true)
{
int ch;
cout<<"您需要"
<<" 查找(0),"
<<"按歡迎度排序(1),"
<<"按景點岔路數排序(2),"
<<"退出此目錄(3) :" ;
cin>>ch;
string sA;
switch(ch)
{
case 0:
cout<<"請輸入您要查找的有關景點的關鍵字:" ;
cin>>sA;
Search(*G,sA);
break;
case 1:
SortWel(*G);
break;
case 2:
SortN(*G);
break;
case 3:
goto r;
default :
cout<<"您的輸入有誤,請重新輸入:"<<endl;
}
}
case 6:
printShortestPath(*G);
break;
case 7:
prim(*G,0,arr);
break;
case 8:
parkinglot();
break;
case 0:
exit(0);
}
}
cout<<endl;
}
else {
cout<<"您的輸入有誤,請重新輸入0-8之間的數字"<<endl;
}
}
return 0;
}
所需要的兩個edge.txt和info.txt文件。(很重要、一定要有?。。。?/p>


更多學習資料請關注專題《管理系統開發》。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。