數(shù)據(jù)結(jié)構(gòu)校園導游程序設(shè)計合集_第1頁
數(shù)據(jù)結(jié)構(gòu)校園導游程序設(shè)計合集_第2頁
數(shù)據(jù)結(jié)構(gòu)校園導游程序設(shè)計合集_第3頁
數(shù)據(jù)結(jié)構(gòu)校園導游程序設(shè)計合集_第4頁
數(shù)據(jù)結(jié)構(gòu)校園導游程序設(shè)計合集_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

校園導游程序(c++)問題描述:用無向網(wǎng)表示你所在學校的校園景點平面圖,圖中頂點表示主要景點,存放景點的編號、名稱、簡介等信息,圖中的邊表示景點間的道路,存放路徑長度等信息。要求能夠答復有關(guān)景點介紹、游覽路徑等問題。根本要求:1、查詢各景點的相關(guān)信息。2、查詢圖中任意兩個景點間的最短路徑。3、查詢圖中任意兩個景點間的所有路徑。4、增加、刪除、更新有關(guān)景點和道路的信息。/*校園導游程序*//*[問題描述]用無向網(wǎng)表示學校的校園景點平面圖,圖中頂點表示主要景點,存放景點的編號、名稱、簡介等信息,圖中的邊表示景點間的道路,存放路徑長度等信息。要求能夠答復有關(guān)景點介紹、游覽路徑等問題。游客通過終端可詢問:〔1〕從某一景點到另一景點的最短路徑。〔2〕游客從公園進入,選取一條最正確路線?!?〕使游客可以不重復地瀏覽各景點,最后回到出口〔出口就在入口旁邊〕。[根本要求]〔1〕將導游圖看作一張帶權(quán)無向圖,頂點表示公園的各個景點,邊表示各景點之間的道路,邊上的權(quán)值表示距離.為此圖選擇適當?shù)臄?shù)據(jù)結(jié)構(gòu)?!?〕把各種路徑都顯示給游客,由游客自己選擇瀏覽路線。〔3〕畫出景點分布圖于屏幕上。[實現(xiàn)提示]〔1〕構(gòu)造一個無向圖G并用鄰接矩陣來存儲?!?〕利用迪杰斯特拉算法來計算出起點到各個頂點之間的最短路徑用二維數(shù)組p[i][]來記錄,最短路徑長度就用一維數(shù)組d[i]存放;i的范圍:0~20?!?〕一維數(shù)組have[]是用來記錄最短路徑出現(xiàn)頂點的順序?!?〕根據(jù)起點和終點輸出最短路徑和路徑長度。*/#defineINFINITY10000/*無窮大*/#defineMAX_VERTEX_NUM40#defineMAX40#include<stdlib.h>#include<stdio.h>#include<conio.h>#include<string.h>typedefstructArCell{intadj;//路徑長度}ArCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedefstruct//圖中頂點表示主要景點,存放景點的編號、名稱、簡介等信息,{charname[30];intnum;charintroduction[100];//簡介}infotype;typedefstruct{infotypevexs[MAX_VERTEX_NUM];AdjMatrixarcs;intvexnum,arcnum;}MGraph;MGraphb;voidcmd(void);MGraphInitGraph(void);voidMenu(void);voidBrowser(MGraph*G);voidShortestPath_DIJ(MGraph*G);voidFloyd(MGraph*G);voidSearch(MGraph*G);intLocateVex(MGraph*G,char*v);MGraph*CreatUDN(MGraph*G);voidprint(MGraph*G);/******************************************************/voidmain(void){system("color1f");system("modecon:cols=140lines=130");cmd();}/******************************************************/voidcmd(void){inti;b=InitGraph();Menu();scanf("%d",&i);while(i!=5){switch(i){case1:system("cls");Browser(&b);Menu();break;case2:system("cls");ShortestPath_DIJ(&b);Menu();break;case3:system("cls");Floyd(&b);Menu();break;case4:system("cls");Search(&b);Menu();break;case5:exit(1);break;default:break;}scanf("%d",&i);}}MGraphInitGraph(void){MGraphG;inti,j;G.vexnum=10;G.arcnum=14;for(i=0;i<G.vexnum;i++)G.vexs[i].num=i;strcpy(G.vexs[0].name,"綜合食堂");strcpy(G.vexs[0].introduction,"新建標準化食堂");strcpy(G.vexs[1].name,"東西辦公樓");strcpy(G.vexs[1].introduction,"全體教師辦公場所,樓高12層,各種設(shè)施齊全");strcpy(G.vexs[2].name,"5號學生宿舍樓");strcpy(G.vexs[2].introduction,"計算機系男生宿舍樓,蘇式建筑");strcpy(G.vexs[3].name,"醫(yī)院");strcpy(G.vexs[3].introduction,"校醫(yī)院,設(shè)施不是很齊全,只能看小病,收費較貴");strcpy(G.vexs[4].name,"圖書館");strcpy(G.vexs[4].introduction,"藏書60萬冊,設(shè)施良好,2樓為電子閱覽室,環(huán)境幽雅");strcpy(G.vexs[5].name,"足球場");strcpy(G.vexs[5].introduction,"現(xiàn)代化塑膠跑道,人造草坪,適宜鍛煉身體的場所");strcpy(G.vexs[6].name,"沁園");strcpy(G.vexs[6].introduction,"綠樹成蔭,適宜休息和讀書");strcpy(G.vexs[7].name,"主教學樓");strcpy(G.vexs[7].introduction,"學院最大的教學樓,共5層,環(huán)形建筑,適宜學習");strcpy(G.vexs[8].name,"西教學樓");strcpy(G.vexs[8].introduction,"學院第二大教學樓,環(huán)境較差");strcpy(G.vexs[9].name,"多媒體樓");strcpy(G.vexs[9].introduction,"多媒體教學場所,設(shè)施先進,環(huán)境良好");for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j].adj=INFINITY;G.arcs[0][1].adj=100;G.arcs[0][2].adj=200;G.arcs[0][6].adj=400;G.arcs[1][7].adj=300;G.arcs[2][3].adj=120;G.arcs[3][6].adj=220;G.arcs[3][4].adj=100;G.arcs[4][5].adj=300;G.arcs[4][9].adj=250;G.arcs[5][9].adj=350;G.arcs[6][7].adj=60;G.arcs[6][9].adj=200;G.arcs[7][8].adj=50;G.arcs[8][9].adj=20;for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[j][i].adj=G.arcs[i][j].adj;returnG;}//InitGraphendvoidMenu(){printf("\n石家莊鐵道學院導游圖\n");printf("┏━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃1.瀏覽校園全景┃\n");printf("┃2.查看所有游覽路線┃\n");printf("┃3.選擇出發(fā)點和目的地┃\n");printf("┃4.查看景點信息┃\n");printf("┃5.退出系統(tǒng)┃\n");printf("┗━━━━━━━━━━━━━━━━━━━━┛\n");printf("Option-:");}voidBrowser(MGraph*G){intv;printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃編號┃景點名稱┃簡介┃\n");for(v=0;v<G->vexnum;v++)printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[v].num,G->vexs[v].name,G->vexs[v].introduction);printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");}//迪杰斯特拉算法來計算出起點到各個頂點之間的最短路徑,v0為起點voidShortestPath_DIJ(MGraph*G){intv,w,i,min,t=0,x,flag=1,v0;intfinal[20],D[20],p[20][20];while(flag){printf("請輸入一個起始景點編號:");scanf("%d",&v0);if(v0<0||v0>G->vexnum){printf("景點編號不存在!請重新輸入景點編號:");scanf("%d",&v0);}if(v0>=0&&v0<G->vexnum)flag=0;}for(v=0;v<G->vexnum;v++){final[v]=0;D[v]=G->arcs[v0][v].adj;for(w=0;w<G->vexnum;w++)p[v][w]=0;if(D[v]<INFINITY){p[v][v0]=1;p[v][v]=1;}}D[v0]=0;final[v0]=1;for(i=1;i<G->vexnum;i++){min=INFINITY;for(w=0;w<G->vexnum;w++)if(!final[w])if(D[w]<min){v=w;min=D[w];}final[v]=1;for(w=0;w<G->vexnum;w++)if(!final[w]&&(min+G->arcs[v][w].adj<D[w])){D[w]=min+G->arcs[v][w].adj;for(x=0;x<G->vexnum;x++)p[w][x]=p[v][x];p[w][w]=1;}}for(v=0;v<G->vexnum;v++){if(v0!=v)printf("%s",G->vexs[v0].name);for(w=0;w<G->vexnum;w++){if(p[v][w]&&w!=v0)printf("-->%s",G->vexs[w].name);t++;}if(t>G->vexnum-1&&v0!=v)printf("總路線長%dm\n\n",D[v]);}}//ShortestPath_DIJendvoidFloyd(MGraph*G){intv,u,i,w,k,j,flag=1,p[10][10][10],D[10][10];for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++){D[v][w]=G->arcs[v][w].adj;for(u=0;u<G->vexnum;u++)p[v][w][u]=0;if(D[v][w]<INFINITY){p[v][w][v]=1;p[v][w][w]=1;}}for(u=0;u<G->vexnum;u++)for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++)if(D[v][u]+D[u][w]<D[v][w]){D[v][w]=D[v][u]+D[u][w];for(i=0;i<G->vexnum;i++)p[v][w][i]=p[v][u][i]||p[u][w][i];}while(flag){printf("請輸入出發(fā)點和目的地的編號:");scanf("%d%d",&k,&j);if(k<0||k>G->vexnum||j<0||j>G->vexnum){printf("景點編號不存在!請重新輸入出發(fā)點和目的地的編號:");scanf("%d%d",&k,&j);}if(k>=0&&k<G->vexnum&&j>=0&&j<G->vexnum)flag=0;}printf("%s",G->vexs[k].name);for(u=0;u<G->vexnum;u++)if(p[k][j][u]&&k!=u&&j!=u)printf("-->%s",G->vexs[u].name);printf("-->%s",G->vexs[j].name);printf("總路線長%dm\n",D[k][j]);}//FloydendvoidSearch(MGraph*G){intk,flag=1;while(flag){printf("請輸入要查詢的景點編號:");scanf("%d",&k);if(k<0||k>G->vexnum){printf("景點編號不存在!請重新輸入景點編號:");scanf("%d",&k);}if(k>=0&&k<G->vexnum)flag=0;}printf("┏━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n");printf("┃編號┃景點名稱┃簡介┃\n");printf("┃%-4d┃%-16s┃%-56s┃\n",G->vexs[k].num,G->vexs[k].name,G->vexs[k].introduction);printf("┗━━┻━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n");}//SearchendintLocateVex(MGraph*G,char*v){intc=-1,i;for(i=0;i<G->vexnum;i++)if(strcmp(v,G->vexs[i].name)==0){c=i;break;}returnc;}MGraph*CreatUDN(MGraph*G)//初始化圖形,接受用戶輸入{inti,j,k,w;charv1[20],v2[20];printf("請輸入圖的頂點數(shù),弧數(shù):");scanf("%d%d",&G->vexnum,&G->arcnum);printf("請輸入景點的編號:、名稱、簡介:\n");for(i=0;i<G->vexnum;i++){printf("景點編號:");scanf("%d",&G->vexs->num);printf("景點名稱:");scanf("%s",G->vexs[i].name);printf("景點簡介:");scanf("%s",G->vexs->introduction);}for(i=0;i<G->vexnum;i++)for(j=0;j<G->vexnum;j++)G->arcs[i][j].adj=INFINITY;printf("請輸入路徑長度:\n");for(k=0;k<G->arcnum;k++){printf("第%d條邊:\n",k+1);printf("景點對(x,y):");scanf("%s",v1);scanf("%s",v2);printf("路徑長度:");scanf("%d",&w);i=LocateVex(G,v1);j=LocateVex(G,v2);if(i>=0&&j>=0){G->arcs[i][j].adj=w;G->arcs[j][i]=G->arcs[i][j];}}returnG;}voidprint(MGraph*G){intv,w,t=0;for(v=0;v<G->vexnum;v++)for(w=0;w<G->vexnum;w++){if(G->arcs[v][w].adj==INFINITY)printf("∞");elseprintf("%-7d",G->arcs[v][w].adj);t++;if(t%G->vexnum==0)printf("\n");}}校園導游咨詢[問題描述]設(shè)計一個校園導游程序,為來訪的客人提供各種信息查詢效勞。[根本要求](1)設(shè)計你的學校的校園平面圖,所含景點不少于10個。以圖中頂點表示校內(nèi)各景點,存放景點名稱、代號、簡介等信息;以邊表示路徑,存放路徑長度等相關(guān)信息。(2)為來訪客人提供圖中任意景點相關(guān)信息的查詢。(3)為來訪客人提供圖中任意景點的問路查詢,即查詢?nèi)我鈨蓚€景點之間的一條最短的簡單路徑。[實現(xiàn)提示]一般情況下,校園的道路是雙向通行的,可設(shè)校園平面圖是一個無向網(wǎng)。頂點和邊均含有相關(guān)信息。一需求分析1從中北大學平面圖中選取10個大家熟悉的景點,抽象成一個無向帶權(quán)圖〔如下圖〕。以圖中頂點表示景點,邊上的權(quán)值表示兩地的距離。2本程序的目的是為用戶提供路徑咨詢和景點查詢。根據(jù)用戶指定的始點和終點輸出相應路徑或者根據(jù)用戶指定的景點輸出景點的信息。南北二、概要設(shè)計1本文采用的數(shù)據(jù)結(jié)構(gòu)*//*包含頭文件*/#include<stdio.h>#include<process.h>/*定義符號常量*/#defineINT_MAX10000#definen10/*定義全局變量*/intcost[n][n];/*邊的值*/intshortest[n][n];/*兩點間的最短距離*/intpath[n][n];/*經(jīng)過的景點*//*自定義函數(shù)原型說明*/voidintroduce();intshortestdistance();voidfloyed();voiddisplay(inti,intj);2個人分工〔1〕景點信息查詢〔2〕兩景點的最短距離〔3〕兩個景點之間的路徑三、詳細設(shè)計voidmain(){/*主函數(shù)*/inti,j;chark;for(i=0;i<=n;i++)for(j=0;j<=n;j++)cost[i][j]=INT_MAX;cost[1][3]=cost[3][1]=2;cost[2][3]=cost[3][2]=1;cost[2][4]=cost[4][2]=2;cost[3][10]=cost[10][3]=4;cost[1][10]=cost[10][1]=4;cost[2][10]=cost[10][2]=4;cost[4][10]=cost[10][4]=4;cost[1][4]=cost[4][1]=5;cost[4][5]=cost[5][4]=3;cost[4][9]=cost[9][4]=4;cost[5][9]=cost[9][5]=8;cost[5][7]=cost[7][5]=4;cost[5][6]=cost[6][5]=2;cost[6][7]=cost[7][6]=1;cost[7][8]=cost[8][7]=3;cost[8][6]=cost[6][8]=4;cost[1][1]=cost[2][2]=cost[3][3]=cost[4][4]=cost[5][5]=0;cost[6][6]=cost[7][7]=cost[8][8]=cost[9][9]=cost[10][10]=0;while(1){printf("----------------歡送使用中北大學導游系統(tǒng)!----------------\n");printf("1.景點信息查詢………請按i(introduc)鍵\n");printf("2.景點最短路徑查詢…請按s(shortestdistance)鍵\n");printf("3.退出系統(tǒng)……………請按e(exit)鍵\n");printf("學校景點列表:\n");printf("1:學校南門");printf("2:學生公寓");printf("3:柏林園");printf("4:餐廳");printf("5:體育館\n");printf("6:圖書館");printf("7:重點實驗室");printf("8:主樓");printf("9:科藝苑");printf("10:國防生公寓\n");printf("請選擇效勞:");scanf("\n%c",&k);switch(k){case'i':printf("進入景點信息查詢:");introduce();break;case's':printf("進入最短路徑查詢:");shortestdistance();break;case'e':exit(0);default:printf("輸入信息錯誤!\n請輸入字母i或s或e.\n");break;}}}/*main*/voidintroduce(){/*景點介紹*/inta;printf("您想查詢哪個景點的詳細信息?請輸入景點編號:");scanf("%d",&a);getchar();printf("\n");switch(a){case1:printf("1:學校南門\n\n學校的正門,前面豎立著一尊彭德華的石像,氣勢宏偉。\n\n");break;case2:printf("2:學生公寓集中的地方。\n\n");break;case3:printf("3:柏林園\n\n晨讀鍛煉得地方。\n\n");break;case4:printf("4:餐廳\n\n學生老師就餐的地方\n\n");break;case5:printf("5:體育館\n\n體育館\n\n學生上體育課及運動的場地,設(shè)有田徑場、足球場、籃球場等。\n\n");break;case6:printf("6:圖書館\n\n學校信息資源中心,內(nèi)設(shè)大量的自習室。\n\n");break;case7:printf("7:重點實驗室\n\n我校的研究科研中心\n\n");break;case8:printf("8:主樓\n\n學校行政辦公的主樓。\n\n");break;case9:printf("9:科藝苑\n\n有咖啡廳和放映室。\n\n\n");break;case10:printf("10:國防生公寓\n\n國防生居住地地方。\n\n");break;default:printf("景點編號輸入錯誤!請輸入1->10的數(shù)字編號!\n\n");break;}}/*introduce*/intshortestdistance(){/*要查找的兩景點的最短距離*/inti,j;printf("請輸入要查詢的兩個景點的編號(1->10的數(shù)字編號并用','間隔):");scanf("%d,%d",&i,&j);if(i>n||i<=0||j>n||j<0){printf("輸入信息錯誤!\n\n");printf("請輸入要查詢的兩個景點的編號(1->10的數(shù)字編號并用','間隔):\n");scanf("%d,%d",&i,&j);}else{floyed();display(i,j);}return1;}/*shortestdistance*/voidfloyed(){/*用floyed算法求兩個景點的最短路徑*/inti,j,k;for(i=1;i<=n;i++)for(j=1;j<=n;j++){shortest[i][j]=cost[i][j];path[i][j]=0;}for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(shortest[i][j]>(shortest[i][k]+shortest[k][j])){/*用path[][]記錄從i到j的最短路徑上點j的前驅(qū)景點的序號*/shortest[i][j]=shortest[i][k]+shortest[k][j];path[i][j]=k;path[j][i]=k;}}/*floyed*/voiddisplay(inti,intj){/*打印兩個景點的路徑及最短距離*/inta,b;a=i;b=j;printf("您要查詢的兩景點間最短路徑是:\n\n");if(shortest[i][j]!=INT_MAX){if(i<j){printf("%d",b);while(path[i][j]!=0){/*把i到j的路徑上所有經(jīng)過的景點按逆序打印出來*/printf("<-%d",path[i][j]);if(i<j)j=path[i][j];elsei=path[j][i];}printf("<-%d",a);printf("\n\n");printf("(%d->%d)最短距離是:%d米\n\n",a,b,shortest[a][b]);}else{printf("%d",a);while(path[i][j]!=0){/*把i到j的路徑上所有經(jīng)過的景點按順序打印出來*/printf("->%d",path[i][j]);if(i<j)j=path[i][j];elsei=path[j][i];}printf("->%d",b);printf("\n\n");printf("(%d->%d)最短距離是:%5d米\n\n",a,b,shortest[a][b]);}}elseprintf("輸入錯誤!不存在此路!\n\n");printf("\n");}/*display*/校園導游咨詢[問題描述]設(shè)計一個校園導游程序,為來訪的客人提供各種信息查詢效勞。[根本要求]〔1〕設(shè)計你所在學校的校園平面圖,所含景點不少于10(*6*)個。以圖中頂點表示校內(nèi)各景點,存放景點名稱、代號、簡介等信息;以邊表示路徑,存放路徑長度等相關(guān)信息?!?〕為來訪客人提供圖中任意景點相關(guān)信息的查詢?!?〕為來訪客人提供圖中任意景點的問路查詢,即查詢?nèi)我鈨蓚€景點之間的一條最短的簡單路徑。************************************************感想:拿到這一題目,我有一種似曾相似的感覺,yeah~跟以前學C語言時做的“學生成績管理系統(tǒng)”類似,程序功能就是多了求最短路徑,用到圖方面的算法。所以我異想天開,認為簡單的把“學生成績管理系統(tǒng)”加以修改,增加一個求最短路徑函數(shù)就大功告成了。結(jié)果寫到最后麻煩就來了:景點結(jié)構(gòu)體信息是可以保存到文件mystud.dat文件了,可邊的信息該怎么表示出來?邊似乎跟景點壓根兒沒聯(lián)系得上。實在沒方法,只好多建一文件me.dat獨立存放邊的信息。通過寫這個程序,給我的教訓是深刻的,也讓我重新認識到程序設(shè)計思路、規(guī)劃的重要性。特發(fā)以下代碼,讓自己和后來者引以為戒?。?!#include<stdio.h>#include<string.h>#include<stdlib.h>#include<ctype.h>#include<conio.h>#defineM10000#defineMaxSize6//設(shè)定校園景點數(shù)#defineM10000//景點結(jié)構(gòu)體structlocation{charname[10];charinformation[100];intvertex;structlocation*link;}stu;intadjacency[MaxSize][MaxSize];FILE*fp,*fp1;//指向文件指針voidinitiate();//輸入函數(shù)voidViews();//瀏覽函數(shù)voidQuit();//退出voidmainenu();//主菜單voidFindShortest();structlocation*search(structlocation*h,intx);//查找函數(shù)structlocation*creat(intn);//創(chuàng)立動態(tài)鏈表voidPrintChain(structlocation*head);//輸出所查找景點的函數(shù)voidmainmenu(){intkey;system("cls");printf("\n");printf("\t︿☆☆迷你校園導游☆☆︿\n");printf("\t\t○----------------------------------○\n");printf("\t\t|1.初始化校園各景點|\n");printf("\t\t|2.瀏覽各個景點的簡介信息|\n");printf("\t\t|3.查找某景點到另一景點的最短路線|\n");printf("\t\t|4.退出導游系統(tǒng)|\n");printf("\t\t○----------------------------------○\n");printf("\t\t請您選擇:");key=getch();switch(key){case'1':initiate();break;case'2':Views();break;case'3':FindShortest();break;case'4':Quit();break;}}/*************************************//*錄入景點及初始化道路信息*//*************************************/voidinitiate(){charch;inti=1;//記錄文件中景點總數(shù)intj,k,s;//s為路線長度if((fp=fopen("D:\\mystud.dat","a+b"))==NULL)//翻開/建立景點文件{printf("can'topenfile\n");exit(1);}if((fp1=fopen("D:\\me.dat","a+b"))==NULL)//翻開/建立道路文件{printf("can'topenfile\n");exit(1);}while(fread(&stu,sizeof(structlocation),1,fp)!=0)//統(tǒng)計文件中景點總數(shù)i++;do{system("cls");//清屏printf("\n");printf("\n");printf("輸入編號為%d的的景點:",i-1);gets();printf("輸入景點簡介信息:");gets(rmation);printf("______________________________\n");printf("確定該景點的編號:");scanf("%d",&stu.vertex);fwrite(&stu,sizeof(structlocation),1,fp);//把輸入的景點數(shù)據(jù)寫入文件中i++;//繼續(xù)統(tǒng)計景點總數(shù)printf("還要輸入新的景點嗎(y/n)?\t");if(i>MaxSize)break;ch=getch();getchar();}while(ch=='y');//選擇是否還輸入數(shù)據(jù)fclose(fp);//關(guān)閉文件//(顯示出輸入的景點信息〕if((fp=fopen("D:\\mystud.dat","rb"))==NULL){printf("can'topenfile\n");exit(1);}system("cls");printf("\t--------------------------------------------------\n");while(fread(&stu,sizeof(structlocation),1,fp)!=0){//將文件中數(shù)據(jù)讀入程序中printf("\t");printf("%d%s",stu.vertex,);if(++i==5)printf("\n");}fclose(fp);//關(guān)閉文件for(j=0;j<MaxSize;j++)for(k=0;k<MaxSize;k++){if(j<k){printf("\n%d到%d的路徑長度:",j,k);scanf("%d",&s);fwrite(&s,sizeof(int),1,fp1);//把輸入的景點數(shù)據(jù)寫入文件中}}fclose(fp1);//關(guān)閉文件getch();system("cls");//清屏反回主菜單mainmenu();}structlocation*creat(intn)//建立動態(tài)鏈表存儲從文件讀入的數(shù)據(jù){structlocation*p,*h,*s;inti;if((fp=fopen("D:\\mystud.dat","rb"))==NULL){printf("can'topenfile\n");exit(1);}if((h=(structlocation*)malloc(sizeof(structlocation)))==NULL){exit(0);}h->name[0]='\0';h->link=NULL;p=h;for(i=0;i<n;i++){if((s=(structlocation*)malloc(sizeof(structlocation)))==NULL){exit(0);}p->link=s;fread(&stu,sizeof(structlocation),1,fp);//從文件讀入程序并賦給鏈表各結(jié)點{strcpy(s->name,);strcpy(s->information,rmation);s->vertex=stu.vertex;s->link=NULL;p=s;}}fclose(fp);return(h);}structlocation*search(structlocation*h,intx)//查找鏈表的函數(shù),其中h指針是鏈表的表頭指針,x指針是要查找的人的姓名{structlocation*p;//當前指針,指向要與所查找的編號比擬的結(jié)點p=h->link;while(p!=NULL){if(p->vertex==x)//把數(shù)據(jù)域里的姓名與所要查找的編號比擬,假設(shè)相同那么返回0,即條件成立returnp;//返回與所要查找結(jié)點的地址elsep=p->link;}printf("failtofindthedata!");mainmenu();returnNULL;}voidPrintChain(structlocation*head)//輸出查找的景點數(shù)據(jù){structlocation*p;p=head;//為了不改變headprintf("\n\n\n");printf("\t\t\t\t");puts(p->name);printf("\t|_______________________________________________|\n");printf("\t|\t簡介:");puts(p->information);printf("\t|_______________________________________________|\n");getch();system("cls");mainmenu();}/******************************//*瀏覽景點信息*//******************************/voidViews(){inti=0;intnumber=0;//記錄單鏈表的節(jié)點數(shù)intNo;if((fp=fopen("D:\\mystud.dat","rb"))==NULL){printf("can'topenfile\n");exit(1);}system("cls");printf("\t--------------------------------------------------\n");while(fread(&stu,sizeof(structlocation),1,fp)!=0){//將文件中數(shù)據(jù)讀入程序中printf("\t");printf("%d%s",stu.vertex,);if(++i==5)printf("\n");}structlocation*head,*searchpoint;//head是表頭指針,searchpoint是保存符合條件的結(jié)點地址的指針if((fp=fopen("D:\\mystud.dat","a+b"))==NULL){printf("can'topenfile\n");exit(1);}while(fread(&stu,sizeof(structlocation),1,fp)!=0)number++;//計算學生總數(shù),求需建鏈表中的節(jié)點數(shù)head=creat(number);printf("\n\n\t請輸入查找景點的編號:");scanf("%d",&No);searchpoint=search(head,No);//調(diào)用查找函數(shù),并把結(jié)果賦給searchpoint指針PrintChain(searchpoint);//輸出結(jié)果}voidQuit()//退出函數(shù){exit(0);}voidFindShortest()//鄰接表格實現(xiàn){intsource,destination,s;intdistance[MaxSize],i,j,k,l,n,m,o,p;boolVisited[MaxSize];intmin,d;intvertex;//頂點//intadjacency[MaxSize][MaxSize];if((fp=fopen("D:\\mystud.dat","rb"))==NULL){printf("can'topenfile\n");exit(1);}if((fp1=fopen("D:\\me.dat","a+b"))==NULL){printf("can'topenfile\n");exit(1);}for(o=0;o<MaxSize;o++)for(p=0;p<MaxSize;p++){if(o==p)adjacency[o][p]=0;if(o<p){fread(&s,sizeof(int),1,fp1);//從文件讀入程序并賦給鏈表各結(jié)點{adjacency[o][p]=s;adjacency[p][o]=s;}}}system("cls");printf("\t--------------------------------------------------\n");while(fread(&stu,sizeof(structlocation),1,fp)!=0){//將文件中數(shù)據(jù)讀入程序中printf("\t");printf("%d%s",stu.vertex,);if(++i==5)printf("\n");}fclose(fp);fclose(fp1);printf("\t\n");printf("\n\t\t請輸入起點編號:");scanf("%d",&source);for(i=0;i<MaxSize;i++)Visited[i]=false;for(i=0;i<MaxSize;i++){distance[i]=adjacency[source][i];}Visited[source]=true;distance[source]=0;for(j=0;j<MaxSize;j++){min=M;printf("\n");for(k=0;k<MaxSize;k++){if(!Visited[k]){if(distance[k]<min){vertex=k;min=distance[k];}}}Visited[vertex]=true;for(n=0;n<MaxSize;n++){if(!Visited[n])if((min+adjacency[vertex][n])<distance[n])distance[n]=min+adjacency[vertex][n];}}//printf("%d",distance[destination]);for(m=0;m<MaxSize;m++)//起點到各景點的最短徑printf("\t\t\t%d->%d=%d\n",source,m,distance[m]);getch();mainmenu();}voidmain(){mainmenu();}課程設(shè)計:校園導游咨詢

