有待改进

  1 #include<iostream>
  2 #include <fstream>
  3 #include <string>
  4 #include <iomanip>
  5 #include<vector>
  6 #include<conio.h>
  7 #define max 9999
  8 const int num = 40;
  9 using namespace std;
 10 void jiemian();
 11 class point
 12 {
 13 public:
 14     friend istream& operator>>(istream& in, point& s)
 15     {
 16         in >> s.code >> s.name >> s.comments;
 17         return in;
 18     }
 19     friend class nuist;
 20 protected:
 21     int code;
 22     string name;
 23     string comments;
 24     string into;
 25 
 26 };
 27 class nuist :public point
 28 {
 29 public:
 30     nuist();
 31     ~nuist();
 32     int numberofpoints();
 33     int numberofedges();
 34     point getvalue(int i);
 35     int getLength(int v1, int v2);
 36     int getati(int code);
 37     void setcnc();
 38     void setedge();
 39     void show(int i);
 40     void Dijkstra(int v);
 41     void showmin(int v, int x);
 42     int findminpath(int v, int x);
 43     void showmany();
 44     void increase();
 45     virtual void search();
 46     virtual void choose();
 47     void Map();
 48     void insertcomment();
 49     void weihu();
 50 private:
 51     int maxpoint;
 52     int numedges;
 53     int numpoints;
 54     point* pointlist;
 55     int edges[40][40];
 56     int* path;
 57     int* dist;
 58 };
 59 nuist::nuist()
 60 {
 61     maxpoint = 40;
 62     numedges = 0; numpoints = 0;
 63     pointlist = new point[maxpoint];
 64     for (int i = 0; i < 40; i++)
 65         for (int j = 0; j < 40; j++)
 66         {
 67             if (i == j)
 68                 edges[i][j] = 0;
 69             else
 70                 edges[i][j] = max;
 71         }
 72     setcnc();
 73     setedge();
 74 }
 75 nuist::~nuist()
 76 {
 77     delete pointlist;
 78     delete path;
 79     delete dist;
 80 }
 81 int nuist::numberofpoints()
 82 {
 83     return numpoints;
 84 }
 85 int nuist::numberofedges()
 86 {
 87     return numedges;
 88 }
 89 point nuist::getvalue(int i)
 90 {
 91     return pointlist[i];
 92 }
 93 int nuist::getLength(int v1, int v2)
 94 {
 95     return edges[v1][v2];
 96 };
 97 int nuist::getati(int code)
 98 {
 99     for (int i = 0; i < numpoints; i++)
100         if (pointlist[i].code == code)
101         {
102             return i;
103         }
104     return -1;
105 };
106 
107 void nuist::setcnc()
108 {
109     if (numpoints == maxpoint)
110     {
111         cout << "景点已达到最大值,无法在添加景点。" << endl;
112     }
113     point t;
114     ifstream in;
115     in.open("nuist.txt");
116     if (!in.is_open())
117         cout << "false to open nuist.txt";
118     vector<point> x[40];
119     while (in >> t)
120     {
121         x->push_back(t);
122         pointlist[numpoints].code = x->at(numpoints).code;
123         pointlist[numpoints].name = x->at(numpoints).name;
124         pointlist[numpoints].comments = x->at(numpoints).comments;
125         numpoints++;
126     }
127 }
128 void nuist::setedge()
129 {
130     edges[0][1] = edges[1][0] = 150;
131     edges[0][2] = edges[2][0] = 300;
132     edges[1][5] = edges[5][1] = 50;
133     edges[5][6] = edges[6][5] = 50;
134     edges[6][7] = edges[7][6] = 100;
135     edges[7][3] = edges[3][7] = 200;
136     edges[3][4] = edges[4][3] = 50;
137     edges[7][8] = edges[8][7] = 100;
138     edges[8][9] = edges[9][8] = 50;
139     edges[4][9] = edges[9][4] = 30;
140     edges[8][10] = edges[10][8] = 30;
141     edges[10][11] = edges[11][10] = 40;
142     edges[11][12] = edges[12][11] = 50;
143     edges[12][15] = edges[15][12] = 20;
144     edges[15][16] = edges[16][15] = 50;
145     edges[16][17] = edges[17][16] = 50;
146     edges[17][13] = edges[13][17] = 50;
147     edges[13][14] = edges[14][13] = 100;
148     edges[18][13] = edges[13][18] = 100;
149     edges[19][16] = edges[16][19] = 100;
150     edges[20][14] = edges[14][20] = 200;
151     edges[20][21] = edges[21][20] = 200;
152     edges[14][21] = edges[21][14] = 200;
153     edges[21][22] = edges[22][21] = 200;
154     edges[22][23] = edges[23][22] = 150;
155     edges[21][23] = edges[23][21] = 100;
156     edges[23][24] = edges[24][23] = 50;
157     edges[24][25] = edges[25][24] = 50;
158     edges[24][26] = edges[26][24] = 100;
159     edges[18][26] = edges[26][18] = 300;
160     edges[20][26] = edges[26][20] = 50;
161     edges[26][27] = edges[27][26] = 50;
162     edges[27][29] = edges[29][27] = 100;
163     edges[28][29] = edges[29][28] = 100;
164     edges[29][26] = edges[26][29] = 150;
165     edges[18][29] = edges[29][18] = 200;
166 }
167 void nuist::show(int i)
168 {
169 
170     cout << "\t\t欢迎来到南信大校园导航" << endl;
171     cout << "    景点编号:" << pointlist[i].code << endl;
172     cout << "    景点名称:" << pointlist[i].name << endl;
173     cout << "    景点介绍:" << pointlist[i].comments << endl;
174     cout << "*******************************************" << endl;
175 }
176 void nuist::Dijkstra(int v)
177 {
178     int n = numberofpoints();
179     dist = new int[n];
180     path = new int[n];
181     bool* S = new bool[n];
182     int i, j, k, w, min;
183     for (i = 0; i < n; i++)
184     {
185         dist[i] = getLength(v, i);
186         S[i] = false;
187         if (i != v && dist[i] < max)
188             path[i] = v;
189         else
190             path[i] = -1;
191     }
192     S[v] = true;
193     dist[v] = 0;
194     for (i = 0; i < n - 1; i++)
195     {
196         min = max;
197         int u = v;
198         for (j = 0; j < n; j++)
199             if (S[j] == false && dist[j] < min)
200             {
201                 u = j;
202                 min = dist[j];
203             }
204         S[u] = true;
205         for (k = 0; k < n; k++)
206         {
207             w = getLength(u, k);
208             if (S[k] == false && w < max && dist[u] + w < dist[k])
209             {
210                 dist[k] = dist[u] + w;
211                 path[k] = u;
212             }
213         }
214     }
215     delete[] S;
216 }
217 void nuist::showmin(int v, int x)
218 {
219     int j, k, n;
220     n = numberofpoints();
221     int* d = new int[n];
222     {
223         j = x;
224         k = 0;
225         while (j != v)
226         {
227             d[k++] = j;
228             j = path[j];
229         }
230         cout << getvalue(v).name << "" << getvalue(x).name << "的最短路径为:" << endl << getvalue(v).name;
231         while (k > 0)
232         {
233             cout << "-->" << getvalue(d[--k]).name;
234         }
235         cout << endl << "最短路径长度为:" << dist[x] << endl;
236 
237     }
238     delete[] d;
239 }
240 int nuist::findminpath(int v, int x)
241 {
242     int j, k, n;
243     n = numberofedges();
244     int* d = new int[n];
245     {
246         j = x;
247         k = 0;
248         while (j != v)
249         {
250             d[k++] = j;
251             j = path[j];
252         }
253         while (k > 0)
254         {
255             cout << "-->" << getvalue(d[--k]).name;
256         }
257     }
258 
259     delete[] d;
260 
261     return dist[x];
262 }
263 void nuist::showmany()
264 {
265     Map();
266     int i, j, sum, x, a[num];
267     int c[num];
268     for (i = 0;; i++)
269     {
270         cout << "请输入你要参观的第" << i + 1 << "个景点(输入-1结束): ";
271         cin >> c[i];
272         if (c[i] == -1)
273             break;
274         while (1)
275         {
276             a[i] = getati(c[i]);
277             if (a[i] == -1)
278             {
279                 cout << "输入错误,请重新输入" << endl;
280                 cout << "请输入你要参观的第" << i + 1 << "个景点(输入-1结束): ";
281                 getchar();
282                 cin >> c[i];
283             }
284             else
285             {
286                 break;
287             }
288         }
289     }
290     cout << getvalue(a[0]).name;
291     for (j = 0, sum = 0; j < i - 1; j++)
292     {
293         Dijkstra(a[j]);
294         x = findminpath(a[j], a[j + 1]);
295         sum += x;
296     }
297     cout << endl << "最短路径长度为:" << sum << endl;
298     cout << "按任意键继续";
299     system("pause");
300     getchar();
301 }
302 void nuist::Map()
303 {
304     system("cls");
305     cout << endl << endl << endl << endl;
306     cout  << "*******************************************************************************************" << endl;
307     cout  << "***景点编号如下:                                                                       ***" << endl;
308     for (int i = 1; i <= numpoints; i++)
309     {
310         cout << i-1 << std::left << setw(15) << pointlist[i - 1].name;
311 
312         if (i % 4 == 0)
313             cout << endl;
314         else
315             cout << "\t";
316     }
317     cout << endl;
318     cout <<
319    endl  << "*******************************************************************************************" << endl;
320 }
321 void nuist::choose()
322 {
323     system("cls");
324     Map();
325     int v1, v2;
326     int code1, code2;
327     cout << "编号如上图,请输入您要查询的两个景点的编号:" << endl;
328     cout << "起始景点:";
329     cin >> code1;
330     cout << "终止景点:";
331     cin >> code2;
332     while (1)
333     {
334         v1 = getati(code1);
335         v2 = getati(code2);
336         if (v1 == -1 || v2 == -1)
337         {
338             cout << "输入错误,请重新输入" << endl;
339             cout << "起始景点:";
340             cin >> code1;
341             cout << "终止景点:";
342             cin >> code2;
343         }
344         else
345         {
346             Dijkstra(v1);
347             showmin(v1, v2);
348             break;
349         }
350     }
351     cout << "按任意键继续";
352     system("pause");
353     jiemian();
354 }
355 void nuist::increase()
356 {
357     Map();
358     int code;
359     string name;
360     string comment;
361     cout << "请输入要增加的景点的编号:";
362     cin >> code; numpoints += 1;
363     while (1)
364     {
365         int f = 0;
366         for (int i = 0; i < numpoints; i++)
367         {
368             if (code == getvalue(i).code)
369             {
370                 cout << "已有该编号请重新输入" << endl;
371                 f = 1;
372                 break;
373             }
374         }
375         if (f == 1)
376         {
377             cout << "请输入要增加的景点的编号:";
378             cin >> code;
379         }
380         else
381         {
382             break;
383         }
384     }
385     cout << "要添加景点的名称:";
386     cin >> name;
387     pointlist[code].code = code;
388     pointlist[code].name = name;
389     cout << "请输入" << pointlist[code].name << "的介绍:";
390     cin >> comment;
391     pointlist[code].comments = comment;
392     int code1, code2 = -1, length, z = 0;
393     cout << "请添加该地点的道路" << endl;
394     while (z != -1)
395     {
396         cout << "请输入" << pointlist[code].name << "到其他地方的编号:";
397         cin >> code1;
398         if (code2 == code1)
399         {
400             cout << "这条路径已经添加过";
401             continue;
402         }
403         if (getati(code1) == -1)
404         {
405             cout << "输入错误" << endl;
406             continue;
407         }
408         cout << "请输入" << pointlist[code].name << "" << pointlist[code1].name << "的距离:";
409         cin >> length;
410         edges[code][code1] = edges[code1][code] = length;
411         cout << "添加成功(不再添加请输入-1)  ";
412         cin >> z;
413         code2 = code1;
414     }
415 
416 }
417 void nuist::insertcomment()
418 {
419     int i; string s;
420     Map();
421     cout << "请输入修改景点简介的编号:";
422     cin >> i;
423     cout << "请输入" << pointlist[i].name << "的简介:";
424     cin >> s;
425     pointlist[i].comments = s;
426     cout << "添加成功" << endl;
427 }
428 void nuist::search()
429 {
430     int i;
431     int code;
432     while (1)
433     {
434 
435         Map();
436         cout << "请输入要查询的景点编号(输入-1退出景点信息查询):";
437         cin >> code;
438         if (code == -1)
439         {
440             jiemian();
441             break;
442         }
443         i = code;
444         if (i == -1)
445         {
446             cout << "输入错误,请重新输入" << endl;
447         }
448         else
449         {
450             show(i);
451             system("pause");
452             cout << "按任意键继续";
453         }
454     }
455 }
456 void nuist::weihu()
457 {
458     Map();
459     int ssi;
460     cout <<"请输入需要维护的景区:";
461     cin >> ssi;
462     pointlist[ssi].name = "正在维护中";
463     for (int i = 0; i < numpoints;i++)
464     {
465         edges[ssi][i] = max;
466     }
467     cout << "设置维护成功(此路不通)";
468     cout << endl << "按任意建继续";
469     system("pause");
470     system("cls");
471     Map();
472 
473 }
474 class visitor
475 {
476 protected:
477     string username;
478     string password;
479 public:
480     visitor()
481     {
482         this->username = username;
483         this->password = password;
484     }
485     visitor(string username, string password)
486     {
487         this->username = username;
488         this->password = password;
489     }
490     void creatuser();
491 };
492 void visitor::creatuser()
493 {
494     cout << "请输入用户名(账号):"; cin >> username;
495     int i = 0;
496     cout << "请输入密码: ";
497     while (true)
498     {
499         char ch = _getch();
500 
501         if (ch == 13)
502         { 
503             password[i] = '\0';
504             break;
505         }
506         else if (ch == 8)
507         {  
508             if (i > 0)
509             {
510                 cout << "\b \b"; 
511                 i--;
512             }
513         }
514         else
515         {
516             password[i] = ch;
517             cout << "*";
518             i++;
519         }
520     }
521 }
522 class mangi :public  visitor,public nuist
523 {
524 private:
525     string pinglun;
526     string ss;
527 public:
528     mangi(const string& username="nuistmangi", const string& password = "1258963074")
529     {
530         this->username = username;
531         this->password = password;
532     }
533     bool yesno()
534     {
535         if ( username=="nuistmangi" && password=="1258963074")
536             return 1;
537         else
538             return 0;
539     }
540     friend istream& operator>>(istream& in, mangi& s)
541     {
542         in>>s.ss >> s.pinglun;
543         return in;
544     }
545     void xiugaiinto();
546     void sss(vector<mangi> x[50],int i)
547     {
548         for (; i >= 0; i--)
549     {
550         cout << x->at(i).ss << ":" << x->at(i).pinglun << endl;
551     }
552     }
553 };
554 void mangi::xiugaiinto()
555 {
556     Map();
557     mangi ts;
558     mangi tt; int zxc = -1;
559     ifstream in;
560     cout<<1; 
561     in.open("ccpl.txt");
562     if (!in.is_open())
563         cout << "fail to open ccpl.txt.";
564     else
565     {
566     cout<<2;
567     vector<mangi> zx[15];
568     cout<<3;
569     while (in >>tt )
570     {
571         zx->push_back(tt);
572         zxc++;
573     }
574     cout<<4;
575     sss(zx,zxc);
576     in.close();
577     }
578     
579 }
580 
581 void start()
582 {
583     printf("\n\n\n\n\n");
584     printf("\t\t\t    ******************************************************\n");
585     printf("\t\t\t    *----------------------------------------------------*\n");
586     printf("\t\t\t    *----------------------------------------------------*\n");
587     printf("\t\t\t    *---------------------Welcome!-----------------------*\n");
588     printf("\t\t\t    *----------------------------------------------------*\n");
589     printf("\t\t\t    *----------------南信大校园导航系统------------------*\n");
590     printf("\t\t\t    *----------------------------------------------------*\n");
591     printf("\t\t\t    *-------------------按任意键继续---------------------*\n");
592     printf("\t\t\t    *----------------------------------------------------*\n");
593     printf("\t\t\t    *----------------------------------------------------*\n");
594     printf("\t\t\t    ******************************************************\n");
595     system("pause");
596 }
597 
598 void doad()
599 {
600     printf("\n\n\n\n\n");
601     printf("\t\t\t    ******************************************************\n");
602     printf("\t\t\t    *----------------------------------------------------*\n");
603     printf("\t\t\t    *----------------------------------------------------*\n");
604     printf("\t\t\t    *------------------1.游客注册------------------------*\n");
605     printf("\t\t\t    *----------------------------------------------------*\n");
606     printf("\t\t\t    *------------------2.管理员登录----------------------*\n");
607     printf("\t\t\t    *----------------------------------------------------*\n");
608     printf("\t\t\t    *------------------3.退出导航------------------------*\n");
609     printf("\t\t\t    *----------------------------------------------------*\n");
610     printf("\t\t\t    *----------------------------------------------------*\n");
611     printf("\t\t\t    ******************************************************\n");
612 }
613 void jiemian()
614 {
615     system("cls");
616     cout << "*****************************************************************************************************************" << endl;
617     cout << "***                                         南信大校园导航                                                    ***" << endl;
618     cout << "*****************************************************************************************************************" << endl;
619     cout << "***                                                                                                           ***" << endl;
620     cout << "***                                       1.执行景点信息查询                                                  ***" << endl;
621     cout << "***                                       2.查询两个景点间的最佳路径                                          ***" << endl;
622     cout << "***                                       3.查询多个景点间的最佳路径                                          ***" << endl;
623     cout << "***                                       4.添加景点(管理员功能)                                            ***" << endl;
624     cout << "***                                       5.添加景点介绍(管理员功能)                                        ***" << endl;
625     cout << "***                                       6.设置维护景点(管理员功能)                                        ***" << endl;
626     cout << "***                                       7.执行退出系统                                                      ***" << endl;
627     cout << "***                                                                                                           ***" << endl;
628     cout << "*****************************************************************************************************************" << endl;
629 
630 }
631 int main()
632 {
633     visitor z; mangi m;
634     start();
635     system("cls");
636     int cose, sz = 1, tiao = 1;
637     string username; string password;
638     doad();
639     while (tiao)
640     {
641         cout << "请输入您要执行功能的编号:(请输入数字)";
642         cin >> cose;
643         if (cose < 0 || cose>3)
644         {
645             cout << "输入错误,请重新输入!" << endl;
646         }
647         switch (cose)
648         {
649         case 1:
650             z.creatuser();
651             tiao = 0;
652             jiemian();
653             break;
654         case 2:
655             m.creatuser();
656             if (m.yesno())
657             {
658                 cout << "登录成功"; sz++; tiao = 0;
659                 jiemian();
660                 break;
661             }
662             else
663             {
664                 cout << "登录失败" << endl;
665                 break;
666             }
667         case 3:
668             system("cls");
669             return 0;
670         }
671     }
672     nuist g; int ssi = 1;
673     while (ssi)
674     {
675         jiemian();
676         int c;
677         cout << "请输入您要执行功能的编号:(请输入数字)";
678         cin >> c;
679 
680         if (c < 0 || c>8) { cout << "输入错误,请重新输入!" << endl; }
681         switch (c)
682         {
683         case 1:
684             g.search();
685             break;
686         case 2:
687             g.choose();
688             break;
689         case 3:
690             g.showmany();
691             break;
692         case 4:
693             if (sz >= 1) { g.increase(); break; }
694             else { cout << "您没有该权限" << endl; break; }
695         case 5:
696             if (sz >= 1) { g.insertcomment(); break; }
697             else { cout << "您没有该权限" << endl; break; }
698         case 6:
699             g.weihu();
700             break;
701         case 7:
702             cout << "谢谢您的使用!" << endl;
703             ssi -= 1;
704             break;
705         case 8:
706             m.xiugaiinto();
707         }
708     }
709     return 0;
710 }
View Code

 

 
posted @ 2023-12-23 21:13  dmsx  阅读(27)  评论(0)    收藏  举报