校园导航系统——迪杰特斯拉算法
2014-09-11 20:12
225 查看
#include<iostream> #include<string> #include<fstream> #include<Windows.h> #include"stdio.h" #include<ctype.h> #include<conio.h> #include<sstream> using namespace std; //最大值 #define INFINITY 32767 //管理员密码 string G_PIN; //迪杰特斯拉算法的辅助数组 int have [12]; //存放景点信息 string info [12]; //最大顶点个数 #define MAX_V 30 //图 typedef struct { char* vexs[MAX_V]; //顶点向量 int arcs[MAX_V][MAX_V];//邻接矩阵 int vexnum,arcnum;//图的当前顶点数和弧数 } MGraph; //从txt文件读取信息 void read() { ifstream in ("point.txt",ios::in); if(!in) { cerr << "Open \"point.txt\" error!"<<endl; exit(1); } int i = 0; while(in.eof()==0) { in >> info[i]; //cout << info[i]; i++; } in.close(); ifstream inB ("G_PIN.txt",ios::in); inB >> G_PIN; in.close(); } //将数据保存到txt文件中 void save() { ofstream out("point.txt",ios::out); out.close(); ofstream outA ("point.txt",ios::out); int i = 0; while(i<12) { outA << info[i] <<endl; i ++; } out.close(); ofstream outB ("G_PIN.txt",ios::out); outB << G_PIN; outB.close(); } //输入密码回显星号 string getPass() { unsigned char c; string pass; int i = 0; while ((c=getch())!='\r') { if (isprint(c) && c!=' ') { pass += c; putchar('*'); } else if (c=='\b') { pass += c; putchar('\b'); putchar(' '); putchar('\b'); } } putchar('\n'); int len = pass.length(); for(int j = 0; j<len; j++) { if(pass[j]=='\b') { pass.erase(j,1); pass.erase(j-1,1); j = 0; len = pass.length(); } } return pass; } //密码验证(6-16位字符,数字和英文字符) bool PIN_yanzheng(string pin) { if(pin.length()<6 || pin.length()>16) { cout<<"位数不符合!在6-16位之间!"<<endl; return false; } else { for(int i = 0; i<pin.length(); i++) { if((pin[i]<'0') || (pin[i]>'z')||(pin[i]>'9'&&pin[i]<'A') || (pin[i]>'Z'&&pin[i]<'a')) { cout<<"只能包含数字和字母...."<<endl; return false; } } cout<<"密码合法..."<<endl; return true; } } //主菜单(1.管理员2.用户0.退出其余不合法) void menu_main() { cout<<" ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl; cout<<" ※※※※ ※※※※"<<endl; cout<<" ※※※※ 欢迎使用中国海洋大学校园导航系统! ※※※※"<<endl; cout<<" ※※※※ 请选择用户登录或者管理员登陆 ※※※※"<<endl; cout<<" ※※※※ 1 超级用户界面 ※※※※"<<endl; cout<<" ※※※※ 2 普通用户界面 ※※※※"<<endl; cout<<" ※※※※ 0 退出系统 ※※※※"<<endl; cout<<" ※※※※ ※※※※"<<endl; cout<<" ※※※※※※※※※※※※※※※※※※※※※※※※※※※※※"<<endl; cout<<" 选择一个功能(0-2):"; } //景点菜单 void menu_point() { printf(" ①西门 ");printf("\n"); printf(" | \\ ");printf("\n"); printf(" | ②----③足球场 ");printf("\n"); printf(" | 体育馆 \\ ");printf("\n"); printf(" 南区 | \\ ");printf("\n"); printf(" ⑩----⑾行远楼 ⑥教学区 \\ ");printf("\n"); printf(" | / \\ \\_ \\ ");printf("\n"); printf(" | ___/ \\ \\_ ④北区宿舍 ");printf("\n"); printf(" | __/ \\ \\ / \\_ ");printf("\n"); printf(" | ______/ ⑦--⑧食堂 ⑤校医院 ");printf("\n"); printf(" | ______/ 五子顶 / ");printf("\n"); printf(" | / / ");printf("\n"); printf(" ⑿图书馆 / ");printf("\n"); printf(" / ");printf("\n"); printf(" / ");printf("\n"); printf(" / ");printf("\n"); printf(" / ");printf("\n"); printf(" / ");printf("\n"); printf(" ⑨东区 ");printf("\n"); } //管理员菜单 void G_menu() { cout<<endl<<endl<<endl; cout<<" \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl; cout<<" \3\3\3\3\3\3 1 查看景点信息 \3\3\3\3\3\3"<<endl; cout<<" \3\3\3\3\3\3 2 修改景点信息 \3\3\3\3\3\3"<<endl; cout<<" \3\3\3\3\3\3 3 修 改 密 码 \3\3\3\3\3\3 "<<endl; cout<<" \3\3\3\3\3\3 0 退 出 系 统 \3\3\3\3\3\3"<<endl; cout<<" \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl; cout<<" 请选择一个功能(0-3):"; } //用户菜单(1.查询景点信息,2.查询最短路径0.退出系统,其余不合法) void Y_menu() { cout<<endl<<endl<<endl<<endl<<endl; cout<<" \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl; cout<<" \3\3\3\3\3\3\3 1 查询最短路径 \3\3\3\3\3\3\3"<<endl; cout<<" \3\3\3\3\3\3\3 2 查询景点信息 \3\3\3\3\3\3\3"<<endl; cout<<" \3\3\3\3\3\3\3 0 退 出 系 统 \3\3\3\3\3\3\3"<<endl; cout<<" \3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3"<<endl; cout<<" 请选择一个功能(0-2):"; } //查看景点信息 void viewThePoint() { string num_str; int num; bool trail; cout <<"输入你想要查看的景点编号(1-12):"<<endl; do { cin >> num_str; trail =("1"!=num_str&&"2"!=num_str &&"3"!=num_str && "4"!=num_str &&"5"!=num_str &&"6"!=num_str&&"7"!=num_str &&"8"!=num_str&&"9"!=num_str&&"10"!=num_str &&"11"!=num_str &&"12"!=num_str); if(trail) { cout <<"输入正确的范围!"<<endl; } else { num = atoi(num_str.c_str()); cout << info[num-1] <<endl; } } while(trail); } //管理员修改景点信息 void G_modifyThePoint() { //stringstream ss; string num_str; string str; int num; bool trail = false; do { menu_point(); cout <<"您想要修改哪个景点的信息(1-12)?"<<endl; cin >> num_str; trail =("1"!=num_str&&"2"!=num_str &&"3"!=num_str && "4"!=num_str &&"5"!=num_str &&"6"!=num_str&&"7"!=num_str &&"8"!=num_str&&"9"!=num_str&&"10"!=num_str &&"11"!=num_str &&"12"!=num_str); if(trail) { cout << "输入有误,请重新输入,1-12范围的数字。"<<endl; Sleep(2000); system("cls"); } } while(trail); num = atoi(num_str.c_str()); cout <<"您要修改的信息为:"<<info[num-1]<<endl; cout <<"请输入将要修改的信息内容:"<<endl; cin >> str; cout << "确认信息修改?(N/n(不修改),其余输入确认修改)"<<endl; string modify; cin >> modify; if(modify == "n" || modify =="N") { cout <<"信息未修改"<<endl; return ; } else { info[num-1] = str; cout <<"信息修改成功!"<<endl; } } //管理员验证 bool G_yanzheng() { string pin; char x; int times=0; do { cout<<"请输入您的管理员密码"<<endl; pin = getPass(); times++; if(pin == G_PIN) { cout<<"密码输入正确!"<<endl; return true; } else { cout<<"密码输入错误!您还有"<<3-times<<"次机会!"<<endl; if(times == 3) { cout<<"您已经三次密码输入错误,不能继续输入密码!"<<endl; return false; } cout<<"是否继续输入密码?否(N/n)是按其余键"<<endl; cin >> x; if( 'n'==x || 'N'==x) { return false; } } } while(pin !=G_PIN && times<3); return false; } void G_change_PIN() { cout<<"为了保证您的账号安全,请输入您的原密码..."<<endl; string PIN; //cin>>PIN; PIN = getPass(); if(PIN !=G_PIN) { cout<<"对不起,您的密码输入不正确..."<<endl; return; } char x; string pin; string pin2; do { do { cout<<"请输入新密码(6-16位,数字和字母)..."<<endl; //cin>>pin; pin = getPass(); } while(PIN_yanzheng(pin) == false); cout<<"请再次确认密码(6-16位,数字和字母)..."<<endl; //cin>>pin2; pin2=getPass(); if(pin2 == pin) { G_PIN = pin; } else { cout<<"两次输入密码不一致,是否重新输入密码?是(任意字符),否(N/n)"<<endl; cin>>x; if(x=='n' || x=='N') { cout<<"您的密码未修改!谢谢您的使用!"<<endl; return; } } } while(pin !=pin2&& x!='n'&&x!='N'); cout<<"正在操作中,请耐心等候..."<<endl; ofstream out("G_PIN.txt"); out<<G_PIN<<endl; Sleep(2000); cout<<"您的密码已经修改成功!谢谢您的使用!"<<endl; } //用户验证 bool Y_yanzheng() { return true; } //创建无向图 void createUDN(MGraph &G) { int i = 0,j=0; G.vexnum = 12; G.arcnum = 13; G.vexs[0] = "西门"; G.vexs[1] = "体育馆"; G.vexs[2] = "风雨操场"; G.vexs[3] = "北区宿舍"; G.vexs[4] = "校医院"; G.vexs[5] = "教学区"; G.vexs[6] = "五子顶"; G.vexs[7] = "食堂"; G.vexs[8] = "东区"; G.vexs[9] = "南区"; G.vexs[10] = "行远楼"; G.vexs[11] ="图书馆"; for(i=0; i<G.vexnum; i++) //初始化路径长度 for(j=0; j<G.vexnum; j++) { if(i==j) G.arcs[i][j]=0; else G.arcs[i][j]=INFINITY; } //为每一条边赋权 G.arcs[9][10] =G.arcs[10][9] = 100; G.arcs[10][11] =G.arcs[11][10]=270; G.arcs[11][5] =G.arcs[5][11]=500; G.arcs[11][6]=G.arcs[6][11]=150; G.arcs[6][7] =G.arcs[7][6] = 70; G.arcs[0][5]=G.arcs[5][0]=200; G.arcs[0][1]=G.arcs[1][0]=100; G.arcs[1][2]=G.arcs[2][1]=130; G.arcs[2][3]=G.arcs[3][2]=200; G.arcs[3][7]=G.arcs[7][3]=110; G.arcs[5][7]=G.arcs[7][5]=250; G.arcs[3][4]=G.arcs[4][3]=120; G.arcs[7][8]=G.arcs[8][7]=550; } //迪杰特斯拉算法 void Djtsl(MGraph &G,int v0,int p[MAX_V][MAX_V],int d[]) { //迪杰斯特拉发求最短路径 int v,w,i,j,min; int final[MAX_V]; int k=1; for(v=0; v<G.vexnum; ++v) { //初始化 final[v]=0; d[v]=G.arcs[v0-1][v]; for(w=0; w<G.vexnum; ++w) p[v][w]=0; if(d[v]<INFINITY) { p[v][v0-1]=1; p[v][v]=1; } } d[v0-1]=0; final[v0-1]=1; have[0]=v0-1; for(i=1; i<G.vexnum; ++i) { //其余的vexnum-1个顶点 min=INFINITY; for(w=0; w<G.vexnum; ++w) if(!final[w]) if(d[w]<min) //如有W点离更近 { v=w; min=d[w]; } final[v]=1; have[k]=v; k++; for(w=0; w<G.vexnum; ++w) //更新当前最短路径及距离 if(!final[w]&&(min+G.arcs[v][w]<d[w])) { d[w]=min+G.arcs[v][w]; for(j=0; j<G.vexnum; j++) p[w][j]=p[v][j]; p[w][w]=1; } } } //输入两点求最短路径 void shortPath() { stringstream ss; string num_v0; string num_end; bool trail_v0 ; bool trail_end; MGraph G; createUDN(G); int v0,i,end; int P[MAX_V][MAX_V]; int D[MAX_V]; do { cout <<"请输入起点(1-12):"; cin >> num_v0; trail_v0=("1"!=num_v0&&"2"!=num_v0&&"3"!=num_v0&& "4"!=num_v0 &&"5"!=num_v0 &&"6"!=num_v0&&"7"!=num_v0 &&"8"!=num_v0&&"9"!=num_v0&&"10"!=num_v0 &&"11"!=num_v0 &&"12"!=num_v0); if(trail_v0) { cout << "请正确输入起点(1-12)!"<<endl; } }while(trail_v0); do { cout <<"请输入终点(1-12):"; cin >> num_end; trail_end=("1"!=num_end&&"2"!=num_end &&"3"!=num_end && "4"!=num_end &&"5"!=num_end &&"6"!=num_end&&"7"!=num_end &&"8"!=num_end&&"9"!=num_end&&"10"!=num_end &&"11"!=num_end &&"12"!=num_end); if(trail_end) { cout << "请正确输入终点(1-12)!"<<endl; } }while(trail_end); v0 = atoi(num_v0.c_str()); end = atoi(num_end.c_str()); Djtsl(G,v0,P,D); cout << "最短路径是:"<<endl; for(i=0; i<G.vexnum; i++) { if(P[end-1][have[i]]==1) cout << "-->"<<G.vexs[have[i]]; } cout << "路径长度是:"<<D[end -1] <<endl; } void main() { system("color 37"); string choice_main; string Y_choice; string G_choice; bool sign;//登录是否成功的标志 read(); do { menu_main(); cin>>choice_main; if(choice_main=="0") { cout<<"正在关闭系统,请稍后..."<<endl; Sleep(2000); return ; } else if(choice_main == "1") { sign =G_yanzheng(); if(sign == false) { cout<<"登录失败!系统将在三秒内关闭!"<<endl; Sleep(2000); save(); return; } else { cout<<"登陆成功!"<<endl; Sleep(2000); system("cls"); do { G_menu(); cin>>G_choice; if(G_choice == "1") { menu_point(); viewThePoint(); } else if(G_choice =="2") { G_modifyThePoint(); } else if(G_choice == "3") { G_change_PIN(); } else if(G_choice == "0") { cout<<"正在退出系统..."<<endl; Sleep(2000); save(); return; } else { cout<< "请正确输入!" <<endl; Sleep(2000); system("cls"); } system("pause"); system("cls"); } while(G_choice!="0"); } } else if(choice_main == "2") { Sleep(2000); system("cls"); do { Y_menu(); cin>>Y_choice; if(Y_choice == "0") { cout<<"正在退出系统..."<<endl; Sleep(2000); save(); return; } else if(Y_choice =="1") { menu_point(); shortPath(); } else if(Y_choice == "2") { menu_point(); viewThePoint(); } else { cout<<"请您正确选择功能"<<endl; } system("pause"); system("cls"); } while(Y_choice!="0"); } else { cout <<"请正确选择"<<endl; Sleep(2000); system("cls"); } } while(choice_main !="2" && choice_main !="1"); }
相关文章推荐
- 校园导航系统,生成图,图之间最短路径问题(温习迪杰斯特拉算法,普利姆算法)
- 【算法设计】虎溪校园导游系统
- 【算法设计】虎溪校园导游系统
- 【算法设计】虎溪校园导游系统
- 初探MFC之校园导航系统
- 数据结构课程设计——校园导航系统开发
- 校园导航系统
- 校园导航系统,生成图,图之间最短路径问题(温习迪杰斯特拉算法,普利姆算法)
- 数据结构实践项目之校园导航系统
- 滨州学院信息工程学院2015级数据结构 校园导航系统的设计与实现
- 用无向带权图实现校园导航系统
- 数据结构课程设计————校园导航系统
- Campus Guider校园导航系统 Hash算法分析
- 用无向带权图实现校园导航系统
- 数据课程设计 -——-校园导航系统
- ARCGis+Google map api 校园地理信息导航系统
- 应用asp.net2.0 新特性构建简单的网站导航系统
- 理解并扩展 ASP.NET 2.0 中的站点导航系统
- 小焦面系统光纤单元定位算法
- 《ASP.NET办公自动化系统开发实例导航》人事管理模块