《数据结构课设》弗洛伊德算法设计校园导游系统
大二上學期的數(shù)據(jù)結(jié)構(gòu)課設(shè)分享一下,具體題目如下:
題目27:“校園導游系統(tǒng)”的設(shè)計與實現(xiàn)
1.問題描述
設(shè)計一個校園導游系統(tǒng),為來訪的客人提供信息查詢服務(wù)。
2.基本要求
(1)從學校園中選取10個景點
(2)分別對這10個景點特征進行說明
(3)以這10個景點作為10個頂點建立無向圖
(4)對各個路徑長度進行賦值
(5)根據(jù)建立的無向圖創(chuàng)建一個領(lǐng)邊矩陣
(6)利用弗洛伊德算法實現(xiàn)兩個景點間最短路徑的求解
3.測試數(shù)據(jù)
由讀者根據(jù)實際情況指定。
【實現(xiàn)提示】
一般情況下,校園的道路是雙向通行的,可設(shè)校園平面圖是一個無向網(wǎng)。頂點和邊均含有相關(guān)信息。
目錄
- 一.課程設(shè)計目的
- 二.課程設(shè)計內(nèi)容和要求
- 三.任務(wù)完成情況
- 四.設(shè)計報告
- 4.1需求分析
- 4.1.1用戶需求
- 4.2概要設(shè)計
- 4.2.1總體設(shè)計
- 4.2.2各功能函數(shù)的設(shè)計
- 4.3詳細設(shè)計
- 4.3.1 程序流程圖
- 4.4詳細代碼
- 4.4.1結(jié)構(gòu)體定義
- 4.4.2 主函數(shù)
- 4.4.3移動光標函數(shù)
- 4.4.4初始化函數(shù)
- 4.4.5顯示菜單函數(shù)
- 4.4.6顯示地圖函數(shù)
- 4.4.7顯示景點信息函數(shù)
- 4.4.8弗洛伊德算法求最短路徑函數(shù)
- 4.4.9導航位置信息函數(shù)
- 4.5使用說明
- 4.6測試結(jié)果與分析
- 4.7參考文獻
- 5.體會與感想
- 附錄
一.課程設(shè)計目的
1.數(shù)據(jù)結(jié)構(gòu)課程設(shè)計是綜合運用數(shù)據(jù)結(jié)構(gòu)課程中學到的幾種典型數(shù)據(jù)結(jié)構(gòu),以及程序設(shè)計語言(C語言),自行實現(xiàn)一個較為完整的使用系統(tǒng)。
2.通過課程設(shè)計,自己通過系統(tǒng)分析、系統(tǒng)設(shè)計、編程調(diào)試,寫實驗報告等環(huán)節(jié),進一步掌握使用系統(tǒng)設(shè)計的方法和步驟,靈活運用并深刻理解典型數(shù)據(jù)結(jié)構(gòu)在軟件開發(fā)中的使用。
3.學會將知識使用于實際的方法,提高分析和解決問題的能力,增加綜合能力。(1)熟練掌握弗洛伊德算法;(2)熟練掌握鄰接矩陣的建立過程和常用操作;(3)學會自己調(diào)試程序的方法并掌握一定的技巧。
二.課程設(shè)計內(nèi)容和要求
題目27:“校園導游系統(tǒng)”的設(shè)計與實現(xiàn)
- 問題描述 設(shè)計一個校園導游系統(tǒng),為來訪的客人提供信息查詢服務(wù)。
- 基本要求
(1)從學校園中選取10個景點
(2)分別對這10個景點特征進行說明
(3)以這10個景點作為10個頂點建立無向圖
(4)對各個路徑長度進行賦值
(5)根據(jù)建立的無向圖創(chuàng)建一個領(lǐng)邊矩陣
(6)利用弗洛伊德算法實現(xiàn)兩個景點間最短路徑的求解
3.測試數(shù)據(jù) 由讀者根據(jù)實際情況指定。 【實現(xiàn)提示】 一般情況下,校園的道路是雙向通行的,可設(shè)校園平面圖是一個無向網(wǎng)。頂點和邊均含有相關(guān)信息。
三.任務(wù)完成情況
1.選取校園的十個標志性的地點作為本次介紹的對象,通過讀取文本文件來提取出景點名稱和兩兩之間的距離。
2.介紹景點的特征。
3.創(chuàng)建鄰接矩陣實現(xiàn)兩點之間距離的記錄。
4.通過弗洛伊德算法求最短路徑。
四.設(shè)計報告
4.1需求分析
4.1.1用戶需求
(1)界面簡介,排列清晰,可以一目了然的看懂每一項功能。
(2)運行速度快,沒有卡頓,使用方便。
(3)功能齊全,具備查詢每一種景點的信息的功能,可以計算出任意兩個景點的最短路徑
4.2概要設(shè)計
4.2.1總體設(shè)計
10個景點對應(yīng)的關(guān)系如圖4.1:
4.2.2各功能函數(shù)的設(shè)計
(1) 歡迎界面,顯示菜單
(2) 退出功能。
(3) 顯示地圖。
(4) 景點信息查詢。
(5) 導航。
4.3詳細設(shè)計
4.3.1 程序流程圖
4.4詳細代碼
4.4.1結(jié)構(gòu)體定義
該系統(tǒng)包含的庫函數(shù)具體有:
#include <iostream> #include <fstream> #include <windows.h>該系統(tǒng)創(chuàng)建的結(jié)構(gòu)體有:
struct Graphd {string vexs[MVNum]; /*頂點表*/int a[MVNum][MVNum]; /*鄰接矩陣*/int vexnum; /*頂點數(shù)*/int arcnum; /*邊數(shù)*/ } G;4.4.2 主函數(shù)
int main() {system("title 校園導游程序設(shè)計"); /*設(shè)置標題*/init();menu();char c;while((c=getchar())!='0'){system("cls");switch(c-'0'){case 1:map();break;case 2:information();break;case 3:daohang();break;}getchar();menu();}return 0; }4.4.3移動光標函數(shù)
void gotoxy(int y, int x)/*將光標移動到坐標為(x,y)的地方*/ {CONSOLE_SCREEN_BUFFER_INFO csbiInfo;HANDLE hConsoleOut;hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo);csbiInfo.dwCursorPosition.X = x;csbiInfo.dwCursorPosition.Y = y;SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition); }4.4.4初始化函數(shù)
void init()//讀取txt文件數(shù)據(jù)并存入結(jié)構(gòu)體中 {FILE *fp;ifstream in("1.txt");for(int i = 0; i<10; i++)//把文件中的10個景點復(fù)制到對應(yīng)的圖中{in >> G.vexs[i];}G.vexnum = 10; /*頂點數(shù)*/G.arcnum = 22; /*邊數(shù)*/fp = fopen("weight.txt", "r"); /*打開權(quán)值文件*/for (int i = 0; i < G.vexnum; i++)for (int j = 0; j < G.vexnum; j++){fscanf(fp, "%d", &G.a[i][j]); /*從文件讀入權(quán)值*/if (!G.a[i][j]&&i!=j)G.a[i][j] = MaxInt; /*沒邊的設(shè)置為最大值*/}fclose(fp); /*關(guān)閉文件*/ }4.4.5顯示菜單函數(shù)
void menu() {system("cls");gotoxy(10,40);cout<<"歡迎來到南昌航空大學科技學院!";gotoxy(11,40);cout<<"0.退出";gotoxy(12,40);cout<<"1.顯示地圖";gotoxy(13,40);cout<<"2.景點信息查詢";gotoxy(14,40);cout<<"3.導航"<<endl;gotoxy(20,1); }4.4.6顯示地圖函數(shù)
void map() {int y=3,x=20;for(int i=0; i<80; ++i){gotoxy(y,x+i);if(i==40){cout<<"北門";gotoxy(y+40,x+i);cout<<"南門";i+=2;continue;}cout<<"*";gotoxy(y+40,x+i);cout<<"*";}for(int i=0; i<40; ++i){gotoxy(y+i,x);if(i==20){cout<<"西";++i;gotoxy(y+i,x);cout<<"門";gotoxy(y+i-1,x+80);cout<<"東";gotoxy(y+i,x+80);cout<<"門";continue;}cout<<"*";gotoxy(y+i,x+80);cout<<"*";}for(int i=30; i<40; ++i){gotoxy(y+2,x+i);cout<<"*";gotoxy(y+10,x+i);cout<<"*";gotoxy(y+20,x+i);cout<<"*";gotoxy(y+30,x+i);cout<<"*";}for(int i=2; i<10; ++i){gotoxy(y+i,x+30);cout<<"*";gotoxy(y+i,x+40);cout<<"*";if(i<5){gotoxy(y+i,x+50);cout<<"*";}else{gotoxy(y+i,x+60);cout<<"*";}}for(int i=20; i<30; ++i){gotoxy(y+i,x+30);cout<<"*";gotoxy(y+i,x+40);cout<<"*";if(i<25){gotoxy(y+i,x+50);cout<<"*";}else{gotoxy(y+i,x+60);cout<<"*";}}gotoxy(0,0);system("pause"); }4.4.7顯示景點信息函數(shù)
void information() {int t;while(1){system("cls");gotoxy(10,40);cout<<"請選擇查詢的地點";gotoxy(11,40);cout<<"1.教學主樓";gotoxy(12,40);cout<<"2.綜合實驗樓";gotoxy(13,40);cout<<"3.實訓樓";gotoxy(14,40);cout<<"4.體育館";gotoxy(15,40);cout<<"5.1-14棟學生宿舍";gotoxy(16,40);cout<<"6.圖書館";gotoxy(17,40);cout<<"7.禮堂";gotoxy(18,40);cout<<"8.食堂";gotoxy(19,40);cout<<"9.15-17棟學生宿舍";gotoxy(20,40);cout<<"10.第二教學樓";gotoxy(21,40);cout<<"0.退出";gotoxy(30,1);cin>>t;system("cls");gotoxy(10,40);switch(t){case 0:return;case 1:cout<<"學生日常上課的教學樓"<<endl;break;case 2:cout<<"硬件和實驗為主的實驗樓"<<endl;break;case 3:cout<<"中航未來訓練基地,體育室,科技創(chuàng)新小組"<<endl;break;case 4:cout<<"一樓有籃球舞蹈乒乓球羽毛球室,二樓有鋼琴和各種琴類"<<endl;break;case 5:cout<<"大一到大四的不同專業(yè)的宿舍樓集合"<<endl;break;case 6:cout<<"圖書室閱讀室和自習室"<<endl;break;case 7:cout<<"舉行大型講座會議的會場"<<endl;break;case 8:cout<<"學生和老師用餐的地點"<<endl;break;case 9:cout<<"經(jīng)管等專業(yè)的宿舍"<<endl;break;case 10:cout<<"輔導員辦公室和輔助教學樓"<<endl;break;}system("pause");} }4.4.8弗洛伊德算法求最短路徑函數(shù)
void floyd() {int i, j, k;for (i = 0; i < G.vexnum; i++)for (j = 0; j < G.vexnum; j++){D[i][j] = G.a[i][j];if (D[i][j] > 0)//出發(fā)地到目的地的距離大于0說明可以走Path[i][j] = i;elsePath[i][j] = -1;}for (k = 0; k < G.vexnum; k++)for (i = 0; i < G.vexnum; i++)for (j = 0; j < G.vexnum; j++){if (D[i][j]>D[i][k] + D[k][j])//如果兩地之間的路途大于間接的路途則換成間接的路途{D[i][j] = D[i][k] + D[k][j];Path[i][j] = Path[k][j];}} }4.4.9導航位置信息函數(shù)
void daohang() {int x,y;cout<<"請輸入需要查詢的地點:"<<endl;cin>>x;cout<<"請輸入下一個地點:"<<endl;cin>>y;floyd();gotoxy(10,40);cout<<G.vexs[--x]<<"到"<<G.vexs[--y]<<"的路程為"<<D[x][y]<<"米"<<endl;system("pause"); }4.5使用說明
程序比較簡單易懂,對不懂變成的用戶比較友好,只需根據(jù)自己想要選擇的功能進行選擇就行。
4.6測試結(jié)果與分析
主界面如圖4-3
地圖如圖4-4
導航信息如圖4-6
4.7參考文獻
[1] 嚴蔚敏、吳偉民,數(shù)據(jù)結(jié)構(gòu):C語言版.清華大學出版社,1997.4
[2] 程杰,大話數(shù)據(jù)結(jié)構(gòu).清華大學出版社,2011.6
[3] 譚浩強,C語言程序設(shè)計.清華大學出版社,2010.6
5.體會與感想
學習的意義在于自己探索,自己總結(jié)經(jīng)驗,設(shè)計途中會遇到許許多多的問題,通過不斷的調(diào)試排查錯誤,才能進步,相信自己的能力還有對專業(yè)的執(zhí)著與熱愛,經(jīng)過不斷的學習成長,終將變成對這個社會有用的人。
附錄
1.txt (存入選取的十個景點)
教學主樓 綜合實驗樓 實訓樓 體育館 1-14棟學生宿舍 圖書館 禮堂 食堂 15-17棟學生宿舍 第二教學樓weight.txt (存入鄰接矩陣)
0 80 95 0 0 100 0 120 0 90 80 0 50 0 0 0 0 0 0 0 95 50 0 60 0 0 0 0 0 0 0 0 60 0 90 80 85 100 0 0 0 0 0 90 0 175 170 130 0 0 100 0 0 80 175 0 30 60 0 70 0 0 0 85 170 30 0 55 0 75 120 0 0 100 130 60 55 0 30 50 0 0 0 0 0 0 0 30 0 55 90 0 0 0 0 70 75 50 55 0源代碼
#include <iostream> #include <fstream> #include <windows.h> #define MVNum 10 //頂點數(shù) #define MaxInt 32767 //最大值 using namespace std;struct Graphd {string vexs[MVNum]; /*頂點表*/int a[MVNum][MVNum]; /*鄰接矩陣*/int vexnum; /*頂點數(shù)*/int arcnum; /*邊數(shù)*/ } G; void gotoxy(int x,int y); int Path[MVNum][MVNum]; int D[MVNum][MVNum]; void init(); void menu(); void map(); void information(); void floyd(); void daohang();int main() {system("title 校園導游程序設(shè)計"); /*設(shè)置標題*/init();menu();char c;while((c=getchar())!='0'){system("cls");switch(c-'0'){case 1:map();break;case 2:information();break;case 3:daohang();break;}getchar();menu();}return 0; }void gotoxy(int y, int x)/*將光標移動到坐標為(x,y)的地方*/ {CONSOLE_SCREEN_BUFFER_INFO csbiInfo;HANDLE hConsoleOut;hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);GetConsoleScreenBufferInfo(hConsoleOut, &csbiInfo);csbiInfo.dwCursorPosition.X = x;csbiInfo.dwCursorPosition.Y = y;SetConsoleCursorPosition(hConsoleOut, csbiInfo.dwCursorPosition); }void init()//讀取txt文件數(shù)據(jù)并存入結(jié)構(gòu)體中 {FILE *fp;ifstream in("1.txt");for(int i = 0; i<10; i++)//把文件中的10個景點復(fù)制到對應(yīng)的圖中{in >> G.vexs[i];}G.vexnum = 10; /*頂點數(shù)*/G.arcnum = 22; /*邊數(shù)*/fp = fopen("weight.txt", "r"); /*打開權(quán)值文件*/for (int i = 0; i < G.vexnum; i++)for (int j = 0; j < G.vexnum; j++){fscanf(fp, "%d", &G.a[i][j]); /*從文件讀入權(quán)值*/if (!G.a[i][j]&&i!=j)G.a[i][j] = MaxInt; /*沒邊的設(shè)置為最大值*/}fclose(fp); /*關(guān)閉文件*/ }void menu() {system("cls");gotoxy(10,40);cout<<"歡迎來到南昌航空大學科技學院!";gotoxy(11,40);cout<<"0.退出";gotoxy(12,40);cout<<"1.顯示地圖";gotoxy(13,40);cout<<"2.景點信息查詢";gotoxy(14,40);cout<<"3.導航"<<endl;gotoxy(20,1); }void map() {int y=3,x=20;for(int i=0; i<80; ++i){gotoxy(y,x+i);if(i==40){cout<<"北門";gotoxy(y+40,x+i);cout<<"南門";i+=2;continue;}cout<<"*";gotoxy(y+40,x+i);cout<<"*";}for(int i=0; i<40; ++i){gotoxy(y+i,x);if(i==20){cout<<"西";++i;gotoxy(y+i,x);cout<<"門";gotoxy(y+i-1,x+80);cout<<"東";gotoxy(y+i,x+80);cout<<"門";continue;}cout<<"*";gotoxy(y+i,x+80);cout<<"*";}for(int i=30; i<40; ++i){gotoxy(y+2,x+i);cout<<"*";gotoxy(y+10,x+i);cout<<"*";gotoxy(y+20,x+i);cout<<"*";gotoxy(y+30,x+i);cout<<"*";}for(int i=2; i<10; ++i){gotoxy(y+i,x+30);cout<<"*";gotoxy(y+i,x+40);cout<<"*";if(i<5){gotoxy(y+i,x+50);cout<<"*";}else{gotoxy(y+i,x+60);cout<<"*";}}for(int i=20; i<30; ++i){gotoxy(y+i,x+30);cout<<"*";gotoxy(y+i,x+40);cout<<"*";if(i<25){gotoxy(y+i,x+50);cout<<"*";}else{gotoxy(y+i,x+60);cout<<"*";}}gotoxy(0,0);system("pause"); }void information() {int t;while(1){system("cls");gotoxy(10,40);cout<<"請選擇查詢的地點";gotoxy(11,40);cout<<"1.教學主樓";gotoxy(12,40);cout<<"2.綜合實驗樓";gotoxy(13,40);cout<<"3.實訓樓";gotoxy(14,40);cout<<"4.體育館";gotoxy(15,40);cout<<"5.1-14棟學生宿舍";gotoxy(16,40);cout<<"6.圖書館";gotoxy(17,40);cout<<"7.禮堂";gotoxy(18,40);cout<<"8.食堂";gotoxy(19,40);cout<<"9.15-17棟學生宿舍";gotoxy(20,40);cout<<"10.第二教學樓";gotoxy(21,40);cout<<"0.退出";gotoxy(30,1);cin>>t;system("cls");gotoxy(10,40);switch(t){case 0:return;case 1:cout<<"學生日常上課的教學樓"<<endl;break;case 2:cout<<"硬件和實驗為主的實驗樓"<<endl;break;case 3:cout<<"中航未來訓練基地,體育室,科技創(chuàng)新小組"<<endl;break;case 4:cout<<"一樓有籃球舞蹈乒乓球羽毛球室,二樓有鋼琴和各種琴類"<<endl;break;case 5:cout<<"大一到大四的不同專業(yè)的宿舍樓集合"<<endl;break;case 6:cout<<"圖書室閱讀室和自習室"<<endl;break;case 7:cout<<"舉行大型講座會議的會場"<<endl;break;case 8:cout<<"學生和老師用餐的地點"<<endl;break;case 9:cout<<"經(jīng)管等專業(yè)的宿舍"<<endl;break;case 10:cout<<"輔導員辦公室和輔助教學樓"<<endl;break;}system("pause");} }void floyd() {int i, j, k;for (i = 0; i < G.vexnum; i++)for (j = 0; j < G.vexnum; j++){D[i][j] = G.a[i][j];if (D[i][j] > 0)//出發(fā)地到目的地的距離大于0說明可以走Path[i][j] = i;elsePath[i][j] = -1;}for (k = 0; k < G.vexnum; k++)for (i = 0; i < G.vexnum; i++)for (j = 0; j < G.vexnum; j++){if (D[i][j]>D[i][k] + D[k][j])//如果兩地之間的路途大于間接的路途則換成間接的路途{D[i][j] = D[i][k] + D[k][j];Path[i][j] = Path[k][j];}} }void daohang() {int x,y;cout<<"請輸入需要查詢的地點:"<<endl;cin>>x;cout<<"請輸入下一個地點:"<<endl;cin>>y;floyd();gotoxy(10,40);cout<<G.vexs[--x]<<"到"<<G.vexs[--y]<<"的路程為"<<D[x][y]<<"米"<<endl;system("pause"); }總結(jié)
以上是生活随笔為你收集整理的《数据结构课设》弗洛伊德算法设计校园导游系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OKR 示例——按行业和团队划分的目标和
- 下一篇: 计算机科学与技术 什么学士,计算机科学与