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

下载本文档

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

文档简介

C+课程设计报告课程设计题目:列车时刻查询系统学生姓名 : 专 业:软件工程系班 级 : 指导教师 : 2009年6月25日一、 问题分析:i) 具有不同类型的列车类的描述 建立了Train类,利用继承与派生建立派生类Ttrain(特快列车)类、Ztrain(直达特快列车)类、Dtrain(动车组)类、Ktrain(快速列车)类ii) 有列表时刻表类的描述 利用链表模板类来实现列车时刻表的存储,将整个程序运行过程中用户输入的所有列车信息存储到链表中,以便用户查询。iii) 能完成时刻表的输入、查询、保存等功能利用链表模板存储信息,调用函数对链表进行处理完成输入、查询等功能。利用文件的来实现列车信息的长久存储,将信息存储到磁盘上。二、 结构分析:i) Train类的UML图 Train- trainNum10:char- Eozoic20:char- Terminus20;char- starTime: Time+Train():+ Train(Num:char,Eo:char,Te:char,Ti:Time)+Train(x:const&Train)+Train()+ operator =( l: const Train &): 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()ii) Ttrain类的UML图 Ttrain+Ttrain()+Ttrain(Num:char,Eo:char,Te:char,Ti:Time)+Ttrain()iii) Dtrain类的UML图 Dtrain+Dtrain()+Dtrain(Num:char, Eo:char,Te:char,Ti:Time)+Dtrain()iv) Ktrain类的UML图 Ktrain+Ktrain()+Ktrain(Num:char,Eo:char,Te:char,Ti:Time )+Ktrain()三、 实现流程分析:i) Train类的声明与实现:struct Timeint hour;int minute;class Trainprivate:char trainNum10;char Eozoic20;char Terminus20;Time starTime;public:Train()Train(char Num,char Eo,char Te, Time Ti);Train(const Train & x);Train()Train & operator =(const Train & l); char *GetNum();char *GetEo();char *GetTe();Time GetTi(); int SelectNum(char Num); int SelectPlace(char Place1,char Place2); void Show();iv) Ztrain、Ttrain、Dtrain、Ktrain类的声明与实现:class Ztrain:virtual public Trainpublic:Ztrain()Ztrain(char Num,char Eo,char Te, Time Ti);Ztrain();class Ttrain:virtual public Trainpublic:Ttrain()Ttrain(char Num,char Eo,char Te, Time Ti);Ttrain();class Dtrain: public Ttrain,public Ztrainpublic:Dtrain()Dtrain(char Num,char Eo,char Te, Time Ti);Dtrain();class Ktrain: public Trainpublic:Ktrain()Ktrain(char Num,char Eo,char Te, Time Ti);Ktrain();iii) 主函数的实现:void ShowMenu();/*菜单显示*/void Creat();/*建立字符串工具箱*/ void SerchAsPlace();/按站台查询void SerchAsNum();/按车次查询void Display();/显示所有信息void Save();/将链表信息保存到文件中void Open();/将文件中的信息读到链表中LinkedList List;int main(void) char x; bool quit = false; List.ClearList(); Open(); while(!quit) ShowMenu(); cinx; switch(x) case a: coutwode; 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); return 1; /*主菜单*/void ShowMenu() coutn*n; couta、添加列车时刻表n; coutb、按始发站终点站查询信息n; coutc、按车次查询列车信息n; coutd、显示所有列车信息n; coute、保存列车信息n; coutf、退出n; coutn*n; cout请选择; void Creat()int m=1;char str110;int hour,minute;char str220,str320;Train p;Time y1;int n;while(m=1) cout请输入列车的类型:(,直达快车 2,动车组3,特快车 4,快车)n;coutstr1; cout请输入发车时间(时和分中间用空格隔开):hourminute;y1.hour=hour;y1.minute=minute; coutstr2; coutstr3;if(n=1)Ztrain t(str1,str2,str3,y1);p=t;else if(n=2)Dtrain t(str1,str2,str3,y1);p=t;else if(n=3)Ttrain t(str1,str2,str3,y1);p=t;else if(n=4)Ktrain t(str1,str2,str3,y1);p=t;elsecout输入错误!; List.InsertRear(p); coutm; system(pause);void SerchAsPlace()char str220,str320;long pos=0;Train p; coutstr2;coutstr3;List.Reset(); while(!List.EndOfList()p=List.Data();pos=p.SelectPlace(str2,str3);List.Next();if(pos=0)cout没有此信息;system(pause); void SerchAsNum()Train p;long pos=0;char str120;coutstr1;List.Reset(); while(!List.EndOfList()p=List.Data();pos=p.SelectNum(str1);List.Next();if(pos=0)cout没有此信息;system(pause);void Display()Train p;List.Reset(); while(!List.EndOfList()p=List.Data();p.Show();List.Next();system(pause);四、 个性功能介绍:i) 链表模板类的声明与实现:/*节点类*/ templateclass Nodeprivate:Node * next;public:T data;Node (const T & item,Node * ptrnext=NULL);void InsertAfter(Node * p);Node * DeleteAfter();Node * NextNode()const;templateNode:Node(const T& item,Node * ptrnext):data(item),next(ptrnext)templateNode * Node:NextNode()constreturn next;templatevoid Node:InsertAfter(Node *p)p-next=next;next=p;templateNode * Node:DeleteAfter()Node * tempPtr=next;if(next=NULL)return NULL;next=tempPtr-next;return tempPtr;/链表类templateclass LinkedListprivate:Node * head,* tail;Node * prevPtr,* currPtr;int size;int position;Node * GetNode(const T & item,Node * ptrnext=NULL);void FreeNode(Node * p);void CopyList(const LinkedList & L);public:LinkedList();LinkedList(const LinkedList & L);LinkedList();LinkedList & operator=(const LinkedList & L);int ListSize()const;int ListEmpty()const;void Reset(int pos=0);void Next();int EndOfList()const;int CurrentPosition()const;void InsertFront(const T& item);void InsertRear(const T& item);void InsertAt(const T& item);void InsertAfter(const T& item);T DeleteFront();void DeleteAt();T& Data(void);void ClearList(void);templateNode* LinkedList:GetNode(const T & item,Node *ptrnext)Node *p; p = new Node(item,ptrnext); if (p = NULL) cout Memory allocation failure!n; exit(1); return p;templatevoid LinkedList:FreeNode(Node *p)delete p;templatevoid LinkedList:CopyList(const LinkedList & L) /P用来遍历L Node *p = L.head; int pos; /将L中的每一个元素插入到当前链表最后 while (p != NULL) InsertRear(p-data); p = p-NextNode(); /如果链表空,返回 if (position = -1) return; /在新链表中重新设置prevPtr和currPtr prevPtr = NULL; currPtr = head; for (pos = 0; pos != position; pos+) prevPtr = currPtr; currPtr = currPtr-NextNode(); templateLinkedList:LinkedList(void)head=NULL;tail=NULL;size=0;position=0;templateLinkedList:LinkedList(const LinkedList & L)head= tail = NULL; prevPtr = currPtr = NULL; size = 0; position = -1; CopyList(L);templatevoid LinkedList:ClearList()Node *currPosition, *nextPosition; currPosition = head; while(currPosition != NULL) /取得下一结点的地址并删除当前结点 nextPosition = currPosition-NextNode(); FreeNode(currPosition); currPosition = nextPosition; / 移动到下一结点 head = tail = NULL; prevPtr = currPtr = NULL; size = 0; position = -1;templateLinkedList: LinkedList()ClearList();templateLinkedList & LinkedList:operator =(const LinkedList & L)if (this = &L) /不能将链表赋值给它自身return *this; ClearList(); CopyList(L); return *this;templateint LinkedList:ListSize()constreturn size;templateint LinkedList:ListEmpty()constif(size=0)return 1;elsereturn 0;templatevoid LinkedList:Reset(int pos)int startPos; / 如果链表为空,返回 if (head = NULL) return; / 如果位置不合法,中止程序 if (pos size-1) cerr The position you set is wrong or out of range!NextNode(); prevPtr = head; startPos = 1; /移动指针直到 position = pos for(position=startPos; position != pos; position+) / 向前移动遍历指针 prevPtr = currPtr; currPtr = currPtr-NextNode(); templatevoid LinkedList:Next()if(currPtr!=NULL)prevPtr=currPtr; currPtr=currPtr-NextNode();position+;templateint LinkedList:EndOfList()constif(currPtr=NULL)return 1;else return 0;templateint LinkedList:CurrentPosition()constreturn position;templatevoid LinkedList:InsertFront(const T &item)/ 如果链表不空则调用Reset if (head != NULL) Reset(); InsertAt(item); / 在表头插入templatevoid LinkedList:InsertRear(const T& item)Node *newNode; prevPtr = tail; newNode = GetNode(item); / 创建新结点 if (head = NULL) / 如果表空则插入在表头 head = tail = newNode; else tail-InsertAfter(newNode); tail = newNode; currPtr = tail; position = size; size+;templatevoid LinkedList:InsertAt(const T& item)Node *newNode; / 两种情况: 插入在链表头或链表之中 if (prevPtr = NULL) / 插入在链表头,包括将结点插入到空表中 newNode = GetNode(item,head); tail = newNode; else / 插入到链表之中. 将结点置于prevPtr之后 newNode = GetNode(item); prevPtr-InsertAfter(newNode); / 如果prevPtr = tail, 说明正在向空表中插入, / 或者是插入到非空表的表尾;更新rear 和 position if (prevPtr = tail) tail = newNode; position = size; /更新currPtr并且使size增值 currPtr = newNode; size+; templatevoid LinkedList:InsertAfter(const T& item)Node *p; p = GetNode(item); if (head = NULL) / 向空表中插入 head = currPtr = tail = p; position = 0; else / 插入到最后一个结点之后 if (currPtr = NULL) currPtr = prevPtr; currPtr-InsertNodeAfter(p); else if (currPtr = rear) tail = p; position = size; else position+; prevPtr = currPtr; currPtr = p; size+; / 使链表长度增值templateT LinkedList:DeleteFront()T item; Reset(); if (head = NULL) cout The list is empty! data; DeleteAt(); return item;templatevoid LinkedList:DeleteAt()Node *p; / 如果表空或达到表尾则出错 if (currPtr = NULL) cout The list is empty or it is the last node! NextNode(); else / 分离prevPtr之后的一个内部结点. 保存其地址 p = prevPtr-DeleteAfter(); / 如果表尾结点被删除, 则新的表尾是prevPtr 并且position自减; / 否则position不变 if (p = tail) tail = prevPtr; position-; / 使currPtr越过被删除的结点 currPtr = p-NextNode(); /p-NextNode()=pr

温馨提示

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

评论

0/150

提交评论