车票管理系统课程设计报告
课程设计报告
2011~2012学年第二学期
课学学专指
业导
班教生
姓
程 名 号 级 师
C++课程设计 车票管理系统 刘吉喆 1104121008 1210
课程设计名称
2013年9月17日星期二
一、系统的需求分析:
需求分析是一项重要的工作,也是最困难的工作。它指对要解决的问题进行详细的分析,弄清楚问题的要求,包括需要输入什么数据,要得到什么结果,最后应输出什么。可以说,“需求分析”就是确定要计算机“做什么”。
车票管理系统是典型的管理信息系统(MIS ),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。车票管理系统可以实现对车票的科学化、规范化、查询车票情况、定票信息、以及路线信息等。车票管理系统是根据某车站对这票管理的实际情况进行编写的,主要目的是为了方便车站对车票的实际情况进行集中的查询与管理工作,以提高整个车站的工作。
经过电脑及生活的调查研究,根据车辆的运行状态和车站的管理模式,车票管理系统需要管理的东西主要有:车辆的班次,车辆的线路,售票和退票等等。
车辆是一个对外服务的内容,为了乘客的乘车要求,所以系统需要实现售票信息的录入、修改和删除功能。
乘客对剩余车票需要进行选择,系统必须实现相应的查询和输出功能,使乘客择优而乘。 本次课程设计需要实现的是——车票管理系统的链表实现。
主要实现的功能包括:车票信息的录入、修改、删除、剩余车票信息的查询、输出。车票信息可写入文件,也可从文件中读取。车票信息涉及的数据有班次号、发车时间、起点站、终点站、行车时间、额定载量、已定票人数等。
按照需求分析所得,车票管理系统有以下几个功能模块: (1)录入班次信息(信息用文件保存), 可不定时地增加班次数据
(2)浏览班次信息, 可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间, 则显示“此班已发出”的提示信息) 。
(3)查询路线:可按班次号查询 ,可按终点站查询 (4)售票和退票功能
A :当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数。
B :退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数。 (5)退出
在界面状态下,按下“ESC ”会退出该系统。返回源程序。 由上述需求分析可得,系统的功能模块图如图1所示。
图1 系统功能模块图
二、 系统的设计与实现
根据第一章的需求分析,接下来给出的是系统的设计和实现。 1、 类的设计
根据上述需求分析,有车票信息类和链表类。 (1) 车票信息类
系统研究车票系统Bus_infor类中成员:Bus_order是班次编号,start[20]是车票信息的起点站,end[20]是车票信息的终点站,all_tickted是总共要发售的票数,tickted 是已经被订购的票数,Hour_start,Minute_start是车票的发车时间,GoHour 表示行车时间,构造函数Bus_infor(),析构函数~Bus_infor(),录入函数input(),读取函数input(ifstream & is),输出函数output(),写入函数output(ofstream & os),定票函数Order_tickt(int n),获取发车时间函数GetTime_start(),判断当前班次状况函数GetTime(),内联函数, 返回额定载量
Get_all_tickted() { return all_tickted; },返回已定票人数Get_tickted(),返回班次号Get_bus_order(),返回终点站的字符串Get_end()const。
车票类的UML 图如(图2)所示:
(2)链表类
在Bus_link类中,有成员:构造函数Bus_link (),析构函数~Bus_link(),录入车票信息的函数input(),修改车票信息的函数mend(),删除车票信息的函数del(),查找函数find(Bus_infor **p,int num,char *pn),查询车票信息found(),显示车票信息show(),定购车票信息Order(),退还车票信息Unorder(),保存车票信息save(),初始化车票信息begin(),清除函数clear(),关于车票信息about(),主菜单函数mainmenu(),设置系统修改标志void setkey(int k){ key=k; },返回系统修改标志int getkey(){ return key;},头节点head, 系统修改标志key ,管理员登陆标志password 。 链表类的UML 图如(图3)所示:
2
分界面:车票信息的查询的设计
提示进入查询界面,选择按班次查找或按终点站查询车票信息。车票信息的查询界面如图所示。
分界面:车票信息的删除的设计
在录入或修改错误的车票信息后,想删除错误的车票信息,按提示按提示输入班次号,程序会显示该班次的信息并提示用户是否确定删除,输入y 则删除。删除车票的信息界面如图所示。
修改车票信息的设计
按提示进行车票信息的修改,本系统中只有管理员身份才可以修改车票,显示屏幕如图所示。
分界面:订购车票信息的设计
在管理员身份下按提示在剩余未出发的班次中,输出车票的信息,以判断是否可以订票,已出发的和已定票人数已满的情况下是不能订票的。定购车票信息输出界面如图所示
。
分界面:退订车票信息的设计
在管理员身份下按提示在剩余未出发的班次中,输出车票的信息,以判断是否可以退票,已出发的和没人定票的情况下是不能退票的。退定信息输出界面如图所示。
分界面:介绍车票信息的设计
在程序中输出使用说明。介绍信息界面如图所示。
3. 关键程序代码的分析: (1)系统的登录
在主函数中,先输出车票管理系统的欢迎界面。调用一个对象的mainmenu 函数来输出主菜单,按照提示选择需要执行功能的序号,由switch 判断和选择所需要执行的功能。
选择1:执行车票信息的录入; 选择2:执行车票信息的浏览; 选择3:执行查询车票信息; 选择4:执行车票信息的删除; 选择5:执行车票信息的修改; 选择6:执行定购车票; 选择7:执行退定车票; 选择8:执行车票信息的保存; 选择9:输出关于车票管理系统的信息; 选择0:退出; 主函数: int main() {
Bus_link pp; int k=1; char c; string s; pp.begin();
cout
cout
cout
do //利用一个do-while 循环来判断输入是否进入系统
{
c=getch(); if(c==27) exit(0); else if(c==13) break; else {
cout
}while((c!=13)||(c!=27)); try {
while(k==1) {
system("cls");
s=pp.mainmenu(); //调用主菜单函数 switch(s[0]) {
case '1':pp.input(); break; //录入车票信息 case '2':pp.show(); break; //浏览车票信息
case '3':pp.found(); break; //查询车票信息 case '4':pp.del(); break; //删除车票信息 case '5':pp.mend(); break; //修改车票信息 case '6':pp.Order(); break; //保存车票信息 case '7':pp.Unorder(); break; //退还车票信息 case '8':pp.save(); break; //保存车票信息 case '9':pp.about();break; //关于车票系统 case '0':
cout
do //利用一个do-while 循环来判断输入是否退出系统
{
c=getch(); if(c==27) {
k=0; break; }
else if(c==13) {
k=1; break; } else {
cout
}
}while((c!=13)||(c!=27)); break; }
if(k==1) {
cout>k; if(!cin)
throw string("数据输入错误");
cout
do //利用一个do-while 循环来判断输入是否退出系统
{
c=getch(); if(c==27)
{
k=0; break; }
else if(c==13) {
k=1; break; } else {
cout
}
}while((c!=13)||(c!=27)); }
if(k==0) {
if(pp.getkey()==1) {
cout>k; if(!cin)
throw string("数据输入错误"); if(k==1)
pp.save(); pp.clear(); k=0; } } } }
catch(string s) {
cout
return 0; }
在读取数据库中,可以从以有的文件中读取数据到程序中,避免了程序的重复输入数据,有利于后面的信息修改、删除等功能。 读取数据库:
void Bus_link::begin() {
password=0;
Bus_infor *p,*p2; p=head; clear(); long t;
ifstream is("bus.txt",ios::in); //文件以输入方式打开 if(!is) {
ofstream os("bus.txt",ios::out); //文件以输出方式打开 os.close(); //关闭文件 return ; }
int num=-1; while(1) {
num=-1;
t=is.tellg(); //记录下当前位置 is>>num;
is.seekg(t); //移动到原来位置 if(num
is.close(); return; }
p2=new Bus_infor;
p2->input(is); //输入is 对象内容 p->next=p2; p2->next=NULL; p=p->next; } }
(2)信息的添加
车票信息的录入,创建Bus_infor类和Bus_link对象,调用构造函数,输入车票的班次、额定座位数、始发时间、行车时间、起始站与终点站、,通过input 函数实现。
void Bus_link::input() {
if(password==1) {
Bus_infor *p,*p2=NULL;
p=head; int n=1; //int n; while(p->next) {
p2=new Bus_infor; p=p->next; while(n)
}
}
}
p->next=p2; p2->next=NULL;
p=p->next; Bus_link::setkey(1);
cout>n; if(!cin)
throw string("数据输入错误");
else
cout
void Bus_infor::GetTime_start() {
}
void Bus_infor::input() //Bus_infor类中成员函数input 的函数体 {
cout
//判断输入的数据类型是否有错
cin>>Hour_start>>Minute_start; if (cin.fail())
cout
cout
}
else if(Hour_start24||Minute_start60)
于24, 分钟不能小于大于60
else
break;
}
cout
cout
cin>>Bus_order; if (cin.fail()) {
cout
//判断输入的数据类型是否有错
}
}
}
cin.get();
//重新输入
else
break;
cout
GetTime_start();
cout
cout
cout>a;
if(a=='y'||a=='Y') tickted=0;
cin>>GoHour; if (cin.fail()) { } else
break;
cin>>all_tickted; if (cin.fail()) { } else
break;
//判断输入的数据类型是否有错
cout
//判断输入的数据类型是否有错
cout
cin>>start;cin>>end;
(3)信息的浏览
浏览客房信息,如果之前有文件信息,则直接输出,如果没有则需录入后才能输出。所以,先得有一个读取函数begin ,再有一个浏览函数show 。
void Bus_link::begin() {
password=0;
Bus_infor *p,*p2; p=head; clear(); long t;
ifstream is("bus.txt",ios::in); //文件以输入方式打开 if(!is) {
ofstream os("bus.txt",ios::out); //文件以输出方式打开 os.close(); //关闭文件 return ; }
int num=-1; while(1) {
num=-1;
t=is.tellg(); //记录下当前位置 is>>num;
is.seekg(t); //移动到原来位置 if(num
is.close(); return; }
p2=new Bus_infor;
p2->input(is); //输入is 对象内容 p->next=p2; p2->next=NULL; p=p->next; } }
void Bus_link::show() {
cout
******"
**"
**"
}
p=head; while(p->next) { }
(p->next)->output(); p=p->next;
(4)信息的修改
按提示输入要修改的班次,定义一个指向链表第一个节点的指针p 。如果指针创建成功,开始用while 和if 语句实现p 指向的节点的班次与存在的班次比较。如果相同,提示输入车票的各个信息;如果没有相同,提示没有所查询的车票。
int Bus_link::find(Bus_infor **p1,int num,char *pn) {
Bus_infor *p; p=head; int t=0; while(p->next) { (*p1)=p;
if( (p->next)->Get_bus_order()==num|| (p->next)->Get_end()==pn ) {
cout
(p->next)->output(); t=1; } p=p->next; }
return t; }
void Bus_link::mend() {
if(password==1) {
Bus_infor *p; int num;
char name[20];
cout>num; if(!cin)
throw string("数据输入错误"); if( !find(&p,num,name) ) {
cout
}
return; }
(p->next)->input(); Bus_link::setkey(1); } else
cout
(5)信息的查询
按提示输入要查询的班次或者终点站,定义一个指向链表第一个节点的指针p 。如果指针创建成功,开始用while 和if 语句实现p 指向的节点的班次与存在的班次比较。如果相同,则输出车票的各个信息;如果没有相同,提示没有所查询的车票。
void Bus_link::found() { }
(6)信息的删除
按提示输入要删除的班次,定义一个指向链表第一个节点的指针p 。如果指针创建成功,开始用
Bus_infor *p; int num,n; char name[20]; do {
cout>n; if(!cin)
throw string("数据输入错误");
}while(n2); if(n==1) { } if(n==2) { }
if(!find(&p,num,name)) { }
cout
cout>name;
cout>num; if(!cin)
throw string("数据输入错误");
while 和if 语句实现p 指向的节点的班次与存在的班次比较。如果相同,输出车票的各个信息并提示是否确定删除;如果没有相同,提示没有所查询的车票。
void Bus_link::del() { }
(7)车票的定购
按提示输入要定票的班次,定义一个指向链表第一个节点的指针p 。如果指针创建成功,开始用while 和if 语句实现p 指向的节点的班次与存在的班次比较。如果相同,判断是否出发,若已出发则输出信息提示不能订票,若没有出发,则输出车票信息。提示输入需要定购车票的数量;如果没有相同,提示没有所查询的车票。
void Bus_link::Order() {
if(password==1) { } else
cout>num; if(!cin) { }
cout
throw string("数据输入错误");
if( !find(&p,num,name) )
cout>a; if(a=='y'||a=='Y') { }
p2=p->next; p->next=p2->next; delete p2; Bus_link::setkey(1);
if(password==1) {
Bus_infor *p;
cout>X; if(X=='y'||X=='Y'){
int num;
}
}
}
cin>>num; if(!cin) { }
p=p->next;
if(!(p->GetTime())) { }
cout>n; if(!cin)
throw string("数据输入错误"); p->Order_tickt(n);
if((p->Get_tickted()+n)Get_all_tickted()) else cout
cout
//判断要定票的车辆是否已经出发, 若已经出发
cout
throw string("数据输入错误"); if( !find(&p,num,"^") )
则不允许定票
else if(X=='n'||X=='N') cout
else
cout
(8)车票的退定
按提示输入要退票的班次,定义一个指向链表第一个节点的指针p 。如果指针创建成功,开始用while 和if 语句实现p 指向的节点的班次与存在的班次比较。如果相同,判断是否出发,若已出发则输出信息提示不能退票,若没有出发,则输出车票信息。提示输入需要退票的数量;如果没有相同,提示没有所查询的车票。
void Bus_link::Unorder() {
if(password==1) {
Bus_infor *p;
cout>X; if(X=='y'||X=='Y'){
}
}
}
cout>num; if(!cin) { }
if((p->GetTime())) { }
cout>n; if(!cin)
throw string("数据输入错误"); p=p->next;
if((p->Get_tickted()-n)>=0)
p->Unorder_tickt(n);
else cout
cout
//判断要定票的车辆是否已经出发, 若
cout
throw string("数据输入错误"); if( !find(&p,num,"^") )
已经出发则不允许定票
else if(X=='n'||X=='N') cout
else
cout
(9)保存车票信息
将车票信息输出到文件保存。 void Bus_link::save() {
if(password==1) {
Bus_infor *p; p=head;
ofstream os("bus.txt",ios::out); if (Bus_link::getkey()==1) {
while(p->next)
//文件以输出方式打开
}
}
}
}
(p->next)->output(os); p=p->next;
cout
else
cout
三、 用户手册
输入的格式要求均有提示,而且输入错误的话会提示并要求重新输入,基本不需要说明。
四、 调试及测试
程序调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程。这是保证计算机信息系统正确性的必不可少的步骤。编完计算机程序,必须送入计算机中测试。 原程序:
void Bus_link::Order() {
if(password==1) {
Bus_infor *p;
cout>X;
if(X=='y'||X=='Y'){ int num;
cout>num; if(!cin)
throw string("数据输入错误"); if( !find(&p,num,"^") ) {
cout
p=p->next;
if((p->GetTime())) //判断要定票的车辆是否已经出发, 若已经出发则不允许定票
{
cout
cout>n; if(!cin)
throw string("数据输入错误");
if((p->Get_tickted()+n)Get_all_tickted()) p->Order_tickt(n);
else cout
else if(X=='n'||X=='N') cout
cout
编译成功后开始运行,信息输出后,不能在程序中正确定购,经Debug 调试,发现,if((p->GetTime()))中加一个!即可。
void Bus_link::Order() {
if(password==1) {
Bus_infor *p;
cout>X;
if(X=='y'||X=='Y'){ int num;
cout>num; if(!cin)
throw string("数据输入错误"); if( !find(&p,num,"^") ) {
cout
p=p->next;
if(!(p->GetTime())) //判断要定票的车辆是否已经出发, 若已经出发则不允许定票
{
cout
cout>n; if(!cin)
throw string("数据输入错误");
if((p->Get_tickted()+n)Get_all_tickted()) p->Order_tickt(n);
else cout
else if(X=='n'||X=='N') cout
cout
五、 小结
本次的C++课程设计时间非常紧凑,虽然只是短短的一星期,但是却令我体会很多,也学到很多东西。利用C++去设计车票管理,使我加强了对C++的认识,也对现代客运的基本运作管理有了初步了解。
在这次课程设计中,我还懂得了程序开发中的一些比较重要的步骤,比如需求分析、类的设计以及类与类之间的关系,UML 图形的表示方法等。面向对象程序设计作为一门软件设计的课程,具有极强的实践性,使我加强了灵活应用理论知识的能力及面向对象程序设计技能。C ++语言相对于C 语言来更具有优越性,它不仅兼容C ,还有一个非常重要的特点就是面向对象(具体来讲就是类),另外模板技术的频繁引用,也使整个程序看起来更清晰,更有条理化,所以,对模块的掌握,在C++学习中是非常重要的。
在本次的应用程序的设计和创建过程中,我经历了平时在课堂中和考试中,决不会有的重重难题,而这些问题,又都是课本上简单零散提到的,使我在设计的初期不得不查询大量的资料来了解整个系统的规划,所以,课程设计也培养了我们探索实践的能力。
总之,我们学习和掌握的知识,只有通过实际应用,才能真正的理解和掌握,才能更好的去应用。以前上C++课程,只是零散被动地接受知识,而不是主动地去吸收渗透,而此次的课程设计却让我对编程产生了兴趣,习惯独立自主地完成任务,在困难中寻求帮助,加强和同学间的互帮互助,相信自己会在以后的学习和工作更加有经验。通过课程设计,我既复习了以前的旧知识,又学到了一些新的知识;设计增强了我们用所学知识去解决具体问题的能力,进一步培养了我们独立思考问题和解决问题的能力。
完整代码:
#include #include #include #include #include #include #define N 20
typedef struct cl {
char num[10]; char hour[3]; char min[3]; char from[10]; char to[10]; float hours; int max; int now;
/*小时、分钟为char 型可输出时间时输出xx:00*/
}CLASS;
int class_num=0; CLASS records[N]; void NewMessage(); void ShowTable1();
/*录入班次*/
/*打印表头*/
/*打印表尾*/
void ShowTable2(int i); void Display(); void add(); void save(); void load();
/*显示所有班次*/ /*增加班次*/
/*保存班次*/ /*打开文件信息*/
/*定位光标*/
void gotoxy(int i,int j); void search(); void change(); void quit();
/*查询班次*/ /*修改班次*/
/*退出*/
void Ticketorder(); void Ticketdelete(); int menu_select(); int whether(int);
/*售票*/
/*退票*/ /*菜单函数*/
/*判断系统时间与发车时间*/ /*查找函数*/ /*删除函数*/ /*按班次查询*/
/*修改或增加班次录入函数*/
void find(char s1[],char s2[]); void deletemessage(); int findnum(char s1[]); void get(int,int);
char *menu[]={"***************MENU***************","1. 录入班次","2. 显示所有班次","3. 查询班次","4. 增加班次","5. 售票","6. 退票","7. 修改班次","8. 删除班次","9. 退出"};
void main() {
system("cls");
for(;;) { switch(menu_select()) {
case 1: NewMessage();break; case 2: Display();break; case 3: search();break; case 4: add();break; case 5: Ticketorder();break; case 6: Ticketdelete();break; case 7: change();break; case 8: deletemessage();break; case 9: quit();break; }
}
}
int menu_select() { char s[5]; int c,i; system("cls"); gotoxy(10,2);
for(i=0;i
printf("%c ",04);
for(i=3;i
}
gotoxy(10,16); for(i=0;i
for(i=0;i
}
/*输出边框*/
}
i=0; do {
gotoxy(25,(i++)+17); printf("请选择(1-9):"); scanf("%s",s); c=atoi(s);
}while(c9); return c;
void NewMessage() {
int i=0,j,h; char s[5]; FILE *fp; system("cls");
if((fp=fopen("车票管理系统0.dat","rb"))!=NULL) /*判断是否班次信息存在, 若存在
询问是否覆盖原有信息*/
{ } if(i==0) {
system("cls"); gotoxy(8,6);
printf("请输入要录入班次总数:"); scanf("%d",&class_num); system("cls");
for(i=0,j=5;i
system("cls"); gotoxy(8,j++);
/*当i! =0时表示不录入班次不执行此操作直接跳出此函数*/
gotoxy(8,6);
printf("车票信息已存在, 录入将覆盖已有信息!"); gotoxy(8,7);
printf("是否继续(Y/N)"); scanf("%s",s);
if(s[0]!='Y'&&s[0]!='y')
i=1;
/*用j++代替具体数字可使屏幕显示规律(可见后面运行结
果) */
}
void Display() {
printf("|----------|----------|----------|----------|--------|--------|--------|");
}
printf("请输入第%d个班次信息:",i+1); h=-1; for(;h!=i;) { } get(i,j); j=5;
gotoxy(8,j++); printf("请输入班次:"); scanf("%s",records[i].num); for(h=0;h
if(strcmp(records[h].num,records[i].num)==0) { }
gotoxy(8,j++);
printf("输入错误! 该班次已存在!"); break;
/*判断该班次是否存在,h=-1使第一次循环顺利进行*/
save();
}
int i,j; system("cls"); load(); ShowTable1();
for(i=0,j=0;i
gotoxy(4,j+5);
gotoxy(4,j+6); if(whether(i))
printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,recor
ds[i].min,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);
printf("|%10s| 已发车 |%10s|%10s|%8.1f|%8d|%8d|",records[i].num,
records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now); }
void search() {
int i;
char s1[10]={'\0'},s2[10]={'\0'}; system("cls"); gotoxy(10,4);
printf("1. 按班次查询"); gotoxy(10,5);
printf("2. 按终点站查询"); gotoxy(10,6); printf("3. 退出"); gotoxy(12,8);
printf("请选择(1-3):"); scanf("%d",&i); load(); gotoxy(12,9); switch(i) {
/*根据输入不同选择按班次或终点站查询*/
}
ShowTable2(j);
printf("\n按任意键继续...."); getch();
/*将s1、s2初始值当按不同方式查询时在给其赋值*/
case 1: printf("请输入要查询的班次:");
scanf("%s",s1); find(s1,s2);break;
case 2: printf("请输入要查询终点站:");
scanf("%s",s2); find(s1,s2);break;
case 3: break;
default : printf("输入错误!"); }
gotoxy(12,20);
break;
}
getch();
void add() { }
int i,j=5; load(); system("cls"); gotoxy(8,4);
printf("1. 增加班次"); gotoxy(8,5); printf("2. 返回"); gotoxy(10,8);
printf("请选择(1-2)"); scanf("%d",&i); if(i==1) { }
system("cls"); gotoxy(8,4);
printf("1. 请输入要增加的班次:"); scanf("%s",records[class_num].num); for(i=0;i
if(strcmp(records[class_num].num,records[i].num)==0)
/*当满足if 条件时提示输入错误,并且跳出循环使i!=class_num*/
{ gotoxy(8,j++); printf("输入错误!"); getch(); break; }
if(i==class_num) { }
get(i,j); class_num++; save();
void Ticketorder() { 车*/
{
records[i].now++; printf("
通
向
%s
班
次
为
%s
的
票
订
票
成
int i;char num[10]; system("cls"); gotoxy(8,4); printf("1. 售票"); gotoxy(8,5); printf("2. 返回"); gotoxy(12,8);
printf("请选择(1-2):"); scanf("%d",&i); if(i==1) {
load(); search(); gotoxy(8,20);
printf("请输入要订票的班次(若无请输入0):"); scanf("%s",num); gotoxy(15,21);
for(i=0;i
if(strcmp(num,records[i].num)==0)
if(records[i].max>records[i].now&&whether(i)==1) /*判断是否满座、已发
功!\n",records[i].to,records[i].num);
}
save(); getch(); break;
else {
printf("该班次已满或已发出!\n"); getch(); break;
次,*/
}
}
if(i==class_num) /*i==因为上述有break ,故class_num时表示未找到输入班
}
{ }
printf("输入错误!"); getch();
void Ticketdelete() {
int i; char num[10]; system("cls"); gotoxy(8,4); printf("1. 退票"); gotoxy(8,5); printf("2. 返回"); gotoxy(12,8);
printf("请选择(1-2):"); scanf("%d",&i); if(i==1) {
system("cls"); load(); gotoxy(8,4);
printf("请输入要退票的班次:"); scanf("%s",num); i=findnum(num);
if(strcmp(num,records[i].num)==0)
if(whether(i)) {
gotoxy(10,20); printf("确定(Y/N)?"); scanf("%s",num);
if(num[0]=='y'||num[0]=='Y') {
} } } } gotoxy(10,22); printf("退票成功!\n"); save(); getch(); else { } if(i==class_num) { printf("输入错误!"); getch(); } printf("该班车已发出, 无法退票!\n"); getch();
void change()
{
char num[10],s[10]; int h=0,j=13,i; load(); system("cls"); gotoxy(10,8); printf("请输入要修改的班次:"); scanf("%s",num); i=findnum(num); gotoxy(4,12); if(i==class_num) { } else { printf("输入错误, 无此班次!"); getch();
} } printf("确定修改(Y/N)?"); scanf("%s",s); if(s[0]=='y') { } get(i,j); save();
void deletemessage()
{
int i,h=0; char num[10]; system("cls"); gotoxy(8,4); printf("1. 删除班次"); gotoxy(8,5); printf("2. 返回"); gotoxy(12,8); printf("请选择(1-2):"); scanf("%d",&i); if(i==1) { system("cls"); gotoxy(12,8); printf("请输入要删除的班次:"); scanf("%s",num); i=findnum(num); gotoxy(4,12); if(i==class_num) { } else { printf("输入错误, 无此班次!"); getch();
}
} } scanf("%s",num); if(num[0]=='y') { } for(;i
void quit()
{ char s[5];
printf("确认退出?(Y/N)");
scanf("%s",s);
if(s[0]=='y'||s[0]=='Y')
exit(0);
}
void ShowTable1()
{
int i=2; system("cls"); gotoxy(4,i++);
printf("****************************MESSAGE******************************");
);
|");
}
void ShowTable2(int i)
gotoxy(4,i++); printf("|----------|----------|----------|----------|--------|--------|--------|"gotoxy(4,i++); printf("| 班次 | 发车时间 | 起点站 | 终点站 |行车时间|额定载量| 已售票
{
n");
} gotoxy(4,i+5); printf("|----------|----------|----------|----------|--------|--------|--------|\
void find(char s1[],char s2[])
{
int i,h=0,m; ShowTable1(); if(s2[0]=='\0') m=1; else m=0; for(i=0;i
gotoxy(4,h+6);
printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,records[i].min,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);
}
int findnum(char s1[])
{
} h+=2; if(m==1) break; ShowTable2(h); if(h==0) printf("要查找的班次不存在!"); int i,h=0; ShowTable1(); for(i=0;i
printf("|----------|----------|----------|----------|--------|--------|--------|");
gotoxy(4,h+6);
printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,records[i].min,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);
}
void save()
{
}
void load()
{
} h+=2; break; ShowTable2(h); return i; FILE *fp1,*fp2; if((fp1=fopen("车票管理系统.dat","wb"))==NULL) { } if((fp2=fopen("车票管理系统0.dat","wb"))==NULL) { } fwrite(&class_num,sizeof(int),1,fp2); fwrite(records,sizeof(CLASS),class_num,fp1); fclose(fp1);fclose(fp2); printf("文件打开错误!"); exit(0); printf("文件打开错误!"); exit(0); FILE *fp1,*fp2; if((fp1=fopen("车票管理系统.dat","rb"))==NULL) { system("cls"); gotoxy(12,8); printf("文件打开错误!"); getch();
} } if((fp2=fopen("车票管理系统0.dat","rb"))==NULL) { } fread(&class_num,sizeof(int),1,fp2); fread(records,sizeof(CLASS),class_num,fp1); fclose(fp1);fclose(fp2); system("cls"); gotoxy(12,8); printf("文件打开错误!"); getch(); exit(0);
int whether(int i)
{
struct tm *local; time_t t; t=time(NULL); local=localtime(&t); if(local->tm_hourtm_hour==atoi(records[i].hour)&&local->tm_min
}
void gotoxy(int i,int j)
{
HANDLE hConsole = GetStdHandle ( STD_OUTPUT_HANDLE ); return 1; else return 0;
}
void get(int i,int j)
if ( INVALID_HANDLE_VALUE != hConsole ) { COORD pos = {i, j}; SetConsoleCursorPosition ( hConsole, pos ); }
{
if((atoi(records[i].hour)=0)&&(atoi(records[i].min)=0))
} break; else { } gotoxy(8,j++); printf("输入错误"); getch(); gotoxy(8,j++); printf("请输入起点站:"); scanf("%s",records[i].from); gotoxy(8,j++); printf("请输入终点站:"); scanf("%s",records[i].to); gotoxy(8,j++); printf("请输入行车时间:"); scanf("%f",&records[i].hours); gotoxy(8,j++); printf("请输入额定载量:"); scanf("%d",&records[i].max); for(;;) { gotoxy(8,j++); printf("请输入已售票数:");scanf("%d",&records[i].now); if(records[i].now
} } getch(); }