1.問題描述

設(shè)計一個校園導游程序,為來訪的客人提供各種信息查詢效勞。

〔1〕設(shè)計你的學校的校園平面圖,所含景點不少于10個。以圖中頂點表示校內(nèi)各景點,存放景點名稱、代號、簡介等信息;以邊表示路徑,存放路徑長度等有關(guān)信息。

〔2〕為來訪客人提供圖中任意景點相關(guān)信息的查詢。

〔3〕為來訪客人提供圖中任意景點的問路查詢,即查詢?nèi)我鈨蓚€景點之間的一條最短的簡單路徑。2.概要設(shè)計整個程序可用幾個功能模塊函數(shù)實現(xiàn)。Main()函數(shù)的主要功能:首先是主函數(shù)里面的開始界面,顯示相關(guān)的操作提示,用戶在知道學校景點的前提下可以直接查詢想要知道的兩景點之間的最短距離,也可以選擇進入主菜單界面和退出該系統(tǒng)。其次就是主菜單界面,它主要顯示學校的景點列表和相應的景點代號。提醒用戶輸入相關(guān)的鍵值,進入相關(guān)的景點,也可以查詢?nèi)我鈨删包c之間的最短距離以及退出功能。接下來就是求最短路徑的算法和打印。該算法采用的floyed算法,3.詳細設(shè)計;Main()函數(shù)模:主要打印開始界面和提示相關(guān)的操作。用窮舉的方法把學校相關(guān)景點之間的路徑和權(quán)值〔距離〕初始化,用cost[][]二維數(shù)組實現(xiàn)。打?。狠斎搿眘”進行查詢最短路徑,輸入“b”進入主菜單頁面,輸入“e”退出程序。switch(k)

