资源描述
软件课程设计・・C语言设计火车票订票系统之源代码(模拟数据库功能)(需求分析+可行性分析)
设计题目:火车订票系统小组成员:
指导教师:
完成时间:
一.需求设计:
1. 每条线路所涉及的信息有:起点、终点、站名、车次、、票价、时间、座位号。
2. 作为示意系统,全部数据可以只放在内存中。
3. 系统能实现的功能和操作如下:
① .查询路线:根据旅客提出的终点站名输入下列信息:车次、车站名。
② .承办订票业务:根据客户提出的要求查询该车次票额的情况,若尚有余票,则为客广办理订 票手续,输出座位号:若巳满员或余票额少于订票额,则需重新查询客户要求,若需要可登记排 队候补。
③ .承办退票业务:根据客户提供的情况(车次、时间、座位号)为客户办理退票手续,然后查 询该车次是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办 理订票手续,否则依次询问其他排队候补的客户。
④ 登记旅客情况:包括旅客姓名,性别,年龄,家庭住址,联系方式等。
⑤ 统计功能:将每次车的订票,退票结果统计出来。
⑥ 管理功能:列车管理员可以通过调用函数来查看车票极其用户情况.
⑦ .查询功能:用户可以查询自己需要的车辆信息.
二.总体设计1.程序流程图:
是否是需要的车次 是While循环是否已到头指针
否是否是需要的车站名
是输出所需的信息
是是
错误移动指针
否否
②程序代码:
void inquire。
{struct ticket *p;
struct station *q;int t;
in+ *o *s;printff'please enter the number:"); scanf(”%d”,&f);/*输入需要的车次*/
printfC'please enter the station:**);scanf("%d",&h);/*输入需要到达的车站名*/
p=t;/*初始化p的值*/while(p=!null)
if(p->number==t)(q=p->down;
o=p;/*把符合条件的横向链表结点的数据给o*/while(q->next=!headl)
{if(q->name==h)
{s=q;/*把符合条件的纵向链表的数据给s*/
}q=q->next;/*纵向链表移针*/
}}
p=p->next;/*横向链表移针*/}
printf(,,%d,,;,%d,';'%d,,/o->nurn/o->nurn2,o->time); /*输出横向链表的数据*/printf("%s","%d","%d","%d",“%d”,s->name,&s->time,&s->money,&s->seat,&s->ma「k); /* 输 出纵向链表的数据*/
goto first;}
③功能说明:
本函数主要提供查询功能.用户输入需要查询的车次和需要到车站名,程序首先遍历横向链表查 找到需要的数据后转向纵向链表,接着遍历纵向链表,查找到需要的车站名.最后输出所有关于本 车次的所有信息.
4. Cancel()函数:
① 程序流程图:
输入需要的车次号输入需要到达的车站名
While循环是否需要的车次横向结点值给。
While循环是否是需要的车站名是
使mark的值为0纵向结点值给s
纵向链表移针横向链表移针
当横向链表卜一个指针为空时输出s点的数据
输出。点的数据程序代码;
void cancel(){
struct ticket *p;struct station *q;
int t;int *o *s;
printfC'please enter the number*:"); scanf("%d",&f);/*输入需要的车次*/printfC'please enter the station:");
scanf("%d",&h);/*输入需要到达的车站名*/p=t; /*初始化p的值*/
while(p =!null){
if(p->number=t)(q=p->down;
0=p;/*把符合条件的横向链表结点的数据给0*/while(q->next=!headl)
{if(q->name=h)
(q->mark=0; /*修改 mark 标记*/
s=q;/*把符合条件的纵向链表的数据给s*/}
q=q->next;/*纵向链表移针*/}}
p=p->next;/*横向链表移针*/}
printfC'your ticket has already cancel!");p「intf(”%d”,“%d“,”%d”,o->num,o->num2,o・>time); /*输出横向链表的数据*/ printf("%s",“%d","%d","%d",“%d”,s->name,&s->time,&s->money,&s->seat,&s->ma「k); /* 输 出纵向链表的数据*/
goto first;功能说明:
本函数主要提供退票功能.用户输入需要退票的车次和需要到车站名,程序首先遍历横向 链表查找到需要的数据后转向纵向链表,接着遍历纵向链表,查找到需要的车站名.修改其mark标 识是其为0.最后输出所有关于本车次的所有信息.
5. you。函数:
① 程序代码:
void you()
struct you *head;struct you *p;
p=(struct you *)malloc(len);scanf("%d",&p->name,&p->num,&p->numl,&p->fime,&p->timel);
goto First;}
② 用户查询代码:(注:本函数用于管理人员查询用户)void find()
{struct you *head;
struct you *p;int u;
scanf("%d",&u);while(p=!null)
{if(p->num=u)
{s=p;)p=p->next;
}}
③ 功能说明:
本函数用于用户输入个人信息,以便管理人员管理.而管理函数只面对管理人员使用,因 此未在用户界面上显示出来.
6. 统计模块:
void total() int *p*q;int n;
P”;while(p=!null)
(while(q->next=!headl)
{if (mark= 1)
(n=n+l;)q=q->next;
}
p=p->next;}
printff'the number of the booked ticket are :, printf("%d",n);
}6.所用变量声明:
① 横向链表结点的结构体:
struct ticket{
int num;int numl;
int time;
struct ticket *next;
struct station *down;};
int t;纵向链表结点的结构体:
struct station
int name;
int time;
int money;
int mark;
struct station *next;}
② 用户信息链表结点的结构体:
struct you
(
int name;
int num;
int numl;
int time;
int timel;
struct you *next;
}四.程序说明书:
木系统用于火车站的车票管理.主要方便用户订票,也可方便管理人员管理车票.当用户看到 用户界面时,可以根据提示选择自己想要的服务,选择后按下回车键,程序便会转到相应的函数进 行.完成后,程序会显示您己经成功的订票或退票.完成后程序会自动回到起始位置.
管理人员也可以很方便的调用本系统包含的查询和统计函数,管理车票情况.
具体说明:
1. 提示程序操作者输入预设的数据.
2. 提示用户进行订票操作.
3. 提示用户进行查询自己需要的车票的操作.
4. 提示用户进行退票操作.
5. 提示用户输入自己的相关信息.
/L.程序调试:
本程序分为多模块,为的是方便小组合作.所以各个功能都由函数调用来实现.组员在各自的 编制和调试中基本都实现所需的功能.但在联调的过程中,由于我们使用了大量的传递指针形的函 数,所以在数值的传递上问题很多.分步执行的时候指针的位置很乱!所以让我们遗憾的是联调并 没有成功.我们也会吸取教训,在函数编制时注意数值的传递.
六.运行结果: 输入:2
K717,Beijing,11:00
yuci,12:00,10,0,56
yangyuan】:00,20,0,56
Shijiazhuang,2:00,30,56输入:k717
Shijiazhuang输出:you have already booked the ticket!
K717,shijiazhuang,ll:00,3:00,30,56七.程序源代码:
#include <stdio.h>#include <string.h>
#define null 0#define len sizeof(struct ticket)
struct ticket(
int num;int numl;
int time;
struct ticket *next;
struct station *down;):
int t;struct station/*公共变量声明*/
(
int name;
int time;
int money;
int mark;
struct station *next;struct you
(
int name;
int num;
int numl;
int time;
int timel;
struct you *next;struct ticket *in()
struct ticket *in()
/* 一个返回指针形的函数*/
struct ticket *head;/*头结点*/struct ticket *pl *p2;
struct station *sl *s2;int m,n;
int i;pl=p2=(struct ticket *)malloc(len); /*建立横向链表的头结点*7
scanf(”%d”,&m);/*输入一共所需的车票信息总数*/scanf("%d",&n);/*输入从始发站到终点站共有几站*/
head=null;for(i=0;i<=m;i++)
(p2->next=pl;
P2印1;pl二(struct ticket )*malloc(len);
sl=s2=(struct ticket )*malloc(len); /*建立纵向链表的头结点*/headl=sl=s2;
pl->down=sl=s2;/*指向纵向链表的头结点*/scanf(”%dL”%d”,”%d”,&pl->num,&pl->num2,&pl->time); /*输入横向链表的数据*/ for i=0;i<=n,i++ ()
(s2->next=s2;
s2=sl;sl=(struct ticket )*malloc(len);/*建立纵向链表*/
scanf("%s","%d","%d","%d","%d”,sl->name,&sl->time,&sl->money,&sl->seat,&sl->mark);}/*输入纵向链表的数据*/
sl->next=headl; /*纵向链表为循环链表*/按1键
按2键按3键
按4键进入in函数
进入book函数进入inquire函数
进入cancel函数按5键
进入you函数2.总体设计说明:
①.数据结构设计:
程序二数据结构+算法,一个好的程序必定有一个好的数据结构.本设计主要考虑车票信息和用户信 息的数据结构.
车票信息采用半十字链表.横向链表中的每一个结点包含以下内容:车次,起始站,发车时间,指向下 一个结点的指针,指向中途站的指针.纵向链表中每一个结点包含以下内容:从始发站开始的依次 到站,票价,到达时间,是否己被购买标识,才用mark标识,当mark为1时车票已售出,当mark为0 时车票还未售出.以及指向下一个结点的指针.纵向链表采用循环链表,尾指针指向首指针.
未购票用户信息使用队列来保存,因为考虑到用户会预订票,所以把用户以来订票的时间早晚排 在队中.先来先买,后来后买.队列中的每个元素包含以下内容:用户姓名,身份证号码,想要购票的 车次,起始站,要到的站,时间.
己经购票用户信息使用一个单链表来保存,链表中的没个结点包含以下内容:用户姓名,身份证号 码,已购车票的车次,出发时间,到达时间.
车票信息链表示意图:
车次起始站
发车时间downn next
p2->next=null;return(head);/*返回头指针*/
goto first;/*返回头指针*/}
void book()
(struct ticket *p;
struct station *q;int t;
int *o *s;printf("please enter the number:");
scanf("%d",&f);/*输入需要的车次*/printf(''please enter the station:");
scanf("%d",&h);/*输入需要到达的车站名*/p=t;/*初始化p的值*/
while(p=!null){
if(p->number==t)(q=p->down;
o=p; /*把符合条件的横向锥表结点的数据给0*/while(q->next=!headl)
(if(q->name==h)
(if (q->mark=l)
printfC'your ticket is unused");else
q->mark=l;/*修改 mark 标记*/s=q:
s=q:
/*把符合条件的纵向链表的数据给s*/
q=q->next;/*纵向链表移针*/
»p=p->next;/*横向链表移针*/
}printfC'your ticket has already booked!");
printfC,%d,,/"%d,7,%d",o->num/o->num2/o->time); /*输出横向链表的数据*/ printf("%s","%d","%d","%d",“%d",s->nQme,&s-汁 ime,&s->money,&s->seat,&s->mark); /* 输 出纵向链表的数据*/goto first;
}
void inquire()
{struct ticket *p;
struct station *q;int t;
int *o *s;printff'please enter the number;");
scanf("%d",&f);/*输入需要的车次*/printfC'please enter the station:");
scanf("%d",&h);/*输入需要到达的车站名*/p=t;/*初始化p的值*/
while(p=!null)(
if(p->number==t)(q=p->down;
o=p;/*把符合条件的横向链表结点的数据给。*/while(q->next=!headl)
if(q->name==h)s=q:/*把符合条件的纵向链表的数据给s*/
}q=q->next;/*纵向链表移针*/
}}
p=p->next;/*横向链表移针*/}
printf(”%d“,“%d“,”%d”,o->num,o->num2,o->time); /*输出横向链表的数据*/printf("%s";*%d","%d","%d*7%d"w・>name,&s・>time,&s・>money,&s・>seat,&s・>mQrk); /* 输
出纵向链表的数据*/goto first;
void cancel()(
struct ticket *p;struct station *q;
int t;int *o *s;
printff'please enter the number:"); scanf("%d",&f);/*输入需要的车次*/printff'please enter the station:");
scanf("%d",&h);/*输入需要到达的车站名*/p=t;/*初始化p的值*/
if(p->number=t)(q=p->down;
o=p;/*把符合条件的横向链表结点的数据给0*/while(q->next=!headl)
(if(q->name = h)
(q->mark=0; /*修改 mark 标记*/
s=q;/*把符合条件的纵向链表的数据给s*/}
q=q->next; /*纵向链表移针*/p=p->next;/*横向链表移针*/
}printfC'your ticket has already cancel!");
printf(,,%d,,;,%d";'%d,,/o->num/o->num2,o->time); /*输出横向链表的数据*/ printf("%s","%d","%d","%d",“%d”,s->name,&s->time,&s->money,&s->seat,&s->ma「k); /* 输出纵向链表的数据*/
goto first;void you()
{
struct you *head;struct you *p;
p=(struct you *)malloc(len);scanf("%cr,&p->name,&p->num,&p-〉numl,&p->fime,&p->timel);
}goto First;
void find() struct you *head; struct you *p;int u;
scanfC%dw,&u); while(p=!null){
if(p->num=u){s=p;)
p=p->next;}
}void total()
{int *p,*q;
int n;Pf
while(p =!null)(
while(q->next=!headl)(
if (mark=l)
(n=n+l;)q=q->next;
}
p=p->next; printff'the number of the booked ticket are :M); printfC%d\n);Main()
(int *t;int c;
First: printff'welcome to our ticket system!\nH);printfC'l.intput the data.\nM); /*按 1 键输入数据*/ printfC'2.book the ticket.\n");/*按 2 键订车票*/
printf(n3.inquire the ticketAn"); /*按 3 键查询车票*/ printfC4.cancel the ticket.\nH);/*按 4 键退车票*/printf(H5.input your own data.\nn); /*按 5 谜输入个人信息*/ scanf("%d",&c);
switch(c)(case T: t=in(); break;
case 2: book(); break;
case ‘3’: inquire。; break;
case 4: cancel(); break;
case 5: you() ; break;default : printfCyou enter an error number\nM);
}
)八.结束语:
课程设计使我们通过解决一个实际问题,巩固和加深所学课程,提高了我们分析和编写程序的能 力,为我们以后的学习提供了很好的帮助,更为毕业设计和毕业以后从事计算机方面的工作奠定 了基础。
通过两周的学习,我们对已学的专业知识有了比较深刻的认识,同时在查找资料或和其他同学交 流的过程中,发现了一些问题,所以在设计的时候,遇到了很多困难。在对所学的有限知识的理 解和掌握下,在查找资料以及大家共同努力学习和讨论后终于把课题做完。但因为对专业知识没 有很深的认识,所以其中难免有一些是错误的或者是不合理的,希望老师多指教。
在课程设计的过程中,老师的指导对我起了非常大的帮助,在此表示感谢,谢谢各位老师的辛勤 工作!
更多内容:
C++P「imer第四版部分习题解答
麻省理工算法导论翻译
浙江大学ACM试题解答(四月)
浙江大学ACM试题解答(三月)
华容道游戏与算法
中国象棋对战程序C语言源代码
三维建筑物图像的二维建模
分段线性骨架
基于图论的图像分割技术
Linux文件系统
分层模型
汉语编程企业管理应用软件可行性研究报告
汉语编程企业管理应用软件需求说明书
计算机专业操作系统课程设计报告
软件可行性报告
软件需求分析报告
两种计算Ack(m,n)的非递归算法
浙江大学计算机复试解答1
浙江大学计算机复试解答2
浙江大学计算机复试解答3
Trackback: http:
下一站名到站时间
票价mark
next座位号
未购票用户信息队列:
用户姓名购票的车次
起始站要到的站
达到时间用户姓名
购票的车次起始站
要到的站达到时间
注:座位号包含在车次号中己购票用户信息链表示意图:
用户姓名身份证号码
已购车票的车次号出发时间 到达时间
注:座位号包含在车次号中②算法的设计:
主函数:
利用case语句实现用户界面,用户输入需要的服务的数字代码,程序就会转到相应的函 数,实现相应的功能。在主函数开始处做下First标识,以便在其他函数中使用9oto ig句返回 主函数的用户界面。
In()函数:
In()函数负责输入各种信息,链表中车票信息的初始值.
Book。函数:
Book。函数负责订票功能.主要是遍历整个链表,查找到需要订票的结点后修改其mark 值.
Inquire。函数:
Inquire。函数主要负责查询功能.主要是遍历整个链表查找到需要的结点,然后输出.
Cancel。函数:
Cancel()函数主要负责退票功能.主要是遍历整个链表查找到需要的结点,然后修改 mark的值.
you。函数:
you()函数主要负责输入用户信息,主要是创建-个单链表,将用户信息放入.并提供管 理人员的查询功能.
Find。函数:
Find()函数主要负责查询用户信息,遍历整个单链表后,输出需要的信息.
TotalQ 函数:
Total()函数主要负责统计整个订票系统的情况.
三.详细设计:
1. 主函数:
① 程序代码:
Main()(int *t;
int c;First: printfC'welcome to our ticket system!\nH);
printfC'l.intput the data."); /*按 1 键输入数据*/ printf(tt2.book the ticket.\nH);/*按 2 键订车票*/printfC'3.inquire the ticket.\nH); /*按 3 键查询车票*/ printfC4.cancel the ticketAn");/*按 4 键退车票*/
printf(''5.input your own data.'n"); /*按 5 键输入个人信息*/ scanf("%d",&c);switch(c)
(case T: t=in(); break;
case 2: book(); break;
case 3: inquire。; break;
case 4: cancel(); break;
case 5: you() ; break;default : printffyou enter an error number'n");}}
② 功能说明:
通过printf语句,输出提示用户选择的信息.用户看到后,按下自己需要功能的代号.然后程序进入 实现该功能函数完成用户所需要的功能.
2. In()函数:
①程序流程图:
建立横向链表头结点输入m,n的值
For循环,m是否为0建立结点 向结点输入数据
For循环,n是否为0否
建立纵向结点向结点输入数据
是返回头指针
Goto到用户界面②程序代码:
struct ticket *in()/*一个返回指针形的函数*/
(
struct ticket *head; /*头结点*/struct ticket *pl *p2;
struct station *sl *s2;int m,n;
int i;pl=p2=(struct ticket *)malloc(len); /*建立横向链表的头结点*/ scanf(”%d”,&m);/*输入一共所需的车票信息总数*/
scanf("%d",&n);/*输入从始发站到终点站共有几站*/head=null;
for(i=0;i<=m;i++){
p2->next=pl;P2=pl;
pl=(struct ticket )*malloc(len);sl=s2=(struct ticket )*malloc(len); /*建立纵向链表的头结点*/ headl=sl=s2;
pl->down=sl=s2;/*指向纵向链表的头结点*/scanf(”%d”,”%d”,”%d“,&pl->num,&pl->num2,&pl->time); /*输入横向链表的数据*/ for(i=0;i<=nj++)
(s2->next=s2;
s2=sl;sl=(struct ticket )*malloc(len); /*建立纵向链表*/
scanf("%s","%d","%d"「'%d",“%d",sl->name,&sl->time,&sl->money,&sl->seat,&sl->mark);}/*输入纵向链表的数据*/
sl->next=headl; /*纵向链表为循环链表*7}
p2->next=null;return(head);/* 返回头指针*/
goto first;/*返回头指针*/}
③功能说明:
通过用户输入的数值,建立所需的结点数量.再输入每个结点的具体数据.使横向链表的尾指针指向空,纵向链表的的尾指针指向头指针.最后返回头指针,再回到用户界面.
3. Book ()函数:
①程序流程图:
输入需要的车次号输入需要到达的车站名
While循环是否需要的车次是
横向结点值给。
While循环是否是需要的车站名是 使mark的值为1
纵向结点值给s 纵向链表移针横向链表移针
当横向链表下一个指针为空时输出S点的数据
输出。点的数据Mark是否为1
错误否
是②程序代码:
void book()
(struct ticket *p;
struct station *q;int t;
int *o *s;printfC'please enter the number:");
scanf("%d",&f);/*输入需要的车次*/printfC'please enter the station:");
scanf("%d",&h);/*输入需要到达的车站名*/p=t; /*初始化p的值*/
while(p=!null){
if(p->number==t)(q=p->down;
o=p;/*把符合条件的横向链表结点的数据给0*/
while(q->next=!headl) if(q->name==h)(
if (q->mark=l)printfC'your ticket is unused");
elseq->mark=l;/*修改 mark 标记*/
s=q;/*把符合条件的纵向链表的数据给s*/}
q=q->next;/*纵向链表移针*/p=p->next;/*横向链表移针*/
}printfC'your ticket has already booked!");
printfC,%d,,;,%d";'%d,,/o->num/o->num2,o->time); /*输出横向链表的数据*/printf("%s","%d","%d","%d","%d”,s->name,&s->time,&s->money,&s->seat,&s->ma「k); /* 输 出纵向链表的数据*/
goto first;}
③ 功能说明:
本函数主要是先遍历横向链表找到符合条件的结点后,转向该点的纵向链表,遍历纵向链表找到符合条件的结点,读出需要的数据.并且修改mark标记,使其成为己定车票.如果mark己经为1则 输出错误信息.
3.inquire。函数:
①程序流程图:
输入需要的车次号输入需要到达的车站名
While循环是否已到空
展开阅读全文