校园导游系统(源码)
生活随笔
收集整理的這篇文章主要介紹了
校园导游系统(源码)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
校園導游系統(源碼)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<windows.h> #define MAXVEX 30 #define INFINITY 32767typedef struct {int num; //地點權值char name[30]; //建筑名char build_describe[300]; //描述建筑 }Vextype;typedef struct {int arcs[MAXVEX][MAXVEX];Vextype vex[MAXVEX];int vexnum;int arcnum; }MGraph;int Index(MGraph *G, char name[]) //索引 {int i;for (i = 0; i < G->vexnum; i++){if (!strcmp(name, G->vex[i].name))return i;}return -1; }//鄰接矩陣創建無向圖 void Creat(MGraph *G) {FILE *fp;int i = 0,j = 0,k,m,index1,index2,weight;char name1[30], name2[30];fp=fopen("文件點.txt", "rt"); //文件中讀取結點if (fp == NULL){printf("文件為空,或者文件遭破壞,請呼叫工作人員。按任意退出...");getchar();exit(1);}while (fscanf(fp, "%s %s", G->vex[i].name,G->vex[i].build_describe) != EOF){G->vex[i].num = i;i++;}fclose(fp);G->vexnum = i;for (m = 0; m < G->vexnum; m++) //初始化鄰接矩陣for (k = 0; k < G->vexnum; k++)G->arcs[m][k] = INFINITY;fp = fopen("文件邊.txt", "rt"); //文件中讀取邊if (fp == NULL){printf("文件為空,或者文件遭破壞,請呼叫工作人員。按任意退出...");getchar();exit(1);}while (fscanf(fp, "%s %s %d", name1,name2,&weight) != EOF){index1 = Index(G, name1);index2 = Index(G, name2);G->arcs[index1][index2] = weight;G->arcs[index2][index1] = weight;j++;} fclose(fp);G->arcnum = j; }void Display(MGraph *G) //顯示圖信息 {int i, j;printf("校園各個路徑的情況為:\n");for (i = 0; i < G->vexnum; i++)for (j = 0; j < i; j++){if (G->arcs[i][j] != INFINITY)printf("%s<------>%s:%10dm\n", G->vex[i].name, G->vex[j].name, G->arcs[i][j]);} }void Search(MGraph *G) //搜索建筑 {system("cls");char name[20];int num, i, j;printf("輸入要查詢地點:");scanf("%s", name);num = Index(G, name);printf("%s 簡介:%s\n", name, G->vex[num].build_describe);for(i=0;i<G->vexnum;i++)if (i == num){for (j = 0; j < G->vexnum; j++){if (G->arcs[i][j] != INFINITY){printf("%s<------>%s:%10dm\n", G->vex[num].name, G->vex[j].name, G->arcs[i][j]);}}} } //Dijkstra算法求從起點到終點的最短路徑 void Dijkstra(MGraph *G, int start, int end, int dist[], int path[][MAXVEX]) {//dist記錄各條最短路徑長度,path數組記錄對應路徑上的各頂點int mindist, i, j, k, t = 1;for (i = 0; i < G->vexnum; i++) //初始化{dist[i] = G->arcs[start][i];if (G->arcs[start][i] != INFINITY)path[i][1] = start;}path[start][0] = 1;for (i = 1; i < G->vexnum; i++){mindist = INFINITY;for(j=0;j<G->vexnum;j++) //選擇最小權值路徑if (!path[j][0] && dist[j] < mindist){k = j;mindist = dist[j];}if (mindist == INFINITY)return;path[k][0] = 1;for (j = 0; j < G->vexnum; j++) //修改路線{if (!path[j][0] && G->arcs[k][j] < INFINITY&&dist[k] + G->arcs[k][j] < dist[j]){dist[j] = dist[k] + G->arcs[k][j];t = 1;while (path[j][t] != 0) //記錄新的最短路徑{path[j][t] = path[k][t];t++;}path[j][t] = k;path[j][t + 1] = 0;}}}for (i = 0; i < G->vexnum; i++)if (i == end)break;printf("從%s<------>%s的最短路線為:從%s", G->vex[start].name, G->vex[end].name, G->vex[start].name);for (j = 2; path[i][j] != 0; j++)printf("->%s", G->vex[path[i][j]].name);printf("->%s , 距離為: %dm\n", G->vex[end].name, dist[i]); }void Shortlink(MGraph *G) //尋找最短路線 {system("cls");char name[20];int start, end;int dist[MAXVEX], path[MAXVEX][MAXVEX] = { 0 };printf("請輸入起點建筑:");scanf("%s", name);start = Index(G, name);printf("請輸入終點建筑:");scanf("%s", name);end = Index(G, name);Dijkstra(G, start, end, dist, path); }void Prim(MGraph *G, int start) //prim算法求最小生成樹 {struct{int adjvex;int lowcost;}closedge[MAXVEX];int i, e, k, m, min;closedge[start].lowcost = 0;for(i=0;i<G->vexnum;i++)if (i!=start){closedge[i].adjvex = start;closedge[i].lowcost = G->arcs[start][i];}for (e = 0; e < G->vexnum - 1; e++){//選擇最小權值的邊min = INFINITY;for (k = 0; k < G->vexnum; k++){if (closedge[k].lowcost != 0 && closedge[k].lowcost < min){m = k;min = closedge[k].lowcost;}}printf("從%s<------>%s:%dm\n", G->vex[closedge[m].adjvex].name, G->vex[m].name, closedge[m].lowcost);closedge[m].lowcost = 0;//當m加入后,更新closedge數組信息for (i = 0; i < G->vexnum; i++){if (i != m && G->arcs[m][i] < closedge[i].lowcost){closedge[i].lowcost = G->arcs[m][i];closedge[i].adjvex = m;}}} }void Shortestconnect(MGraph *G)//求某個地點的最短聯通路徑 {system("cls");char name[20];int start;printf("請輸入起點建筑:");scanf("%s", name);start = Index(G, name);Prim(G, start); }void Add_vex(MGraph *MG) //添加新結點 {system("cls");FILE *fp;char name[20], describe[300];printf("請輸入需要添加的地點:");scanf("%s", name);printf("請輸入該地點的描述:");scanf("%s", describe);fp = fopen("文件點.txt", "at");if (fp == NULL){printf("文件為空,或者文件遭破壞,請呼叫工作人員。按任意退出...");getchar();exit(1);}fprintf(fp, "%s %s\n", name,describe);printf("添加成功!");fclose(fp);Creat(MG); //更新文件內容,重新創建鄰接矩陣 }void Add_arcs(MGraph *MG) //添加新邊 {system("cls");FILE *fp;int weight,flag1=0,flag2=0,i;char start[20], end[20];printf("請輸入起始地點:");scanf("%s", start);printf("請輸入終止地點:");scanf("%s", end);printf("請輸入地點之間的距離(單位m):");scanf("%d", &weight);for (i = 0; i < MG->vexnum; i++){if (strcmp(start, MG->vex[i].name) == 0)flag1 = 1;if (strcmp(end, MG->vex[i].name) == 0)flag2 = 1;}if(flag1!=1&&flag2!=1){printf("未找到與之匹配的地點!創建路徑失敗...");return;}fp = fopen("文件邊.txt", "at");if (fp == NULL){printf("文件為空,或者文件遭破壞,請呼叫工作人員。按任意退出...");getchar();exit(1);}fprintf(fp, "%s %s %d\n", start, end, weight);printf("添加成功!");fclose(fp);Creat(MG); //更新文件內容,重新創建鄰接矩陣 }void Write_vex(MGraph *G) {FILE *fp;int i, j,flag;fp = fopen("文件點.txt", "wt");if (fp == NULL){printf("文件為空,或者文件遭破壞,請呼叫工作人員。按任意退出...");getchar();exit(1);}for (i = 0; i < G->vexnum; i++){flag = 0;for (j = 0; j < G->vexnum; j++){if (G->arcs[i][j] < INFINITY)flag = 1;}if(flag==1)fprintf(fp, "%s %s\n", G->vex[i].name,G->vex[i].build_describe);}fclose(fp); }void Write_arse(MGraph *G) {FILE *fp;int i, j;fp = fopen("文件邊.txt", "wt");if (fp == NULL){printf("文件為空,或者文件遭破壞,請呼叫工作人員。按任意退出...");getchar();exit(1);}for (i = 0; i < G->vexnum; i++)for (j = 0; j <= i; j++){if (G->arcs[i][j] < INFINITY){fprintf(fp, "%s %s %d\n", G->vex[i].name, G->vex[j].name, G->arcs[i][j]);}}fclose(fp); }void Del_arcs(MGraph *G) {system("cls");char name[20];int start, end;printf("請輸入刪除的起點名:");scanf("%s", name);start = Index(G, name);printf("請輸入刪除的終點名:");scanf("%s", name);end = Index(G, name);G->arcs[start][end] = INFINITY;G->arcs[end][start] = INFINITY;Write_arse(G);Write_vex(G);printf("刪除成功!"); }void Del_vex(MGraph *G) {system("cls");char name[20];int num,i;printf("輸入你要刪除的地點:");scanf("%s", name);num = Index(G, name);for (i = 0; i < G->vexnum; i++){G->arcs[num][i] = INFINITY;G->arcs[i][num] = INFINITY;}Write_arse(G);Write_vex(G);printf("刪除成功!"); }void Inputpasswd(char passwd[], int min, int ma_x) //密碼設置 {char s[20];char temp[2];int n;strcpy(s, " ");while (1){while (1){n = getch();if (n == 13){break;}printf("*");memset(temp, 0, sizeof(temp));sprintf(temp, "%c", n);strcat(s, temp);}if (strlen(s) > ma_x + 1){memset(s, 0, sizeof(s));printf("\n密碼過長,請重新輸入:");strcpy(s, " ");continue;}if (strlen(s) < min + 1){memset(s, 0, sizeof(s));printf("\n密碼過短,請重新輸入:");strcpy(s, " ");continue;}break;}printf("\n"); }char Set_passwd() {FILE *fp;char passwd[10] = "123456";if ((fp = fopen("passward.txt", "wt")) == NULL){printf("寫文件出錯,按任意鍵退出!");getch();exit(1);}fprintf(fp, "%s", passwd);fclose(fp);return passwd;}void Dfs(MGraph *G,int start, int end, int visit[], int path[], int len, int limit) //Dfs算法求簡單路徑 {int i;if (limit >= 0){visit[start] = 1;path[len++] = start;if (start == end){for (i = 0; i < len; i++){if (i)printf("---->");printf("%s", G->vex[path[i]].name);}printf("\n");}else{ for (i = 0; i < G->vexnum; i++){if (visit[i] != 1 && G->arcs[start][i] < INFINITE && G->arcs[start][i]){Dfs(G, i, end, visit, path, len, limit-1);}}}visit[start] = 0;} }void All_path(MGraph *G) //任意兩地點的所有簡單路徑 {char name[20];int path[MAXVEX] = { 0 };int visit[MAXVEX] = { 0 };int start, end, len = 0, limit;system("cls");printf("請輸入起點建筑:");scanf("%s", name);start = Index(G, name);printf("請輸入終點建筑:");scanf("%s", name);end = Index(G, name);printf("由于路徑過多,請輸入中轉次數限制:");scanf("%d", &limit);Dfs(G, start, end, visit, path, len, limit); }void Manage_menu(MGraph *MG) //管理員菜單 {system("cls");int select;printf("請輸入管理員密碼:");Inputpasswd(Set_passwd(), 6, 9);printf("正在打開管理員系統...");Sleep(1000);system("cls");do{printf("\n\n\n\n\n\n\n");printf("\t\t\t\t*******************************************************\n");printf("\t\t\t\t*** | 1.增加新的地點信息 | ***\n");printf("\t\t\t\t*** | 2.增加新的路徑 | ***\n");printf("\t\t\t\t*** | 3.刪除某個地點信息 | ***\n");printf("\t\t\t\t*** | 4.刪除某條路徑 | ***\n");printf("\t\t\t\t*** | 0.退出 | ***\n");printf("\t\t\t\t*******************************************************\n");printf("\n請輸入選擇:");scanf("%d", &select);switch (select){case 1:Add_vex(MG);break;case 2:Add_arcs(MG);break;case 3:Del_vex(MG);break;case 4:Del_arcs(MG);break;case 0:return;}} while (1); }void menu(MGraph *MG) //菜單 {int select;Creat(MG);do{printf("\n\n\n\n\n\n\n");printf("\t\t\t\t**************西安郵電大學校園導游系統*****************\n");printf("\t\t\t\t*** | 1.顯示各個建筑之間的基本信息 | ***\n");printf("\t\t\t\t*** | 2.查詢單個建筑的基本信息 | ***\n");printf("\t\t\t\t*** | 3.查詢任意兩個地點的所有簡單路徑 | ***\n");//printf("\t\t\t\t*** | 4.查詢任意兩個地點的最短簡單路徑 | ***\n");printf("\t\t\t\t*** | 4.查詢任意兩地點的最短路徑 | ***\n");printf("\t\t\t\t*** | 5.查詢從某個地點出發到其它各地點的最佳布網 | ***\n");printf("\t\t\t\t*** | 6.管理員系統 | ***\n");printf("\t\t\t\t*** | 0.退出 | ***\n");printf("\t\t\t\t*******************************************************\n");printf("\n請輸入選擇:");scanf("%d", &select);switch (select){case 1:Display(MG);break;case 2:Search(MG);break;case 3:All_path(MG);break;/*case 4:Shortest_transfer(MG);break;*/case 4:Shortlink(MG);break;case 5:Shortestconnect(MG);break;case 6:Manage_menu(MG);break;case 0:return;}} while (1); }int main() {MGraph MG;menu(&MG); }總結
以上是生活随笔為你收集整理的校园导游系统(源码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果手机系统更新信号无服务器,苹果手机服
- 下一篇: Mems传感器的七大分类是哪些?