课程设计一火车售票系统

上传人:gui****hi 文档编号:135517434 上传时间:2022-08-15 格式:DOCX 页数:14 大小:150.67KB
返回 下载 相关 举报
课程设计一火车售票系统_第1页
第1页 / 共14页
课程设计一火车售票系统_第2页
第2页 / 共14页
课程设计一火车售票系统_第3页
第3页 / 共14页
点击查看更多>>
资源描述
数据结构与算法课程实验报告课程设计一:火车售票系统设计及实现姓名:cll 班级: 学号:一、实验内容: 火车售票系统在现实中的应用已经非常普遍,目前通常使用可视化的方法实现,例如采用C/S模式下的程序设计或者采用B/S模式下的程序设计,通常都具有较为友好的界面和较为完善的功能。火车售票系统的实现过程中,主要涉及到数据格式的设计,也就是数据结构的设计。通常在采用数据库的情况下,可以运用数据库的设计来实现。在没有采用数据库情况下需要,单独设计相应数据结构和算法。二、实验目的: 按给定需求,通过查找相关资料,完成火车售票系统设计及实现,在设计过程中充分运用数据结构与算法课程中所学知识,从而熟练地掌握和应用线性表、单链表等重要数据结构和常用算法。提前熟悉软件需求分析,软件测试等环节,运用相应程序设计语言实现该系统,从而进一步提高程序设计能力。三、问题描述(1)此系统可以实现售票、退票、车票剩余情况查询等功能。(2)每张车票包含车次、座位信息。在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位情况。(3)退票时,必须是车站售出的车票才能退,否则视为无效票,不能退票。(4)演示程序以用户和计算机的对话方式进行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在后。(5)由订票系统的主要功能使程序的命令包括:1)查询;2)订票;3)退票 4)退出订票系统四、问题的实现4.1所用的数据结构(包括所用数据结构的抽象数据类型定义和说明)typedef struct LNode/数据域char name10;/订票姓名int dnum;/订票数量char dj50;/证件编号int zhekou; /1代表折扣对象float pay;/付费struct LNode *next;/指针域int zuohao200;LNode,*LinkList;/构造单链表(已订票) typedef struct Ticketschar *endname;/终点站名char *hnum;/车次名int fnum;/票价float discut;/折扣int day;/日期int wholenum;/总票额 int lastnum;/余票量 int tuipiao100; /退票处理,记录退票的座位号 int tpcs;/记录目前退票次数int mcps;/记录卖出去的票数(包括退票)LinkList la;/已订票链表Tickets;/构造结构类型(火车票) typedef structstruct Tickets *elem;/存储空间的基址int length;int listsize;/当前分配的存储容量(以sizeof(Tickets)为单位)SqList;/构造顺序表4.2主要实现思路1、火车站的火车票采用顺序表表示。每趟火车出售的票用链表表示。2、查询:输入终点站信息,输出该趟火车的票价,日期,余票数等信息; 订票:输入终点站信息,确认有该趟车之后,输入该趟车的基本信息,之后输入购票数,系统查询是否有余票,确认之后,输入个人基本信息;系统查询是否有退票,若有退票则,先售出退票。插入新的结点。退票:输入终点站的信息,输入个人信息,1、若退出所有票,则删除该结点,若,只退部分票,则更改该结点的购票信息。退出:退出系统;【程序演示】输入2 订票,购买到温州的火车票十张,姓名:a;证件号:a;退票:输入3退票,输入终点站温州,姓名:a;证件号:a;退票之后,继续订票3张【实现代码】int InitList_L(LinkList *h)/初始化带头结点的单链表 *h = (LinkList)malloc(sizeof(LNode);/生成头结点if(!h)printf(初始化链表错误!n);return 0; (*h) - next = NULL;return 1;int Create_Sq(SqList *L)/初始化并创建顺序表 L-elem=(Tickets *)malloc(ListInitSize*sizeof(Tickets);if(!L-elem) printf(存储分配失败!);/ 存储分配失败 return 0; L-length=5;/赋值 L-listsize=ListInitSize;int j;for(j = 0; j length; j+) L-elemj.mcps=0;/初始化,记录买出去的票 L-elemj.tpcs=0;/记录退票数 int i;for(i = 0;i length; i+) InitList_L(&L-elemi.la); L-elem0.endname=北京; /终点站名 L-elem0.hnum=G2378;/车次名 L-elem0.day=1;/日期 L-elem0.fnum=346;/票价 L-elem0.discut=0.5; L-elem0.wholenum=L-elem0.lastnum=10; L-elem1.endname=温州; L-elem1.hnum=K351; L-elem1.day=2; L-elem1.fnum=254; L-elem1.discut=0.5; L-elem1.wholenum=L-elem1.lastnum=10; L-elem2.endname=合肥; L-elem2.hnum=G782B; L-elem2.day=3; L-elem2.fnum=224; L-elem2.discut=0.5; L-elem2.wholenum=L-elem2.lastnum=10; L-elem3.endname=武汉; L-elem3.hnum=D2903; L-elem3.day=4; L-elem3.fnum=200; L-elem3.discut=0.5; L-elem3.wholenum=L-elem3.lastnum=10; L-elem4.endname=厦门; L-elem4.hnum=T112; L-elem4.day=5; L-elem4.fnum=450; L-elem4.discut=0.5; L-elem4.wholenum=L-elem4.lastnum=10; return 1;/创建顺序表void Demand(SqList L) int n1; do char endstop100; printf(*查票窗口*n); printf(请输入终点站名:n);do gets(endstop); while(!endstop0);int i; for(i=0;i%sn,endstop); printf(tt车次:%sn,L.elemi.hnum); printf(tt日期:%d日n,L.elemi.day); printf(tt票价:%dn,L.elemi.fnum); printf(tt折扣价(学生/军人等5折):%fn,L.elemi.fnum*L.elemi.discut); printf(tt总票量:%dn,L.elemi.wholenum); printf(tt余票量:%dn,L.elemi.lastnum); break; if(i=L.length-1) printf(没有找到%s的车票!n,endstop); printf(1.返回主菜单;2.继续n); scanf(%d,&n1); while(n1=2);void GetTicket(SqList *L)/订票 int n2=2,zhekou;/n2=1,继续订票;n2=2,返回主菜单;n2=0,确定,即订票成功 int num; /订票数 float money; /存储应付的总票额 char endstop100; /记录终点站名 char name100; char ID100; /记录证件号 do printf(*订票窗口*n); printf(终点站名:); do gets(endstop); while(!endstop0);int i = 0;for(i=0;ilength;i+) if(strcmp(L-elemi.endname,endstop)=0) /有该趟火车 printf(tt杭州-%sn,endstop); printf(tt车次:%sn,L-elemi.hnum); printf(tt日期:%d日n,L-elemi.day); printf(tt票价:%dn,L-elemi.fnum); printf(tt折扣价(学生/军人等5折):%fn,L-elemi.fnum*L-elemi.discut); printf(tt总票量:%dn,L-elemi.wholenum); printf(tt余票量:%dn,L-elemi.lastnum); printf(请输入订票数:); scanf(%d,&num); if(L-elemi.lastnum = 0) printf(对不起,到%s的车票已卖完!n,endstop); printf(nt1.继续订票;2.返回主菜单;n); scanf(%d,&n2); else if(num L-elemi.lastnum) printf(对不起,到%s的车票只剩%d张。n,endstop); printf(n1.继续订票;2.返回主菜单;n); scanf(%d,&n2); else printf(购票请输入个人信息:n); printf(姓名:);dogets(name);while(!name0); printf(是折扣对象吗?若是,请输入相关证件号,不是请输入身份证号(1.是;0.不是)n); scanf(%d,&zhekou); while(zhekou != 1 & zhekou != 0) printf(不合法输入,请重输!n); scanf(%d,&zhekou);printf(证件号码:);/fflush(stdin); dogets(ID);while(!ID0); /输出订票信息,待客户确认 printf(t请核对您的订票信息:n); printf(t姓名:%sn,name); printf(t证件号码:%sn,ID); printf(t杭州-%s:n,endstop); printf(t车次:%sn,L-elemi.hnum); printf(t日期:12月%d日,L-elemi.day); /输出票价(两种情况) if(zhekou=1) printf(折扣价(学生/军人等5折):%fn,L-elemi.fnum*L-elemi.discut); money=L-elemi.fnum*L-elemi.discut*num;/money用于暂时存储应付的总票额 else printf(票价:%dn,L-elemi.fnum); money = L-elemi.fnum*num; printf(订票数:%dn,num); printf(座位号: ); /如果有退票,优先卖退票 int k=0; /k用于记录买到的票是退票的数目 int data100; /临时记录座位号,用于后面的保存 int j;/只用于for循环的参数,不保存数据; for(j=L-elemi.tpcs-1 ; j=0 ; j-)/只需要num 张就够了,L.elemi.jishu1为退票总数 printf(%dt,L-elemi.tuipiaoj); /退票的座位号 tuipioaj k+; /买到退票数目+1 if(k=num)break; /说明买的全部都是退票 /退票数目不够买票数目 if(k num)for(j=0;jelemi.mcps += 1; /卖出去票的数目+1(包括退票) 此时卖出的票数即为座位号 dataj=L-elemi.mcps; printf(%dt,L-elemi.mcps); printf(n总票额:%fn,money); printf(n 0.确认;1.取消;2.返回主菜单n); scanf(%d,&n2); if(n2=0) printf(订票成功!n); L-elemi.lastnum-=num; /更新余票的数目 /在链表中插入新结点 LinkList p,s; /已订票链表的指针类型 p = L-elemi.la;/第i趟车的已订票列表 (头结点) s = (LinkList)malloc(sizeof(LNode) ; /新的结点 if(!s) printf(内存分配失败!);else s-next=p-next;/在头部插入 p-next=s; s-dnum=num; /订票数量 s-pay=money; /票价 s-zhekou=zhekou; /折扣信息 strcpy(s-name,name); /姓名 strcpy(s-dj,ID); /证件号 /将座位号记入客户信息 int flag=0; for(j=L-elemi.tpcs-1 ; j=0 ; j-)/只需要num 张就够了,L.elemi.jishu1为可买退票的张数 s-zuohaoflag=L-elemi.tuipiaoj; flag+; k+; /买到退票数目+1 if(k=num)break; /说明买的全部都是退票 /退票数目不够买票数目 if(k num)for(j=0;jzuohaoflag=dataj;flag+; break; if(i=L-length-1) printf(没有到%s的车票!n,endstop); n2=2; while(n2=1);void ReturnTicket(SqList *L) int n3=2,k; /n3=1,继续退票;n3=2,返回主菜单;n3=0,确定,即退票成功,k记录要退的票的数目 LinkList p; char name100; char ID100; char endstop100; do printf(*退票窗口*n); printf(终点站:); do gets(endstop); while(!endstop0); int i; for(i=0;ilength-1;i+) if(strcmp(L-elemi.endname,endstop)=0) printf(姓名:); do gets(name);while(!name0); printf(证件号:); do gets(ID);while(!ID0); p = L-elemi.la; if(!p-next) printf(没有客户!); else p = p-next; while(!(strcmp(p-name,name)=0 & strcmp(p-dj,ID)=0) & p-next) p=p-next; if(strcmp(p-name,name)=0 & strcmp(p-dj,ID)=0) printf(您的车票信息如下:n); printf(t姓名:%sn,p-name);printf(t证件号码:%sn,p-dj); printf(t杭州-%sn,L-elemi.endname);printf(t车次:%sn,L-elemi.hnum);printf(t日期:12月%d日n,L-elemi.day); if(p-zhekou=0)/非折扣对象 printf(t票价:%dn,L-elemi.fnum); else/折扣对象 printf(t折扣价:%fn,L-elemi.fnum*L-elemi.discut); printf(t订票数:%dn,p-dnum); printf(t座位号为:); int flag; for(flag = 0;flagdnum;flag+) printf(%dt,p-zuohaoflag);printf(总票额:%fn,p-pay);printf(退几张?n);scanf(%d,&k);/k用来记录退票的张数 if(k p-dnum) printf(您只有%d票,请重新确认!n,p-dnum); printf(1.重新确定;2.返回主菜单n); scanf(%d,n3); else printf(0.确认;1.取消;2.返回主菜单n); scanf(%d,&n3); if(n3=0) printf(退票成功!n); int i1 = L-elemi.tpcs; L-elemi.tpcs+=k;/更新退票数 for(flag=p-dnum;flagp-dnum-k;flag-,i1+) L-elemi.tuipiaoi1 = p-zuohaoflag-1; L-elemi.lastnum+=k;/更新余票 if(k=p-dnum) /票全部退完的情况,删除链表中的结点 LinkList q = L-elemi.la; while(q-next!=p) q = q-next; q-next = p-next; free(p); /释放资源 n3=2; /返回主菜单 else if(p-pay = p-dnum*L-elemi.fnum) /判断是否是折扣票 p-pay-=L-elemi.fnum*k;else p-pay-=L-elemi.fnum*k*L-elemi.discut; p-dnum-=k; printf(你还有%d张票,p-dnum); n3=2; /if(n3=0) / else else/ if(strcmp(p-name,name)=0&strcmp(p-zhengjian,zhengjian)=0) printf(没有该客户买票的信息!请重新确认!);/最后一个结点也不是要找的结点的情况 n3=2; break; /if(strcmp(L.elemi.endstop,endstop)=0) if(i=L-length-1) /查找到了最后一个 printf(不是本站售出的票,请重新确认!n); n3=2; while(n3=1);void Quit()printf(成功退出系统!感谢您的支持!n);void main()LinkList L0; InitList_L(&L0); SqList L; /顺序表,用于存放车票信息 Create_Sq(&L); /初始化并创建顺序表 int n; do printf(n *杭州火车站订票系统*n); printf(n *本站车票信息*n); printf( * 车次 目的地 日期 票价 *nn); int i; for(i=0;iL.length-1;i+) printf(n * %s %s 12月%d日 %d * n,L.elemi.hnum,L.elemi.endname,L.elemi.day,L.elemi.fnum); printf(n * 1.查询 3.退票 *n); printf(n * 2.订票 4.退出 *n);printf( *n);printf(n请按菜单提示输入:n);scanf(%d,&n); switch(n) case 1 : Demand(L); break; case 2 : GetTicket(&L); break; case 3 : ReturnTicket(&L); break; case 4 : Quit(); break; while(n!=4);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!