{

case'b':star();break;

case's':

printf("theshortestwaysearching:");

shortestdistance();

break;

case'e':

exit(0);

default:printf("Error!\npleasepressborsore.\n");getchar();break;

}Star()函數(shù):主要是顯示一個界面,功能是提供查詢路徑選擇和查看進入景點的主頁面和退出該頁面返回主界面。switch(choose)

{case'0':instruction();getchar();break;

case'1':jingdian();break;

case'2':map();break;

case'9':end();break;

default:star();

}Jingdian()函數(shù):顯示校園的10個景點和代號,提示輸入相應的代號進入該景點的函數(shù)模塊。在這里也可以查詢10個景點中任意兩個之間的最短路徑,也可以選擇退出程序。switch(point)

{

case'1':office();break;

case'2':library();break;

case'3':lake();break;

case'4':classroom();break;

case'5':apartment();break;

case's':shortestdistance();break;

case'0':star();getchar();break;

case'e':exit(0);

default:jingdian();

}Floyed()函數(shù):求兩個景點之間的最短距離。for(i=1;i<=n;i++)for(j=1;j<=n;j++){shortest[j]=cost[j];path[j]=0;}for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)if(shortest[j]>(shortest[k]+shortest[k][j])){/*用path[][]記錄從i到j的最短路徑上點j的前驅(qū)景點的序號*/shortest[j]=shortest[k]+shortest[k][j];path[j]=k;path[j]=k;display(inti,intj)函數(shù):打印兩個景點之間的最短路徑。if(shortest[j]!=INT_MAX){if(i<j){printf("%d",b);while(path[j]!=0){/*把i到j的路徑上所有經(jīng)過的景點按逆序打印出來*/printf("<-%d",path[j]);if(i<j)j=path[j];elsei=path[j];}printf("<-%d",a);printf("\n\n");printf("(%d->%d)thedistanceis:%dm\n\n",a,b,shortest[a]);}else{printf("%d",a);while(path[j]!=0){/*把i到j的路徑上所有經(jīng)過的景點按順序打印出來*/printf("->%d",path[j]);if(i<j)j=path[j];elsei=path[j];}printf("->%d",b);printf("\n\n");printf("(%d->%d)theshortestdistanceis:%5dm\n\n",a,b,shortest[a]);}其余幾個函數(shù)是學校景點的相應介紹。調(diào)用后都可以回到jingdian()函數(shù)的主界面。End()函數(shù)是一個結(jié)束函數(shù),打印結(jié)束語,執(zhí)行退出命令。voidend()

{charr;

clrscr();

printf("THANKYOUANDYOURWELCOMEAGAIN\n");

printf("PLEASEINPUTANYKEYEXIT!\n");

getchar();

scanf("%c",&r);

exit(0);

}4.調(diào)試過程。整個程序是采用填充模塊函數(shù)的方法完成的。一開始是把界面和主要功能函數(shù)都用空函數(shù)都寫出來,最后采用具體化的方法完成?!?〕一開始是兩景點之間的最短路徑的算法和圖的建立問題,所用的變量和參數(shù)沒能協(xié)同起來。就換成用數(shù)組來表示了?!?〕在調(diào)試的過程中遇到語句聲明的錯誤,原因是出現(xiàn)大小寫的不一致?!?〕程序中的換行符’\n’和getchar()函數(shù)的用法,一個換行得用一個getchar();來吃掉一個回車。在jingdian()函數(shù)的調(diào)用中執(zhí)行到調(diào)用各個具體的景點的函數(shù)的打印輸出時就無法顯示。在加上一個getchar();后即可顯示相應景點的信息了?!?〕熟悉用單步調(diào)試的方法調(diào)試程序。在上面的調(diào)試錯誤中就是用單步調(diào)試的方法發(fā)現(xiàn)錯誤的。5.結(jié)論與體會。經(jīng)過兩個周的時間,整個程序已根本實現(xiàn)要求的功能。即可以為用戶提供查詢最短路徑、查看相關(guān)景點的信息。大體上完成這次課程設(shè)計的目的。但總體上還是覺得不夠滿意,因為其中要用到的圖和文件的使用都沒在這個程序中用好/還需要進一步的學習和練習鍛煉。體會:初次感覺編程的過程中也挺有樂趣,但是在和同學討論的過程中發(fā)現(xiàn)根底知識還是不扎實,需要進行加工和練習。對編程也還是充滿自信的,我能想到的我就能這個工具把它實現(xiàn),借助別人的東西也行。有些東西只要你想得到,你就可以讓計算機為你做得漂亮和完美。通過這次的學習鍛煉,進一步對用C語言編程更熟悉了。也比擬順手了,發(fā)現(xiàn)編程不怕做不到,只怕想不到/還對以前學到的知識進一步穩(wěn)固和加深了理解。最短路徑的應用——校園導游2008-06-2701:52今天晚上,還是,花了點時間,把最后這份課設(shè)給搞定了。還是蠻有感慨的,終于完了。四個程序,四天完成,每天一個。只可惜自己做的太晚了,現(xiàn)在才做完。不過還好,至少每個程序都是我自己一行一行親自打上去,每個程序的思想都是自己認真體會過的。一路過來,雖然每次都有坎坷,但我沒有逃避,勇敢的去面對他,最終還是我取得了勝利!所以才有每晚的發(fā)表一篇文章。不多說,說下這次最短路徑吧。

本程序是用的迪杰斯特拉算法求的最短路徑,構(gòu)造兩個數(shù)組,一個bool型的二維數(shù)組用于記錄最短路徑,一個int型的一維數(shù)組用于記錄最短路徑的值。開始自己碰到的問題是對二維數(shù)組理解不好,后經(jīng)過認真思索,朋友提醒,最終突然頓悟,知道了怎么回事,一氣呵成,完成了算法。

程序中其他的一些功能,不說了,很根本,說多了浪費時間。

具體程序如下:stdafx.h頭文件://stdafx.h:標準系統(tǒng)包含文件的包含文件,

//或是經(jīng)常使用但不常更改的

//特定于工程的包含文件

//#pragmaonce

#defineWIN32_LEAN_AND_MEAN

//從Windows頭中排除極少使用的資料

#include<stdio.h>

#inclu

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論