第一篇:火车订票系统部分 uml[推荐]
全程一体化建模报告
——火车订票系统
工商管理学院 信息1101 20110837 王若洲
1.火车订票系统描述....................................................................3
2.用例图和用例说明....................................................................3
3.类图
........................................................................................11
4.对象图......................................................................................13
5.顺序图和协作图.....................................................................14
6.状态图....................................................................................28
7.组件图.....................................................................................29
8.部署图.....................................................................................30
9.总结............................................................................................301.火车订票系统描述
线上预订火车票系统是一款功能强大、操作简便、易维护的、具有良好人机交互界面的线上订票系统,用户可以在注册之后进入系统。购票用户可以在系统中查询车票信息,并进行车票预定。同时购票用户的个人信息可以修改,已预定的车票也可以在取消订单的窗口中取消,很方便用户的使用。
对于管理员来说,可以对用户的信息进行统一的管理,具有实时性、便捷性等有点。同时,系统的数据可以定期备份,以防止信息的丢失。
2.用例图和用例描述
2.1 用例描述
用例编号:001 用例名:注册帐号
用例描述:购票用户在注册帐号后成为该系统的用户,使用该系统的功能 参与者:购票用户
前置条件:电子商城正常运行
后置条件:如果用户输入的帐号在系统中未被注册过,该用户会注册成功;否则,显示帐号已注册,提示用户重新输入。基本路径:
1.用户登录火车订票系统
2.购票用户输入要注册的帐号和密码 3.购票用户提交信息
4.系统检查用户帐号是否已被注册 5.系统添加帐号,并显示注册成功
扩展点:
4a:系统检测到帐号已被注册
4a1.用户重新输入 4a2.用户离开系统
变异点:无
用例编号:002 用例名:登录帐号
用例描述:购票用户在登录帐号后进入系统,使用该系统的功能 参与者:购票用户
前置条件:电子商城正常运行
后置条件:如果用户输入的帐号和密码与系统数据库中的数据一致,该用户会登录成功;否则,显示输入信息有误,提示用户重新输入。基本路径: 1.用户登录火车订票系统
2.购票用户输入自己的帐号和密码 3.购票用户提交信息
4.系统检查用户帐号和密码是否匹配 5.系统记录并显示当前用户
扩展点:
4a:系统检测到帐号有误
4a1.用户重新输入 4a2.用户离开系统
4b:购票用户密码错误
4b1:系统弹出密码错误警告信息 4b2:购票用户离开或重新输入密码
变异点:无
用例编号:003 用例名:车票查询
用例描述:在车票查询页面可以通过车次,始发地等信息查询相关车次,获得具体的车票信息
参与者:购票用户
前置条件:电子商城正常运行,用户已登录该系统
后置条件:用户输入的车次信息是在实际的火车运行系统中存在的则显示相应的车票信息,否则,提示用户输入的信息有误。基本路径:
1.用户执行登录帐号进入自己的页面 2.用户进入车票查询界面
3.购票用户输入要查询的车票、车次或时间等信息 4.系统检测输入的信息是否正确 5.系统返回给用户车票的具体信息
扩展点:
4a:系统检测到用户输入的信息有误
4a1.用户重新输入
4a2.用户离开该功能界面
变异点:无
用例编号:004 用例名:订单查询
用例描述:用户在提交订单后可以通过该功能查询自己的订单情况以及历史订单 参与者:购票用户
前置条件:电子商城正常运行,用户已登录该系统并在该系统已提交过订单
后置条件:用户提交信息后系统会查询相关的数据库信息,如果用户提交过订单,系统返回所有订单(包括历史订单),否则提示用户订单列表为空 基本路径:
1.用户执行登录帐号进入自己的页面 2.用户进入订单查询界面
3.购票用户输入要查询的订单的时间区间 4.系统调取用户的订单信息
5.系统返回给用户想要的订单信息(没有订单显示空)
扩展点:无 变异点:无
用例编号:005 用例名:取消订单
用例描述:该功能是订单查询的拓展功能,在订单查询之后可以选择取消之前的订单操作 参与者:购票用户
前置条件:用户在执行完查询订单功能,并至少有一份未完成的订单 后置条件:系统根据用户的操作在系统数据库中找到相应数据,如果符合条件则删除该条订单信息,否则,提示用户没有未完成的订单 基本路径:
1.用户执行登录帐号进入自己的页面 2.用户进入订单查询界面 3.用户执行取消订单操作
4.系统检测该操作是否符合取消订单的条件 5.系统删除用户为完成的订单
扩展点:
4a:用户没有未完成的订单,用户取消操作
变异点:无
用例编号:006 用例名:车票预定
用例描述:该功能是车票查询的拓展功能,在查询完车票信息后可以继续执行该功能,完成车票的最后预定 参与者:购票用户
前置条件:电子商城正常运行,用户已登录该系统并查询到自己需要的车票
后置条件:用户提交信息后系统会查询相关的数据库信息,如果该车票有余票,则用户预定成功,否则,提示用户重新选择车票或者放弃操作 基本路径:
1.用户执行登录帐号进入自己的页面 2.用户执行车票查询功能 3.用户预定车票
4.系统检测车票是否有余票 5.系统返回用户预定成功
扩展点:
4a:车票已被全部出售
4a1:用户重新选择车票 4a2:用户放弃该操作
变异点:无
用例编号:007 用例名:信息查询
用例描述:该功能可以让用户查询自己的相关信息,包括帐号、密码、姓名及邮箱等 参与者:购票用户
前置条件:电子商城正常运行,用户登录系统进入自己的页面
后置条件:用户提交请求后系统从数据库中调用与该用户有关的所有信息 基本路径:
1.用户执行登录帐号进入自己的页面 2.用户提交信息查询申请
3.系统调用数据库中与该用户有关的信息 4.系统把数据返回给用户
扩展点:无 变异点:无
用例编号:008 用例名:修改信息
用例描述:该功能是信息查询的拓展功能,主要指密码、邮箱的修改 参与者:购票用户
前置条件:电子商城正常运行,用户已登录系统并执行了查询功能
后置条件:用户提交修改信息功能后,系统对比修改信息需要的条件,如果符合则把用户在系统数据库中的信息修改,否则,提示信息修改失败 基本路径:
1.用户执行登录帐号进入自己的页面 2.用户执行信息查询功能 3.用户填写想要修改的信息 4.系统检测相关条件 5.系统修改用户的信息
扩展点:无 变异点:无
用例编号:009 用例名:添加用户
用例描述:把新注册的用户添加到系统数据库中 参与者:系统管理员
前置条件:有用户条件注册申请,管理员执行添加操作
后置条件:如果用户输入的帐号在系统中未被注册过,该用户会注册成功;否则,显示帐号已注册,提示用户重新输入。基本路径:
1.管理员登录系统
2.管理员执行添加用户操作 3.系统检测用户是否注册
4.管理员将用户信息添加到数据库中
扩展点:无 变异点:无
用例编号:010 用例名:修改用户
用例描述:该功能可以修改用户的信息及用户权限 参与者:系统管理员 前置条件:系统正常运行
后置条件:管理员选择修改用户信息,系统修改用户在数据库中的信息 基本路径:
1.管理员登录系统
2.管理员执行修改用户操作 3.系统修改用户信息
扩展点:无 变异点:无
用例编号:011 用例名:删除用户
用例描述:该功能可以把用户从系统中彻底删除 参与者:系统管理员 前置条件:系统正常运行
后置条件:管理员选择删除用户,将用户从系统中彻底删除 基本路径:
1.管理员登录系统
2.管理员执行删除用户操作 3.系统将用户彻底删除
扩展点:无 变异点:无
用例编号:012 用例名:修改票务信息
用例描述:在车票的价格及火车的发车时间等实际信息更改后要在系统中做出相应修改 参与者:系统管理员
前置条件:系统正常运行,实际运行的票务信息有变化
后置条件:管理员根据实际的修改对系统中的票务信息做出相应修改 基本路径:
1.管理员登录系统
2.管理员执行修改票务信息操作 3.系统重新存储修改后的信息
扩展点:无 变异点:无
用例编号:013 用例名:数据备份
用例描述:定期将重要数据进行备份,防止数据丢失 参与者:系统管理员 前置条件:系统正常运行
后置条件:管理员选择数据备份,数据被备份存储 基本路径:
1.管理员登录系统
2.管理员执行数据备份操作 3.系统将重要数据进行备份
扩展点:无 变异点:无 2.2用例图
3.类图
3.1 实体类
3.2 边界类
3.3控制类
4.对象图
5.顺序图和协作图
5.1用户的顺序图和协作图
(1)注册帐号
:购票用户:注册界面:处理注册:系统数据库1: c_register2: submit_info3: check_account4: return_account5: register6: succeed1: c_register:购票用户:注册界面2: submit_info3: check_account5: register:处理注册4: return_account6: succeed:系统数据库
(2)登录帐号
:购票用户:登录界面:处理登录:系统数据库1: c_login2: submit_info3: check_account4: account5: return_ok
1: c_login:购票用户:登录界面5: return_ok2: submit_info3: check_account:处理登录4: account:系统数据库
(3)车票查询
:购票用户:车票查询界:查询车票面1: c_query_ticket2: submit_ticket_info:车票数据3: request_info4: return_info1: c_query_ticket:购票用户:车票查询界面2: submit_ticket_info3: request_info:查询车票4: return_info:车票数据
(4)车票预定
:购票用户:车票查询界:查询车票面1: c_query_ticket2: submit_ticket_info:车票数据库:预定车票:个人订单3: request_info4: return_info5: c_reserve_ticket6: submit_order8: return_success7: create_order9: deliver_order
1: c_query_ticket5: c_reserve_ticket:购票用户:车票查询界面4: return_info2: submit_ticket_info:查询车票8: return_success:车票数据库3: request_info6: submit_order:个人订单7: create_order9: deliver_order:预定车票
(5)订单查询 :购票用户:订单查询界面:查询订单:个人信息:个人订单1: query_order2: submit_info3: request_person_info4: return_info5: request_order6: return_order_info
1: query_order:购票用户:订单查询界面2: submit_info:查询订单4: return_info6: return_order_info5: request_order3: request_person_info:个人订单:个人信息
(6)取消订单 :购票用户:订单查询界面:查询订单:个人信息:个人订单:取消订单1: c_query_order2: submit_info3: request_person_info4: return_info5: request_order6: return_order_info7: c_cancel_order8: submit_cancel9: cancel_order10: return_success11: return_cancel_ok:购票用户1: c_query_order7: c_cancel_order:订单查询界面6: return_order_info2: submit_info:查询订单8: submit_cancel5: request_order11: return_cancel_ok10: return_success3: request_person_info4: return_info:个人订单:取消订单9: cancel_order:个人信息
(7)信息查询 :购票用户:信息查询界面:信息查询:个人信息1: c_person_query2: submit_request3: query_info4: info5: return_person_info
1: c_person_query:购票用户5: return_person_info:信息查询界面2: submit_request3: query_info:信息查询4: info:个人信息
(8)修改个人信息
:购票用户:信息查询界面:信息查询:个人信息:修改信息1: c_person_query2: submit_request3: query_info4: info5: return_person_info6: c_edit_info7: request_edit8: edit_info9: true10: return_edit_ok1: c_person_query6: c_edit_info:购票用户:信息查询界面2: submit_request:信息查询5: return_person_info10: return_edit_ok4: info3: query_info7: request_edit8: edit_info:修改信息9: true:个人信息
5.2 系统管理员的顺序图和协作图
(1)添加用户
:系统管理员:添加用户界面:添加用户:系统数据库1: a_add_account2: add_request3: check_account4: true5: add_account6: ok7: return_add_ok1: a_add_account:添加用户界面:系统管理员7: return_add_ok2: add_request3: check_account5: add_account:系统数据库:添加用户4: true6: ok
(2)删除用户
:系统管理员:删除用户界面:删除用户:用户信息1: a_delete_account2: delete_request3: check_account4: true5: delete_account6: true7: return_delete_ok
:系统管理员1: a_delete_account7: return_delete_ok:删除用户界面:删除用户2: delete_request3: check_account5: delete_account4: true6: true:用户信息
(3)修改用户信息
:系统管理员:修改信息界面:修改用户信息:用户信息1: a_edit_account2: edit_request3: edit_info4: true5: return_edit_ok
1: a_edit_account:系统管理员:修改信息界面5: return_edit_ok2: edit_request3: edit_info:修改用户信息4: true:用户信息
(4)修改票务信息
:系统管理员:系统信息管理界面:票务信息修改:票务信息1: a_manage_info2: request_edit_ticket3: edit_info4: true5: get_info6: info7: return_new_info
:系统信息管理界面1: a_manage_info:系统管理员7: return_new_info2: request_edit_ticket3: edit_info5: get_info:票务信息修改:票务信息4: true6: info
(5)数据备份
:系统管理员:系统信息管理界面:数据备份:系统数据:备份数据1: a_manage_info2: backup_request3: backup_data4: data5: restore_data6: success
1: a_manage_info:系统管理员:系统信息管理界面2: backup_request:数据备份4: data6: success3: backup_data5: restore_data:系统数据:备份数据
6.状态图
6.1 车票状态图
添加车票车票可订选定车票被选定提交订单被预订取消订单完成支付已被取取票成功等待取票
6.2 用户状态图
未注册createAccountEvent已注册关闭帐号帐号被注销
7.组件图
login.jspcustomer.javaregister.jspdata.java火车订票系统java库order_ticket.jsporder.javacancel_order.jspcancel.javaconsult_order.jspconsult.java
8.部署图
路由器防火墙<
9.总结
通过这次对火车订票系统的建模分析,让我对全程城一体化建模的理解更深了。在做系统分析的时候,遇到了很多问题。其中最大的问题就是,系统在实际做的时候跟想的时候差距是很大的。做系统的时候要注意到所有的细节,要把每一步都想的非常清楚,只有这样才能搭建一个合理的系统。
第二篇:火车订票管理系统
学号11~15 选题三:火车票订票管理系统
1.基本要求:为方便管理火车票购买信息,编写一个火车票订票管理系统软件。系统记录必须包括订票人姓名、订票人身份证号、始发站、终到站、票价、席别、订票时间等。2.基本管理功能: [1] [2] 添加:增加一条订票人的记录到管理系统中。
查询:根据订票人身份证查找订票人的相关信息并显示,若找不到也要给出相应提示。[3] [4] 修改:在管理系统中修改订票人的订票记录。
保存:将所有订票信息保存在一个文件中(数据库文件或普通的文本文件)。[5] [6] [7] [8] 读取:从文件中读取已保存了数据。删除:从管理系统中删除一条记录。恢复:能恢复被删除的记录。
统计:(A)统计每天订票张数和总车票金额;(B)统计单价在100元以下、100~400元之间和400元以上的票数总张数及总金额;(C)以表格形式打印所有订票信息。
源代码:
#include
int d;//用于选择(按1继续,按2退出,按他其他报错待完善)int x=1;//用于脱出while循环
string sfz;//身份证号码,用户输入可用到
class ticket {public: string ID;string name;string Sstation;string Tstation;float price;string seat;string time;ticket *next;ticket(string I,string n,string S, string T,float p, string s,string t){ID=I;name=n;Sstation=S;Tstation=T;price=p;seat=s;time=t;} void display();};
void ticket::display(){cout< cout<<“|”< ************欢迎使用 ************”< **请输入选项前的编号**”< **************************************************************”< * 1.添加车票信息 *”< * 2.查询车票信息 *”< * 3.修改车票信息 *”< * 4.删除车票信息 *”< * 5.恢复车票信息 *”< * 6.显示车票信息 *”< * 7.统计车票信息 *”< * 8.保存车票信息 *”< * 9.读取车票信息 *”< * 0.离开 *”< **************************************************************”< ticket *head=NULL,*del=NULL,*p0,*p1,*p2,*p3,*p4;//head数据链表头指针,p0,p1,p2添加函数专用,避免发生错误 int check(string b)//身份证号码作为功能基本辨别数据,应该有一个函数专门检查其是否重复,0 表示重复,1 表示不重复 {ticket *ch;ch=head;int che=1;while(ch!=NULL) {if(ch->ID==b){che=0;ch=NULL;} else {ch=ch->next;} } return che;} int check1(string b)// sbl {ticket *ch;ch=del;int che=1;while(ch!=NULL) {if(ch->ID==b){che=0;ch=NULL;} else {ch=ch->next;} } return che;} int add()//将订票数据保存在一个基础链表中 {system(“cls”);float price;string name,ID,Sstation,Tstation,seat,time; if(head==NULL)//以下为链表为空的情况 { cout<<“=============开始输入订票信息=============”< cout<<“请输入订票人身份证号码:”;cin>>ID;cout<<“请输入订票人姓名:”;cin>>name;cout<<“请输入始发站:”;cin>>Sstation; cout<<“请输入终点站:”;cin>>Tstation; cout<<“请输入票价:”;cin>>price;cout<<“请输入席别:”;cin>>seat;cout<<“请输入订票时间(年月日以“-”隔开):”;cin>>time; head=p1=p2=new ticket(ID,name,Sstation,Tstation,price,seat,time);x=1;while(x){system(“cls”); cout<<“按1继续输入,按2退出-》”; cin>>d; if(d==1) {system(“cls”); p1->next=NULL; cout<<“=============开始输入订票信息=============”< cout<<“请输入订票人身份证号码:”; cin>>ID; if(check(ID)==0){cout<<“身份证号码重复!”< system(“pause”); return 0;} cout<<“请输入订票人姓名:”; cin>>name; cout<<“请输入始发站:”; cin>>Sstation; cout<<“请输入终点站:”; cin>>Tstation; cout<<“请输入票价:”; cin>>price; cout<<“请输入席别:”; cin>>seat; cout<<“请输入订票时间(年月日以“-”隔开):”; cin>>time; p1=new ticket(ID,name,Sstation,Tstation,price,seat,time); p2->next=p1; p2=p1; } else if(d==2) {p1->next=NULL; x=0; } else {cout<<“非法输入!”< } //以上为链表为空的情况 else //以下为链表已有数据,往末尾添加 {p3=head; while(p3->next!=NULL) {p3=p3->next;} x=1; while(x) {system(“cls”); cout<<“=============开始输入订票信息=============”< cout<<“请输入订票人身份证号码:”; cin>>ID; if(check(ID)==0){cout<<“身份证号码重复!”< system(“pause”); return 0;} cout<<“请输入订票人姓名:”; cin>>name; cout<<“请输入始发站:”; cin>>Sstation; cout<<“请输入终点站:”; cin>>Tstation; cout<<“请输入票价:”; cin>>price; cout<<“请输入席别:”; cin>>seat; cout<<“请输入订票时间(年月日以“-”隔开):”; cin>>time; p0=new ticket(ID,name,Sstation,Tstation,price,seat,time); p3->next=p0; p3=p0; system(“cls”); cout<<“按1继续输入,按2退出-》”; cin>>d; if(d==1){x=1;p3->next=NULL;} else if(d==2){p3->next=NULL;x=0;} else {cout<<“非法输入!”< } } //以上为链表已有数据,往末尾添加 return 1;} ticket *search1(string a)//查询函数1,用于输入身份证号码返回一个指针,可在其他部分被使用 {ticket *cha1;cha1=head;x=1;while(x) {if(cha1==NULL){x=0;} else if(cha1->ID==a){x=0;} else {cha1=cha1->next;} } return cha1;} ticket *search_1(string a)//改查1后面都得改,嗯,就这样了(~ ̄▽ ̄)~ {ticket *cha1;cha1=del;x=1;while(x) {if(cha1==NULL){x=0;} else if(cha1->ID==a){x=0;} else {cha1=cha1->next;} } return cha1;} ticket *search2(string b)//查询函数2,返回所要查询结点的前一个结点的指针,在删除部分使用 {ticket *cha2,*cha3;cha2=cha3=head;x=1;while(x) {if(cha2->next==NULL){x=0;} else if(cha2->ID==b){x=0;} else {cha3=cha2; cha2=cha2->next;} } return cha3;} ticket *search_2(string b)//-_-{ticket *cha2,*cha3;cha2=cha3=del;x=1;while(x) {if(cha2->next==NULL){x=0;} else if(cha2->ID==b){x=0;} else {cha3=cha2; cha2=cha2->next;} } return cha3;} void search()//用于用户查询功能(目前只能查询一次,然后退出,待完善){system(“cls”);cout<<“请输入身份证号码:”;cin>>sfz;p3=search1(sfz);if(p3==NULL){cout<<“无相关信息!”< cout<<“|”< cout<<“----------”< p3->display();system(“pause”);} } void display1()// {system(“cls”);ticket *dis;cout< {dis->display(); dis=dis->next; } while(dis!=NULL);} void modify()//修改函数,用于修改数据(目前只可以修改单个订票信息,待完善){system(“cls”);display1();cout<<“请输入要修改信息的身份证号码:”;cin>>sfz;p3=search1(sfz);if(p3==NULL){cout<<“无相关信息!”< while(x) {system(“cls”); cout<<“1.身份证号码 2.姓名 3.始发站 4.终点站 5.票价 6.席别 7.时间”< cout<<“请输入要修改的选项前的编号:”; cin>>d; if(d==1){hui2: cout<<“请输入身份证号码:”; cin>>sfz; if(check(sfz)==0){cout<<“身份证号码重复!”< goto hui2;} p3->ID=sfz; } else if(d==2){cout<<“请输入姓名:”;cin>>p3->name;} else if(d==3){cout<<“请输入始发站:”;cin>>p3->Sstation;} else if(d==4){cout<<“请输入终点站:”;cin>>p3->Tstation;} else if(d==5){cout<<“请输入票价:”;cin>>p3->price;} else if(d==6){cout<<“请输入席别:”;cin>>p3->seat;} else if(d==7){cout<<“请输入时间:”;cin>>p3->time;} else {cout<<“非法输入!”< hui1: cout<<“按1继续输入,按2退出-》”; int d1; cin>>d1; if(d1==1){x=1;} else if(d1==2){x=0;} else {cout<<“非法输入!”< } } } void Darea(ticket *c)//将删除信息储存在另一链表中 {if(del==NULL){del=c;del->next=NULL;} else {ticket *Dar; Dar=del; while(Dar->next!=NULL) {Dar=Dar->next;} Dar->next=c; Dar=c; Dar->next=NULL; } } void Delete()//删除函数将要删除的订票信息移出链表,并将所有删除信息结成另一链表,供恢复使用 {system(“cls”);display1();cout<<“请输入要删除订票信息的身份证号码:”;cin>>sfz;p3=search1(sfz);p4=search2(sfz);if(p3==NULL){cout<<“无相关信息!”< void recover()//恢复函数,用于将已经删除的订票信息恢复 {system(“cls”);ticket *r1,*r2,*r3;if(del==NULL){cout<<“无可恢复订票信息!”< cout<<“|”< cout<<“----------”< r1=del; if(del!=0) do {r1->display(); r1=r1->next; } while(r1!=NULL);hui3: cout<<“请输入要恢复的订票信息的身份证号码:”; cin>>sfz; if(check1(sfz)==1){cout<<“非法输入!”< r2=head; while(r2->next!=NULL){r2=r2->next;} r3=search_1(sfz); r2->next=r3; r3->next=NULL; Rdel(sfz); cout<<“成功恢复!”< system(“pause”); } } void display()//显示基础链表中的所有订票信息 {system(“cls”);ticket *dis;cout< {dis->display(); dis=dis->next; } while(dis!=NULL);system(“pause”);} void count()//统计部分 {system(“cls”);if(head==NULL){cout<<“无可统计信息!”< n=0,n1=0,n2=0,n3=0; float i,m=0,m1=0,m2=0,m3=0; p3=head; while(p3!=NULL) {i=p3->price; n=n+1; m=m+i; if(i<100){n1=n1+1;m1=m1+i;} if(i>=100&&i<=400){n2=n2+1;m2=m2+i;} if(i>400){n3=n3+1;m3=m3+i;} p3=p3->next; } cout< cout<<“|”< cout<<“-------------------”< cout<<“|”< 元 以 下 cout<<“|”< cout<<“|”< cout<<“|”< system(“pause”); } } void save()//保存函数 {system(“cls”);string filename,filename1;ofstream file;cout<<“请输入文件名:”;cin>>filename1;filename1=filename1+“.txt”;filename=“C:Program Files(x86)Microsoft Visual StudioMyProjects火车票订票管理系统savedata”+filename1;//此处路径根据需要自行更改 /*file.open(filename.c_str(),ios::in);//功能失败部分待完善 if(!file){d=1;} else {d=2;} file.close();if(d==1){file.open(filename.c_str(),ios::out); p1=head; x=1; while(x) {if(p1!=NULL) {file< ID< name< Sstation< Tstation< price< seat< time< p1=p1->next;} else {x=0;} } file.close(); cout<<“保存成功”< if(d==2){ */ int i;// cout<<“文件已存在!”< cin>>i; if(i==1) {file.open(filename.c_str(),ios::out); p3=head; x=1; while(x) {if(p3!=NULL) {file< ID< p3=p3->next;} else {x=0;} } file.close(); cout<<“保存成功”< } else if(i==2) {file.open(filename.c_str(),ios::app); p3=head; x=1; while(x) {if(p3!=NULL) {file< ID< p3=p3->next;} else {x=0;} } file.close(); cout<<“保存成功”< } else {cout<<“非法输入!”;goto hui;} //} } int load()//读取函数 {system(“cls”);int i=0,ii=0,j=0;ifstream infile;string filename,filename1;cout<<“请输入文件名:”;cin>>filename1;filename1=filename1+“.txt”;filename=“C:Program Files(x86)Microsoft Visual StudioMyProjects火车票订票管理系统savedata”+filename1;//此处路径根据需要自行更改 infile.open(filename.c_str(),ios::in); if(!infile){cerr<<“读取失败!”< system(“pause”); return-1;} string a[1000];//能力有限,不会动态大小,只能这样了(+﹏+)~ while(!infile.eof()){getline(infile,a[i],'n'); i++;} ticket *L1,*L2;float f;for(ii=0;ii {f=atof(a[ii+4].c_str()); head=new ticket(a[ii],a[ii+1],a[ii+2],a[ii+3],f,a[ii+5],a[ii+6]); head->next=NULL; } else {L1=head; while(L1->next!=NULL) {L1=L1->next;} f=atof(a[ii+4].c_str()); L2=new ticket(a[ii],a[ii+1],a[ii+2],a[ii+3],f,a[ii+5],a[ii+6]); L1->next=L2; L1=L2; L1->next=NULL; } } infile.close();cout<<“读取成功”< void select()//选择功能分支 {system(“cls”);menu();cin>>d; if(d==1){add();select();} if(d==2){search();select();} if(d==3){modify();select();} if(d==4){Delete();select();} if(d==5){recover();select();} if(d==6){display();select();} if(d==7){count();select();} if(d==8){save();select();} if(d==9){load();select();} else if(d==0) {ticket *ex1,*ex2,*ex3,*ex4; ex1=head; while(ex1!=NULL) {ex2=ex1; ex1=ex1->next; delete ex2; } ex3=del; while(ex3!=NULL) {ex4=ex3; ex3=ex3->next; delete ex4; } cout<<“离开!”< exit(0);} else {cout<<“错误!”< int main(){head=NULL;select();return 0;} //较多bug,比如,如果先恢复第一个会导致后面的数据全部丢失,时间能力有限,实在抱歉->_<- /* 头文件 */ #include #include #include char lt[10];//开车时间 char at[10];//到达时间 int count;//票数 }s[N];/* 全局变量 */ int i;//输入计数器 int m=0;//合计计数器 char l[20];//纠错空间 /* 函数声明 */ void INPUT();//输入车次信息 void PRINTF();//输出车次信息 void save();//保存车次信息 void read();//读取车次信息 void search();//查找车次信息 void dingpiao();//订票信息 void tuipiao();//退票信息 void WRONG();//纠错模块 ///////////////////////////////////////////////////////////////////////////////////////主函数 void main(){ int j;do { system(“cls”);//清屏语句 printf(“ *************************************************************n”);printf(“ 欢迎进入火车票务管理系统 n”);printf(“ *************************************************************”);printf(“ n 请输入选项 nn”);printf(“ 1.添加列车信息 nn” “ 2.查找 nn” “ 3.订票 nn” “ 4.退票 nn” “ 5.退出 nn”);printf(“ *************************************************************nn”);printf(“请选择: ”);scanf(“%d”,&j);gets(l); switch(j){ case 1: INPUT();//调用输入模块 break;case 2:search();//调用查找模块 break;case 3:dingpiao();//调用订票模块 break;case 4:tuipiao();//调用退票模块 break;case 5:;break;default:WRONG();break;} }while(j!=5);//判断结束 printf(“n 王志强 1241班 201210913124 n ”);printf(“n--------”); printf(“n 正在退出,请按任意键退出”); printf(“n--------n ”);}//主函数结束 //////////////////////////////////////////////////////////////////////////////////////////输入模块 void INPUT(){ int y; system(“cls”);printf(“n ====================欢迎进入 录入火车时刻信息 界面====================nn”);for(i=0;i printf(“请输入车次号: ”);scanf(“%s”,&s[i].code);//读取车次号 printf(“请输入站数: ”);scanf(“%s”,&s[i].data);//读取站数 printf(“请输入起始站: ”);scanf(“%s”,s[i].lp);//读取起始站 printf(“请输入终点站: ”);scanf(“%s”,s[i].ap);//读取终点站 printf(“请输入开车时间: ”);scanf(“%s”,s[i].lt);//读取开车时间 printf(“请输入到达时间: ”);scanf(“%s”,s[i].at);//读取到达时间 printf(“请输入车票数: ”);scanf(“%d”,&s[i].count);//读取票数 m++; printf(“第%d个信息已经输完.按任意键继续,按 0 结束: ”,m);scanf(“%d”,&y);gets(l);if(y==0){ save();//将结构体信息存盘 PRINTF();//输出输入的列车信息 printf(“n 按任意键返回上级菜单: ”);gets(l);break;} } } ////////////////////////////////////////////////////////////////////////保存模块程序 void save(){ FILE *fp,*fp1;//定义文件指针 if((fp=fopen(“chen.dat”,“wb”))==NULL)//打开文件并判断是否出错 { printf(“创建文件失败!nn”);//打印出错提示 getchar();return;} if((fp1=fopen(“hao.dat”,“wb”))==NULL)//打开文件并判断是否出错 { printf(“创建文件失败!nn”);//打印出错提示 getchar();return;} for(i=0;i printf(“向文件输入数据失败!nn”);fprintf(fp1,“%d”,m);fclose(fp);//关闭文件 fclose(fp1);//关闭文件 } ///////////////////////////////////////////////////////////////////////文件读取模块 void read(){ FILE *fp,*fp1;//定义文件指针 if((fp=fopen(“chen.dat”,“rb”))==NULL)//打开文件,并判断是否出错 { printf(“出错,请检查文件是否存在,按任意键返回住菜单”);//打印出错提示 getchar();} if((fp1=fopen(“hao.dat”,“rb”))==NULL)//打开文件并判断是否出错 { printf(“创建文件失败!nn”);//打印出错提示 getchar();return;} fscanf(fp1,“%d”,&m);fclose(fp1);//关闭文件 for(i=0;i //////////////////////////////////////////////////////////////////////////////查询模块 void search(){ char name1[20];char name2[20];char ii[10];int nk;char no[10];do { system(“cls”);//清屏语句 printf(“nn ====================欢迎进入 查询火车时刻信息 界面====================n”); printf(“n ++++++++++++++++++请选择查找方式++++++++++++++++++nn”); printf(“ ----1.显示所有列车信息 2.按车次查询 3.按始发站查询----n”); printf(“ -----4.按终点站查询 5.返回主菜单----n”); printf(“n 请选择: ”);scanf(“%d”,&nk);//读取查找方式 gets(l);if(nk==5)break; switch(nk){ case 1:PRINTF();//调用打印模块 break;case 2: printf(“请输入车次号:n”);scanf(“%s”,&no);//车次号 break;case 3: printf(“请输入始发站名称:n”);scanf(“%s”,name1);//读取始发站 break;case 4: printf(“请输入终点站名称:n”);scanf(“%s”,name2);//终点站 break;default: WRONG(); break;} read();//调用读取函数 for(i=0;i search();//调用查询模块 printf(“请输入您要订的车票数以回车键结束:”);scanf(“%d”,&n);//读取所订机票数 if(n<0){ system(“cls”);WRONG();//scanf(“%s”,l);//gets(l); break;} if(s[i].count!=0&&s[i].count>=n)//判断是否出错 { s[i].count=s[i].count-n;//调用保存函数 system(“cls”);printf(“订票成功!nn”);printf(“ntt按任意键返回主菜单: ”);scanf(“%s”,l); break;} if(s[i].count break;} printf(“是否继续?(y/n):n”);//判断是否继续订票 scanf(“%s”,a);}while(!strcmp(a,“y”));//判断结束 } ///////////////////////////////////////////////////////////////////////////////退票模块 void tuipiao(){ int n;char a;do { search();//调用查询模块 printf(“请输入您要退的机票数目:n”);scanf(“%d”,&n);//输入所退票数 gets(l);if(n<0)//判断票数是否有效 { WRONG(); break;} s[i].count=s[i].count+n;do { system(“cls”);//借鉴而来的清屏语句,好用! printf(“nn-->退票成功<--”);printf(“nn-->继续 y,返回主菜单 n <--”); a=getchar(); gets(l); if(a!='y'&&a!='n') WRONG(); }while(a!='y'&&a!='n');}while(a!='n');//判断并跳出循环 } ///////////////////////////////////////////////////////////////////////////////////////纠错模块 void WRONG(){ system(“cls”);//借鉴而来的清屏语句,好用! printf(“nn--->!!输入错误,请按任意键返回!!<---”);gets(l);} 程序简介 此程序是采用多文件模块化形式编写;其中自定义头文件中包括了程序中所有调用的函数的声明,以及需要的所有系统头文件。 #include 编写时的分块包括订票块、查询块、输出块,及已订票修改部分等。 订票块则包含了定票流程的所有代码。查询块中是通过车次号码或是到达城市来查询的。输出部分包括了主界面的输出,已定车票信息的输出,所查车次信息输出的头部分。订票修改即是改定过程的编程。 即此程序包括了查询、订票、改定的流程。 编程过程 在编写该程序时,遇到了信息的保存问题。订票时与改定时的录入信息的保存不知如何处理;之后将保存的部分分为链表暂存和文件的保存,在录入信息时是暂存在链表中的,当离开此系统是会提示是否保存信息,若是则保存到文件中。此举方便了票的改定,将数据分割开了,也精简了程序,更便于阅读。 编程模块划分后,编写程序之后的编译时,总是连分文件编译时都无法通过。但是写入的代码经过检查又没有问题,一直困扰着我。直到想起老师教的课本以外的知识,并以一种玩玩试一试的心态用条件编译得以解决此问题。 同时在编程时多次用到“清屏”,保证了输出界面的简洁。 在分出模块后,未完成所有部分的编程时的试运行时出现刚一进入子程序时便会回到主界面,后发现时由于只有输出部分没有输入部分,每当运行完子程序后回到主程序时都会被“清屏”,结果造成编译时正常,到运行时却漏洞百出。 在编程时,由于对文件的处理不熟悉,以及计算机的设置问题没考虑,使用了‘w+’的调用方式,使得在保存数据到文件时出现无法写入文件的现象。在百度,问同学以及问老师后才用‘wb+’和别的方式调用,并写入成功。 这个程序时我学习计算机c以来编写的最大型涵盖面最广的一个程序,没有之一。但同时我也知道这在c语言编程中也只是很小的一个小程序而已,我在这编程中发现:我要学的还有很多,大型程序也不是一个人能写出来的,会一些编程技巧是很有必要的,与人合作是 – 1 – 必须的,当然了,我不是在写诗,而是真的这么觉得。一个人会的有限,专精方向也不同,若能好好的合作肯定可以超过一个人单干。 部分源代码 订票程序 #ifndef TRAINHEAD_H #define TRAINHEAD_H #include“trainhead.h” #endif/*条件编译,作用是防止头文件被重复引用*/ int saveflag = 0;void Bookticket(link l,booklink k){ Node *p[10],*q;char c[2],tnum[10],str[10],str1[10];Book *r,*s;int i = 0,t = 0,flag = 0,dnum;r = k;while(r->next!=NULL) r = r->next;printf(“Input the city you want to go:”);scanf(“%s”,&str);q = l->next;while(q!=NULL) { if(strcmp(q->data.reachcity,str)==0) { p[i] = q; i++; } q = q->next; } printf(“nthe number of record have %dn”,i); printhead(); for(t=0;t printdata(p[t]); if(i==0) printf(“nSorry!Can't find the train for you!n”); else { printf(“ndo you want to book it? scanf(“%s”,c); if(strcmp(c,“Y”)==0||strcmp(c,“y”)==0)/*判断是否订票*/ { s =(Book*)malloc(sizeof(Book)); printf(“nInput your name: ”); scanf(“%s”,&s->data.name); printf(“nInput your ID: ”); scanf(“%s”,&str1); 相应减少*/ strcpy(s->data.num,str1);printf(“nplease input the number of the train:”);scanf(“%s”,tnum);for(t=0;tdata.num,tnum)==0){ if(p[t]->data.ticketnum < 1)/*判断剩余的供订票的票数是否为0*/ { printf(“nsorry,no ticket!”); Sleep(2); return;} printf(“nremain %d ticketsn”,p[t]->data.ticketnum);flag = 1;break;} if(flag==0){ printf(“ninput error”);Sleep(2);return;} printf(“nInput your bookNum: ”);scanf(“%d”,&dnum);p[t]->data.ticketnum=p[t]->data.ticketnum-dnum;/*定票成功则可供订的票数s->data.bookNum = dnum;s->next = NULL;r->next = s;r = s;printf(“nLucky!you have booked a ticket!”);getch(); – 3 – } } } saveflag = 1;使用说明 运行程序时,首先进入到菜单部分,菜单部分提供了菜单显示和输入功能部分。其运行效果如图19.1所示。在主界面上输入数字0——6,实现相应的功能。 图19.1 火车订票系统主界面 主界面输入“1”,进入添加火车信息界面,如图19.2所示。根据屏幕上给出的提示输入火车的车次,起点,终点,出发时间,到达时间,票价和可以订购的票数。 – 4 – 图19.2 输入效果图 主界面输入“2”,可以查询火车信息,可以选择查询的方法有两种,一种是按照车次查询,一种是按照你想要到达的地方查询,运行效果如图19.3所示。 – 5 – 图19.3 查询效果图 当在主界面输入“3”时,进入订票界面,按照提示输入你想要到达的城市,会自动显示出你终点站为你输入城市的信息,根据提示输入你是否决定订票以及你的个人信息,运行效果如图19.4所示。 图19.4 订票效果图 当在主界面输入“4”时,进入修改界面,根据提示输入你要修改的内容,修改模块的运行效果如图19.5所示。 – 6 – 图19.5 修改效果图 当在主界面输入“5”时,可以显示出所有的火车信息,显示模块效果如图19.6所示。 – 7 – 图19.6 显示效果图 当在主界面输入“6”时,进入到保存模块,将录入的火车信息进行保存,并且将订票人的信息也进行保存,存储在指定的磁盘文件中。运行效果如图19.7所示。 图19.7 保存效果图 – 8 – 火车订票系统源码 #include intshoudsave=0;int count1=0,count2=0,mark=0,mark1=0;/*定义存储火车信息的结构体*/ struct train { char num[10];/*列车号*/ char city[10];/*目的城市*/ char takeoffTime[10];/*发车时间*/ char receiveTime[10];/*到达时间*/ int price;/*票价*/ intbookNum;/*票数*/ };/*订票人的信息*/ struct man { charnum[10];/*ID*/ char name[10];/*姓名*/ intbookNum;/*需求的票数*/ };/*定义火车信息链表的结点结构*/ typedefstruct node { struct train data;struct node * next;}Node,*Link;/*定义订票人链表的结点结构*/ typedefstruct people { struct man data;struct people*next;}bookMan,*bookManLink;/* 初始界面*/ voidprintInterface(){ puts(“********************************************************”);puts(“* Welcome to use the system of booking tickets *”);puts(“********************************************************”);puts(“* You can choose the operation: *”);puts(“* 1:Insert a train information *”);puts(“* 2:Inquire a train information *”);puts(“* 3:Book a train ticket *”);puts(“* 4:Update the train information *”);puts(“* 5:Advice to you about the train *”);puts(“* 6:save information to file *”);puts(“* 7:quit the system *”);puts(“********************************************************”);} /*添加一个火车信息*/ voidInsertTraininfo(Link linkhead){ struct node *p,*r,*s;charnum[10]; r = linkhead; s = linkhead->next;while(r->next!=NULL) r=r->next;while(1) { printf(“please input the number of the train(0-return)”);scanf(“%s”,num);if(strcmp(num,“0”)==0)break; /*判断是否已经存在*/ while(s) { if(strcmp(s->data.num,num)==0) { printf(“the train '%s'has been born!n”,num);return; } s = s->next; } p =(struct node*)malloc(sizeof(struct node));strcpy(p->data.num,num);printf(“Input the city where the train will reach:”);scanf(“%s”,p->data.city);printf(“Input the time which the train take off:”);scanf(“%s”,p->data.takeoffTime);printf(“Input the time which the train receive:”);scanf(“%s”,&p->data.receiveTime);printf(“Input the price of ticket:”);scanf(“%d”,&p->data.price);printf(“Input the number of booked tickets:”);scanf(“%d”,&p->data.bookNum);p->next=NULL;r->next=p; r=p;shoudsave = 1; } } /*打印火车票信息*/ voidprintTrainInfo(struct node*p){ puts(“nThe following is the record you want:”);printf(“>>number of train: %sn”,p->data.num);printf(“>>city the train will reach: %sn”,p->data.city);printf(“>>the time the train take off: %snthe time the train reach: %sn”,p->data.takeoffTime,p->data.receiveTime);printf(“>>the price of the ticket: %dn”,p->data.price);printf(“>>the number of booked tickets: %dn”,p->data.bookNum);} struct node * Locate1(Link l,charfindmess[],char numorcity[]){ Node*r;if(strcmp(numorcity,“num”)==0) { r=l->next;while(r) { if(strcmp(r->data.num,findmess)==0)return r; r=r->next; } } else if(strcmp(numorcity,“city”)==0) { r=l->next;while(r) { if(strcmp(r->data.city,findmess)==0)return r; r=r->next; } } return 0;} /*查询火车信息*/ voidQueryTrain(Link l){ Node *p;intsel;char str1[5],str2[10];if(!l->next) { printf(“There is not any record!”);return; } printf(“Choose the way:n>>1:according to the number of train;n>>2:according to the city:n”);scanf(“%d”,&sel);if(sel==1) { printf(“Input the the number of train:”);scanf(“%s”,str1); p=Locate1(l,str1,“num”);if(p) { printTrainInfo(p); } else { mark1=1;printf(“nthe file can't be found!”); } } else if(sel==2) { printf(“Input the city:”);scanf(“%s”,str2); p=Locate1(l,str2,“city”);if(p) { printTrainInfo(p); } else { mark1=1;printf(“nthe file can't be found!”); } } } /*订票子模块*/ voidBookTicket(Link l,bookManLink k){ Node*r[10],*p;charch,dem;bookMan*v,*h;int i=0,t=0;charstr[10],str1[10],str2[10]; v=k;while(v->next!=NULL) v=v->next;printf(“Input the city you want to go: ”);scanf(“%s”,&str); p=l->next;while(p!=NULL) { if(strcmp(p->data.city,str)==0) { r[i]=p;i++; } p=p->next; } printf(“nnthe number of record have %dn”,i);for(t=0;t { printf(“ndo you want to book it?<1/0>n”);scanf(“%d”,&ch);if(ch == 1) { h=(bookMan*)malloc(sizeof(bookMan));printf(“Input your name: ”);scanf(“%s”,&str1);strcpy(h->data.name,str1);printf(“Input your id: ”);scanf(“%s”,&str2);strcpy(h->data.num,str2);printf(“Input your bookNum: ”);scanf(“%d”,&dem);h->data.bookNum=dem;h->next=NULL;v->next=h; v=h;printf(“nLucky!you have booked a ticket!”);getch();shoudsave=1; } } } bookMan*Locate2(bookManLinkk,charfindmess[]){ bookMan*r; r=k->next;while(r) { if(strcmp(r->data.num,findmess)==0) { mark=1;return r; } r=r->next; } return 0;} /*修改火车信息*/ voidUpdateInfo(Link l){ Node*p;charfindmess[20],ch;if(!l->next) { printf(“nthere isn't record for you to modify!n”);return; } else { QueryTrain(l);if(mark1==0) { printf(“nDo you want to modify it?n”);getchar();scanf(“%c”,&ch);if(ch=='y'); { printf(“nInput the number of the train:”);scanf(“%s”,findmess); p=Locate1(l,findmess,“num”);if(p) { printf(“Input new number of train:”);scanf(“%s”,&p->data.num);printf(“Input new city the train will reach:”);scanf(“%s”,&p->data.city);printf(“Input new time the train take off”);scanf(“%s”,&p->data.takeoffTime);printf(“Input new time the train reach:”);scanf(“%s”,&p->data.receiveTime);printf(“Input new price of the ticket::”);scanf(“%d”,&p->data.price);printf(“Input new number of people who have booked ticket:”);scanf(“%d”,&p->data.bookNum);printf(“nmodifying record is sucessful!n”);shoudsave=1; } else printf(“tttcan't find the record!”); } } else mark1=0; } } /*系统给用户的提示信息*/ voidAdvicedTrains(Link l){ Node*r;charstr[10];int mar=0; r=l->next;printf(“Iuput the city you want to go: ”);scanf(“%s”,str);while(r) { if(strcmp(r->data.city,str)==0&&r->data.bookNum<200) { mar=1;printf(“nyou can select the following train!n”);printf(“nnplease select the fourth operation to book the ticket!n”);printTrainInfo(r); } r=r->next; } if(mar==0)printf(“ntttyou can't book any ticket now!n”);} /*保存火车信息*/ voidSaveTrainInfo(Link l){ FILE*fp; Node*p;int count=0,flag=1;fp=fopen(“c: rain.txt”,“wb”);if(fp==NULL) { printf(“the file can't be opened!”);return; } p=l->next;while(p) { if(fwrite(p,sizeof(Node),1,fp)==1) { p=p->next;count++; } else { flag=0;break; } } if(flag) { printf(“the number of the record which have been saved is %dn”,count);shoudsave=0; } fclose(fp);} /*保存订票人的信息*/ voidSaveBookmanInfo(bookManLink k){ FILE*fp;bookMan*p;int count=0,flag=1;fp=fopen(“c:man.txt”,“wb”);if(fp==NULL) { printf(“the file can't be opened!”);return; } p=k->next;while(p) { if(fwrite(p,sizeof(bookMan),1,fp)==1) { p=p->next;count++; } else { flag=0;break; } } if(flag) { printf(“the number of the record which have been saved is %dn”,count);shoudsave=0; } fclose(fp);} int main(){ FILE*fp1,*fp2; Node*p,*r;char ch1,ch2; Link l;bookManLink k;bookMan*t,*h;intsel; l=(Node*)malloc(sizeof(Node));l->next=NULL; r=l; k=(bookMan*)malloc(sizeof(bookMan));k->next=NULL; h=k; fp1=fopen(“c: rain.txt”,“ab+”);if((fp1==NULL)) { printf(“can't open the file!”);return 0; } while(!feof(fp1)) { p=(Node*)malloc(sizeof(Node));if(fread(p,sizeof(Node),1,fp1)==1) { p->next=NULL;r->next=p; r=p;count1++; } } fclose(fp1); fp2=fopen(“c:man.txt”,“ab+”);if((fp2==NULL)) { printf(“can't open the file!”);return 0; } while(!feof(fp2)) { t=(bookMan*)malloc(sizeof(bookMan));if(fread(t,sizeof(bookMan),1,fp2)==1) { t->next=NULL;h->next=t; h=t;count2++; } } fclose(fp2);while(1) { system(“cls”);printInterface();printf(“please choose the operation: ”);scanf(“%d”,&sel);system(“cls”);if(sel==8) { if(shoudsave==1) { getchar();printf(“nthe file have been changed!do you want to save it(y/n)?n”);scanf(“%c”,&ch1);if(ch1=='y'||ch1=='Y') { SaveBookmanInfo(k);SaveTrainInfo(l); } } printf(“nThank you!You are welcome toon”);break; } switch(sel) { case 1 : InsertTraininfo(l);break;case 2 : QueryTrain(l);break;case 3 : BookTicket(l,k);break;case 4 : UpdateInfo(l);break;case 5 : AdvicedTrains(l);break;case 6 : SaveTrainInfo(l);SaveBookmanInfo(k);break;case 7 : return 0; } printf(“nplease press any key to continue.......”);getch(); } return 0;}第三篇:火车订票系统c++程序
第四篇:火车订票管理系统主程序流程
第五篇:C语言编程---火车订票系统源代码