列车时刻查询系统设计-C++课程设计报告_第1页
列车时刻查询系统设计-C++课程设计报告_第2页
列车时刻查询系统设计-C++课程设计报告_第3页
列车时刻查询系统设计-C++课程设计报告_第4页
列车时刻查询系统设计-C++课程设计报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C++课程设计报告课程设计题目:列车时刻查询系统学生姓名:专业:软件工程系班级:指导教师:2009年6月25日问题分析:具有不同类型的列车类的描述建立了Train类,利用继承与派生建立派生类Ttrain(特快列车)类、Ztrain(直达特快列车)类、Dtrain(动车组)类、Ktrain(快速列车)类有列表时刻表类的描述利用链表模板类来实现列车时刻表的存储,将整个程序运行过程中用户输入的所有列车信息存储到链表中,以便用户查询。能完成时刻表的输入、查询、保存等功能利用链表模板存储信息,调用函数对链表进行处理完成输入、查询等功能。利用文件的来实现列车信息的长久存储,将信息存储到磁盘上。结构分析:Train类的UML图Train-trainNum[10]:char-Eozoic[20]:char-Terminus[20];char-starTime:Time+Train():+Train(Num[]:char,Eo[]:char,Te[]:char,Ti:Time)+Train(x:const&Train)+~Train()+operator=(l:constTrain&):Train&+GetNum():char*+GetEo():char*+GetTe():char*+GetTi():Time+SelectNum(Num[]:char):int+SelectPlace(Place1[]:char,Place2[]:char):int+Show():voidii)Ztrain类的UML图Ztrain+Ztrain()+Ztrain(Num[]:char,Eo[]:char,Te[]:char,Ti:Time)+~Ztrain()Ttrain类的UML图Ttrain+Ttrain()+Ttrain(Num[]:char,Eo[]:char,Te[]:char,Ti:Time)+~Ttrain()Dtrain类的UML图Dtrain+Dtrain()+Dtrain(Num[]:char,Eo[]:char,Te[]:char,Ti:Time)+~Dtrain()Ktrain类的UML图Ktrain+Ktrain()+Ktrain(Num[]:char,Eo[]:char,Te[]:char,Ti:Time)+~Ktrain()实现流程分析:Train类的声明与实现:structTime{ inthour; intminute;};classTrain{private: chartrainNum[10]; charEozoic[20]; charTerminus[20]; TimestarTime;public: Train(){} Train(charNum[],charEo[],charTe[],TimeTi); Train(constTrain&x); ~Train(){} Train&operator=(constTrain&l);char*GetNum(); char*GetEo(); char*GetTe(); TimeGetTi(); intSelectNum(charNum[]); intSelectPlace(charPlace1[],charPlace2[]); voidShow();};Ztrain、Ttrain、Dtrain、Ktrain类的声明与实现:classZtrain:virtualpublicTrain{public: Ztrain(){} Ztrain(charNum[],charEo[],charTe[],TimeTi); ~Ztrain(){}};classTtrain:virtualpublicTrain{public: Ttrain(){} Ttrain(charNum[],charEo[],charTe[],TimeTi); ~Ttrain(){}};classDtrain:publicTtrain,publicZtrain{public: Dtrain(){} Dtrain(charNum[],charEo[],charTe[],TimeTi); ~Dtrain(){}};classKtrain:publicTrain{public: Ktrain(){} Ktrain(charNum[],charEo[],charTe[],TimeTi); ~Ktrain(){}};主函数的实现:voidShowMenu();/*菜单显示*/voidCreat();/*建立字符串工具箱*/voidSerchAsPlace();//按站台查询voidSerchAsNum();//按车次查询voidDisplay();//显示所有信息voidSave();//将链表信息保存到文件中voidOpen();//将文件中的信息读到链表中LinkedList<Train>List;intmain(void){charx;boolquit=false; List.ClearList(); Open();while(!quit){ShowMenu();cin>>x;switch(x){case'a': cout<<"wode";system("cls");Creat();system("cls");break;case'b':system("cls");SerchAsPlace();system("cls");break;case'c':system("cls");SerchAsNum();system("cls");break;case'd':system("cls");Display();system("cls");break;case'e':system("cls");Save();system("cls");break; case'f':quit=true;break;default:break;} //system("cls");}return1;}/*主菜单*/voidShowMenu(){cout<<"\n*******************************************\n";cout<<"a、添加列车时刻表\n";cout<<"b、按始发站终点站查询信息\n";cout<<"c、按车次查询列车信息\n";cout<<"d、显示所有列车信息\n"; cout<<"e、保存列车信息\n"; cout<<"f、退出\n";cout<<"\n*******************************************\n";cout<<"请选择";}voidCreat(){intm=1; charstr1[10]; inthour,minute; charstr2[20],str3[20]; Trainp; Timey1; intn; while(m==1){ cout<<"请输入列车的类型:(,直达快车2,动车组3,特快车4,快车)"<<endl; cin>>n; cout<<"请输入车次:"; cin>>str1; cout<<"请输入发车时间(时和分中间用空格隔开):"<<endl;cin>>hour>>minute; y1.hour=hour; y1.minute=minute; cout<<"请输入始发站:"; cin>>str2; cout<<"请输入终点站:"; cin>>str3; if(n==1) { Ztraint(str1,str2,str3,y1); p=t; } elseif(n==2) { Dtraint(str1,str2,str3,y1); p=t; } elseif(n==3) { Ttraint(str1,str2,str3,y1); p=t; } elseif(n==4) { Ktraint(str1,str2,str3,y1); p=t; } else cout<<"输入错误!";List.InsertRear(p);cout<<"是否想继续输入:,是.2,否。\n";cin>>m;}system("pause");}voidSerchAsPlace(){ charstr2[20],str3[20]; longpos=0; Trainp;cout<<"请输入始发站:"; cin>>str2; cout<<"请输入终点站:"; cin>>str3; List.Reset();while(!List.EndOfList()) { p=List.Data(); pos=p.SelectPlace(str2,str3); List.Next(); } if(pos==0) cout<<"没有此信息"; system("pause");}voidSerchAsNum(){ Trainp; longpos=0; charstr1[20]; cout<<"请输入车次:"; cin>>str1; List.Reset();while(!List.EndOfList()) { p=List.Data(); pos=p.SelectNum(str1); List.Next(); } if(pos==0) cout<<"没有此信息"; system("pause");}voidDisplay(){ Trainp; List.Reset();while(!List.EndOfList()) { p=List.Data(); p.Show(); List.Next(); } system("pause");}个性功能介绍:链表模板类的声明与实现:/*节点类*/template<classT>classNode{ private: Node<T>*next; public: Tdata; Node(constT&item,Node<T>*ptrnext=NULL); voidInsertAfter(Node<T>*p); Node<T>*DeleteAfter(); Node<T>*NextNode()const;};template<classT>Node<T>::Node(constT&item,Node<T>*ptrnext):data(item),next(ptrnext){}template<classT>Node<T>*Node<T>::NextNode()const{ returnnext;}template<classT>voidNode<T>::InsertAfter(Node<T>*p){ p->next=next; next=p;}template<classT>Node<T>*Node<T>::DeleteAfter(){ Node<T>*tempPtr=next; if(next==NULL) returnNULL; next=tempPtr->next; returntempPtr;}//链表类template<classT>classLinkedList{ private: Node<T>*head,*tail; Node<T>*prevPtr,*currPtr; intsize; intposition; Node<T>*GetNode(constT&item,Node<T>*ptrnext=NULL); voidFreeNode(Node<T>*p); voidCopyList(constLinkedList<T>&L); public: LinkedList(); LinkedList(constLinkedList<T>&L); ~LinkedList(); LinkedList<T>&operator=(constLinkedList<T>&L); intListSize()const; intListEmpty()const; voidReset(intpos=0); voidNext(); intEndOfList()const; intCurrentPosition()const; voidInsertFront(constT&item); voidInsertRear(constT&item); voidInsertAt(constT&item); voidInsertAfter(constT&item); TDeleteFront(); voidDeleteAt(); T&Data(void); voidClearList(void);};template<classT>Node<T>*LinkedList<T>::GetNode(constT&item,Node<T>*ptrnext){ Node<T>*p;p=newNode<T>(item,ptrnext);if(p==NULL){cout<<"Memoryallocationfailure!\n";exit(1);}returnp;}template<classT>voidLinkedList<T>::FreeNode(Node<T>*p){ deletep;}template<classT>voidLinkedList<T>::CopyList(constLinkedList<T>&L){ //P用来遍历LNode<T>*p=L.head;intpos;//将L中的每一个元素插入到当前链表最后while(p!=NULL) { InsertRear(p->data);p=p->NextNode(); }//如果链表空,返回if(position==-1)return;//在新链表中重新设置prevPtr和currPtrprevPtr=NULL;currPtr=head;for(pos=0;pos!=position;pos++) { prevPtr=currPtr;currPtr=currPtr->NextNode(); }}template<classT>LinkedList<T>::LinkedList(void){ head=NULL; tail=NULL; size=0; position=0;}template<classT>LinkedList<T>::LinkedList(constLinkedList<T>&L){ head=tail=NULL;prevPtr=currPtr=NULL;size=0;position=-1;CopyList(L);}template<classT>voidLinkedList<T>::ClearList(){ Node<T>*currPosition,*nextPosition;currPosition=head;while(currPosition!=NULL){ //取得下一结点的地址并删除当前结点nextPosition=currPosition->NextNode();FreeNode(currPosition);currPosition=nextPosition;//移动到下一结点}head=tail=NULL;prevPtr=currPtr=NULL;size=0;position=-1;}template<classT>LinkedList<T>::~LinkedList(){ ClearList();}template<classT>LinkedList<T>&LinkedList<T>::operator=(constLinkedList&L){ if(this==&L)//不能将链表赋值给它自身 return*this;ClearList();CopyList(L);return*this;}template<classT>intLinkedList<T>::ListSize()const{ returnsize;}template<classT>intLinkedList<T>::ListEmpty()const{ if(size==0) return1; else return0;}template<classT>voidLinkedList<T>::Reset(intpos){ intstartPos;//如果链表为空,返回if(head==NULL)return;//如果位置不合法,中止程序if(pos<0||pos>size-1){cerr<<"Thepositionyousetiswrongoroutofrange!"<<endl; return; }//设置与遍历链表有关的成员if(pos==0){//将指针重新设置到表头prevPtr=NULL;currPtr=head;position=0;}else//重新设置currPtr,prevPtr,和position{currPtr=head->NextNode();prevPtr=head;startPos=1;//移动指针直到position==posfor(position=startPos;position!=pos;position++){//向前移动遍历指针prevPtr=currPtr;currPtr=currPtr->NextNode(); }}}template<classT>voidLinkedList<T>::Next(){ if(currPtr!=NULL) { prevPtr=currPtr; currPtr=currPtr->NextNode(); position++; }}template<classT>intLinkedList<T>::EndOfList()const{ if(currPtr==NULL) return1; else return0;}template<classT>intLinkedList<T>::CurrentPosition()const{ returnposition;}template<classT>voidLinkedList<T>::InsertFront(constT&item){ //如果链表不空则调用Resetif(head!=NULL)Reset();InsertAt(item);//在表头插入}template<classT>voidLinkedList<T>::InsertRear(constT&item){ Node<T>*newNode;prevPtr=tail;newNode=GetNode(item);//创建新结点if(head==NULL)//如果表空则插入在表头head=tail=newNode;else{tail->InsertAfter(newNode);tail=newNode;}currPtr=tail;position=size;size++;}template<classT>voidLinkedList<T>::InsertAt(constT&item){ Node<T>*newNode;//两种情况:插入在链表头或链表之中if(prevPtr==NULL) {//插入在链表头,包括将结点插入到空表中newNode=GetNode(item,head);tail=newNode;}else{//插入到链表之中.将结点置于prevPtr之后newNode=GetNode(item);prevPtr->InsertAfter(newNode);}//如果prevPtr==tail,说明正在向空表中插入,//或者是插入到非空表的表尾;更新rear和positionif(prevPtr==tail){tail=newNode;position=size;}//更新currPtr并且使size增值currPtr=newNode;size++;}template<classT>voidLinkedList<T>::InsertAfter(constT&item){ Node<T>*p;p=GetNode(item);if(head==NULL)//向空表中插入{head=currPtr=tail=p;position=0;}else{//插入到最后一个结点之后if(currPtr==NULL) { currPtr=prevPtr;currPtr->InsertNodeAfter(p); }elseif(currPtr==rear){ tail=p;position=size;}else{ position++;prevPtr=currPtr;currPtr=p; }}size++;//使链表长度增值}template<classT>TLinkedList<T>::DeleteFront(){ Titem;Reset();if(head==NULL){cout<<"Thelistisempty!"<<endl;exit(1);}item=currPtr->data;DeleteAt();returnitem;}template<classT>voidLinkedList<T>::DeleteAt(){ Node<T>*p;//如果表空或达到表尾则出错if(currPtr==NULL){ cout<<"Thelistisemptyoritisthelastnode!"<<endl;exit(1);}//删除将发生在表头或链表之中if(prevPtr==NULL){ //保存头结点地址并将其从链表中分离。p=head;head=head->NextNode();}else//分离prevPtr之后的一个内部结点.保存其地址p=prevPtr->DeleteAfter();//如果表尾结点被删除,则新的表尾是prevPtr并且position自减;//否则position不变if(p==tail){tail=prevPtr;position--;}//使currPtr越过被删除的结点currPtr=p->NextNode();//p->NextNode()==prevPtr->NextNode();//释放结点,并使链表长度自减FreeNode(p);size--;}template<classT>T&LinkedList<T>::Data(){ //如果链表为空或已经完成遍历则出错if(size==0||currPtr==NULL){cerr<<"Thelistisemptyoritisthelastnode!"<<endl;exit(1); } returncurrPtr->data;}利用文件保存和读出信息的函数的实现:voidSave(){ ofstreamout("file"); Trainp; List.Reset(); Timey;while(!List.EndOfList()) { p=List.Data(); out<<p.GetNum()<<endl; out<<p.GetEo()<<endl; out<<p.GetTe()<<endl; y=p.GetTi(); out<<y.hour<<endl; out<<y.minute<<endl; List.Next(); } cout<<保存完毕!"<<endl; out.close();}voidOpen(){ ifstreamin("file"); charstr1[10]; charstr2[20]; charstr3[20]; Timey; while(!in.eof()) { in>>str1; in>>str2; in>>str3; in>>y.hour; in>>y.minute; Traint(str1,str2,str3,y); List.InsertRear(t); } in.close();}运行过程与界面:启动VisualC++开发环境,运行程序得到主界面,如图一图一在主界面中输入‘a’,进入添加界面,按提示进行输入列车信息,如图二图二选择1,继续录入信息,选择2退出此界面返回主界面,在主界面选择‘b’,进入按站台查询界面,输入始发站与终点站,系统会显示出所有符合要求的列车信息,如图三所示。图三返回主界面,在主界面输入‘c’,进入按车次查询界面,在该界面中输入要查询的车次后,会自动显示出该车的所有信息,如图四所示。图四返回主菜单,在主界面中输入‘d’,界面中会显示出当前链表中所有信息及之前保存在文件中的历史记录,如图五所示。6、返回主界面后,选择‘e’,即可将此次操作录入的所有列车信息保存到文件中。选择‘f’即可退出系统。课程设计小结:在整个课程设计完成的过程中,我更加能熟练运用链表模板类与文件的输入与输出。同时,我初步了解了c++编程的流程,为以后的程序设计奠定了基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统基于单片机的控制系统在PLC虚拟教学实验中的应用研究基于单片机系统的网络通信研究与应用基于PIC16F877单片机的莫尔斯码自动译码系统设计与研究基于单片机的模糊控制器在工业电阻炉上的应用研究基于双单片机冲床数控系统的研究与开发基于Cygnal单片机的μC/OS-Ⅱ的研究基于单片机的一体化智能差示扫描量热仪系统研究基于TCP/IP协议的单片机与Internet互联的研究与实现变频调速液压电梯单片机控制器的研究基于单片机γ-免疫计数器自动换样功能的研究与实现基于单片机的倒立摆控制系统

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论