C++课程设计报告.docx
- 文档编号:11671618
- 上传时间:2023-03-30
- 格式:DOCX
- 页数:22
- 大小:249.27KB
C++课程设计报告.docx
《C++课程设计报告.docx》由会员分享,可在线阅读,更多相关《C++课程设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
C++课程设计报告
中南民族大学工商学院
计算机科学与技术系
项目名称:
航班客运订票系统
学生姓名:
学号:
班级:
指导教师:
2009年12月28日
目录
1系统结构模块示意图1
2数据结构设计及用法说明2
2.1航班结构体存储结构2
2.2旅客结构体存储结构2
2.2替补乘客结构体存储2
3程序结构3
3.1订票3
4各模块的功能5
4.1输入航班5
4.2输出航班5
4.3查找航班5
4.4订票5
4.5退票5
4.6删除航班5
5试验结果6
5.1输入航班信息6
5.2输出航班信息7
5.3查找航班7
5.4订票8
5.5退票10
5.6删除航班12
6个人体会13
7参考文献14
附录源代码清单15
1系统结构模块
主菜单分为输入航班信息,输出航班信息,查找航班,订票,退票,删除航班,退出系统。
输入航班信息包括航班的航班号、飞机号、终点站、飞行时间、总票数。
输出航班输出航班号、飞机号、终点站、飞行日期、余票数。
查找航班时,输入终点站时,就显示该终点站所对应的航班的信息。
退票时,当乘客所订的票不是候补票时,余票数减少;当乘客的票时候补票时,余票数不变。
删除航班时,当乘客输入的航班号和飞机号与输入航班时的航班号与飞机号都相同时,删除该航班。
示意图如下图1.1所示。
图1.1
2数据结构设计及用法说明
数据结构设计:
在本程序中,用到三个结构体。
他们分别是航班、乘客、候补结构体。
在航班结构体中数据成员有航班号、飞机号、终点站、飞行日期、总票数、余票数、候补数、和一个指向下一个该节点的指针。
在乘客结构体中,要用到的数据成员有姓名、终点站、飞行日期、订票数、座位号、和指向下一个该节点的指针。
在候补结构体中数据成员有乘客姓名和一个指向下一个该节点的指针。
2.1航班结构体存储结构
structflight
{Elemtypeflight_no;
Elemtypeplane_no;
Elemtypezhongdian;
intdate;
inttotal_ticket;
intticket_balance;
intticket_backup;
flight*next;};
2.2旅客结构体存储结构
structCustomer
{Elemtypename;
Elemtypezhongdian;//终点站
intdate;
intticket;
intseat_no;//座位数
Customer*next;};
2.2替补乘客结构体存储
structReplace
{Elemtypename;
intticket;
Replace*next;};
用法说明:
能完成一些基本操作,例如:
对航班信息的输入;对航班信息的输出;对终点站的查询后,输出该航班的信息;订票和退票的管理,以及删除航班等基本操作。
我所能想到的,而没有完成的功能有,1:
查询航班信息中,只有一种根据终点站来查询的方式,当有多个飞机号能到达该终点时,只能显示出第一个为该终点站的航班信息;2:
没有设计修改航班的功能;3:
没有能显示用户的信息;4:
在订票的过程中,如果有名字一样,而终点站或者是飞行日期不一样时,在退票的代码中没有将他们加以区分,只要乘客姓名相等,就将他们的信息输出出来了,对于有多个同名的乘客,这样会导致错误的结果。
3程序结构
3.1订票
先定义指向第一条航班的指针s,提示用户输入姓名、终点站、飞行日期,当乘客输入的终点站和飞行日期与第一个航班的终点站和飞行日期相同、就存在该航班。
否则,将指向该航班的指针后移,直到输出的终点站和飞行日期与输入航班时的终点站和飞行日期相同。
退出循环时,若s为空,则输出此航班不存在。
否则,输出订票数
4各模块的功能
4.1输入航班
功能:
创建指向航班结构体的指针变量,为其开辟内存单元。
分别输入航班号、飞机号、终点站、飞行日期、总票数。
采用尾插法建表,每输入一条新的航班,就将该节点赋值给尾节点的后继,再将尾节点后移,保证尾节点的后继为空。
4.2输出航班
输出所有航班的信息。
包括航班号、飞机号、终点站、飞行日期、总票数。
4.3查找航班
根据输出终点站进行查询。
当节点为空时,还没有里找到,说明不存在该航班。
否则,输出该航班的所有信息。
包括航班号、飞机号、终点站、星期、总票数、剩余票数、候补票数。
4.4订票
提示用户输入用户的姓名、终点站、和飞行日期。
当用户所输入的终点站和飞行日期与航班本身的内容相同时,退出循环。
否则,将指向航班的指针变量循环后移,退出循环时,节点指针为空时,输出该航班不存在;若该节点指针不为空,提示用户输入所需订所需订票数,用一个变量sum保存该航班已存的票数,用来分配座位号。
如果余票量减去乘客所需要定的票数小于零,则显示余票不足的信息。
提示用户,是否改变定票数,如果改变,重新输入订票数,如果输入的票数还是大于余票数,则要求重新输入,直到所输入的票数小于余票量为止,否则一直要求输入。
退出循环的时候,将票数赋值给该乘客的订票数。
再用一重循环为乘客安排座位号,并输出座位号。
此时的余票量为自减定票数。
乘客结构体指针后移。
4.5退票
定义指向Customer类型的指针c,将全局定义的指向结构体Coustomer类型的后继赋值给c,用一个指针c1来保存的初始值。
这样做的作用是使得指针c一直都是指针c1的后继。
当c不为空时,将c和c1都指向后一个节点。
退出循环时,若c为空时,输出无此人订票信息。
若不为空,提示用户输入终点站和日期,当指向航班结构体的指针不为空时,如果该节点所指向的终点站和日期都与输入航班信息的终点站和日期都相同时,结束循环,输出乘客的信息。
否则,则指向下一个航班,直到找到相等的为止,输出用户的信息。
如果,航班的剩余量大于等于0,则输出该用户的订票数,否则就输出候补订票数。
若真的要退票,则释放该节点的空间。
4.6删除航班
定义两个string的变量,即航班号和飞机号。
定义两个航班号的指针s,q。
将s指向第一个节点,q指向头结点。
输入航班号和飞机号,判断所输入的是否等于第一个航班的航班号和飞机号,如果不相等,两个指针向后移,继续判断s、q所指向的节点的航班号和飞机号是否相等。
退出循环时,若s为空,则输出该航班不存在;否则,删除该航班节点。
5试验结果
5.1输入航班信息
输入一个指向航班节点的航班号、飞机号、终点站、飞行日期、总票数,如图5.1-1所示。
图5.1-1
选择Y或y后,再次输入一条航班信息,如图5.1-2所示。
图5.1-2
5.2输出航班信息
输出所有航班的终点站、航班号、飞机号、飞行日期、余票数,如图5.2-1所示。
图5.2-1
5.3查找航班
这里,只设计了通过终点站来查询航班,而不能有相同的终点站出现,要是有相同的终点站,只显示第一个航班信息,如图5.3-1所示。
图5.3-1
5.4订票
输入乘客的姓名、终点站、飞行日期,只有当乘客的终点站和飞行日期同时为一个航班所有时才存在此航班,否则,将输出该航班不存在。
乘客输入的终点站和飞行日期不是同一个航班时,如图5.4-1所示。
图5.4-1
乘客输入的终点站和飞行日期是同一个航班时,如图5.4-2所示。
图5.4-2
当乘客所定的票数大于该航班最大量票时,提示乘客输入错误,请重新输入,如图5.4-3所示。
图5.4-3
提示乘客再次输入,直到输入的数小于或者等于该航班的总票数,为乘客分配座位号,如图5.4-4所示。
图5.4-4
当输入的订票数大于余票数时,提示乘客是否改变余票量。
当改后的订票量小于余票量时,为乘客分配座位号,如图5.4-5所示。
图5.4-5
改变乘客所需订票量后,航班中的余票量会减少,如图5.4-6所示。
图5.4-6
若选择的是候补,则输入候补信息,包括候补人的姓名、票数,如图5.4-7所示。
图5.4-7
输入候补信息后,显示航班信息,如图5.4-8所示。
图5.4-8
5.5退票
需要输入乘客的姓名,输入姓名后,将显示该乘客的详细信息,包括航班号、飞机号、终点站、飞行日期、订票数。
如图5.5-1所示。
图5.5-1
若输入要退票的票数比本身预定的票数还要多,就提示出错信息,让乘客再次输入要退票数,如图5.5-2所示
图5.5-2
若订票的人不是候补票,退票成功后,该航班的余票量会增加,以前面所举的a航班为例,假设退票前的状态如图5.5-3所示。
图5.5-3
输出退票人的姓名后,信息如图5-4所示。
图5.5-4
退票后的该航班的余票量增加,增加的数等于乘客的退票数,信息为图5-5所示。
图5.5-5
若订票人是候补人员,如图5.5-6所示。
图5.5-6
输出航班时,该航班的余票量将不会发生变化,如图5.5-7所示。
5.6删除航班
输入航班的航班号、飞机号,当搜索所有航班,存在某个航班航班号和飞机号都与所输入的航班号和飞机号相等时,则将该航班删除,删除后,显示所有航班信息时,将不存在原来的航班信息了,如图6-1,6-2所示。
输入要删除的航班号和飞机号。
图6-1
删除后,所有航班信息为图6-2所示。
6个人体会
通过这个航班课程设计,是我对书本上的知识有了进一步的了解,同时,在做这个课程设计的过程中,遇到的最大的问题是存储结构,这个课程设计中,用到三个结构体,一个是航班结构体,一个是乘客结构体,一个是候补乘客结构体。
在航班结构体和乘客结构体中,都有用到终点站和飞行日期。
程序设计中,就是用到终点站和飞行日期将这两个结构体联系到一起。
弄清楚存储结构后,困难还是有蛮多的,主要问题是对座位号的分配,经过诸多努力,终于将那个在订票,当余票不够时,是否定下余票,还是候补,若定下余票,就应该为所定下的余票的张数分配座位号。
开始是由于有一个算sum的地方重复,结果导致分配的座位号总是大于本来应有的座位号。
去掉了一句for后,使座位号回复到理想状态。
在这过程中,困难可以说是有蛮大的,从开始,对存储结构都不清楚,到后来要一步一步地调试、分析、找错,收获还是可观的。
但是,也仍然有很多功能需要完善。
以下是自己想到的存在的问题。
(1)查询航班信息中,只有一种根据终点站来查询的方式,当有多个飞机号能到达该终点时,只能显示出第一个为该终点站的航班信息,并不能将所有到达该终点的航班输出,与实际不符。
改进思路是查找,将所有终点站相同的航班输出。
在退票的时候,要输入乘客的姓名,但没有存在多个乘客姓名的情况,要是有多个乘客姓名相同,则输出信息不准确。
改进思路是还要乘客输入他的终点站和飞行日期。
当终点站和日期都相等时,就可以确定是不是所要删除的乘客信息。
(2)没有设计修改航班的功能
(3)没有用到文件
7参考文献
[1]蔚敏吴伟民,数据结构(C语言版).清华大学出版社,1997.
[2]大有,唐海鹰,孙舒杨,等.数据结构.北京:
高等教育出版社,2001.
[3]黄扬铭,数据结构.北京:
科学出版社,2001.
[4]黄刘生.数据结构.北京:
经济科学出版社,2000.
[5]许卓群,张乃孝,杨冬青,等.数据结构.北京:
高等教育出版社,1988
[6]殷人昆,陶永雷,谢若阳,等.数据结构(用面向对象方法与C++描述 ).北京:
清华大学出版社,1999.
[7]王庆瑞.数据结构教程——C语言版.北京:
北京希望大学电子工业出版社,2002
[8]朱战立.数据结构——使用C++语言.西安:
西安电子科技大学出版社,2001/
[9]薛超英.数据结构——使用Pascal、c++.语言对照描述算法.2版.武汉:
华中科技大学出版社,2002.
[10]赵文静.数据结构——C++语言描述.西安:
西安交通大学出版社,1999.
[11]陈文博,朱青.数据结构与算法.北京:
机械工业出版社,1996.
[12]苏光奎,李春葆数据结构导学.北京:
清华大学出版社,2002.
[13]李春葆,曾慧,张植民.数据结构数据结构程序设计题典.北京:
清华大学出版社,2002.
[14]李春葆.数据结构习题与解析.3版.北京:
清华大学出版社,2006.
[15]李春葆,李三铁.数据结构考点精要与解题指导.北京:
人民邮电出版社,2002.
[16]RLKruse,BPLeung,CLTondo.DataStructuresandProgramDesigninC.2ndEd.PrenticeHall,1997.
[17]RSedgewick.AlgorithmsinC.ADDISON-WESLEY.1998.
附录源代码清单
1输入航班
voidinput()
{
flight*s;
cout<<"输入航班信息:
"< s=newflight; cout<<"航班号: "; cin>>s->flight_no; cout<<"飞机号: "; cin>>s->plan_no; cout<<"终点站: "; cin>>s->zhongdian; cout<<"飞行日期: "; cin>>s->date; cout<<"总票数: "; cin>>s->total_ticket; s->ticket_balance=s->total_ticket; s->ticket_backup=0; rear->next=s; rear=s; rear->next=NULL;//这三句语句的作用是确保rear是尾指针。 } 2输出航班 voiddisplay() { flight*p=f->next; if(p==NULL) cout<<"对不起! 航班为空! "< else { cout<<"所有航班信息: "< cout<<"终点站"< while(p) { cout< p=p->next; }//输出所有的航班信息 } } 3查找 while(p&&p->zhongdian! =ter){ p=p->next; }//输入的终点站与原有航班中的某个航班的终点站相同时,输出该航班,否则就移动指针,指向下一个航班。 if(p==NULL) cout<<"hasn'tfoundthezhongdian! "< 否则,将输出该航班信息。 else { cout<<"航班号"<<"\t"< cout<<"飞机号"<<"\t"< cout<<"终点站"<<"\t"< cout<<"星期"<<"\t"< cout<<"总共票数"<<"\t"< cout<<"余票数"<<"\t"< cout<<"候补数"<<'\t'< } 4订票 while(s) { if(s->zhongdian==c->zhongdian&&s->date==c->date) break;//当乘客输入的终点站和日期都相等时,表示此航班存在。 s=s->next; } if(s==NULL) cout<<"对不起! 此航班不存在! "< else { cout<<"订票数: "; cin>>ticket; while(ticket<1||ticket>s->total_ticket) { cout<<"此航班总共仅"< 请重新输入: "; cin>>ticket; } sum=s->total_ticket-s->ticket_balance;//分配座位号用的sum变量 if(s->ticket_balance-ticket<0) { cout<<"对不起,余票不足! 若定"< cout<<"是否改变订票数? Y/y"; cin>>ch1; if(ch1=='Y'||ch1=='y') { cout<<"订票数: "; cin>>ticket; while(ticket>s->ticket_balance) { cout<<"输入错误! 请重新输入: "; cin>>ticket; } c->ticket=ticket;//当输入的票数正确时,才赋值给乘客所得票数 cout<<"\n你好! 你的座位号是: "; for(i=1;i<=c->ticket;i++) { c->seat_no=++sum; cout< } s->ticket_balance=s->ticket_balance-c->ticket; cout<<"\n订票成功! "< c_rear->next=c; c_rear=c; c_rear->next=NULL; } else { delete(c); cout<<"是否候补订票? Y/y"; cin>>ch1; if(ch1=='Y'||ch1=='y') backup(s); else return; } } else { c->ticket=ticket; cout<<"\n你好! 你的座位号是: "; for(inti=1;i<=c->ticket;i++) { c->seat_no=++sum; cout< if(sum%5==0) cout< } s->ticket_balance=s->ticket_balance-c->ticket; cout<<"订票成功! "< c_rear->next=c; c_rear=c; c_rear->next=NULL; } 5退票 if(c==NULL) cout<<"无此人订票信息! \n"; else { while(s) { if(c->zhongdian==s->zhongdian&&c->date==s->date) break; s=s->next; } cout<<"\n此乘客的相关信息如下: "< cout<<"姓名: "<<"\t\t"< "<<"\t\t"< cout<<"飞机号: "<<"\t\t"< "<<"\t\t"< \t星期"< if(s->ticket_balance>=0) cout<<"订票数: "<<"\t\t"< else cout<<"候补订票数: "<<"\t\t"< cout<<"请问需退几张票? "; cin>>tuipiao_ticket; while(tuipiao_ticket>c->ticket||tuipiao_ticket<1) { cout<<"输入错误! 请重新输入: "; cin>>tuipiao_ticket; } c->ticket=c->ticket-tuipiao_ticket; s->ticket_balance=s->ticket_balance+tuipiao_ticket; if(c->ticket==0) { c1->next=c->next; while(c1->next) c1=c1->next; c_rear=c1; } cout<<"\n乘客退票成功! "< } } 6删除航班 while(s) { if(flight_no==s->flight_no&&plan_no==s->plan_no) break; q=q->next; s=s->next; } if(s==NULL) cout<<"对不起....此航班不存在! "< else { cout<<"是否真的删除? y/Y"; cin>>ch; if(ch=='y'||ch=='Y') { q->next=s->next; while(q->next) q=q->next; rear=q; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 报告