车票管理系统
设计说明与要求:
一车站每天有n个发车班次,每个班次都有一班次号(1、2、3…n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。如
班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数
1 8:00 郫县 广汉 2 . 45 30
2 6:30 郫县 成都 0.5 40 40
3 7:00 郫县 成都 0.5 40 20
4 10:00 郫县 成都 0.5 40 2
…
功能要求:用c/c++设计一系统,能提供下列服务:
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据
(2)浏览班次信息,可显示出所有班次当前状况(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。
(3)查询路线:可按班次号查询 ,可按终点站查询
(4)售票和退票功能
A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数
B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
运行程序请看视频:
完整代码下载:
①. 可以对输入的数据进行判定,如果输入的数据类型不符合要求,会提示输入错误;
②. 系统经过加密,只有管理员才能使用所有的功能,而游客只能使用部分功能;
③. 程序界面可以显示当前的系统时间,然后根据当前时间来判断能否定购车票;
④. 为了防止修改车票信息后,忘记保存信息,系统将会自动提示保存与否;
⑤. 车票信息以文本文档格式保存在程序文件夹下,可以用记事本查看信息
1 #include<iostream> //数据流输入/输出
2 #include<fstream> //文件输入/输出
3 #include<string> //字符串操作
4 #include<iomanip> //参数化输入/输出
5 #include<time.h> //时间库函数
6 using namespace std; //命名空间
7
8 class Bus_infor
9 {
10 private:
11 static int Bus_No; //静态数据成员,统计当前所有的Bus_infor对象的数目
12 char start[20]; //起点站
13 char end[20]; //终点站
14 int Bus_order; //班次号
15 int all_tickted; //额定载量
16 int tickted; //已定票人数
17 int Hour_start,Minute_start; //发车时间
18 float GoHour; //行车时间
19
20 public:
21 Bus_infor();
22 ~Bus_infor();
23 Bus_infor *next;
24 void input(); //录入函数
25 void input(ifstream & is); //读取函数
26 void output(); //输出函数
27 void output(ofstream & os); //写入函数
28 void Order_tickt(int n); //定票函数
29 void Unorder_tickt(int n); //退票函数
30 void GetTime_start(); //获取发车时间函数
31 bool GetTime(); //判断当前班次状况函数
32 int Get_all_tickted() { return all_tickted; } //内联函数,返回额定载量
33 int Get_tickted() { return tickted; } //返回已定票人数
34 int Get_bus_order() { return Bus_order; } //返回班次号
35 string Get_end()const; //返回终点站的字符串
36 };
37
38 int Bus_infor::Bus_No=1;
39
40 Bus_infor::Bus_infor()
41 {
42 Bus_No++;
43 tickted=0;
44 }
45
46 Bus_infor::~Bus_infor()
47 {
48 Bus_No--;
49 }
50
51 void Bus_infor::input()
52 {
53 cout<<"\t\t\t按提示输入:"<<endl;
54 cout<<"输入班次: ";
55 while(1)
56 {
57 cin>>Bus_order;
58 if (cin.fail()) //判断输入的数据类型是否有错
59 {
60 cout << "\n班次输入错误,请重新输入:";
61 cin.clear();
62 cin.get();
63 }
64 else
65 break;
66 }
67 cout<<"请输入车的额定座位数: ";
68 while(1)
69 {
70 cin>>all_tickted;
71 if (cin.fail()) //判断输入的数据类型是否有错
72 {
73 cout << "\n座位数输入错误,请重新输入:";
74 cin.clear();
75 cin.get();
76 }
77 else
78 break;
79 }
80 GetTime_start();
81 cout<<"请输入行车时间:";
82 while(1)
83 {
84 cin>>GoHour;
85 if (cin.fail()) //判断输入的数据类型是否有错
86 {
87 cout << "\n行车时间输入错误,请重新输入:";
88 cin.clear();
89 cin.get();
90 }
91 else
92 break;
93 }
94 cout<<"请输入起始站与终点站:";
95 cin>>start;cin>>end;
96 cout<<"是否清空售票(y/n)?";
97 char a;cin>>a;
98 if(a=='y'||a=='Y') tickted=0;
99 }
100
101 void Bus_infor::input(ifstream & is)
102 {
103 is>>Bus_order>>Hour_start>>Minute_start>>start>>end>>GoHour>>all_tickted>>tickted;
104 is.get();
105 }
106
107 void Bus_infor::output()
108 {
109
110 cout<<" "<<Bus_order<<"\t";
111 if(Minute_start==0) //判断发车时的分钟时刻,若为0分则在后面多显示个0,以符合时间格式
112 {
113 cout<<Hour_start<<":"<< Minute_start<<"0\t";
114 }
115 else
116 {
117 cout<<Hour_start<<":"<< Minute_start<<"\t";
118 }
119 cout<<start<<"\t"<<end<< "\t"<<GoHour<<"\t "<<all_tickted<<"\t "<<tickted;
120 if(!GetTime())
121 cout<<"\t 此班已出发"<<endl;
122 else
123 cout<<"\t 此班未出发"<<endl;
124 }
125
126 void Bus_infor::output(ofstream & os)
127 {
128 os<<setw(6)<<Bus_order //setw()设置输出宽度
129 <<setw(15)<<Hour_start
130 <<setw(15)<<Minute_start
131 <<setw(15)<<start
132 <<setw(6)<<end
133 <<setw(15)<<GoHour
134 <<setw(15)<<all_tickted
135 <<setw(15)<<tickted
136 <<endl;
137 }
138
139 void Bus_infor::GetTime_start()
140 {
141 cout<<"请输入始发时间(时 分):";
142 while(1)
143 {
144 cin>>Hour_start>>Minute_start;
145 if (cin.fail()) //判断输入的数据类型是否有错
146 {
147 cout << "\n时间输入错误,请重新输入:";
148 cin.clear();
149 cin.get();
150 }
151 else if(Hour_start<0||Hour_start>24||Minute_start<0||Minute_start>60)
152 cout<<"\n时间格式出错,请重新输入:"; ////判断时间格式是否出错,小时不能小于0大于24,分钟不能小于0大于60
153 else
154 break;
155 }
156 }
157
158 bool Bus_infor::GetTime()
159 {
160 struct tm *local;
161 time_t t;
162 t=time(NULL);
163 local=localtime(&t); //获取当前系统时间
164 if(local->tm_hour<Hour_start||(local->tm_hour==Hour_start && local->tm_min<=Minute_start))
165 return 1; //比较当前时间与发车时间,获得班次的当前状况,返回1表示班次未出发
166 else
167 return 0; //返回0表示班次已出发
168 }
169
170 void Bus_infor::Order_tickt(int n)
171 {
172 tickted=tickted+n;
173 }
174
175 void Bus_infor::Unorder_tickt(int n)
176 {
177 tickted=tickted-n;
178 }
179
180 string Bus_infor::Get_end()const
181 {
182 string s=end;
183 return s;
184 }
185
186 class Bus_link
187 {
188 public:
189 Bus_link(){head=new Bus_infor;head->next=NULL;key=0;} //带参数的构造函数
190 ~Bus_link(){delete head;} //析构函数
191 void input(); //录入车票信息
192 void mend(); //修改车票信息
193 void del(); //删除车票信息
194 int find(Bus_infor **p1,int num,char *pn); //查找函数,找出所有符合的
195 int find1(Bus_infor **p1,int num,char *pn); //查找函数,找到符合的返回
196 void found(); //查询车票信息
197 void show(); //显示车票信息
198 void Order(); //定购车票信息
199 void Unorder(); //退还车票信息
200 void save(); //保存车票信息
201 void begin(); //初始化车票信息
202 void clear(); //清除函数
203 void about(); //关于车票信息
204 char mainmenu(); //主菜单函数
205 void setkey(int k){ key=k; } //设置系统修改标志
206 int getkey(){ return key;} //返回系统修改标志
207 private:
208 Bus_infor *head; //链表指针
209 int key; //系统修改标志
210 int password; //管理员登陆标志
211 };
212
213 void Bus_link::input()
214 {
215 if(password==1)
216 {
217 Bus_infor *p,*p2=NULL;
218 p=head;
219 int n=1;
220 while(p->next)
221 p=p->next;
222 while(n)
223 {
224 p2=new Bus_infor;
225 p2->input();
226 p->next=p2;
227 p2->next=NULL;
228 p=p->next;
229 Bus_link::setkey(1);
230 cout<<"\t\t\t按1继续,按0返回 : ";
231 cin>>n;
232 if(!cin)
233 throw string("\n数据输入错误");
234 Bus_link::setkey(1);
235 }
236 }
237 else
238 cout<<"\n\t\t对不起,游客不能录入车票信息"<<endl;
239 }
240
241 void Bus_link::show()
242 {
243 cout<<"客车基本信息如下:"<<endl
244 <<"班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数 当前状况"<<endl;
245 Bus_infor *p;
246 p=head;
247 while(p->next)
248 {
249 (p->next)->output();
250 p=p->next;
251 }
252 }
253
254 void Bus_link::found()
255 {
256 Bus_infor *p;
257 int num,n;
258 char name[20];
259 do
260 {
261 cout<<"\t\t1:按班次查找,2:按终点站查找: ";
262 cin>>n;
263 if(!cin)
264 throw string("\n数据输入错误");
265 }while(n<1||n>2);
266 if(n==1)
267 {
268 cout<<"\t\t\t输入班次: ";
269 cin>>num;
270 if(!cin)
271 throw string("\n数据输入错误");
272 }
273 if(n==2)
274 {
275 cout<<"\t\t\t输入终点站: ";
276 cin>>name;
277 }
278 if(!find(&p,num,name))
279 {
280 cout<<"\t\t找不到你要查找的内容!"<<endl;
281 return;
282 }
283 }
284
285 int Bus_link::find(Bus_infor **p1,int num,char *pn)
286 {
287 Bus_infor *p;
288 p=head;
289 int t=0;
290 while(p->next)
291 {
292 (*p1)=p;
293 if( (p->next)->Get_bus_order()==num|| (p->next)->Get_end()==pn )
294 {
295 cout<<"客车基本信息如下:"<<endl
296 <<"班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数 当前状况"<<endl;
297 (p->next)->output();
298 t=1;
299 }
300 p=p->next;
301 }
302 return t;
303 }
304
305 int Bus_link::find1(Bus_infor **p1,int num,char *pn)
306 {
307 Bus_infor *p;
308 p=head;
309 while(p->next)
310 {
311 (*p1)=p;
312 if( (p->next)->Get_bus_order()==num|| (p->next)->Get_end()==pn )
313 {
314 cout<<"客车基本信息如下:"<<endl
315 <<"班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数 当前状况"<<endl;
316 (p->next)->output();
317 return 1;
318 }
319 p=p->next;
320 }
321 return 0;
322 }
323
324 void Bus_link::del()
325 {
326 if(password==1)
327 {
328 Bus_infor *p,*p2;
329 int num;char name[20];
330 cout<<"\t\t\t输入班次号: ";
331 cin>>num;
332 if(!cin)
333 throw string("\n数据输入错误");
334 if( !find1(&p,num,name) )
335 {
336 cout<<"\t\t找不到你要删除的内容!"<<endl;
337 return;
338 }
339 cout<<"\n\t\t\t确定删除(y/n)?";
340 char a;cin>>a;
341 if(a=='y'||a=='Y')
342 {
343 p2=p->next;
344 p->next=p2->next;
345 delete p2;
346 Bus_link::setkey(1);
347 }
348 }
349 else
350 cout<<"\n\t\t对不起,游客不能删除车票信息"<<endl;
351 }
352
353 void Bus_link::mend()
354 {
355 if(password==1)
356 {
357 Bus_infor *p;
358 int num;
359 char name[20];
360 cout<<"\t\t\t输入班次号: ";
361 cin>>num;
362 if(!cin)
363 throw string("\n数据输入错误");
364 if( !find1(&p,num,name) )
365 {
366 cout<<"\t\t找不到你要修改的内容!"<<endl;
367 return;
368 }
369 (p->next)->input();
370 Bus_link::setkey(1);
371 }
372 else
373 cout<<"\n\t\t对不起,游客不能修改车票信息"<<endl;
374 }
375
376 void Bus_link::Order()
377 {
378 if(password==1)
379 {
380 Bus_infor *p;
381 cout<<"\n\t\t\t确定购票(y/n)?";
382 char X;cin>>X;
383 if(X=='y'||X=='Y'){
384 int num;
385 cout<<"\n\t\t\t输入班次号: ";
386 cin>>num;
387 if(!cin)
388 throw string("\n数据输入错误");
389 if( !find1(&p,num,"^") )
390 {
391 cout<<"\n\t\t找不到你要定票的车辆的内容!"<<endl;
392 return;
393 }
394 p=p->next;
395 if(!(p->GetTime())) //判断要定票的车辆是否已经出发,若已经出发则不允许定票
396 {
397 cout<<"\n\t\t你要订票的车辆已出发!"<<endl;
398 return;
399 }
400 cout<<"\n\t\t\t输入要定的票数 ";
401 int n;cin>>n;
402 if(!cin)
403 throw string("\n数据输入错误");
404 if((p->Get_tickted()+n)<=p->Get_all_tickted())
405 p->Order_tickt(n);
406 else cout<<"\n\t\t对不起,没有足够的票数。"<<endl;
407 }
408 else if(X=='n'||X=='N') cout<<"谢谢使用"<<endl;
409 else cout<<"\n\t\t\t输入字符不确定"<<endl;
410 Bus_link::setkey(1);
411 }
412 else
413 cout<<"\n\t\t对不起,订购车票请在管理员处购买"<<endl;
414 }
415
416 void Bus_link::Unorder()
417 {
418 if(password==1)
419 {
420 Bus_infor *p;
421 cout<<"\n\t\t\t确定退票(y/n)?";
422 char X;cin>>X;
423 if(X=='y'||X=='Y'){
424 int num;
425 cout<<"\n\t\t\t输入班次号: ";
426 cin>>num;
427 if(!cin)
428 throw string("\n数据输入错误");
429 if( !find1(&p,num,"^") )
430 {
431 cout<<"\n\t\t找不到你要退票的车辆的内容!"<<endl;
432 return;
433 }
434 p=p->next;
435 if(p->GetTime()==0) //判断要定票的车辆是否已经出发,若已经出发则不允许定票
436 {
437 cout<<"\n\t\t你要退票的车辆已出发!"<<endl;
438 return;
439 }
440 cout<<"\n\t\t\t输入要退的票数 ";
441 int n;cin>>n;
442 if(!cin)
443 throw string("\n数据输入错误");
444 if((p->Get_tickted()-n)>=0)
445 p->Unorder_tickt(n);
446 else cout<<"\n\t\t\t对不起,数据出错!。"<<endl;
447 }
448 else if(X=='n'||X=='N') cout<<"谢谢使用"<<endl;
449 else cout<<"\n\t\t\t输入字符不确定"<<endl;
450 Bus_link::setkey(1);
451 }
452 else
453 cout<<"\n\t\t对不起,退还车票请在管理员处退还"<<endl;
454 }
455
456 void Bus_link::save()
457 {
458 if(password==1)
459 {
460 Bus_infor *p;
461 p=head;
462 ofstream os("bus.txt",ios::out); //文件以输出方式打开
463 if (Bus_link::getkey()==1)
464 {
465 while(p->next)
466 {
467 (p->next)->output(os);
468 p=p->next;
469 }
470 }
471 cout<<"\t\t\t文件已保存! "<<endl;
472 Bus_link::setkey(0);
473 }
474 else
475 cout<<"\n\t\t对不起,游客无法保存车票信息"<<endl;
476 }
477
478 void Bus_link::about()
479 {
480 cout<<endl<<"关于车票管理系统"<<endl<<"────────"<<endl;
481 cout<<"使用说明:"<<endl
482 <<"\t1.请按照操作提示输入正确的格式,以保证系统正常运行;"<<endl
483 <<"\t2.当使用管理员登陆时,需输入密码,可进行对系统的所有操作;"<<endl
484 <<"\t3.当使用游客身份登陆时,无需输入密码,但只能浏览和查询车票信息;"<<endl
485 <<"\t4.车票信息用文本文档格式,保存在本程序文件夹目录下,可以直接打开查看."<<endl<<endl
486 <<"系统说明:"<<endl
487 <<"\t本系统为课程设计作品,可以简易的进行车票管理,欢迎提出意见和建议"<<endl
488 <<"\t漳州师范学院07级计算机科学与工程系非师四班\t王建设"<<endl<<endl;
489 }
490
491 void Bus_link::begin()
492 {
493 password=0;
494 Bus_infor *p,*p2;
495 p=head;
496 clear();
497 long t;
498 ifstream is("bus.txt",ios::in); //文件以输入方式打开
499 if(!is)
500 {
501 ofstream os("bus.txt",ios::out); //文件以输出方式打开
502 os.close(); //关闭文件
503 return ;
504 }
505 int num=-1;
506 while(1)
507 {
508 num=-1;
509 t=is.tellg(); //记录下当前位置
510 is>>num;
511 is.seekg(t); //移动到原来位置
512 if(num<0)
513 {
514 is.close();
515 return;
516 }
517 p2=new Bus_infor;
518 p2->input(is); //输入is对象内容
519 p->next=p2;
520 p2->next=NULL;
521 p=p->next;
522 }
523 }
524
525 void Bus_link::clear()
526 {
527 Bus_infor *p,*p2;
528 p=head->next;
529 while( p )
530 {
531 p2=p;
532 p=p->next;
533 delete p2;
534 }
535 }
536
537 char Bus_link::mainmenu()
538 {
539 struct tm *local;
540 char s1[128];
541 time_t t;
542 t=time(NULL);
543 local=localtime(&t);
544 strftime(s1,128,"%Y-%m-%d %H:%M ",local); //按照指定的格式,把时间保存在s1字符串里面
545 string s; //定义字符串s,来判断功能选择是否输入错误
546 cout<<"\n\n ────欢迎使用车票管理系统────"<<endl<<endl;
547 cout
548 <<" ┌─────────────────────────┐"<<endl
549 <<" │ ┌──────────────────────┐ │"<<endl
550 <<" │ │ 1. 录入车票信息 2. 浏览车票信息 │ │"<<endl
551 <<" │ │ 3. 查询车票信息 4. 删除车票信息 │ │"<<endl
552 <<" │ │ 5. 修改车票信息 6. 定购车票信息 │ │"<<endl
553 <<" │ │ 7. 退还车票信息 8. 保存车票信息 │ │"<<endl
554 <<" │ │ 9. 关于车票系统 0. 退出系统 │ │"<<endl
555 <<" │ └──────────────────────┘ │"<<endl
556 <<" └─────────────────────────┘"<<endl
557 <<"\t\t\t\t "<<s1<<endl<<endl;
558 while(password==0)
559 {
560 cout<<"\t\t请选择用户名(1.管理员;2.游客): ";
561 string n; cin>>n;
562 if(n=="1")
563 {
564 cout<<"\n\t\t请输入管理员密码: ";
565 string m;cin>>m;
566 if(m=="123456")
567 {
568 password=1;
569 cout<<endl;
570 break;
571 }
572 else
573 {
574 cout<<"\n\t\t密码输入不正确\n"<<endl;
575 }
576 }
577 else
578 {
579 password=2; //游客身份标志
580 break;
581 }
582 }
583 cout<<" 请选择功能按钮: ";
584 while(true)
585 {
586 cin>>s;
587 if(s.length()!=1||s[0]<'0'||s[0]>'9') //s.length()返回字符串的长度,即字符个数
588 cout<<"输入错误,请重新选择功能按钮: ";
589 else
590 break;
591 }
592 return s[0];
593 }
594
595 int main()
596 {
597 Bus_link pp;
598 int k=1;
599 int i=1;
600 string s;
601 pp.begin();
602 try
603 {
604 while(k==1)
605 {
606 system("cls");
607 s=pp.mainmenu(); //调用主菜单函数
608 switch(s[0])
609 {
610 case '1':pp.input(); break; //录入车票信息
611 case '2':pp.show(); break; //浏览车票信息
612 case '3':pp.found(); break; //查询车票信息
613 case '4':pp.del(); break; //删除车票信息
614 case '5':pp.mend(); break; //修改车票信息
615 case '6':pp.Order(); break; //保存车票信息
616 case '7':pp.Unorder(); break; //退还车票信息
617 case '8':pp.save(); break; //保存车票信息
618 case '9':pp.about();break; //关于车票系统
619 case '0':k=0;break; //退出系统
620 }
621 if(k==1)
622 {
623 cout<<"\n\t\t\t是否返回主菜单? 1.是 2.不是 : ";
624 cin>>i;
625 if(!cin)
626 throw string("\n数据输入错误");
627 }
628 if(k==0||i==2)
629 {
630 if(pp.getkey()==1)
631 {
632 cout<<"\t\t\t是否保存? 1 . 保存 0.不保存 : ";
633 cin>>i;
634 if(!cin)
635 throw string("\n数据输入错误");
636 if(i==1)
637 pp.save();
638 pp.clear();
639 k=0;
640 }
641 k=0;
642 }
643 }
644 }
645 catch(string s)
646 {
647 cout<<s<<",为保护系统不崩溃,将自动退出系统!"<<endl;
648 system("pause");
649 }
650 return 0;
651 }