文档介绍:海南大学
电子技术课程设计
题目:火车票销售
学号:
姓名:
年级: 08通信(1)
专业:通信工程
指导老师:吴泽晖
日期:2010年12月06日
目录
需求分析…………………………………………….2
设计要求……………………………………………2
概要设计……………………………………………2
火车票销售系统流程图…………………………….3
详细设计…………………………………………….4
测试结果…………………………………………….9
心得体会……………………………………………..13
参考文献……………………………………………..14
正文
一、需求分析
编制一个简单的火车票销售系统,可完成售票、退票、车票剩余情况查询等功能。每张车票包含车次、座位信息。
二、设计要求
在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位情况。为简单起见,在此假设所有出售的车票均为同一车次的车票。退票时,必须是车站售出的列车票才能退(这里以同一车次的为例),否则视为无效票,不能办理退票业务。
三、概要设计
整个车票销售系统实际上可以看作对链式基本线性表的操作过程。为每张车票建立一个结点,则所有出售的车票共同建立起一个销售链表。当售出一张票,从销售链表中删除1个结点,为提高效率,每售1张票时,删除链表最前面的结点。而退回1张票时,如果为有效票,而在销售链表中插入1个结点,否则不能退票。而查询剩余票情况时,则将销售链表中所有结点的信息输出,并统计销售链表中的结点数即可。
根据上述分析,可以给车票构造一个结构体类型如下:
typedef struct node
{
char tr_no[4]; /*车次*/
elemtype seat; /*座位号*/
struct node *next;
}ticket;
则所有车票构成的销售链表如下图:
abc 2
abc 1
abc 3
abc 30 ^
车次座位
车次座位
车次座位
车次座位
……
abc 2
abc 1
abc 3
abc 30 ^
车次座位
车次座位
车次座位
车次座位
……
sale
back
车票销售链表初始状态和备份链表
而每售1张票则是将链表最前面的结点删除,退回1张有效票,则在链表最前面插入1个结点。整个链表由指针sale指向。为检查退票的有效时,即检查退票是否为销售出去的票,可以将销售前所有票构成的链表进行备份,由指针back指向。每次退回的票都与指针back指向的链表中的每个结点进行比较,如果能在back链表中找到,则为有效票,可以办理退票业务。
四、火车票销售系统流程图
开始
建立车票销售链表
1
查询
剩余票数
2
购
票
3
退
票
4
退
出
结束
五、详细设计
#define null 0
#define elemtype int
typedef struct node
{
char tr_no[4]; /*车次*/
elemtype seat; /*座位号*/
struct node *next;
}ticket;
ticket *sale,*back; /*sale为售票链表指针,back为备份链表指针*/
int count() /*查询车票剩余情况模块*/
{
ticket *q;
int n=0; /*车票计数器*/
q=sale;
while(q) /*统计车票数*/
{
n++;
q=q->next;
}
return(n);
}
void abort_ticket(elemtype x,char t[]) /*办理退票模块*/
{
ticket *s,*q;
q=back; /*q指向备份链表*/
s=(ticket *)malloc(sizeof(ticket)); /*需要办理退回的车*/
s->seat=x;
strcpy(s->tr_no,t);
while(strcmp(s->tr_no,q->tr_no)&&(s->seat!=q->seat)&&q) /*检查是否为有效车票*/
q=q->next;
if(!q)
printf("对不起!你所退的不是本列车的车票!\n");
else /*为有效票办理退回业务*/
{
s->next=sale;
sale=s;
}
}
void sale_ticket() /*购票模块*/
{
ticket *t;
if(sale)
{
t=sale;
sale=sale->next; /*从销售链表中删除已售票所在的结点*/
printf("你购买