学校的校园景点平面图(校园景点迷你地图C++&数据结构)

    科技2025-01-12  21

    学校的校园景点平面图(校园景点迷你地图C++&数据结构)

    设计要求:

    (1)建图 以图中顶点表示主要景点,并存放景点的编号、名称、简介等信息; (2)查询 该系统可以查询景点的信息; 查询图中任意两个景点间的最短路径; 查询图中所有景点间的最短路径; 查询图中任意两个景点间的所有路径。 (3)更新 更新景点间路径长度; 在两个景点之间添加一条路径; 删除两个景点之间的一条路径; 增添一个景点; 去除一个景点; 更改景点的简介。

    功能实现

    (1)建图 首先画出所要建立的地图的形象版 为了方便使用图论的知识来完成上述所要实现的功能,将这个形象图抽象化,变成图: 邻接矩阵1:(由createMTGraph()函数建立的邻接矩阵) 邻接矩阵2:(由createMTGraph1()函数建立的邻接矩阵) 接下来使用数据结构的知识用编程语言表示这个图:

    #define numedges 100 //最大边数 #define numvertices 13 //最大顶点个数 typedef string vertexdata; //顶点数据类型 typedef int edgedata; //边上权值类型 typedef int *listofnode; typedef struct node{ vertexdata verlist[numvertices]; //顶点表,verlist[i]类型为string,存放顶点名称 vertexdata info[numvertices];//存放顶点简介 edgedata edge[numvertices][numvertices]; //邻接矩阵--边表,可视为边之间的关系,存放权值 int n,e;//图中当前的顶点个数与边数 }MTGraph;

    这是使用邻接矩阵表示有向图。 注:为什么刚才抽象出来的图是无向图,而我要使用有向图呢? 因为分析这个地图要实现的功能,有“查询图中任意两个景点间的最短路径; 查询图中所有景点间的最短路径;查询图中任意两个景点间的所有路径。”,这些功能一定会用到那个著名的算法:Floyd算法,而这个算法是要求使用有向图的;而且使用邻接矩阵表示的图,无论是有向图还是无向图,都是可以互相转化的,简单地说就是:双向有向图==无向图,即把有向图每对顶点之间的有向边都变为两条方向相反的有向边!这也不会费多少功夫和资源。

    (2)对该图的一些基本操作:

    //判断两个顶点之间是否有边 bool isEdge(MTGraph &G,int v1,int v2){ return G.edge[v1][v2]!=INF; } //创建一个新的顶点 void newnode(MTGraph &G,vertexdata v){ G.verlist[G.n]=v;//G.n=11 G.n++;//G.n=12 for(int i=0;i<G.n+1;i++){//i<12 (i:0~11) G.edge[G.n-1][i]=INF; G.edge[i][G.n-1]=INF; } } //更改两个景点v1,v2之间的路径长度为juli void chg(MTGraph &G,int v1,int v2,int juli){ if(isEdge(G,v1,v2)){ int temp=G.edge[v1][v2]; G.edge[v1][v2]=juli; G.edge[v2][v1]=juli; cout<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间的路径长度从"<<temp<<"更改为"<<juli<<endl; } else{ cout<<"这两个景点之间没有直接路径,更新失败!"<<endl; //return; } } //删除一个顶点 void delnode(MTGraph &G,int v){ int i,j; for(i=0;i<G.n;i++) if(G.edge[v][i]!=INF){ G.edge[v][i]=INF; G.edge[i][v]=INF; G.e==G.e-2; }// 删除一个顶点 之后表示该图的邻接矩阵 也会改变 for(i=v+1;i<G.n;i++)//行 for(j=0;j<G.n;j++)//列 G.edge[i-1][j]=G.edge[i][j]; for(i=v+1;i<G.n;i++)//列 for(j=0;j<G.n-1;j++)//行 G.edge[j][i-1]=G.edge[j][i]; for(i=v+1;i<G.n;i++) G.verlist[i-1]=G.verlist[i]; G.n--; } //添加1条V1->V2的有向边(建立图时用) void setsucc1(MTGraph &G,int v1,int v2,int w){ if(isEdge(G,v1,v2)) return; G.e++; G.edge[v1][v2]=w; //G.edge[v2][v1]=w; } //在V1和V2这两个景点之间添加一条路径(添加路径时用) void setsucc2(MTGraph &G,int v1,int v2,int w){ if(isEdge(G,v1,v2)){ cout<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间已经存在路径,不需要在添加路径!"<<endl; return; } G.e++; G.edge[v1][v2]=w; G.edge[v2][v1]=w; cout<<"成功在"<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间添加一条长度为"<<w<<"的路径"<<endl; } //删除V1->V2的和V2->V1的边;删除V1和V2这两个景点之间的一条路径 void delsucc(MTGraph &G,int v1,int v2){ if(!isEdge(G,v1,v2)){ cout<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间不存在路径,不需要在删除路径!"<<endl; return; } int temp=G.edge[v1][v2]; G.e--; G.edge[v1][v2]=INF; G.edge[v2][v1]=INF; //G.edge[v1][v2]=0; //G.edge[v2][v1]=0; cout<<"成功删除"<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间一条长度为"<<temp<<"的路径"<<endl; } //v的直接后继 int *succ(MTGraph G,int v){ int *ret=new int[numvertices]; int i,k; for(i=0;i<G.n;i++){ if(G.edge[v][i]) ret[k++]=i; } ret[k]=-1; return ret; } //v的直接前驱 int *pre(MTGraph G,int v){ int *ret=new int[numvertices]; int i,k; for(i=0;i<G.n;i++){ if(G.edge[i][v]) ret[k++]=i; } ret[k]=-1; return ret; }

    建图函数: 1.

    //构建图之1,包括表示该图的邻接矩阵(元素由INF和每对顶点间的路径长度组成),图中顶点的名称和简介 void createMTGraph(MTGraph &G){ // int i,j,x,y,e,w; int i,j,n=11,e=30,x,y,w; //int i,j,n=3,e=6,x,y,w; //memset(G.edge,0,sizeof(G.edge)); for(i=0;i<numvertices;i++) for(j=0;j<numvertices;j++) G.edge[i][j]=INF; /*cout << "请输入图中当前的顶点个数:"; cin>>n;//n=11 G.n=n; cout <<endl; cout << "请输入图中当前的边数:"; cin>>e;//e=30 //G.e=e;*/ G.n=n; /* for(i=0;i<n;i++){ cout << "请输入顶点"<<i<<"的名称:"; cin>>G.verlist[i];//顶点表,verlist[i]类型为string,存放顶点名称 cout << "请输入顶点"<<i<<"的简介:"; cin>>G.info[i];//存放顶点简介 }*/ vertexdata str1[13]={"大门","厚学楼","浦江","操场","大礼堂","宿舍","西苑","沉毅广场","镜湖","东苑","图书馆"}; for(int i=0;i<13;i++){ G.verlist[i]= str1[i]; } //存放景点简介的字符串数组 vertexdata str2[13]={"大门是南京工业大学的门面招牌,气势恢宏!","厚学楼是学习圣地,在这里总是能看到莘莘学子发奋苦读的情景!", "浦江是美食天堂,这里有各式各样的特色美食!","操场十分辽阔整洁,是学生放松锻炼的好地方!","大礼堂是学校举办各种文艺演出的地方,周末还会放电影哟!", "宿舍是学生们休息,娱乐,学习的地方!","西苑景色很美,有绿水,有大树,还有一个很时尚的网红餐厅!","沉毅广场也是学校的一大门面担当,那个古老的大铜鼎更是令人赞叹!", "镜湖很美,水面辽阔,平静如镜,还有荷花!","东苑有一个拥有穹顶的食堂,很有艺术感,还上过电视哦!","图书馆是个知识宝库,里面的学生也是络绎不绝!"}; for(int i=0;i<13;i++){ G.info[i]= str2[i]; } //景点平面图的邻接矩阵 edgedata edge1[13][13]={ {INF,50,INF,INF,60,INF,INF,INF,INF,INF,INF,INF,INF}, {50,INF,80,INF,80,INF,INF,40,INF,INF,INF,INF,INF}, {INF,80,INF,20,INF,INF,INF,INF,INF,INF,INF,INF,INF}, {INF,INF,20,INF,INF,INF,INF,160,INF,INF,INF,INF,INF}, {60,80,INF,INF,INF,60,INF,INF,INF,INF,INF,INF,INF}, {INF,INF,INF,INF,60,INF,120,280,INF,INF,INF,INF,INF}, {INF,INF,INF,INF,INF,120,INF,INF,INF,100,INF,INF,INF}, {INF,40,INF,160,INF,280,INF,INF,500,INF,400,INF,INF}, {INF,INF,INF,INF,INF,INF,INF,500,INF,300,200,INF,INF}, {INF,INF,INF,INF,INF,INF,100,INF,300,INF,INF,INF,INF}, {INF,INF,INF,INF,INF,INF,INF,400,200,INF,INF,INF,INF} }; for(int i=0;i<13;i++){//我用上面的二维数组代替此地图初始化的过程 ,不会破坏其可拓展性 ,而且不用每次运行程序都手动输入一遍邻接矩阵 for(int j=0;j<13;j++){//想换一个地图就只要更改这个邻接矩阵即可 G.edge[i][j]=edge1[i][j]; } } /* for(i=0;i<e;i++){//void setsucc(MTGraph &G,int v1,int v2,int w)在改变G的e(G.e),,怪不得一直输入起点终点无法退出 cout << "请输入起点:"; cin>>x; cout << "请输入终点:"; cin>>y; cout << "请输入权值:"; cin>>w; setsucc1(G,x,y,w);//e为奇数时要这样建立图,每条边都要输入一遍,要输入e对顶点 } */ /*for(i=0;i<e/2;i++){//void setsucc(MTGraph &G,int v1,int v2,int w)在改变G的e(G.e),,怪不得一直输入起点终点无法退出 cout << "请输入起点:"; cin>>x; cout << "请输入终点:"; cin>>y; cout << "请输入权值:"; cin>>w; setsucc(G,x,y,w); setsucc(G,y,x,w);//e为偶数时可以这样建立图,输入一半的边即可,只要输入e/2对顶点 }*/ } //构建图之2(改变了邻接矩阵的表示:有边G.edge[i][j]==1,没有边G.edge[i][j]==INF),这个建图函数是为了服务功能10:查询图中任意两个景点间的所有路径 void createMTGraph1(MTGraph &G){ // int i,j,x,y,e,w; int i,j,n=11,e=30,x,y,w; //int i,j,n=3,e=6,x,y,w; //memset(G.edge,0,sizeof(G.edge)); for(i=0;i<numvertices;i++) for(j=0;j<numvertices;j++) G.edge[i][j]=INF; G.n=n; vertexdata str1[13]={"大门","厚学楼","浦江","操场","大礼堂","宿舍","西苑","沉毅广场","镜湖","东苑","图书馆"}; for(int i=0;i<13;i++){ G.verlist[i]= str1[i]; } //存放景点简介的字符串数组 vertexdata str2[13]={"大门是南京工业大学的门面招牌,气势恢宏!","厚学楼是学习圣地,在这里总是能看到莘莘学子发奋苦读的情景!", "浦江是美食天堂,这里有各式各样的特色美食!","操场十分辽阔整洁,是学生放松锻炼的好地方!","大礼堂是学校举办各种文艺演出的地方,周末还会放电影哟!", "宿舍是学生们休息,娱乐,学习的地方!","西苑景色很美,有绿水,有大树,还有一个很时尚的网红餐厅!","沉毅广场也是学校的一大门面担当,那个古老的大铜鼎更是令人赞叹!", "镜湖很美,水面辽阔,平静如镜,还有荷花!","东苑有一个拥有穹顶的食堂,很有艺术感,还上过电视哦!","图书馆是个知识宝库,里面的学生也是络绎不绝!"}; for(int i=0;i<13;i++){ G.info[i]= str2[i]; } //景点平面图的邻接矩阵 edgedata edge1[13][13]={ {INF,1,INF,INF,1,INF,INF,INF,INF,INF,INF,INF,INF}, {1,INF,1,INF,1,INF,INF,1,INF,INF,INF,INF,INF}, {INF,1,INF,1,INF,INF,INF,INF,INF,INF,INF,INF,INF}, {INF,INF,1,INF,INF,INF,INF,1,INF,INF,INF,INF,INF}, {1,1,INF,INF,INF,1,INF,INF,INF,INF,INF,INF,INF}, {INF,INF,INF,INF,1,INF,1,1,INF,INF,INF,INF,INF}, {INF,INF,INF,INF,INF,1,INF,INF,INF,1,INF,INF,INF}, {INF,1,INF,1,INF,1,INF,INF,1,INF,1,INF,INF}, {INF,INF,INF,INF,INF,INF,INF,1,INF,1,1,INF,INF}, {INF,INF,INF,INF,INF,INF,1,INF,1,INF,INF,INF,INF}, {INF,INF,INF,INF,INF,INF,INF,1,1,INF,INF,INF,INF} }; for(int i=0;i<13;i++){//我用上面的二维数组代替此地图初始化的过程 ,不会破坏其可拓展性 ,而且不用每次运行程序都手动输入一遍邻接矩阵 for(int j=0;j<13;j++){//想换一个地图就只要更改这个邻接矩阵即可 G.edge[i][j]=edge1[i][j]; } } }

    (3)各种功能的实现 1.查询景点的信息;

    //查询景点v的信息(简介) void printinfo(MTGraph g,int v){ //if cout<<"景点"<<g.verlist[v]<<"的简介:"<<g.info[v]<<endl; }

    在main()函数中对应着case 1:

    case 1: int x1; cout<<"请输入想要查询信息的景点的代号:"; cin>>x1; cout<<endl; printinfo(g,x1); break;

    2.查询图中任意两个景点间的最短路径; 该功能由Floyd算法和配合Floyd算法使用的输出函数组成:

    //求图中任意两个景点间的最短路径---Floyd算法 void floyd(MTGraph g,int d[numvertices][numvertices],int p[numvertices][numvertices]){ int i,j,k; for(i=0;i<g.n;i++){ for(j=0;j<g.n;j++){ d[i][j]=g.edge[i][j]; p[i][j]=-1; } } for(k=0;k<g.n;k++) for(i=0;i<g.n;i++) for(j=0;j<g.n;j++){ if(d[i][j]>d[i][k]+d[k][j]){ d[i][j]=d[i][k]+d[k][j]; p[i][j]=k; } } }//O(g.n^3) //输出U->V的最短路径 void printpath(MTGraph g,int p[numvertices][numvertices],int u, int v){ int k; if(p[u][v]==-1){ cout<<"<"<<g.verlist[u]<<"--->"<<g.verlist[v]<<">"; return; } k=p[u][v]; printpath(g,p,u,k); printpath(g,p,k,v); }

    在main()函数中对应着case 2:

    case 2: floyd(g,d,p); cout<<"请输入想要查询最短路径的两个景点的编号:"<<endl; cin>>v1>>v2; cout<<g.verlist[v1]<<"和"<<g.verlist[v2]<<"之间的最短路径为:"<<endl; cout<<setiosflags(ios::left)<<g.verlist[v1]<<"->"<<g.verlist[v2]<<":"; printpath(g,p,v1,v2); cout<<" "; cout<<"该路径的长度为:"<<d[v1][v2]<<"米"<<endl; break;

    3.查询图中所有景点间的最短路径; 该功能也是由Floyd算法和配合Floyd算法使用的输出函数组成,只是不止输出要查询的2个顶点之间的最短路径,而是输出每对顶点的: 在main()函数中对应着case 3:

    case 3: floyd(g,d,p); cout<<"每对顶点之间最短路径为:"<<endl; for(i=0;i<g.n;i++){ for(j=0;j<g.n;j++){ if(d[i][j]==INF) continue; else{ if(i!=j){//&&g.egdge[i][j]!=INF //cout<<setiosflags(ios::left)<<i<<g.verlist[i]<<"->"<<j<<g.verlist[j]<<":"; cout<<setiosflags(ios::left)<<g.verlist[i]<<"->"<<g.verlist[j]<<":"; printpath(g,p,i,j); cout<<endl; } } } } break;

    4.查询图中任意两个景点间的所有路径; 这个功能应该是对我来说最烧脑的一个,它是我最后实现的一个功能,所以我把它放在了case 10; 首先在mian()函数开头定义好case 10中要使用的变量并把图建好:

    int main(){ int i,j; int start_num;//起点编号 int node_num;//终点编号 int d[numvertices][numvertices],p[numvertices][numvertices];//,a[numvertices][numvertices] MTGraph g; MTGraph g1; createMTGraph(g);//建立图 g createMTGraph1(g1);//建立图 g1

    接着去case 10中编写"求图中任意两个景点间的所有路径"的算法:

    case 10:{ bool is_in_stack[numvertices]; is_in_stack[numvertices]={0}; stack<int>node_stack; int c_position; c_position = 0; vector<vector<int> >paths;//存储所有路径 vector<int>path;//存储单条路径 cout<<"请输入想要查询所有路径的两个景点的编号:"<<endl; cin>>start_num>>node_num; //start_num和node_num可取0~10 ,但最好不要一样 cout<<g.verlist[start_num]<<"和"<<g.verlist[node_num]<<"之间的所有路径为:"<<endl; //思考过程 //先测试从0--->10的所有路径 //已然解决了,横空出世! //接下来看看任意两点之间的所有路径 //完美! //还有瑕疵,就是 起点编号要小于终点 //又一个瑕疵,连续使用10号功能就会输出不变 ,现在也解决了 //起点入栈 node_stack.push(start_num); is_in_stack[0] = 1;//设置起点已入栈,1表示在栈中,0 表示不在 int top_element;//记录栈顶元素 int tmp; while (!node_stack.empty()) { top_element = node_stack.top();//查看栈顶元素,判断是否已经到达终点 if (top_element == node_num)//若到达终点,输出路径,弹出栈中两个点,设置出栈状态 { while (!node_stack.empty()) { tmp = node_stack.top(); node_stack.pop(); path.push_back(tmp); } paths.push_back(path);//将路径加入路径组 for (vector<int>::reverse_iterator rit = path.rbegin(); rit != path.rend(); rit++) { node_stack.push(*rit); } path.clear();//清除单条路径 node_stack.pop(); is_in_stack[top_element] = 0; c_position = node_stack.top();//记录位置,以便从该位置之后进行搜索 top_element = node_stack.top(); node_stack.pop(); is_in_stack[top_element] = 0; //cout << vis[top_element]; } else { int i = 0; for (i = c_position + 1; i <node_num + 2; i++) { if (is_in_stack[i] == 0 && g1.edge[top_element][i] != INF)//未入栈,而且节点之间有边相连 { is_in_stack[i] = 1;//stack In node_stack.push(i);//入栈 c_position = 0;//位置置零,是因为从记录的位置开始搜索完以后,在新的行上搜索,自然从零开始,以免漏掉节点 break; } } if (i == node_num + 2) { top_element = node_stack.top(); is_in_stack[top_element] = 0; c_position = node_stack.top(); node_stack.pop(); } } } //======================== 输出 ========================== //逆向 for (int i = 0; i <paths.size(); i++) { cout << "路径" << i << ": "; for (int j = paths[i].size()-1; j >=0; j--) { if (j == 0) { //cout << paths[i][j]; cout << g1.verlist[ paths[i][j] ]; } else { //cout << paths[i][j] << "->"; cout << g1.verlist[ paths[i][j] ] << "->"; } } cout << endl; } //======================== 输出 ========================== break;}

    5.更新景点间路径长度;

    //更改两个景点v1,v2之间的路径长度为juli void chg(MTGraph &G,int v1,int v2,int juli){ if(isEdge(G,v1,v2)){ int temp=G.edge[v1][v2]; G.edge[v1][v2]=juli; G.edge[v2][v1]=juli; cout<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间的路径长度从"<<temp<<"更改为"<<juli<<endl; } else{ cout<<"这两个景点之间没有直接路径,更新失败!"<<endl; //return; } }

    在main()函数中对应着case 4:

    case 4: //int v1,v2,w; cout<<"请输入想要更新路径长度的两个景点的编号:"<<endl; cin>>v1>>v2; if(!isEdge(g,v1,v2)){ cout<<"这两个景点之间没有直接路径,更新失败!"<<endl; break; } cout<<"请输入想要设置的新路径长度:"; cin>>w; chg(g,v1,v2,w); break;

    6.在两个景点之间添加一条路径;

    //在V1和V2这两个景点之间添加一条路径(添加路径时用) void setsucc2(MTGraph &G,int v1,int v2,int w){ if(isEdge(G,v1,v2)){ cout<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间已经存在路径,不需要在添加路径!"<<endl; return; } G.e++; G.edge[v1][v2]=w; G.edge[v2][v1]=w; cout<<"成功在"<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间添加一条长度为"<<w<<"的路径"<<endl; }

    在main()函数中对应着case 5:

    case 5: //int v1,v2,w; cout<<"请输入想要添加路径的两个景点的编号:"<<endl; cin>>v1>>v2; if(isEdge(g,v1,v2)){ cout<<g.verlist[v1]<<"和"<<g.verlist[v2]<<"这两个景点之间已经存在路径,不需要在添加路径!"<<endl; break; } cout<<"请输入想想要添加的路径的长度:"; cin>>w; setsucc2(g,v1,v2,w); break;

    7.删除两个景点之间的一条路径;

    //删除V1->V2的和V2->V1的边;删除V1和V2这两个景点之间的一条路径 void delsucc(MTGraph &G,int v1,int v2){ if(!isEdge(G,v1,v2)){ cout<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间不存在路径,不需要在删除路径!"<<endl; return; } int temp=G.edge[v1][v2]; G.e--; G.edge[v1][v2]=INF; G.edge[v2][v1]=INF; //G.edge[v1][v2]=0; //G.edge[v2][v1]=0; cout<<"成功删除"<<G.verlist[v1]<<"和"<<G.verlist[v2]<<"这两个景点之间一条长度为"<<temp<<"的路径"<<endl; }

    在main()函数中对应着case 6:

    case 6: //int v1,v2; cout<<"请输入想要删除路径的景点的编号:"<<endl; cin>>v1>>v2; //删除V1->V2的和V2->V1的边;删除V1和V2这两个景点之间的一条路径 delsucc(g,v1,v2); break;

    8.增添一个景点;

    //创建一个新的顶点 ,并且为这个新顶点设置编号为G.n void newnode(MTGraph &G,vertexdata v){ G.verlist[G.n]=v;//G.n=11 G.n++;//G.n=12 for(int i=0;i<G.n+1;i++){//i<12 (i:0~11) G.edge[G.n-1][i]=INF; G.edge[i][G.n-1]=INF; } }

    在main()函数中对应着case 7:

    case 7://要改进 //string temp; cout<<"请输入想要增添的景点的名称:"; cin>>temp; newnode(g,temp); cout<<"成功增添景点:"<<temp<<" "; cout<<"该景点的编号为:"<<g.n-1<<endl; break;

    9.去除一个景点;

    //删除一个顶点 void delnode(MTGraph &G,int v){ int i,j; for(i=0;i<G.n;i++) if(G.edge[v][i]!=INF){ G.edge[v][i]=INF; G.edge[i][v]=INF; G.e==G.e-2; }// 删除一个顶点 之后表示该图的邻接矩阵 也会改变 for(i=v+1;i<G.n;i++)//行 for(j=0;j<G.n;j++)//列 G.edge[i-1][j]=G.edge[i][j]; for(i=v+1;i<G.n;i++)//列 for(j=0;j<G.n-1;j++)//行 G.edge[j][i-1]=G.edge[j][i]; for(i=v+1;i<G.n;i++) G.verlist[i-1]=G.verlist[i]; G.n--; }

    在main()函数中对应着case 8:

    case 8://删除顶点之后,其他顶点的编号会改变 //int v; //string temp; temp=g.verlist[v]; cout<<"请输入想要去除的景点的编号:"; cin>>v; delnode(g,v); cout<<"成功去除景点:"<<temp<<" "; cout<<"该景点原来的编号为:"<<v<<endl; break;

    10.更改景点的简介;

    //更改景点的简介 void ch (MTGraph &g,int v,vertexdata temp){ g.info[v]=temp; }

    在main()函数中对应着case 9:

    case 9: //int v; cout<<"请输入想要更改简介的景点的编号:"; cin>>v; temp1=g.verlist[v]; cout<<"请输入想要设置的新简介:"; cin>>temp; ch (g,v,temp); cout<<"成功将景点:"<<temp1<<"的简介改为:"<<temp<<endl; break;

    至此,10个功能都已实现。 运行截图: 这个程序是我学习计算机以来感觉最有趣的一个,完成它我确实费了不少周折,有几个功能的实现对现在的我来说着实烧脑,但越是困难我越是想把它做出来,也正是这些困难,将我通过努力获得成功时的快乐放大了。

    Processed: 0.011, SQL: 8