车票管理系统实验报告(电子).docx
- 文档编号:8966117
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:18
- 大小:266.64KB
车票管理系统实验报告(电子).docx
《车票管理系统实验报告(电子).docx》由会员分享,可在线阅读,更多相关《车票管理系统实验报告(电子).docx(18页珍藏版)》请在冰点文库上搜索。
二○一三~二○一四学年第二学期
车票管理系统实验报告
物理与电子工程学院
课程名称:
数据结构
班 级:
学 号:
姓 名:
二○一四年六月
(1)题目:
车票管理系统
(2)系统功能模块结构图
(3)各模块的功能
1.信息输入模块即录入班次信息:
完成班次信息的输入功能,输入信息包括班次、发车时间、起点站、终点站、行车时间、额定载量、已定票人数等;
2.信息浏览模块即浏览班次信息:
完成已录入信息的显示;
3.信息查询模块即查询班次信息:
完成班次信息的查询,查询时对应有按班次查询和按终点站查询两种方式;
4.售票和退票模块:
完成车票的购买和退订的功能;
5.菜单选择模块即主菜单:
完成用户命令的接收,此模块也是车票管理系统的入口,用户所要进行的各种操作均需在此模块中进行选择并进而调用其他模块实现相应的功能。
(4)数据结构设计及用法说明
头文件,一个名TICKET的结构体进行定义:
typedefstructticket //用typedef定义结构体为TICKET
{
intnum; //班次
charstarttime[10]; //发车时间
charbegin[21]; //起始站
charend[21]; //终点站
floatlasttime; //行车时间
intCarryNumber; //额定载量
intSellNumber; //已定票人数structticket*next; //结点的指针域
}TICKET,*Ticket; //结构体类型指针
然后对各调用函数进行定义:
voidInsertTicket() //录入班次
voidFileRead() //班次信息文件读入
voidKeep() //保存数据
voidScanTicket() //浏览信息
voidScanTicket() //浏览信息
voidSearchbyNum() //按班次查询班次
voidSearchbyEnd() //按终点站查询班次
voidBuyticket() //预定车票
voidReturnTicket() //退订车票
intGetHour(char*s) //获取班次小时
intGetMinute(char*s) //获取班次分钟
voidexit() //退出该系统
最后定义main()函数,利用函数调用,实现程序的各种功能。
将其放在系统文件ticket.txt中。
(5)画出各函数流程图
(6)实验结果(包括输入数据和输出结果)
0).主菜单
1).录入界面
2).浏览界面
3).查询界面
1.按班次查询
2.按终点站查询
4).订票界面
5).退票界面
6).退出系统
Ticket文件截图:
(7)体会
经过两周的数据结构设计训练,让我们独立完成一个小系统,让我学到很多东西:
(1)巩固和加深了对链表,指针的理解,提高综合运用所学知识的能力。
(2)培养了我独立思考,深入研究,分析问题、解决问题的能力;通过实践解决实际问题,并学会了很多实用的函数。
(3)在编辑程序代码的时候,这是一个至关重要、复杂而且需要反复修改的环节,在此环节中我发现存在很多问题,需不断改进。
如何实现各函数功能,达到预期效果也将是一项繁复的工作。
(4)代码的调试在VisualC++6.0环境下输入代码并进行调试和正确运行。
在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。
(5)最后,程序可以正确运行之后,在不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。
而其中我发现system("cls")命令特别好用,因为之前在不知道
system("cls")有清屏的功能时,在运行程序时,重复操作一些功能的时候,每次进行一项操作,运行窗口里的内容会一直保留着,感觉很杂乱,知道可以使用system("cls");这一语句可以解决这个问题,里面的内容很多,很繁琐,让人有点眼花缭乱,就是说全部的操作都显示在屏幕中。
但是,在用了
system("cls")命令之后,程序显得更加清楚,更加简洁美观,就是在执行完一个功能之后就把内容都清理掉,然后再返回主菜单或返回其它功能的界面,是操作者更好的操作。
不过,程序中还存在一些问题,当要求用户输入数字选择,若输入字符型数据或其他非整型数据时,还是存在系统不能运行的问题。
但是,因为写程序时是要求用户输入数字的时候是必须用整型的,所以只要用户按要求输入正确的数据,程序是能正确运行的。
通过这次训练,使我更加熟悉的掌握了C语言的运用。
帮助我熟悉了更多C语言的功能,提高了我的动手能力,学到了许多解决实际问题的宝贵经验。
另外,在这次课程设计中我也遇到许多问题和麻烦,得到了老师的帮助和指导,才能够使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。
(8)参考文献
一:
C程序设计(第四版)谭浩强著清华大学出版社
二:
数据结构(C语言版)严蔚敏著人民邮电出版社三:
C语言项目案例分析明日科技著清华大学出版社
(9)附录:
源程序:
#include
#include
#include
#include
typedefstructticket //用typedef定义结构体为TICKET
{
intnum; //班次
charstarttime[10]; //发车时间
charbegin[21]; //起始站
charend[21]; //终点站
floatlasttime; //行车时间
intCarryNumber; //额定载量
intSellNumber; //已定票人数structticket*next; //结点的指针域
}TICKET,*Ticket; //结构体类型指针
TICKET*head; //班次头结点
TICKET*rear; //班次尾结点
/*****************************录入班次信息
************************************/
voidInsertTicket() //录入班次
{
FILE*fp; //定义文件型指针变量
system("cls"); //清屏
fp=fopen("ticket.txt","r+"); //fopen打开文件,读写TICKET*T;
T=(TICKET*)malloc(sizeof(TICKET)); //开辟内存空间
printf("请输入班次信息(输入完成后请按回车键)\n");scanf("%d",&T->num);
printf("请输入发车时间\n");
scanf("%s",&T->starttime);
printf("请输入起点站\n");scanf("%s",&T->begin);
printf("请输入终点站\n");
scanf("%s",&T->end);
printf("请输入行车时间\n");scanf("%f",&T->lasttime);
printf("请输入额定载量\n");
scanf("%d",&T->CarryNumber);
printf("请输入已定票人数\n");scanf("%d",&T->SellNumber);
rear->next=T; //在TICKET单链表中依次插
入下一结点
rear=T;
T->next=NULL; //指针域置空
rear->next=NULL; //班次尾结点的指针域置空
fclose(fp); //文件关闭
printf("信息已保存!
\n");
}
/*******************************文件读入
***************************************/
voidFileRead() //班次信息文件读入
{
FILE*fp; //定义文件型指针变量
system("cls"); //清屏
if((fp=fopen("ticket.txt","r+"))==0) //如果文件内容为空
{
printf("\n打开文件错误!
\n");
exit(0);
}
while(!
feof(fp)) //读取文件并判断是否抵达文
件尾
{
TICKET*T;
T=(TICKET*)malloc(sizeof(TICKET));//开辟内存空间fscanf(fp,"%d%s%s%s%f%d%d\n",&T->num,&T->starttime,&T-
>begin,&T->end,&T->lasttime,&T->CarryNumber,&T->SellNumber);//根据指
定格式从指定文件读取信息
rear->next=T; //在TICKET单链表中依次插入下一结点
rear=T;
rear->next=NULL; //班次尾结点的指针域置空
}
fclose(fp); //文件关闭
}
/*******************************文件数据保存
********************************/
voidKeep() //保存数据
{
FILE*fp; //定义文件型指针变量
if((fp=fopen("ticket.txt","r+"))==0) //如果文件内容为空
{
printf("\n打开文件错误!
\n");
exit(0);
}
TicketT=head->next;while(T!
=NULL)
{
fprintf(fp,"%d\t%s\t%s\t%s\t%.2f\t%d\t%d\n",T->num,T-
>starttime,T->begin,T->end,T->lasttime,T->CarryNumber,T->SellNumber);T=T->next; //根据指定格式发送信息到指
定文件
}
fclose(fp); //文件关闭
}
/********************************浏览班次信息
*****************************************/
voidScanTicket() //浏览信息
{
system("cls"); //清屏
TicketT=head->next;
printf("\n各班次信息如下:
\n");
printf("\n班次\t发车时间\t起点站\t终点站\t行车时间 额定载量已定票人数\n");
printf("
\n");while(T!
=NULL)
{
printf("%d\t%s\t\t%s\t%s\t%.2f\t\t%d\t\t%d\n",T->num,T-
>starttime,T->begin,T->end,T->lasttime,T->CarryNumber,T->SellNumber);T=T->next;
}
printf("
\n");
}
/**********************************查询信息
******************************************/
voidSearchTicket() //查询班次信息
{
system("cls"); //清屏
voidSearchbyNum(); //函数声明按班次查询
voidSearchbyEnd(); //函数声明按终点站站查询
inti,j=0;while(j!
=1)
{
system("cls"); //清屏
printf("\n");
printf(" 查询子菜单\n");printf("==========================\n");
printf(" 1.按班次查询\t\n");
printf(" 2.按终点站站名查询\t\n");printf("==========================\n");
printf("请选择查询方式(1~2):
");
scanf("%d",&i);switch(i)
{
case1:
SearchbyNum();break;case2:
SearchbyEnd();break;
default:
printf("\n输入错误!
请确保你的输入为1或2.\n");break;
}printf("==========================\n");
printf("\n1.返回主菜单2.继续查询:
");
scanf("%d",&j);
}
}
/*****************************按班次查询信息
***********************************/
voidSearchbyNum() //按班次查询班次
{
intGetHour(char*s);intGetMinute(char*s);
system("cls"); //清屏
Ticketp,q; //定义两个结点
intnum; //要查询的班次
intj=0; //判断班次
p=head->next;
printf("\n请输入需要查询的班次:
");scanf("%d",&num);
while(p!
=NULL)
{
if(p->num-num==0) //班次和查询的班次相同
{
q=p;
printf("\n");
printf("班次:
\t");printf("%d\n",q->num);
printf("发车时间:
\t");printf("%s\n",q->starttime);
printf("起点站:
\t");printf("%s\n",q->begin);
printf("终点站:
\t");printf("%s\n",q->end);
printf("行车时间:
\t");printf("%.2f\n",q->lasttime);
printf("额定载量:
\t");printf("%d\n",q->CarryNumber);
printf("已定票人数:
\t");printf("%d\n",q->SellNumber);
置日历时间
time_tt; //得到机器的日历时间或者设
structtm*timeinfo; //返回一个以tm结构表达的
机器时间信息
time(&t); //调用time()函数
timeinfo=localtime(&t); //函数需要传递进去的参数是
&t,也就是之前t的地址,localtime()的返回值是一个struct tm结构,于是返回值用timeinfo保存
if(GetHour(q->starttime)
printf("\n此班次车已发出!
\n");else
if(GetHour(q->starttime)==timeinfo->tm_hour) //小
时正好
钟未到
{
if(GetMinute(q->starttime)<=timeinfo->tm_min) //分
printf("\n此班次车已发出!
\n");else
printf("\n此班次车尚未发出!
\n");
}
else
printf("\n此班次车尚未发出!
\n");j++;
}
p=p->next;
}//while(p!
=NULL)if(j==0)
printf("\n对不起,不存在此班次!
\n");
}
/*****************************按终点站查询信息
************************************/
voidSearchbyEnd() //按终点站查询班次
{
system("cls"); //清屏
intGetHour(char*s);intGetMinute(char*s);
Ticketp,q; //定义两个结点
charend[21]; //要查询的终点站站名intj=0;
p=head->next;
printf("\n请输入需要查询的终点站站名:
");scanf("%s",end);
while(p!
=NULL)
{
if(strcmp(p->end,end)==0) //比较2个字符串的大小是否
一样
{
q=p;
printf("\n");
printf("班次:
\t");printf("%d\n",q->num);
printf("发车时间:
\t");printf("%s\n",q->starttime);
printf("起点站:
\t");printf("%s\n",q->begin);
printf("终点站:
\t");printf("%s\n",q->end);
printf("行车时间:
\t");printf("%.2f\n",q->lasttime);
printf("额定载量:
\t");printf("%d\n",q->CarryNumber);
printf("已定票人数:
\t");printf("%d\n",q->SellNumber);time_tt; //得到机器的日历时间或者设
置日历时间
structtm*timeinfo; //返回一个以tm结构表达的
机器时间信息
time(&t); //调用time()函数timeinfo=localtime(&t); //函数需要传递进去的参数是
&t,也就是之前t的地址,localtime()的返回值是一个struct tm结构,于是返回值用timeinfo保存
if(GetHour(q->starttime)
系统时间超过班次出发时间
printf("\n此班已发出!
\n");else
if(GetHour(q->starttime)==timeinfo->tm_hour) //小
时正好
钟未到
{
if(GetMinute(q->starttime)<=timeinfo->tm_min) //分
printf("\n此班已发出!
\n");else
printf("\n此班次车尚未发出!
\n");
}
else
printf("\n此班次车尚未发出!
\n");j++;
}
p=p->next;
}//while(p!
=NULL)if(j==0)
printf("\n对不起,不存在此班次!
\n");
}
/**********************************预定车票
*********************************/
voidBuyticket() //预定车票
{
intGetHour(char*s);intGetMinute(char*s);inti=0;
system("cls"); //清屏
ScanTicket(); //调用浏览信息函数while(i!
=1)
{
intnum,j=0;
Ticketp,q; //定义两个结点p=head->next;
time_tt; //得到机器的日历时间或者设
置日历时间
structtm*timeinfo; //返回一个以tm结构表达的机器时间信息
time(&t); //调用time()函数
timeinfo=localtime(&t); //函数需要传递进去的参数是
&t,也就是之前t的地址,localtime()的返回值是一个struct tm结构,于是返回值用timeinfo保存
printf("\n请输入你要购买的班次:
");scanf("%d",&num);
while(p!
=NULL)
{
if(p->num-num==0) //班
次和预订的班次相同
{
q=p;j++;
if(q->SellNumber
已定票人数少于额定载量
{
时间未到
if(GetHour(q->starttime)>timeinfo->tm_hour) //系统
{
printf("\n订票成功!
\n");q->SellNumber++;
}
else
if((GetHour(q->starttime)==timeinfo-
>tm_hour)&&(GetMinute(q->starttime)>timeinfo->tm_min))//系统小时正好,分钟未到
{
票人数增1
printf("\n订票成功!
\n");
q->SellNumber++; //已定
}
}
else
else
printf("\n该班次车已经发出!
\n");
printf("\n该班次车人数已满!
\n");
}
p=p->next;
}
if(j==0)
printf("\n不存在此班次!
\n");printf("==========================\n");
printf("\n1.返回主菜单2.继续订票:
");
scanf("%d",&i);
}//while(i!
=1)
}
/********************************退订车票
*********************************/
voidReturnTicket() //退订车票
{
intGetHour(char*s);intGetMinute(char*s);inti=0;
system("cls"); //清屏
ScanTicket(); //调用浏览信息函数while(i!
=1)
{
Ticketp,q;p=head->next;intnum,j=0;
time_tt; //得到机器的日历时间或者设置
日历时间
structtm*timeinfo; //返回一个以tm结构表达的机器时间信息
time(&t); //调用time()函数timeinfo=localtime(&t); //函数需要传递进去的参数是&t,
也就是之前t的地址,localtime()的返回值是一个s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 车票 管理 系统 实验 报告 电子