第一篇:一个简单的火车票售票管理系统
一个简单的火车票售票管理系统(原创)#include
typedef struct time
//时间类型 {
int x,y,z;
//分别对应年,月,日 }TIME;
typedef struct cnode
//票信息类型 {
int no;
//票号
int id;
//购票人证件号
TIME date;
//购票日期
struct cnode *next;}CNODE;
typedef struct tnode
//车次信息类型 {
char data;
//车次编号
struct tnode *lchild,*rchild;
CNODE *head;}TNODE;
void create();
//按车次建立二叉排序树
void insert(int);
//增加新的车次(二叉排序树的插入)void del();
//取消车次(二叉排序树节点删除)
void inorder(TNODE *);
//中序遍历车次二叉排序树(仅显示车次信息)void inorder_all(TNODE *);
//中序遍历车次二叉排序树(显示车次及售票信息)void preorder(TNODE *);
//先序遍历车次二叉排序树(仅显示车次信息)TNODE *search();
//按车次编号搜索
CNODE *insert_c(CNODE *);
//插入新的售票信息(单张)CNODE *insert_c_more(CNODE *);
//插入新的售票信息(批量)CNODE *del_c(CNODE *,CNODE *);
//退票处理(删除售票信息)CNODE *search_c(CNODE *,int);
//按票号查询
void search_c_id(CNODE *,int);
//按购票人证件号搜索(限定某车次)void search_c_id_all(TNODE *,int);
//按购票人证件号搜索(所有车次)void search_date(CNODE *,TIME);
//按购票日期搜索(限定某车次)void search_date_all(TNODE *,TIME);
//按购票日期搜索(所有车次)void print_c(CNODE *);
//输出售票纪录(单张)void print_c_all(CNODE *);
//输出售票纪录(批量)
TNODE *root=NULL;
void main(){
int i,func,no,ok;
TNODE *t;
CNODE *c;
TIME d;
printf(“nnn”);
for(i=0;i<15;i++)printf(“=”);
printf(“列车售票信息管理系统”);
for(i=0;i<15;i++)printf(“=”);
printf(“n”);
printf(“t1.车次信息管理n”);
printf(“t2.售票记录管理n”);
printf(“t3.售票记录查询n”);
printf(“t4.售票记录一览n”);
printf(“t5.退出系统n”);
for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: printf(“nn车次信息管理>>>>n”); for(i=0;i printf(“nt1.增加新的车次”); printf(“nt2.取消车次”); printf(“nt3.返回上级菜单n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: create(); printf(“n售票信息更新成功!nn”); break; case 2:del();break; case 3:main();break; default:printf(“n[错误]功能号输入有误!请重新输入!”); } break; case 2: printf(“nn售票记录管理>>>>n”); for(i=0;i printf(“nt1.增加新的售票记录”); printf(“nt2.退票”); printf(“nt3.返回上级菜单n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: t=search(); if(t!=NULL)t->head=insert_c_more(t->head); break; case 2: t=search(); printf(“需要退票的票号:”); scanf(“%d”,&no); t->head=del_c(t->head,search_c(t->head,no)); break; case 3:main();break; default:printf(“n[错误]功能号输入有误!请重新输入!”); } break; case 3: printf(“nn售票记录查询>>>>n”); for(i=0;i printf(“nt1.按票号搜索”); printf(“nt2.按购票者证件号搜索”); printf(“nt3.按购票日期搜索”); printf(“nt4.返回上级菜单n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: t=search(); if(t!=NULL){ printf(“n请输入您所要查询的票号:”); scanf(“%d”,&no); c=search_c(t->head,no); if(c==NULL)printf(“[错误]没有该票号的纪录!该票还未售出或为废票!自动返回上级菜单n...”);} break; case 2: printf(“n请输入您所要查询的购票者证件号:”); scanf(“%d”,&no); search_c_id_all(root,no); printf(“搜索完毕!自动返回上级菜单n...”); break; case 3: do{ printf(“n请输入您所要查询的日期(格式: yy-mm-dd):”); scanf(“%d-%d-%d”,&d.x,&d.y,&d.z); if(d.y<13&&d.y>0){ if(d.y==1||d.y==3||d.y==5||d.y==7||d.y==8||d.y==10||d.y==12) if(d.z<32&&d.z>0)ok=1; else if(d.z==2) if(d.z<30&&d.z>0)ok=1; else if(d.z<31&&d.z>0)ok=1; } else ok=0; if(!ok)printf(“n[错误]日期输入有误!请重新输入!”); }while(!ok); printf(“n指定车次吗?(1->是,0->否):”); scanf(“%d”,&ok); if(ok)search_date(search()->head,d); else search_date_all(root,d); break; case 4:main();break; default:printf(“n[错误]功能号输入有误!自动返回上级菜单n...”); } break; case 4: printf(“nn售票记录一览>>>>n”); for(i=0;i printf(“nt1.仅浏览车次”); printf(“nt2.指定车次已售票记录”); printf(“nt3.所有车次已售票记录”); printf(“nt4.测试:先序遍历车次”); printf(“nt5.返回上级菜单n”); for(i=0;i printf(“n请选择您所需要的功能:”); fflush(stdin); scanf(“%d”,&func); switch(func){ case 1: printf(“n+++仅浏览车次n”); if(root==NULL)printf(“[错误]无车次纪录!”); else{inorder(root);printf(“n”);} break; case 2: printf(“n+++指定车次已售票记录n”); t=search(); if(t!=NULL){ print_c_all(t->head); printf(“n”); } break; case 3: printf(“n+++所有车次已售票记录n”); if(root==NULL)printf(“[错误]无车次纪录!”); else{inorder_all(root);printf(“n”);} break; case 4: printf(“n+++测试:先序遍历车次n”); if(root==NULL)printf(“[错误]无车次纪录!”); else{preorder(root);printf(“n”);} break; case 5:main();break; default:printf(“n[错误]功能号输入有误!自动返回上级菜单n...”); } break; case 5:exit(0); default:printf(“n[错误]功能号输入有误!请重新输入!”); } main();} void inorder_all(TNODE *ptr){ if(ptr!=NULL) { inorder_all(ptr->lchild); printf(“%d:n”,ptr->data); print_c_all(ptr->head); printf(“n”); inorder_all(ptr->rchild); } } void inorder(TNODE *ptr){ if(ptr!=NULL) { inorder(ptr->lchild); printf(“%dt”,ptr->data); inorder(ptr->rchild); } } void preorder(TNODE *ptr){ if(ptr!=NULL) { printf(“%dt ”,ptr->data); preorder(ptr->lchild); preorder(ptr->rchild); } } void print_c(CNODE *tkt){ if(tkt!=NULL)printf(“t%dt%dt%d-%d-%dn”,tkt->no,tkt->id,tkt->date.x,tkt->date.y,tkt->date.z);} void print_c_all(CNODE *head){ int i=0,j=0; if(head==NULL){printf(“n记录为空!n”);return;} for(i=0;i printf(“nNOt票号t购票者证件号t购票日期(年-月-日)n”); for(i=0;i for(j=0;head!=NULL;j++){ printf(“n%d”,j); print_c(head); head=head->next; } printf(“n”); for(i=0;i printf(“n总计 %d 条记录n”,j); for(i=0;i printf(“n”);} void create(){ int n,i;int k[MAX];printf(“n您所希望增加车次的数量:”);scanf(“%d”,&n);for(i=0;i printf(“新增第%d列车次:”,i+1); scanf(“%d”,&k[i]);} for(i=0;i insert(k[i]);} void insert(int m){ TNODE *p1,*p2;if(root==NULL) { root=(TNODE *)malloc(sizeof(TNODE)); root->data=m; root->lchild=root->rchild=NULL; root->head=NULL; } else { p1=root; while(m!=p1->data) { if((m data)&&(p1->lchild!=NULL))p1=p1->lchild; else if((m>p1->data)&&(p1->rchild!=NULL))p1=p1->rchild; else if((m data)&&(p1->lchild==NULL)) { p2=(TNODE *)malloc(sizeof(TNODE)); p2->data=m; p2->lchild=p2->rchild=NULL; p2->head=NULL; p1->lchild=p2; return; } else if((m>p1->data)&&(p1->rchild==NULL)) { p2=(TNODE *)malloc(sizeof(TNODE)); p2->data=m; p2->lchild=p2->rchild=NULL; p2->head=NULL; p1->rchild=p2; return; } } printf(“n[错误]未能成功增加车次%d,车次号 %d 已存在!”,m,m); } } TNODE *search(){ int key; TNODE *p; p=root; printf(“n输入您所要查找的车次编号:”); scanf(“%d”,&key); while(p!=NULL&&p->data!=key){ if(key data){p=p->lchild;} else if(key>p->data){p=p->rchild;} } if(p==NULL)printf(“n该车次不存在!”); return(p);} void del(){ int key; TNODE *p1,*p2,*p3,*temp; p1=p2=root; p3=temp=NULL; printf(“n请输入您想要取消的车次编号:”); scanf(“%d”,&key); while(p2!=NULL&&p2->data!=key){ if(key data){p1=p2;p2=p2->lchild;} else if(key>p2->data){p1=p2;p2=p1->rchild;} } if(p2==NULL){printf(“n[错误]该车次不存在!返回上级菜单n...”);return;} else if(p2->lchild==NULL&&p2->rchild==NULL) { if(p1->lchild==p2)p1->lchild=NULL; if(p1->rchild==p2)p1->rchild=NULL; temp=p2; if(root==p2){temp=root;root=NULL;} } else{ if(p2->rchild==NULL){ temp=p2->lchild; p2->data=temp->data; p2->lchild=temp->lchild; p2->rchild=temp->rchild; } else if(p2->lchild==NULL){ temp=p2->rchild; p2->data=temp->data; p2->lchild=temp->lchild; p2->rchild=temp->rchild; } else{ p3=p2; temp=p2->lchild; while(temp->rchild!=NULL){p3=temp;temp=temp->rchild;} p2->data=temp->data; if(p3==p2)p3->lchild=temp->lchild; else p3->rchild=temp->lchild; } } free(temp); printf(“车次 %d 已取消!nn”,key);} CNODE *insert_c(CNODE *head){ CNODE *k,*p; k=(CNODE *)malloc(sizeof(CNODE)); do{ printf(“n车票编号:”); scanf(“%d”,&k->no); p=search_c(head,k->no); if(p!=NULL)printf(“n[错误]该票已被购买!请重新选择!n”); }while(p!=NULL); printf(“购票者证件号:”); scanf(“%d”,&k->id); printf(“购票日期(格式:yy-mm-dd):”); scanf(“%d-%d-%d”,&k->date.x,&k->date.y,&k->date.z); k->next=head; head=k; return(head);} CNODE *insert_c_more(CNODE *head){ int n,i; printf(“n请输入批量新增售票记录数:”); fflush(stdin); scanf(“%d”,&n); for(i=0;i printf(“n售票记录更新成功!n”); return(head);} CNODE *search_c(CNODE *head,int id){ CNODE *temp,*s; s=temp=head; while(temp!=NULL&&temp->id!=id){s=temp;temp=temp->next;} print_c(temp); if(temp!=NULL)return(s); else return NULL;} void search_c_id(CNODE *head,int id){ CNODE *s,*head_s; s=head_s=NULL; if(head==NULL)printf(“无该证件号纪录!n”); while(head!=NULL){ if(head->id==id){ s=(CNODE *)malloc(sizeof(CNODE)); s->no=head->no;s->id=head->id;s->date=head->date; s->next=head_s;head_s=s; } head=head->next; } print_c_all(head_s); printf(“n”);} void search_c_id_all(TNODE *ptr,int id){ if(ptr!=NULL){ search_c_id_all(ptr->lchild,id); printf(“n车次:%dn”,ptr->data); search_c_id(ptr->head,id); search_c_id_all(ptr->rchild,id); } } void search_date(CNODE *head,TIME t){ CNODE *s,*head_s; s=head_s=NULL; while(head!=NULL){ if(t.x==head->date.x) if(t.y==head->date.y) if(t.z==head->date.z) { s=(CNODE *)malloc(sizeof(CNODE)); s->no=head->no;s->id=head->id;s->date=head->date; s->next=head_s;head_s=s; } head=head->next; } print_c_all(head_s); printf(“n”);} void search_date_all(TNODE *ptr,TIME t){ if(ptr!=NULL){ search_date_all(ptr->lchild,t); printf(“n车次:%dn”,ptr->data); search_date(ptr->head,t); search_date_all(ptr->rchild,t); } } CNODE *del_c(CNODE *head,CNODE *p){ CNODE *temp; if(p==NULL)printf(“[错误]该票未售出或为废票!返回上级菜单n...”); else if(p==head){head=NULL;free(p);} else{ temp=p->next; p->next=temp->next; free(temp); } return(head);} 三、需求规格说明书 三、需求规格说明书 1.引言...........................................................................................................................1 1.1编写目的.............................................................................................................1 1.2项目背景.............................................................................................................2 1.3定义....................................................................................................................2 1.4参考资料.............................................................................................................2 2.任务概述....................................................................................................................2 2.1目标....................................................................................................................2 2.2运行环境.............................................................................................................3 2.3条件与限制..........................................................................................................3 3.数据描述....................................................................................................................3 3.1静态数据.............................................................................................................3 3.2动态数据.............................................................................................................3 3.3数据库介绍..........................................................................................................4 3.4数据词典.............................................................................................................4 3.5数据采集.............................................................................................................8 4.功能需求....................................................................................................................8 4.1功能划分.............................................................................................................8 4.2功能描述.............................................................................................................9 5.性能需求....................................................................................................................9 5.1数据精确度..........................................................................................................9 5.2时间特性.............................................................................................................9 5.3适应性.................................................................................................................9 6.运行需求....................................................................................................................9 6.1用户界面.............................................................................................................9 6.2硬件接口...........................................................................................................10 6.3软件接口...........................................................................................................10 6.4故障处理...........................................................................................................10 7.其它需求..................................................................................................................10 1.引言 1.1编写目的 本需求分析报告的目的是规范化本软件的编写,旨在于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,同时提出了本火车售票系统的软件开发过程,便于程 三、需求规格说明书 序员与客户之间的交流、协作,并作为工作成果的原始依据,同时也表明了本软件的共性,以期能够获得更大范围的应用。本文档供项目经理、设计人员、开发人员参考。 1.2项目背景 a.项目的委托单位:中国铁路局 b.开发单位:xx大学 c.主管部门:计算机学院 d.软件名称:火车售票系统 e.软件开发者: 1.3定义 a.铁路售票应用系统软件:基本元素为构成铁路售票及相关行为所必须的各种部分。 b.需求:用户解决问题或达到目标所需的条件或功能;系统或系统部件要满足合同、标准,规范或其它正式规定文档所需具有的条件或权能。 c.需求分析:包括提炼,分析和仔细审查已收集到的需求,以确保所有的风险承担者都明其含义并找出其中的错误,遗憾或其它不足的地方。 d.模块的独立性:是指软件系统中每个模块只涉及软件要求的具体的子功能,而和软件系统中其他的模块的接口是简单的。 1.4参考资料 a.《实用软件工程》(第二版)郑人杰,殷人昆,陶永雷。清华大学出版社,1997。b.《JAVA网络高级编程》金勇华,曲俊生。人民邮电出版社,2001。 c.《JBUILDER培训教程》Borland software corporation。机械工业出版社,2002。 2.任务概述 2.1目标 (1)完善目前火车售票系统,使之能跟上时代的发展。同时通过实践来提高自己的动手能 三、需求规格说明书 (2)应用范围:理论上能够实现于铁路部门的售票系统,其目的在于在原有的系统基础使得火车售票便捷化,以期实现完善日常生活中火车售票的各种缺陷。 (3)可实现旅客对于火车票的查询与购买功能,售票员则可实现查询、添加和删除等功能;对于所查询的车次结果提供列表显示输出;有一定的安全机制,普通旅客不能对车次信息随意删改,只有授权的售票员可通过密码识别进行维护。 2.2运行环境 操作系统:Microsoft Windows 2000 Advanced Server 支持环境:IIS 5.0 数 据 库:Microsoft SQL Server 2000 2.3条件与限制 一个更完善的火车票售票系统,应提供更为便捷与强大的查询购买功能,如相应的网络操作及服务,由于开发时间和计算机数量有限,该系统并未提供这一功能,对于信息的保护手段仅限制于设置用户级别,以记名提供数据文件的备份,比较简单,不能防止恶意的破坏,安全性能有待进一步完善。 3.数据描述 3.1静态数据 火车票:列车车号 (int SerialNumber) 列车始发时间(struct time SetOut) 列车始发站(char DeparturePoint) 列车终点站(char TerminalPoint) 票务:列车车号 (int SerialNumber) 已售出车票票数(int FixedNumber) 额定载量(int FixNumber) 售票员:用户名(char name) 密码(char password)3.2动态数据 输入数据:根据界面提示,键盘输入操作; 查询方式:查询车次、查询始发站; 三、需求规格说明书 旅客购买时的票务信息,售票员添加、购票、退票时的票务信息; 售票员备份数据恢复所需的数据备份文件; 售票员操作需密码,旅客操作受限; 输出信息:查询车次确定的数据库记录的子集; 统计结果; 车次信息录入、删除(成功或失败); 车次信息查询、购买的操作结果; 数据备份输出的数据备份文件; 内部数据:查询操作建立的索引; 3.3数据库介绍 数据库采用Microsoft Access数据库 3.4数据词典 《火车售票系统》的总体功能如下: 车票的售出; 车票的退还; 车票信息的查询; 车票的增删改; 售票员查询统计车票信息; 售票系统数据备份; 售票管理者口令修改; 1.售票员登陆系统:(1)数据流图 售票退票选择检验错误售票员选择用户名密码身份验证售票员信息密码正确登陆系统选择选择选择授权信息表查询录入新的班次信息 (2)数据词典 数据源点及汇点描述: ① 名称:售票员 简要描述:管理售票员信息 有关数据流:用户名、密码、系统选择:售票系统、退票系统、查询系统、录入信息系统 数目:1 三、需求规格说明书 加工逻辑词条描述: ① 加工名:身份检验 加工编号:1 简要描述:检验用户身份 输入数据流:用户名、密码 输出数据流:密码正确、身份验证错误 加工逻辑: IF 用户名为空 THEN 发出“用户名为空错误” ELSE IF 密码为空 THEN 发出“密码为空错误” ELSE IF 用户名和密码不符 THEN 发出“用户名和密码不匹配错误” ENDIF ENDIF ENDIF ENDIF 数据流名词条描述: ① 数据流名:用户名 说明:售票员姓名 数据流来源:售票员 数据流去向:身份检验 数据流组成:用户名=字符型字符串 ② 数据流名:密码 说明:与用户名相匹配的密码 数据流来源:售票员 数据流去向:身份检验 数据流组成:密码=短整型字符串 每个数据量流通量: ③ 数据流名:出错信息 说明:用于指示身份验证错误的信息 数据流来源:身份检验 数据流去向:售票员 数据流组成:出错信息=任意字符串 ④ 数据流名:系统名称 说明:系统的名称 数据流来源: 数据流去向:选择 数据流组成: 数据文件词条描述: ① 数据文件名:授权信息表 简述:存放售票员信息 输入数据: 输出数据:售票员信息 数据文件组成:授权信息表由“售票员信息”组成 三、需求规格说明书 2.售票员相关操作(售票、退票、查询、录入) 票务信息表车票信息车票信息售票退票选择检验错误售票员选择用户名密码身份验证售票员信息密码正确登陆系统选择选择选择授权信息表查询车票信息录入新的班次信息车票信息列车信息表 (2):数据词典: 数据源点及汇点描述: 1 名称:售票员 ○简要描述:管理售票员信息 有关数据流:用户名、密码 数目:1 加工逻辑词条描述: 1加工名:身份检验 ○加工编号:1 简要描述:检验用户身份 输入数据流:用户名、密码 输出数据流:密码正确、身份验证错误 2加工名:售票 ○加工编号:2 简要描述:根据所读入的操作信息,售出火车票 输入数据流:操作信息,火车票信息 输出数据流:火车票信息 加工逻辑:根据所读入的操作信息,售出火车票 数据流名词条描述: 数据流名:用户名 ○ 三、需求规格说明书 说明:售票员的姓名 数据流来源:售票员 数据流去向:身份检验 数据流组成:用户名=字符型字符串 2数据流名:密码 ○说明:与职工名称相匹配的密码 数据流来源:售票员 数据流去向:身份检验 数据流组成:密码=短整型字符串 每个数据量流通量: 3数据流名:车票信息 ○说明:车票信息 数据流来源:售票员 数据流去向:列车信息表 数据文件词条描述: ① 数据文件名:列车信息表 简述:车票信息 输入数据:车票信息 输出数据: 数据文件组成:列车信息表由“车票信息”组成 存储方式:关键码 存取频率:频繁 2数据文件名:票务信息表 ○简述:票务信息 输入数据:票务信息 输出数据: 数据文件组成:票务信息表由“列车号、已售票、剩余票”组成 存储方式:关键码 存取频率:频繁 3.旅客查询购票过程:(1)数据流图 三、需求规格说明书 旅客 登录系统选择选择选择选择订票退票查询 (2)数据词典: ● 数据源点及汇点描述: 名称:旅客 简要描述:订票,退票,查询 有关数据流:系统选择:订票系统、退票系统、查询系统 ●数据流名词条描述: ⑤ 数据流名:系统名称 说明:系统的名称 数据流来源: 数据流去向:选择 数据流组成: 3.5数据采集 数据采集采用键盘输入 4.功能需求 4.1功能划分 该软件具有如下主要功能: 1.浏览功能 2.查询功能 3.添加功能 4.修改功能 5.删除功能 三、需求规格说明书 6.授权功能 4.2功能描述 1.浏览功能 列出当前数据库文件中车票的所有记录 可选定一项纪录,显示说有域 2.查询功能 车次信息匹配查询 始发站信息匹配查询 3.添加功能 增加一条车票的信息 4.修改功能 修改某一已存在的记录内容,提供确认机制 5.删除功能 删除一条记录,提供确认机制 6.授权功能 授权票务管理人员修改数据的权限 5.性能需求 5.1数据精确度 查询时应保证查全率,所有在相应域中包含查询车次的记录都应能查到,同时保证查准率。 5.2时间特性 一般操作的相应时间应在1~2秒内 5.3适应性 满足运行环境在允许操作系统之间的安全转换和雨其它又能够用软件的独立运行要求。 6.运行需求 6.1用户界面 采取对话框方式,多功能窗口运行 三、需求规格说明书 6.2硬件接口 (1)硬件接口:支持x86系列PC机 (2)网络硬件接口要求:现实中要求具有高速以太网组网一实现联网销售,但是在理论实验验证软件本身的目的来看,无需网络通讯接口。 6.3软件接口 运行于Windows2000及更高版本并装有JAVA虚拟机的操作系统之上。 6.4故障处理 正常使用时不用出错,对于用户的输入错误应及时给出适当的改正信息提示,若运行遇到不可恢复的系统错误,也必须保证数据库完好无损。 7.其它需求 (1)可用性:该软件也可以通过单步跟踪的操作进行检查处理。 (2)安全性:由于软件运行数据放在数据库中,所以参数不容易被错改、破坏,万一参数受到破坏也不会影响源程序。 (3)可维护性:该软件利用数据库进行编程,系统结构由程序基本确定,大量的参数及文本内容全部放于数据库中。修改、更新数据只要在数据库进行修改添加,而不需要对系统结构进行修改,这样系统维护性、升级都十分方便。 (4)兼容性:由于尚未测试,故无法对兼容性进行评析。 二.需求分析 经过对程序设计题目的分析可知,整个程序的设计实现大致分为八个模块,每一个模块对应一个函数。在这些函数当中,添加车次数据函数、售票函数、查询总额函数的实现严格按照题目的要求,而显示时间函数和显示车次函数属于附加功能。读取文件函数和保存信息函数对其它函数的实现起辅助作用,主函数及菜单函数控制程序的整体运行。 1.添加车次函数 主要实现程序最初运行时车次的录入 2.旅客买票函数 实现的功能是按照旅客所需车次几所购买车票的数目 3.查询车票总额 按照题目的具体要求实现的是总额的查询 4.显示函数 实现的是显示目前所有的有效车次信息 除上面介绍的功能之外,程序还具有显示当地时间,以及退出功能,可以在程序的一次运行当中循环执行所有的功能,并根据需要终止程序的执行。 每一个车次都包含车次、日期,始发、终点以及所受票数和所需费用,在程序当中,将车次类型定义为结构体类型,添加的车次信息直接写入E盘的train.txt文件中,其它函数每次对车次记录的访问,其数据来源都是train.txt文件,这样做不但可以保证学生数据的一致性,而且可以对车次数据进行永保存,保证每次运行程序都可以采用原来的数据 近年来,中国乃至世界的人口急剧增加,人口流动量也随之增加,火车作为一种便捷且相对 比较便宜的交通工具也受到广大出行者的青睐,为了减轻铁道部售票的压力,特此编写此程序,便于乘客在网上购票。 3.1.2 软件项目概述 本系统拥有四大功能,分别是查询、订票、改签和退票。在使用不能系统之前,用户必须注 册用户名,用户名必须包括乘客的身份证号,这样可以实行实名制购票,防止在购票高峰,非法 分子以高价倒卖火车票,以此来保证乘客的利益。用户在利用用户名登陆本系统以后,方可经行 查询、订票、改签和退票的相关操作。其中,查询允许乘客对自己所需乘坐的列车经行查询,来 判断是否有票,如果有票,乘客则可以选择订票,订票以后,用户的信息将被修改,用户信息将 会添加刚才购买的火车票的列车车次以及起始地和目的地。如果乘客已经购票,需要换票,则必 须先查询是否有需要换的票,如果有票,则可以经行换票操作,同样,用户信息将也会被修改。 当乘客已经订票,需要退票,点击退票,则可以退票,但同时会弹出 需要用户支付手续费的窗 口,用户支付完手续费后,退票成功,用户信息将被修改,推掉的车票对应的列车号以及相关信 息将从用户信息中删除。 3.2 订票流程设计 3.2.1 订票流程描述 乘客在使用系统之前,首先注册新用户,需要输入自己相关个人信息,包括自己的身份证号 码,名称,登陆密码等。当已经注册好用户以后,用户可以利用自己的证件号码和登陆密码登陆 火车票订票系统,乘客需先查询自己所需要乘坐的列车,看是否有票,如果有票则可以选择订票,进行订票;如果用户已经购票,需要换票,则需要查询目标票看其是否有剩余,如果有剩余,则 可以进行换票,当用户输入已拥有的火车票的列车号点击退票,则可以经行退票。当然,以上操 作都必须建立在用户已登录的基础上 阶段通过对系统目标的初步调研和分析,提出可行性方案并进行论证。我们在这 里主要从技术可行性、经济可行性和操作可行性三方面进行分析。2.1.1 经济可行性 本系统其他应用软件、硬件系统也易于获得.因此 , 开发成本较低。而引进使用本系 统后,与传统方式相比,具有高效率、低成本、高质量的特点,可以节省不少人力、物 力及财力。所以,从经济的角度来看,该系统可行。2.1.2 技术可行性 开发工具: VS2005 数据库环境: SQL Server 2005 系统环境: Microsoft Windows 2000 或以上版本。 系统实现依靠相对熟悉的 c 语言和 SQL Server2008 数据库系统,其基本操作实质还 是对数据库进行添加、删除、查找等操作。2.1.3 操作可行性 系统采用菜单式,实现用户与数据库的交互,界面简洁友好,操作方便。2.2 需求分析 需求分析是软件设计的一个重要的环节。本阶段对订票系统的应用情况作全面调 查,以确定系统目标,并对系统所需要的基础数据以及数据处理要求进行分析,从而确 定用户的需求。用户对系统的需求我们从以下几方面进行分析。2.2.1 功能需求 本网上售票系统应该具备如下功能: 1.查询 分为对车次信息的查询和客户对已订车票信息的查询。要求: 1)对车次的查询,可以按照发车车次进行查询; 2)车次信息包括:车号、出发 地、目的地、发车日期、开出时刻、票价。3)座位类型设定。4)车次信息只允许用户查询,不能修改。2.添加车票 通过查询系统,客户根据自己的需求找到满意的车次,再输入个人信息后直接通过 网上售票确定已预订选中的车票。要求 : 售票记录应包括:会员名、车号、发车日期、订购票数、总价。3.退票 可退票,通过查询系统,客户可以根据自己的名字找到自己的订票信息,通过退票 模块退去已购车票。2.2.2 数据需求 信息需求,即在系统中需要处理哪些数据。根据对火车站网上订票系统的分析,本 系统的信息需求如表 2-1 所示。表 2-1 信息输入输出 信息输 入 信息 处理 信息 输出 用户输 入所需车次 检索 系统数据库 符合 用户需求的车次及相关 信息 用户输 入个人信息及所需 购的车 票信息 更新 系统中的订票信息,将新 信息存入系统数据库 操作 反馈(如找零)2.2.3 性能需求 为了保证系统能够长期、安全、稳定、可靠、高效的运行,本系统应该满足以下的 性能需求。1.准确性和及时性 系统处理的准确性和及时性是系统的必要性能。系统应能及时而且准确的根据用户 权限及所输入的信息做出响应。 由于本系统的查询功能对于整个系统的功能和性能完成 举足轻重。作为系统的很多数据来源,而车票的数量和时间又影响用户的决策活动,其 准确性和及时性很大程度上决定了系统的成败。在系统开发过程中,必须采用一定的方 法保证系统的准确性和及时性。2.易用性 本系统是直接面对用户的,而用户往往对计算机并不是非常熟悉。这就要求系统能 够提供良好的用户接口,易用的人机交互界面。要实现这一点,就要求系统应该尽量使 用用户熟悉的术语和中文信息的界面,从而保证系统的易用性。 火车票管理系统一、课题内容和要求 改系统要求实现一个简单、实用的火车票管理程序,主要功能包括火车票数据的录入、查找、删除、显示、售票、退票等。所有火车票数据都要利用文件系统保存,以备系统下次运行时使用。通过此课题,熟练掌握文件、数组、指针的各种操作,以及一些基本算法思想的应用。 二、需求分析 功能框架图:(见图2-1) 火车票管理系统 录入 查找 删除 排序 售票 退票 保存 图2-1。 1.新增火车票数据记录:预先建立一个txt文档,存入数据,然后在程序中读取文档。 2.查找火车票数据(可按车次,发车时间、起点站、终点站等查找)。 3.删除火车票数据记录(先查找,再删除。若查找出多条记录,则进一步提示用户选择记录的车次,再删除)。 4.对火车票排序(可按车次、发车时间、起点站、终点站等排序。)。 5.显示当前所有火车票信息列表。 6.售票(先查找,当确定车次后,根据售票张数对该车次的已售票人数进行修改)。 7.退票(售票的逆处理,过程与售票类似)。 8.保存火车票数据到文件中。 9.从文件中读入火车票数据。 三、概要设计 1)主要结构体: struct time { int hour; int minutes; }; struct ticket { char SerialNumber[10]; struct time SetOut; char DeparturePoint[MAX]; char TerminalPoint[MAX]; float LastTime; int FixNumber; int FixedNumber; }train[N]; 2)主要函数流程图: l 载入函数:用于从文本中载入信息。(见图3-1) 打开文本 能否打开 读入数据 是否结束 结束 否 否 开始 开始 否 是 是 读入车次 是否符合输出信息 结束 是 图3-2 图3-1 l 查找函数:利用输入的车次或站点进行顺序查找并将找到的信息输出。(见图3-2) l 删除函数:先查找出要删除的信息再删除。(见图3-3) 否 否 是 无法订票 人数加一 是否超载 否 图3-4 结束 开始 读入车次 是否误点 否 图3-3 是 是 否 是否符合读入车次 开始 记录下标i i=i+1,i++ i<车次总数-1 结束 l 售票退票函数:先判断该车是否已发车,若未发车且人未满则订票成功,否则无法订票退票。(见图3-4) l 备份文件函数:将文件内容存储到用户给定的地址中(见图3—5) 图3-5 l 排序函数(见图3-6) 图3-6 四、源程序代码 #include #include #include #include #include #include const int MAX=20; const int N=50; const int MAXFILENAME=100; enum {FALSE,TRUE}; struct time { int hour; int minutes; }; struct ticket { char SerialNumber[10]; struct time SetOut; char DeparturePoint[MAX]; char TerminalPoint[MAX]; float LastTime; int FixNumber; int FixedNumber; }train[N]; int RecordNumber; int FLAG=FALSE; /**********************************************/ int ShowMessage(void); //载入原始数据 void mainmenu(void); //主菜单 void InsertMessage(void); //录入班次信息 void SearchMenu(void); //查询路线子菜单 void SearchByNumber(void); //按班次号查询 void SearchByAddress(void); //按终点站查询 void cancle(void);//删除数据 void selection(ticket *pa,int n);//排序 void TicketManagement(void); //车票售出与退回 void TicketOrder(void); //售票 void TicketDelete(void); //退票 void exit(void); //退出该系统 void SaveRecord(ticket x); //储存信息到文件中 /********************************************/ int main(void) { do{ mainmenu(); }while(FLAG==FALSE); return 0; } void mainmenu(void) { system(“mode con: cols=140 lines=130“); char functionNumber; printf(“ 火车票管理系统\n\n“); printf(“============================================================================\n“); printf(“ 1.录入班次信息\t\n“); printf(“ 2.显示所有车票信息列表\t\n“); printf(“ 3.查询火车票数据\t\n“); printf(“ 4.删除火车票数据记录\t\n“); printf(“ 5.按行车时间排序\t\n“); printf(“ 6.售票与退票系统\t\n“); printf(“ 7.退出该系统\t\n“); printf(“============================================================================\n“); printf(“请选择你所需要的功能:“); scanf(“%c“,&functionNumber); switch(functionNumber) { case '1': { InsertMessage(); printf(“\n按任意键回主菜单......\n“); getchar(); getchar(); } break; case '2': { RecordNumber=ShowMessage(); printf(“\n按任意键回主菜单......\n“); getchar(); getchar(); } break; case '3': { SearchMenu(); printf(“\n按任意键回主菜单......\n“); getchar(); getchar(); } break; case '4': { cancle(); printf(“\n按任意键回主菜单......\n“); getchar(); getchar(); } break; case '5': { selection(train,RecordNumber); printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“); int i; for(i=0;i { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } printf(“\n按任意键回主菜单......\n“); getchar(); getchar(); } break; case '6': { TicketManagement(); getchar(); getchar(); } break; case '7': { int i; FLAG=TRUE; for(i=0;i { SaveRecord(*(train+i)); } exit(); } break; default: { printf(“输入错误,请确保你的输入为1--7.\n“); printf(“按任意键回主菜单......\n“); getchar(); getchar(); } }//switch ends FLAG=FALSE; } void InsertMessage(void) { FILE *fp; char filename[MAXFILENAME]; int i; printf(“请输入文件名或者文件路径名:“); scanf(“%s“,filename); if((fp=fopen(filename,“r“))==NULL) { printf(“文件%s不可读,请确认文件%s存在或者文件路径正确.\n\n“,filename,filename); mainmenu(); } for(i=RecordNumber;!feof(fp)&&!ferror(fp);i++) { fscanf(fp,“%s%d%d“,&train[i].SerialNumber,&train[i].SetOut.hour,&train[i].SetOut.minutes); fscanf(fp,“%s%s%f%d%d“,&train[i].DeparturePoint,&train[i].TerminalPoint,&train[i].LastTime,&train[i].FixNumber,&train[i].FixedNumber); } RecordNumber=i; /*******************************输出更新后的订票记录************************************************************/ printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“); for(i=0;i { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } fclose(fp); } int ShowMessage(void) { int i; FILE *fp; if((fp=fopen(“add.txt“,“r“))==NULL) { printf(“读取数据失败,请检查文件add.txt是否存在.\n“); exit(-1); } for(i=RecordNumber;!feof(fp)&&!ferror(fp);i++) { fscanf(fp,“%s%d%d“,&train[i].SerialNumber,&train[i].SetOut.hour,&train[i].SetOut.minutes); fscanf(fp,“%s%s%f%d%d“,&train[i].DeparturePoint,&train[i].TerminalPoint,&train[i].LastTime,&train[i].FixNumber,&train[i].FixedNumber); } int count=i; printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“); for(i=0;i { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\t“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); printf(“\n“); } return count; } void SearchMenu(void) { system(“mode con: cols=140 lines=130“); char functionNumber; printf(“ 查询子菜单\n“); printf(“============================================================================\n“); printf(“ 1.按班次号查询\t\n“); printf(“ 2.按终点站查询\t\n“); printf(“ 3.返回主菜单\t\n“); printf(“============================================================================\n“); printf(“请选择你所需要的功能:“); scanf(“%*c%c“,&functionNumber); switch(functionNumber) { case '1':SearchByNumber();break; case '2':SearchByAddress();break; case '3': getchar(); mainmenu(); break; default: printf(“输入错误,请确保你的输入为1--3.\n“); printf(“按任意键回查询子菜单......\n“); getchar(); getchar(); SearchMenu(); } } void SearchByNumber(void) { int i; char Number[MAX]; printf(“请输入班次号:“); scanf(“%s“,&Number); printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“); for(i=0;i { //对比终点站记录,找到并输出 if((strcmp(Number,train[i].SerialNumber))==0) { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } } } void SearchByAddress(void) { int i; char Address[MAX]; printf(“请输入终点站的名称:“); scanf(“%s“,&Address); printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“); for(i=0;i { //对比终点站记录,找到并输出 if((strcmp(Address,train[i].TerminalPoint))==0) { printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } } } void cancle(void) { SearchMenu(); int i,j; char m[MAX]; printf(“请输入要删除的班次:“); scanf(“%s“,&m); for(i=0;i { if(i==RecordNumber) { printf(“对不起,没有这趟车\n“); } } for(j=i;j { train[j]=train[j+1]; } printf(“删除成功\n“); } void selection(ticket *pa,int n) { int i,k,index; struct ticket temp; for(k=0;k { index=k; for(i=k+1;i if(pa[i].LastTime index=i; if(index!=k) { temp=pa[index]; pa[index]=pa[k]; pa[k]=temp; } } } void TicketManagement(void) { char functionNumber; system(“mode con: cols=140 lines=130“); printf(“ 订票与退票菜单\n“); printf(“============================================================================\n“); printf(“ 1.订票\t\n“); printf(“ 2.退票\t\n“); printf(“ 3.返回主菜单.\n“); printf(“============================================================================\n“); printf(“选择你需要的功能:“); scanf(“%*c%c“,&functionNumber); switch(functionNumber) { case '1': { TicketOrder(); //getchar(); //getchar(); } break; case '2':TicketDelete();break; case '3': { getchar(); mainmenu(); } break; default: { printf(“输入错误,请确保你的输入为1--3.\n“); printf(“按任意键回主菜单......\n“); getchar(); getchar(); mainmenu(); } } } void TicketOrder(void) { SearchMenu(); int i,j; char a[MAX]; printf(“请输入要订购的车票的班次:“); scanf(“%s“,&a); printf(“请输入要订购的车票的张数:“); scanf(“%d“,&j); for(i=0;i { if((strcmp(a,train[i].SerialNumber))==0) { if(train[i].FixedNumber { (train[i].FixedNumber)+=j; printf(“你的订票成功,请按时上车,谢谢使用!\n“); printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“); printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } else printf(“对不起,票已卖完\n“); } } } void TicketDelete(void) { SearchMenu(); int i,j; char b[MAX]; printf(“请输入要退购的车票的班次:“); scanf(“%s“,&b); printf(“请输入要退购的车票的张数:“); scanf(“%d“,&j); for(i=0;i { if((strcmp(b,train[i].SerialNumber))==0) { if(train[i].FixedNumber>=1) { train[i].FixedNumber-=j; printf(“退订车票成功,谢谢使用!\n“); printf(“班次\t发车时间\t起点\t终点\t行车时间(小时)\t额定载量\t已定票人数\n“); printf(“%s\t%d:%d\t\t“,train[i].SerialNumber,train[i].SetOut.hour,train[i].SetOut.minutes); printf(“%s\t%s\t\t%.1f\t %d\t\t%d\n“,train[i].DeparturePoint,train[i].TerminalPoint,train[i].LastTime,train[i].FixNumber,train[i].FixedNumber); } else printf(“对不起,今天的这趟车的票尚未卖出,无法完成退票!\n“); } } } void exit(void) { printf(“\n\n*********************谢谢使用本系统,欢迎下次继续使用***********************\n“); exit(0); } void SaveRecord(ticket x) { FILE *fp; if((fp=fopen(“add.txt“,“a“))==NULL) { printf(“打开文件%s失败\n“,“add.txt“); exit(-1); } fprintf(fp,“\n%s\t%d\t%d\t\t“,x.SerialNumber,x.SetOut.hour,x.SetOut.minutes); fprintf(fp,“%s\t%s\t\t%.1f\t %d\t\t%d“,x.DeparturePoint,x.TerminalPoint,x.LastTime,x.FixNumber,x.FixedNumber); } 五、测试数据及其结果分析 显示的主菜单界面: 火车票管理系统 ============================================================================ 1.录入班次信息 2.显示所有车票信息列表 3.查询火车票数据 4.删除火车票数据记录 5.按行车时间排序 6.售票与退票系统 7.退出该系统 ============================================================================ 请选择你所需要的功能: 1)录入班次信息 输入:1 输出:请输入文件名或者文件路径名: 输入:D:\\1.txt 输出: 班次 发车时间 起点 终点 行车时间(小时) 额定载量 已定票人数 k1111 8:30 南京 上海 4.0 300 200 k1234 10:20 上海 苏州 2.0 200 t2222 12:40 长沙 上海 9.0 250 k2323 13:50 扬州 南京 1.5 200 k1122 9:20 广州 南京 20.0 300 170 按任意键回主菜单......2)显示所有车票信息列表 输入:2 输出: 班次 发车时间 起点 终点 行车时间(小时) 额定载量 已定票人数 k1111 8:30 南京 上海 4.0 300 200 k1234 10:20 上海 苏州 2.0 200 t2222 12:40 长沙 上海 9.0 250 k2323 13:50 扬州 南京 1.5 200 k1122 9:20 广州 南京 20.0 300 170 按任意键回主菜单......3)查询火车票记录 输入:3 输出: 查询子菜单 ============================================================================ 1.按班次号查询 2.按终点站查询 3.返回主菜单 ============================================================================ 请选择你所需要的功能: 输入:1 输出:请输入班次号: 输入:k1111 输出: 班次 发车时间 起点 终点 行车时间(小时) 额定载量 已定票人数 k1111 8:30 南京 上海 4.0 300 200 按任意键回主菜单......输入:2 输出:请输入终点站的名称: 输入:上海 输出: 班次 发车时间 起点 终点 行车时间(小时) 额定载量 已定票人数 k1111 8:30 南京 上海 4.0 300 200 t2222 12:40 长沙 上海 9.0 250 按任意键回主菜单......4)删除火车票数据 输入:4 输出:查询子菜单 ============================================================================ 1.按班次号查询 2.按终点站查询 3.返回主菜单 ============================================================================ 请选择你所需要的功能: (查找过程同上) 输出:请输入要删除的班次: 输入:t2222 输出:删除成功 按任意键回主菜单......5)按行车时间排序: 输入:5 输出: 班次 发车时间 起点 终点 行车时间(小时) 额定载量 已定票人数 k2323 13:50 扬州 南京 1.5 200 k1234 10:20 上海 苏州 2.0 200 k1111 8:30 南京 上海 4.0 300 200 t2222 12:40 长沙 上海 9.0 250 k1122 9:20 广州 南京 20.0 300 170 按任意键回主菜单......6)售票 输入:6 输出: 订票与退票菜单 =================================================== 1.订票 2.退票 3.返回主菜单 ================================================== 选择你需要的功能: 输入:1 输出: 查询子菜单 ======================================================================== 1.按班次号查询 2.按终点站查询 3.返回主菜单 ========================================================================= 请选择你所需要的功能: (查询过程同上) 输出:请输入需要订购的车票班次 输入:k1111 输出:请输入要订购的车票张数 输入:10 输出: 您的订票成功,请按时上车,谢谢使用! 班次 发车时间 起点 终点 行车时间(小时) 额定载量 已定票人数 k1111 8:30 南京 上海 4.0 300 210 7)退票 输入:6 输出: 订票与退票菜单 =================================================== 1.订票 2.退票 3.返回主菜单 ================================================== 选择你需要的功能: 输入:2 输出: 查询子菜单 ======================================================================== 1.按班次号查询 2.按终点站查询 3.返回主菜单 ========================================================================= 请选择你所需要的功能: (查询过程同上) 输出:请输入需要退购的车票班次 输入:k1111 输出:请输入要订购的车票张数 输入:5 退订车票成功,谢谢使用! 班次 发车时间 起点 终点 行车时间(小时) 额定载量 已定票人数 k1111 8:30 南京 上海 4.0 300 195 8)退出 输入:7 输出:****************谢谢使用本系统,欢迎下次继续使用**************** 结果分析:(1).若输入数字不在1——7之间,则会提示错误。 (2).当输入列车班次信息不正确时,将不会得到结果。 (3).文件录入不正确时,将不会得到任何结果。 六、调试过程中的问题 1)文件存储方式不正确:应先定义一个文件存储函数,在其它函数中调用,方便有效。 2)删除时若遇到没有的班次则程序出错。应在不存在输入的列车班次时,输出不存在的提示 3)保存后在下次运行时出错问题:在保存信息时,应在每个信息之间加一空格来保存,否则在文件下次使用时读取就会没有分界点。 4)订票退票只能一次一张。应在用户输入列车班次后让用户输入需要订购的张数。 5)结构指针定义错误,ticket前不应加struct。 #include typedef struct node//定义信息结构体 { char num[10];// 航班号 int hour;//起飞时间小时 int minitues;//起飞时间分钟 char start[10];//起始 char end[10];//终点 float prize;//经济舱票价 int last;//剩余座位 }FLIGHT; typedef struct Order//订单信息 { char name[10];//乘客姓名 char num[10];//航班号 int count;//订票数量 }Order; class flight//定义类 { private: FLIGHT stu[N];//每个元素对应一条信息 Order psg[N];//订单 int len;//航班总数 int lenp;//订票者总数 public: flight(); ~flight();void input();//录入信息 void show();//浏览 void sall();//售票 void back();//退票 void search();// 信息查询 void search2();// 信息查询(起点终点) char menu();//菜单 }; flight stud; char filename[]=“flight.txt”; flight::flight(){}//构造函数 flight::~flight(){}//析构函数 bool CheckTime(int h1,int m1,int h2,int m2)//判断两个时间前后 { if(h1 return true;else if(h1==h2){ if(m1 return true; else return false;} else return false;} void flight::show()//浏览 { system(“cls”);//清屏 cout<<“ 所有航班信息如下:”< 起飞时间 起点 终点 经济舱票价 剩余座位 备注”< for(int i=0;i printf(“%-10s%-2.2d:%-2.2d %-10s%-10s%-12.2f%-10d”,stu[i].num,stu[i].hour,stu[i].minitues,stu[i].start,stu[i].end,stu[i].prize,stu[i].last); time_t t; struct tm *tm; t=time(NULL);//获取当前系统时间 tm=localtime(&t); if(CheckTime(stud.stu[i].hour,stud.stu[i].minitues,tm->tm_hour,tm->tm_min)==true)//如果起飞时间在当前时间之前 输出此次航班已发出 cout<<“此次航班已发出”< else cout< } cout<<“_______________________________________________________________________________”< void flight::back()//退票 { char name[20]; char s[20]; system(“cls”);//清屏 cout<<“请输入退票的航班编号:”;cin>>s; for(int i=0;i if(strcmp(stud.stu[i].num,s)==0) break;//存在 结束循环 if(i==stud.len)//这二者相等说明查找完所有信息也没找到输入信息,说明输入航班编号不存在{ cout<<“对不起!没有你输入航班编号的相关信息。n”; system(“pause”);//任意键继续 return;} time_t t; struct tm *tm; t=time(NULL);//获取当前系统时间 tm=localtime(&t);if(CheckTime(stud.stu[i].hour,stud.stu[i].minitues,tm->tm_hour,tm->tm_min)==true) { cout<<“对不起!该航班已经起飞。不能退票。n”; system(“pause”);//任意键继续 return;} int j=i; cout<<“请输入您的姓名:”;cin>>name;for(i=0;i if(strcmp(stud.psg[i].name,name)==0 && strcmp(stud.psg[i].num,s)==0)//查询这个名字是否相同 { stud.stu[j].last+=stud.psg[i].count;//退票 stud.psg[i]=stud.psg[stud.lenp-1];///删除这个订单 stud.lenp--;//订单数减一 cout<<“退票成功!n”; system(“pause”);//任意键继续 return; } } cout<<“对不起!您没有定该航班的票。n”; system(“pause”);//任意键继续 } void flight::sall()//售票 { char s[20]; system(“cls”);//清屏 cout<<“请输入要购买的航班编号:”;cin>>s; for(int i=0;i if(strcmp(stud.stu[i].num,s)==0) break;//存在 结束循环 if(i==stud.len)//这二者相等说明查找完所有信息也没找到输入信息,说明输入航班编号不存在{ cout<<“对不起!没有你输入航班编号的相关信息。n”; system(“pause”);//任意键继续 return;} if(stud.stu[i].last<=0)//没有票了 { cout<<“对不起!该航班票已售完。n”; system(“pause”);//任意键继续 return;} time_t t; struct tm *tm; t=time(NULL);//获取当前系统时间 tm=localtime(&t);if(CheckTime(stud.stu[i].hour,stud.stu[i].minitues,tm->tm_hour,tm->tm_min)==true) { cout<<“对不起!该航班已经起飞。n”; system(“pause”);//任意键继续 return;} int j=i;i=stud.lenp;strcpy(stud.psg[i].num,stud.stu[i].num);cout<<“请输入购票数量:”;cin>>stud.psg[i].count; while(stud.psg[i].count>stud.stu[i].last){ cout<<“余票不足,请重新输入:”; cin>>stud.psg[i].count; } cout<<“请输入您的姓名:”;cin>>stud.psg[i].name; stud.stu[j].last-=stud.psg[i].count;//剩余票数 stud.lenp++;cout<<“购票成功!n”;system(“pause”);//任意键继续 } void flight::input()//录入信息 { system(“cls”);//清屏 for(int i=stud.len;i { cout<<“请输入航班号:”; cin>>stud.stu[i].num; cout<<“请输入起飞时间(格式: 12:30):”; char ch; cin>>stud.stu[i].hour>>ch>>stud.stu[i].minitues; cout<<“请输入起点:”; cin>>stud.stu[i].start; cout<<“请输入终点:”; cin>>stud.stu[i].end; cout<<“请输入经济舱票价:”; cin>>stud.stu[i].prize; cout<<“请输入剩余座位:”; cin>>stud.stu[i].last; stud.len++;//个数加1 cout<<“一条航班信息录入完成,是否继续录入?(y/n):”; while(1) { cin>>ch; if(ch=='y' || ch=='Y' || ch=='n' || ch=='N') break; else cout<<“输入错误请重新输入:”; } if(ch=='n' || ch=='N') break; } } void flight::search()// 信息查询 { char s[20]; system(“cls”);//清屏 cout<<“请输入要查询的航班编号:”;cin>>s; for(int i=0;i if(strcmp(stud.stu[i].num,s)==0) break;//存在 结束循环 if(i==stud.len)//这二者相等说明查找完所有信息也没找到输入信息,说明输入航班编号不存在{ cout<<“对不起!没有你输入航班编号的相关信息。n”; system(“pause”);//任意键继续 return;} cout<<“ 查询结果如下:”< 起飞时间 起点 终点 经济舱票价 剩余座位 备注”< printf(“%-10s%-2.2d:%-2.2d %-10s%-10s%-12.2f%-10d”,stu[i].num,stu[i].hour,stu[i].minitues,stu[i].start,stu[i].end,stu[i].prize,stu[i].last); time_t t; struct tm *tm; t=time(NULL);//获取当前系统时间 tm=localtime(&t); if(CheckTime(stud.stu[i].hour,stud.stu[i].minitues,tm->tm_hour,tm->tm_min)==true)//如果起飞时间在当前时间之前 输出此次航班已发出 cout<<“此次航班已发出”< else cout< cout<<“_______________________________________________________________________________”< void flight::search2()// 信息查询(按线路){ char s1[20],s2[20]; system(“cls”);//清屏 cout<<“请输入要查询的线路起点:”;cin>>s1; cout<<“请输入要查询的线路终点:”;cin>>s2; for(int i=0;i if(strcmp(stud.stu[i].start,s1)==0 && strcmp(stud.stu[i].end,s2)==0) break;//存在 结束循环 if(i==stud.len)//这二者相等说明查找完所有信息也没找到输入信息,说明输入航班编号不存在{ cout<<“对不起!没有你输入线路的相关信息。n”; system(“pause”);//任意键继续 return;} cout<<“ 查询结果如下:”< 起飞时间 起点 终点 经济舱票价 剩余座位 备注”< for(i=0;i if(strcmp(stud.stu[i].start,s1)==0 && strcmp(stud.stu[i].end,s2)==0) { printf(“%-10s%-2.2d:%-2.2d %-10s%-10s%-12.2f%-10d”,stu[i].num,stu[i].hour,stu[i].minitues,stu[i].start,stu[i].end,stu[i].prize,stu[i].last); time_t t; struct tm *tm; t=time(NULL);//获取当前系统时间 tm=localtime(&t); if(CheckTime(stud.stu[i].hour,stud.stu[i].minitues,tm->tm_hour,tm->tm_min)==true)//如果起飞时间在当前时间之前 输出此次航班已发出 cout<<“此次航班已发出”< else cout< } cout<<“_______________________________________________________________________________”< char flight::menu()//菜单 { char c; system(“cls”);//清屏 cout<<“nnnn ╔═══════════════════════════╗n”;cout<<“ ║ 1、录入航班信息 ║n”; cout<<“ ╠═══════════════════════════╣n”;cout<<“ ║ 2、浏览航班信息 ║n”;cout<<“ ╠═══════════════════════════╣n”; cout<<“ ║ 3、查询路线(按编号) ║n”; cout<<“ ╠═══════════════════════════╣n”;cout<<“ ║ 4、查询路线(按线路) ║n”; cout<<“ ╠═══════════════════════════╣n”;cout<<“ ║ 5、售票 ║n”; cout<<“ ╠═══════════════════════════╣n”;cout<<“ ║ 6、退票 ║n”; cout<<“ ╠═══════════════════════════╣n”;cout<<“ ║ 0、退出系统 ║n”; cout<<“ ╚═══════════════════════════╝n”;cout<<“ 请选择:”; cin>>c; return c;} int main(){ while(1) { char ch; ch=stud.menu();//获取选择 switch(ch) { case '1': stud.input();break;//录入航班信息 case '2': stud.show();break;//浏览航班信息 case '3': stud.search();break;// 查询路线 case '4': stud.search2();break;// 查询路线(按线路) case '5': stud.sall();break;// 售票 case '6': stud.back(); break;// 退票 case '0': exit(0);//退出 } } return 0;}第二篇:火车票售票系统 需求分析报告
第三篇:课程设计火车票售票系统的需求分析
第四篇:火车票管理系统
第五篇:航空售票管理系统