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