课程设计一:火车售票系统由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“火车定票系统课程设计”。
数据结构与算法课程实验报告
班级:学号:
课程设计一:火车售票系统设计及实现姓名:
cll
一、实验内容:
火车售票系统在现实中的应用已经非常普遍,目前通常使用可视化的方法实现,例如采用C/S模式下的程序设计或者采用B/S模式下的程序设计,通常都具有较为友好的界面和较为完善的功能。火车售票系统的实现过程中,主要涉及到数据格式的设计,也就是数据结构的设计。通常在采用数据库的情况下,可以运用数据库的设计来实现。在没有采用数据库情况下需要,单独设计相应数据结构和算法。
二、实验目的:
按给定需求,通过查找相关资料,完成火车售票系统设计及实现,在设计过程中充分运用数据结构与算法课程中所学知识,从而熟练地掌握和应用线性表、单链表等重要数据结构和常用算法。提前熟悉软件需求分析,软件测试等环节,运用相应程序设计语言实现该系统,从而进一步提高程序设计能力。
三、问题描述
(1)此系统可以实现售票、退票、车票剩余情况查询等功能。
(2)每张车票包含车次、座位信息。在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位情况。
(3)退票时,必须是车站售出的车票才能退,否则视为无效票,不能退票。(4)演示程序以用户和计算机的对话方式进行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入程序中规定的运算命令;相应的输入数据(滤去输入中的非法字符)和运算结果显示在后。
(5)由订票系统的主要功能使程序的命令包括: 1)查询;2)订票;3)退票 4)退出订票系统
四、问题的实现
4.1所用的数据结构(包括所用数据结构的抽象数据类型定义和说明)typedefstructLNode{ //数据域
char name[10];//订票姓名
intdnum;//订票数量
char dj[50];//证件编号
intzhekou;//1代表折扣对象
float pay;//付费
structLNode *next;//指针域
intzuohao[200];}LNode,*LinkList;//构造单链表(已订票)
typedefstructTickets{ char *endname;//终点站名
char *hnum;//车次名
intfnum;//票价
float discut;//折扣
int day;//日期
intwholenum;//总票额 intlastnum;//余票量
inttuipiao[100];//退票处理,记录退票的座位号 inttpcs;//记录目前退票次数
intmcps;//记录卖出去的票数(包括退票)LinkList la;//已订票链表
}Tickets;//构造结构类型(火车票)
typedefstruct{ struct Tickets *elem;//存储空间的基址
int length;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”);
return 0;}
(*h)-> next = NULL;return 1;}
intCreate_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->elem[j].mcps=0;//初始化,记录买出去的票 L->elem[j].tpcs=0;//记录退票数
} inti;for(i = 0;i length;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;return 1;}//创建顺序表
void Demand(SqList L){ int n1;do{
char endstop[100];
printf(“*******查票窗口********n”);
printf(“请输入终点站名:n”);
do{ gets(endstop);} while(!endstop[0]);inti;for(i=0;i
printf(“tt杭州-->%sn”,endstop);printf(“tt车次:%sn”,L.elem[i].hnum);printf(“tt日期:%d日n”,L.elem[i].day);printf(“tt票价:%dn”,L.elem[i].fnum);printf(“tt折扣价(学生/军人等5折):%fn”,L.elem[i].fnum*L.elem[i].discut);printf(“tt总票量:%dn”,L.elem[i].wholenum);printf(“tt余票量:%dn”,L.elem[i].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,确定,即订票成功
intnum;//订票数
float money;//存储应付的总票额
char endstop[100];//记录终点站名
char name[100];char ID[100];//记录证件号
do{ printf(“*******订票窗口********n”);printf(“终点站名:”);
do{ gets(endstop);} while(!endstop[0]);inti = 0;for(i=0;ilength;i++){ if(strcmp(L->elem[i].endname,endstop)==0){ //有该趟火车
printf(“tt杭州-->%sn”,endstop);printf(“tt车次:%sn”,L->elem[i].hnum);printf(“tt日期:%d日n”,L->elem[i].day);printf(“tt票价:%dn”,L->elem[i].fnum);printf(“tt折扣价(学生/军人等5折):%fn”,L->elem[i].fnum*L->elem[i].discut);printf(“tt总票量:%dn”,L->elem[i].wholenum);printf(“tt余票量:%dn”,L->elem[i].lastnum);printf(“请输入订票数:”);
scanf(“%d”,&num);
if(L->elem[i].lastnum == 0){ printf(“对不起,到%s的车票已卖完!n”,endstop);printf(“nt1.继续订票;2.返回主菜单;n”);
scanf(“%d”,&n2);}else if(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姓名:%sn”,name);printf(“t证件号码:%sn”,ID);printf(“t杭州--%s:n”,endstop);printf(“t车次:%sn”,L->elem[i].hnum);printf(“t日期:12月%d日”,L->elem[i].day);//输出票价(两种情况)
if(zhekou==1){
printf(“折扣价(学生/军人等5折):%fn”,L->elem[i].fnum*L->elem[i].discut);
money=L->elem[i].fnum*L->elem[i].discut*num;//money用于暂时存储应付的总票额
}else{ printf(“票价:%dn”,L->elem[i].fnum);
money = L->elem[i].fnum*num;
}
printf(“订票数:%dn”,num);
printf(“座位号: ”);
//如果有退票,优先卖退票
int k=0;
//k用于记录买到的票是退票的数目
int data[100];//临时记录座位号,用于后面的保存
int j;//只用于for循环的参数,不保存数据;
for(j=L->elem[i].tpcs-1;j>=0;j--){//只需要num张就够了,L.elem[i].jishu1为退票总数
printf(“%dt”,L->elem[i].tuipiao[j]);//退票的座位号tuipioa[j]
k++;//买到退票数目+1
if(k>=num)break;//说明买的全部都是退票
} //退票数目不够
此时卖出的票数即为座位号
L->elem[i].mcps += 1;//卖出去票的数目+1(包括退票)
data[j]=L->elem[i].mcps;
printf(“%dt”,L->elem[i].mcps);
} }
printf(“n总票额:%fn”,money);
printf(“n 0.确认;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);//证件号
//将座位号记入客户信息
int flag=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;//说明买的全部都是退票 }
//退票数目不够
s->zuohao[flag]=data[j];
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 name[100];char ID[100];
char endstop[100];do{
printf(“*******退票窗口********n”);
printf(“终点站:”);
do{ gets(endstop);} while(!endstop[0]);inti;
for(i=0;ilength-1;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(“没有客户!”);
p->next){
}else{ p = p->next;while(!(strcmp(p->name,name)==0 p=p->next;}
&&strcmp(p->dj,ID)==0)&&
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->elem[i].endname);
printf(“t车次:%sn”,L->elem[i].hnum);
printf(“t日期:12月%d日n”,L->elem[i].day);
if(p->zhekou==0){//非折扣对象
printf(“t票价:%dn”,L->elem[i].fnum);
}else{//折扣对象
printf(“t
折价:%fn”,L->elem[i].fnum*L->elem[i].discut);
}
printf(“t订票数:%dn”,p->dnum);
printf(“t座位号为:”);
int flag;
for(flag = 0;flag
dnum;flag++){
printf(“%dt”,p->zuohao[flag]);
}
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->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){ //票全部退完的情况,删除链表中的结点
LinkList q = 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].fnum){ //判断是否是
}
p->pay-=L->elem[i].fnum*k;}else{
p->pay-=L->elem[i].fnum*k*L->elem[i].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.elem[i].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”);
inti;for(i=0;i
*
%s
%s
12月%d日
%d
*
n“,L.elem[i].hnum,L.elem[i].endname,L.elem[i].day,L.elem[i].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);
湖北工业大学工程技术学院课程设计报告书课程名称:C语言课程设计班级:物联网一班小组成员: 范立恒、陈根、聂俊豪、麦灿文、黄文康组长:范立恒指导教师:楚惟善二○一三 年 六 月C......
1、旅客账户表:旅客账户ID,用户名,登录密码,旅客ID,创建日期Paenger account: paenger account ID, username, paword, paenger ID, creation date 2、乘车人表(账号人&乘车人):乘车......
车 售 票 系 统需 求 规 格 说 明 书 作者:李艳亮 2013年11月1 火 目录1.引言................................................................................................
二.需求分析经过对程序设计题目的分析可知,整个程序的设计实现大致分为八个模块,每一个模块对应一个函数。在这些函数当中,添加车次数据函数、售票函数、查询总额函数的实现严格......
铁路售票系统应用软件需求分析报告前言:(1)需求分析报告的编写目的本需求分析报告的目的是规范化本软件的编写,旨在于提高软件开发过程中的能见度,便于对软件开发过程中的控制与......