信息科学与技术学院《程序设计基础》课程设计报告题目名称:车票管理系统专业班级:电子信息工程10级2班学生姓名:王彪樊江涛学生学号:********** **********指导教师:**完成日期:2011-01 目录1 课程设计综述————————————————— 4 1.1 课程设计的目的——————————————— 4 1.2 课程设计的题目——————————————— 41.3 题目要求—————————————————— 42 概要设计——————————————————— 43 详细设计——————————————————— 5 3.1 流程图——————————————————— 53.2 源程序——————————————————64 测试——————————————————— 145 课程设计总结—————————————————161.课程设计综述1.1 课程设计的目的让我们更加深入的了解C++的,使我们一学期学习到的东西得到实践. 1.2 课程设计的题目火车票管理系统1.3 题目要求用c++设计一个系统,能提供下列服务:(1)录入班次信息(信息用文件保存),可不定时地增加班次数据(2)浏览班次信息,可显示出所有班次当前状态(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。
(3)查询路线:可按班次号查询 ,可按终点站查询(4)售票和退票功能A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数2 方案选择1)算法设计说明由主函数进入,弹出主菜单界面,通过Switch语句选择需要的功能,可以选择班次录入,浏览班次信息,查询班次信息,购票和退票以及退出系统,以完成不同的操作.其中查询班次信息中还可以由班次查询或者终点站查询.整个系统的文件载入用一个文件载入函数承当.3 详细设计3.1 流程图3.2 源程序#include <iostream>#include <fstream>#include <string>#include<time.h>using namespace std;void welcome(); //欢迎子函数void choose(); //选择子函数void banciluru(); //班次录入子函数void liulanbancixinxi(); //浏览班次信息子函数void shoupiao(); //售票子函数void tuipiao(); //退票子函数void quit(); //退出子函数void chaxun(); //查询子函数int loading(); //文件载入子函数const int MAX=20; //使数组最大值可调const int N=50;struct time //时间结构体,为了与系统时间做比较.{int hour;int minutes;};struct ticket //车票结构体,包含车次,时间结构体,起点,终点,行车时间,额定载客量,已订票人数{int Number;struct time Setout;char Qidian[MAX];char Zhongdian[MAX];float Lasttime;int Fixnumber;int Fixednumber;}car[N];//主函数int main(){welcome();return 0;}//欢迎子函数void welcome(){cout<<"________________________________________________________"<<endl; cout<<"| 欢* 迎* 使* 用* 火* 车* 票* 管* 理* 系* 统|"<<endl; cout<<"| |"<<endl; cout<<"| 本管理系统有以下功能: |"<<endl; cout<<"| |"<<endl; cout<<"| 1 班次录入|"<<endl; cout<<"| 2 浏览班次信息|"<<endl; cout<<"| 3 查询火车信息|"<<endl; cout<<"| 4 购买火车票|"<<endl; cout<<"| 5 退订火车票|"<<endl; cout<<"| 6 退出系统|"<<endl; cout<<"|______________________________________________________|"<<endl; cout<<"请输入所要执行功能前的数字: "<<endl;choose();}//选择子函数void choose(){string i;cin>>i;if(i=="1")banciluru();if(i=="2")liulanbancixinxi();if(i=="3")chaxun();if(i=="4")shoupiao();if(i=="5")tuipiao();if(i=="6")quit();else{cout<<"输入有误!请在数字1-5之间重新您的输入选择!"<<endl;choose();}}//班次录入子函数void banciluru(){string t="1";ofstream outfile;outfile.open("班次信息.txt",ios::app);for(int i=0;t=="1";i++){cout<<"请输入需要添加的火车班次:"<<endl;cin>>car[i].Number;cout<<"请输入此班次发车时间(格式:先输入小时,回车,再输入分钟):"<<endl;cin>>car[i].Setout.hour;cin>>car[i].Setout.minutes;cout<<"请输入出发站:"<<endl;cin>>car[i].Qidian;cout<<"请输入终点站:"<<endl;cin>>car[i].Zhongdian;cout<<"请输入行车时间:"<<endl;cin>>car[i].Lasttime;cout<<"请输入额定载客量:"<<endl;cin>>car[i].Fixnumber;cout<<"请输入已订票人数:"<<endl;cin>>car[i].Fixednumber;outfile<<car[i].Number<<" "<<car[i].Setout.hour<<" "<<car[i].Setout.minutes<<" "<<car[i].Qidian<<" "<<car[i].Zhongdian<<" "<<car[i].Lasttime<<" "<<car[i].Fixnumber<<" "<<car[i].Fixednumber<<endl;cout<<"是否继续录入?(是请输1,否请输任意键返回主菜单)"<<endl;cin>>t;if(t!="1"){welcome();}}outfile.close();cout<<"输入回车键返回"<<endl;getchar();getchar();welcome();}//浏览班次子函数void liulanbancixinxi(){int c;c=loading();cout<<"班次"<<" "<<"发车时间"<<" "<<"起点站"<<" "<<"终点站"<<" "<<"行车时间"<<" "<<"额定载客量"<<" "<<"已订票人数"<<endl;for(int i=0;i<c;i++){cout<<car[i].Number<<" "<<car[i].Setout.hour<<":"<<car[i].Setout.minutes<<" "<<car[i].Qidian<<" "<<car[i].Zhongdian<<" "<<car[i].Lasttime<<" "<<car[i].Fixnumber<<" "<<car[i].Fixednumber<<endl;time_t tval;struct tm *now;tval = time(NULL);now = localtime(&tval);if((now->tm_hour==car[i].Setout.hour&&now->tm_min>car[i].Setout.minutes)||(now->tm_hour> car[i].Setout.hour))cout<<"此车已发出"<<endl;}cout<<"输入回车键返回"<<endl;getchar();getchar();welcome();}//车次查询子函数void Numbersearch();void Finalsearch();void chaxun(){string t;cout<<"1.按班次查询"<<endl;cout<<"2.按终点站查询"<<endl;cout<<"请输入您想选择的查询方法前的数字:"<<endl;cin>>t;if(t=="1")Numbersearch();if(t=="2")Finalsearch();if(t!="1"||t!="2"){cout<<"输入有误,请重新输入"<<endl;chaxun();}}//班次查询子函数void Numbersearch(){loading();int SearchNumber;cout<<"请输入您需要查找的班次号:"<<endl;cin>>SearchNumber;cout<<"班次"<<" "<<"发车时间"<<" "<<"起点站"<<" "<<"终点站"<<" "<<"行车时间"<<" "<<"额定载客量"<<" "<<"已订票人数"<<endl;cout<<car[SearchNumber-1].Number<<""<<car[SearchNumber-1].Setout.hour<<":"<<car[SearchNumber-1].Setout.minutes<<""<<car[SearchNumber-1].Qidian<<" "<<car[SearchNumber-1].Zhongdian<<" "<<car[SearchNumber-1].Lasttime<<" "<<car[SearchNumber-1].Fixnumber<<" "<<car[SearchNumber-1].Fixednumber<<endl;cout<<"输入回车键返回"<<endl;getchar();getchar();welcome();}//终点站查询子函数void Finalsearch(){int R;R=loading();int i;char Address[MAX];cout<<"请输入终点站名称:"<<endl;cin>>Address;cout<<"班次"<<" "<<"发车时间"<<" "<<"起点站"<<" "<<"终点站"<<" "<<"行车时间"<<" "<<"额定载客量"<<" "<<"已订票人数"<<endl;for(i=0;i<R;i++){if((strcmp(Address,car[i].Zhongdian))==0)cout<<car[i].Number<<""<<car[i].Setout.hour<<":"<<car[i].Setout.minutes<<" "<<car[i].Qidian<<" "<<car[i].Zhongdian<<" "<<car[i].Lasttime<<" "<<car[i].Fixnumber<<" "<<car[i].Fixednumber<<endl;}cout<<"输入回车键返回"<<endl;getchar();getchar();welcome();}//购买火车票子函数void shoupiao(){int R;R=loading();int i;cout<<"请输入要订购的车票的班次:"<<endl;cin>>i;if(i<=0||i>R){cout<<"对不起,今天没有这趟车,请明天再来,谢谢使用!"<<endl;cout<<"输入回车键返回"<<endl;getchar();getchar();welcome();}time_t tval;struct tm *now;tval = time(NULL);now = localtime(&tval);if((now->tm_hour==car[i-1].Setout.hour&&now->tm_min<car[i-1].Setout.minutes)||(now->tm_h our<car[i-1].Setout.hour)){if(car[i-1].Fixednumber<car[i-1].Fixnumber){(car[i-1].Fixednumber)++;ofstream outfile;outfile.open("班次信息.txt",ios::out);for(i=0;i<R;i++){outfile<<car[i].Number<<" "<<car[i].Setout.hour<<" "<<car[i].Setout.minutes<<" "<<car[i].Qidian<<" "<<car[i].Zhongdian<<" "<<car[i].Lasttime<<" "<<car[i].Fixnumber<<" "<<car[i].Fixednumber<<endl;}outfile.close();cout<<"你的订票成功,请按时上车,谢谢使用!"<<endl;}else cout<<"对不起,今天的这趟车的票已卖完,请明天再来,谢谢合作"<<endl;}else cout<<"对不起,今天的这趟车已发出,请明天再来,谢谢合作"<<endl;cout<<"输入回车键返回"<<endl;getchar();getchar();welcome();}//退订火车票子函数void tuipiao(){int R;R=loading();int i;cout<<"请输入要退购的车票的班次:"<<endl;cin>>i;if(i<=0||i>R){cout<<"对不起,今天没有这趟车,无法完成退票.谢谢使用!"<<endl;cout<<"输入回车键返回"<<endl;getchar();getchar();welcome();}time_t tval;struct tm *now;tval = time(NULL);now = localtime(&tval);if((now->tm_hour==car[i-1].Setout.hour&&now->tm_min<car[i-1].Setout.minutes)||(now->tm_h our<car[i-1].Setout.hour)){if(car[i-1].Fixednumber>=1){car[i-1].Fixednumber-=1;ofstream outfile;outfile.open("班次信息.txt",ios::out);for(i=0;i<R;i++){outfile<<car[i].Number<<" "<<car[i].Setout.hour<<" "<<car[i].Setout.minutes<<" "<<car[i].Qidian<<" "<<car[i].Zhongdian<<" "<<car[i].Lasttime<<" "<<car[i].Fixnumber<<" "<<car[i].Fixednumber<<endl;}outfile.close();cout<<"退订车票成功,谢谢使用!"<<endl;}else cout<<"对不起,今天的这趟车的票尚未卖出,无法完成退票!"<<endl;}else cout<<"对不起,今天的这趟车已发出,无法完成退票!"<<endl;cout<<"输入回车键返回"<<endl;getchar();getchar();welcome();}//退出子函数void quit(){cout<<"*********************谢谢使用本系统,欢迎下次继续使用***********************"<<endl;}//文件载入子函数int loading(){int i;ifstream infile;infile.open("班次信息.txt",ios::in);if(!infile){cout<<"请查看原文件是否存在!"<<endl;cout<<"按任意键返回";getchar();getchar();welcome();}for(i=0;!infile.eof();i++){infile>>car[i].Number>>car[i].Setout.hour>>car[i].Setout.minutes>>car[i].Qidian>>car[i].Zhongd ian>>car[i].Lasttime>>car[i].Fixnumber>>car[i].Fixednumber;}return i-1;}4 测试主菜单:班次录入:浏览班次信息:查询火车信息:测试中发现订购和退订车票后,虽然已订购车票数实际上有增减,但不能存入到文件中及时保存.后来通过以文件覆盖的方法重新录入一次文件得以解决.测试中还发现若时间是整点的话,分钟的0只能是一个0,因为分钟定义的格式是int.,但若果改成char格式之后和系统时间比较的函数将不成立.所以这个程序仍然存在这样的一个问题.5 课程设计总结通过这次的课程设计,我发现我还有好多的不足之处,还有好多知识不能很好的运用,而且题目中的一个要求没有正常的完成.我觉得我们应该花更多的时间去查找资料,因为仅凭自己已学的知识是无法完成这些内容的.这次课程设计我用了9个子函数去完成,分开完成各个函数并验证其正确性,这样的方法让我能够顺利完成整个系统.不足之处还有好多,我应该在以后的学习中更加努力完善.6参考书目:[1]谭浩强,《C++程序设计》,北京,清华大学出版社,2006年.。