课程设计一火车售票系统.docx
- 文档编号:26471785
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:20
- 大小:131.11KB
课程设计一火车售票系统.docx
《课程设计一火车售票系统.docx》由会员分享,可在线阅读,更多相关《课程设计一火车售票系统.docx(20页珍藏版)》请在冰豆网上搜索。
课程设计一火车售票系统
数据结构与算法课程实验报告
课程设计一:
火车售票系统设计及实现
姓名:
cll
班级:
学号:
一、实验内容:
火车售票系统在现实中的应用已经非常普遍,目前通常使用可视化的方法实现,例如采用C/S模式下的程序设计或者采用B/S模式下的程序设计,通常都具有较为友好的界面和较为完善的功能。
火车售票系统的实现过程中,主要涉及到数据格式的设计,也就是数据结构的设计。
通常在采用数据库的情况下,可以运用数据库的设计来实现。
在没有采用数据库情况下需要,单独设计相应数据结构和算法。
二、实验目的:
按给定需求,通过查找相关资料,完成火车售票系统设计及实现,在设计过程中充分运用数据结构与算法课程中所学知识,从而熟练地掌握和应用线性表、单链表等重要数据结构和常用算法。
提前熟悉软件需求分析,软件测试等环节,运用相应程序设计语言实现该系统,从而进一步提高程序设计能力。
三、问题描述
(1)此系统可以实现售票、退票、车票剩余情况查询等功能。
(2)每张车票包含车次、座位信息。
在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位情况。
(3)退票时,必须是车站售出的车票才能退,否则视为无效票,不能退票。
(4)演示程序以用户和计算机的对话方式进行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在后。
(5)由订票系统的主要功能使程序的命令包括:
1)查询;2)订票;3)退票4)退出订票系统
四、问题的实现
4.1所用的数据结构(包括所用数据结构的抽象数据类型定义和说明)
typedefstructLNode{
//数据域
charname[10];//订票姓名
intdnum;//订票数量
chardj[50];//证件编号
intzhekou;//1代表折扣对象
floatpay;//付费
structLNode*next;//指针域
intzuohao[200];
}LNode,*LinkList;//构造单链表(已订票)
typedefstructTickets{
char*endname;//终点站名
char*hnum;//车次名
intfnum;//票价
floatdiscut;//折扣
intday;//日期
intwholenum;//总票额
intlastnum;//余票量
inttuipiao[100];//退票处理,记录退票的座位号
inttpcs;//记录目前退票次数
intmcps;//记录卖出去的票数(包括退票)
LinkListla;//已订票链表
}Tickets;//构造结构类型(火车票)
typedefstruct{
structTickets*elem;//存储空间的基址
intlength;
intlistsize;//当前分配的存储容量(以sizeof(Tickets)为单位)
}SqList;//构造顺序表
4.2主要实现思路
1、火车站的火车票采用顺序表表示。
每趟火车出售的票用链表表示。
2、查询:
输入终点站信息,输出该趟火车的票价,日期,余票数等信息;
订票:
输入终点站信息,确认有该趟车之后,输入该趟车的基本信息,之后输入购票数,系统查询是否有余票,确认之后,输入个人基本信息;系统查询是否有退票,若有退票则,先售出退票。
插入新的结点。
退票:
输入终点站的信息,输入个人信息,1、若退出所有票,则删除该结点,若,只退部分票,则更改该结点的购票信息。
退出:
退出系统;
【程序演示】
输入2订票,购买到温州的火车票十张,姓名:
a;证件号:
a;
退票:
输入3退票,输入终点站温州,姓名:
a;证件号:
a;
退票之后,继续订票3张
【实现代码】
intInitList_L(LinkList*h){//初始化带头结点的单链表
*h=(LinkList)malloc(sizeof(LNode));//生成头结点
if(!
h){
printf("初始化链表错误!
\n");
return0;
}
(*h)->next=NULL;
return1;
}
intCreate_Sq(SqList*L){//初始化并创建顺序表
L->elem=(Tickets*)malloc(ListInitSize*sizeof(Tickets));
if(!
L->elem){
printf("存储分配失败!
");//存储分配失败
return0;
}
L->length=5;
//赋值
L->listsize=ListInitSize;
intj;
for(j=0;j
L->elem[j].mcps=0;//初始化,记录买出去的票
L->elem[j].tpcs=0;//记录退票数
}
inti;
for(i=0;i
InitList_L(&L->elem[i].la);
}
L->elem[0].endname="北京";//终点站名
L->elem[0].hnum="G2378";//车次名
L->elem[0].day=1;//日期
L->elem[0].fnum=346;//票价
L->elem[0].discut=0.5;
L->elem[0].wholenum=L->elem[0].lastnum=10;
L->elem[1].endname="温州";
L->elem[1].hnum="K351";
L->elem[1].day=2;
L->elem[1].fnum=254;
L->elem[1].discut=0.5;
L->elem[1].wholenum=L->elem[1].lastnum=10;
L->elem[2].endname="合肥";
L->elem[2].hnum="G782B";
L->elem[2].day=3;
L->elem[2].fnum=224;
L->elem[2].discut=0.5;
L->elem[2].wholenum=L->elem[2].lastnum=10;
L->elem[3].endname="武汉";
L->elem[3].hnum="D2903";
L->elem[3].day=4;
L->elem[3].fnum=200;
L->elem[3].discut=0.5;
L->elem[3].wholenum=L->elem[3].lastnum=10;
L->elem[4].endname="厦门";
L->elem[4].hnum="T112";
L->elem[4].day=5;
L->elem[4].fnum=450;
L->elem[4].discut=0.5;
L->elem[4].wholenum=L->elem[4].lastnum=10;
return1;
}//创建顺序表
voidDemand(SqListL){
intn1;
do{
charendstop[100];
printf("*******查票窗口********\n");
printf("请输入终点站名:
\n");
do{
gets(endstop);
}while(!
endstop[0]);
inti;
for(i=0;i if(strcmp(L.elem[i].endname,endstop)==0){ printf("\t\t杭州-->%s\n",endstop); printf("\t\t车次: %s\n",L.elem[i].hnum); printf("\t\t日期: %d日\n",L.elem[i].day); printf("\t\t票价: %d\n",L.elem[i].fnum); printf("\t\t折扣价(学生/军人等5折): %f\n",L.elem[i].fnum*L.elem[i].discut); printf("\t\t总票量: %d\n",L.elem[i].wholenum); printf("\t\t余票量: %d\n",L.elem[i].lastnum); break; } if(i==L.length-1){ printf("没有找到%s的车票! \n",endstop); } } printf("1.返回主菜单;2.继续\n"); scanf("%d",&n1); }while(n1==2); } voidGetTicket(SqList*L){//订票 intn2=2,zhekou;//n2=1,继续订票;n2=2,返回主菜单;n2=0,确定,即订票成功 intnum;//订票数 floatmoney;//存储应付的总票额 charendstop[100];//记录终点站名 charname[100]; charID[100];//记录证件号 do{ printf("*******订票窗口********\n"); printf("终点站名: "); do{ gets(endstop); }while(! endstop[0]); inti=0; for(i=0;i if(strcmp(L->elem[i].endname,endstop)==0){//有该趟火车 printf("\t\t杭州-->%s\n",endstop); printf("\t\t车次: %s\n",L->elem[i].hnum); printf("\t\t日期: %d日\n",L->elem[i].day); printf("\t\t票价: %d\n",L->elem[i].fnum); printf("\t\t折扣价(学生/军人等5折): %f\n",L->elem[i].fnum*L->elem[i].discut); printf("\t\t总票量: %d\n",L->elem[i].wholenum); printf("\t\t余票量: %d\n",L->elem[i].lastnum); printf("请输入订票数: "); scanf("%d",&num); if(L->elem[i].lastnum==0){ printf("对不起,到%s的车票已卖完! \n",endstop); printf("\n\t1.继续订票;2.返回主菜单;\n"); scanf("%d",&n2); }elseif(num>L->elem[i].lastnum){ printf("对不起,到%s的车票只剩%d张。 \n",endstop); printf("\n1.继续订票;2.返回主菜单;\n"); scanf("%d",&n2); }else{ printf("购票请输入个人信息: \n"); printf("姓名: "); do{ gets(name); }while(! name[0]); printf("是折扣对象吗? 若是,请输入相关证件号,不是请输入身份证号(1.是;0.不是)\n"); scanf("%d",&zhekou); while(zhekou! =1&&zhekou! =0){ printf("不合法输入,请重输! \n"); scanf("%d",&zhekou); } printf("证件号码: "); //fflush(stdin); do{ gets(ID); }while(! ID[0]); //输出订票信息,待客户确认 printf("\t请核对您的订票信息: \n"); printf("\t姓名: %s\n",name); printf("\t证件号码: %s\n",ID); printf("\t杭州--%s: \n",endstop); printf("\t车次: %s\n",L->elem[i].hnum); printf("\t日期: 12月%d日",L->elem[i].day); //输出票价(两种情况) if(zhekou==1){ printf("折扣价(学生/军人等5折): %f\n",L->elem[i].fnum*L->elem[i].discut); money=L->elem[i].fnum*L->elem[i].discut*num;//money用于暂时存储应付的总票额 }else{ printf("票价: %d\n",L->elem[i].fnum); money=L->elem[i].fnum*num; } printf("订票数: %d\n",num); printf("座位号: "); //如果有退票,优先卖退票 intk=0;//k用于记录买到的票是退票的数目 intdata[100];//临时记录座位号,用于后面的保存 intj;//只用于for循环的参数,不保存数据; for(j=L->elem[i].tpcs-1;j>=0;j--){//只需要num张就够了,L.elem[i].jishu1为退票总数 printf("%d\t",L->elem[i].tuipiao[j]);//退票的座位号tuipioa[j] k++;//买到退票数目+1 if(k>=num)break;//说明买的全部都是退票 } //退票数目不够<买票数目 if(k for(j=0;j L->elem[i].mcps+=1;//卖出去票的数目+1(包括退票)此时卖出的票数即为座位号 data[j]=L->elem[i].mcps; printf("%d\t",L->elem[i].mcps); } } printf("\n总票额: %f\n",money); printf("\n0.确认;1.取消;2.返回主菜单\n"); scanf("%d",&n2); if(n2==0){ printf("订票成功! \n"); L->elem[i].lastnum-=num;//更新余票的数目 //在链表中插入新结点 LinkListp,s;//已订票链表的指针类型 p=L->elem[i].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);//证件号 //将座位号记入客户信息 intflag=0; for(j=L->elem[i].tpcs-1;j>=0;j--){//只需要num张就够了,L.elem[i].jishu1为可买退票的张数 s->zuohao[flag]=L->elem[i].tuipiao[j]; flag++; k++;//买到退票数目+1 if(k>=num)break;//说明买的全部都是退票 } //退票数目不够<买票数目 if(k for(j=0;j s->zuohao[flag]=data[j]; flag++; } } } } } break; } if(i==L->length-1){ printf("没有到%s的车票! \n",endstop); n2=2; } } }while(n2==1); } voidReturnTicket(SqList*L){ intn3=2,k;//n3=1,继续退票;n3=2,返回主菜单;n3=0,确定,即退票成功,k记录要退的票的数目 LinkListp; charname[100]; charID[100]; charendstop[100]; do{ printf("*******退票窗口********\n"); printf("终点站: "); do{ gets(endstop); }while(! endstop[0]); inti; for(i=0;i if(strcmp(L->elem[i].endname,endstop)==0){ printf("姓名: "); do{ gets(name); }while(! name[0]); printf("证件号: "); do{ gets(ID); }while(! ID[0]); p=L->elem[i].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姓名: %s\n",p->name); printf("\t证件号码: %s\n",p->dj); printf("\t杭州-->%s\n",L->elem[i].endname); printf("\t车次: %s\n",L->elem[i].hnum); printf("\t日期: 12月%d日\n",L->elem[i].day); if(p->zhekou==0){//非折扣对象 printf("\t票价: %d\n",L->elem[i].fnum); }else{//折扣对象 printf("\t折扣价: %f\n",L->elem[i].fnum*L->elem[i].discut); } printf("\t订票数: %d\n",p->dnum); printf("\t座位号为: "); intflag; for(flag=0;flag printf("%d\t",p->zuohao[flag]); } printf("总票额: %f\n",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"); inti1=L->elem[i].tpcs; L->elem[i].tpcs+=k;//更新退票数 for(flag=p->dnum;flag>p->dnum-k;flag--,i1++){ L->elem[i].tuipiao[i1]=p->zuohao[flag-1]; } L->elem[i].lastnum+=k;//更新余票 if(k==p->dnum){//票全部退完的情况,删除链表中的结点 LinkListq=L->elem[i].la; while(q->next! =p){ q=q->next; } q->next=p->next; free(p);//释放资源 n3=2;//返回主菜单 }else{ if(p->pay==p->dnum*L->elem[i].fn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 火车 售票 系统