资源描述
车票管理系统
40
2020年4月19日
文档仅供参考
一、课程设计的内容
车票管理系统
一车站每天有n个发车班次,每个班次都有一班次号(1、2、3…n),固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量。如
班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数
1 8:00 郫县 广汉 2 45 30
2 6:30 郫县 成都 0.5 40 40
3 7:00 郫县 成都 0.5 40 20
4 10:00 郫县 成都 0.5 40 2
…
(一)功能要求:用c/c++设计一系统,能提供下列服务:
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据
(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。
(3)查询路线:可按班次号查询 ,可按终点站查询
(4)售票和退票功能
A:当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数
B:退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
二、课程设计的要求与数据
1、进一步掌握和利用C语言进行程设计的能力;
2、进一步理解和运用结构化程序设计的思想和方法;
3、初步掌握开发一个小型实用系统的基本方法;
4、学会调试一个较长程序的基本方法;
5、学会利用流程图或N-S图表示算法;
6、掌握书写程序设计开发文档的能力。
三、课程设计应完成的工作
1、编写完成相应题目的程序;
2、编写课程设计报告,课程设计报告的内容应包括以下6个部分:
1) 需求分析:包括设计题目、设计要求以及系统功能需求分析;
2) 总体设计:包括系统总体设计框架和系统功能模块图;
3) 详细设计:包括主要功能模块的算法设计思路以及对应的工作流程图;
4) 调试分析过程描述:包括测试数据、测试输出结果,以及对程序调试过程中存在问题的思考(列出主要问题的出错现象、出错原因、解决方法及效果等,适当的包含结果截图);
5) 总结:课程设计完成了哪些功能,有没有什么扩展功能?还有哪些地方需要改进?课程设计过程中的学习体会与收获、对本次课程设计的认识以及自己的建议等内容;
6) 附录:主要源程序代码,含必要的注释。
3、答辩:在实验室建立程序运行的环境,并在指导教师的监督下,独立解
决问题、运行程序和回答教师提出的问题。
目 录
第一章 目的与要求 5
第二章 总体设计 6
第三章 详细设计 9
3.1功能模块设计 9
3.2数据结构设计 11
第四章 调试分析 12
第五章 总 结 14
第六章 附录 15
参考文献 25
第一章 目的与要求
编写目的:
便于车站管理部门对汽车班次信息的统计和管理,提高车站部门的工作效率,能够更好的为市民服务,同时也便于旅客了解相关的信息,方便出行。
要求:
1.能够录入汽车班次信息,如班次号,发车时间,起点站,终点站,行车时间,额载量,已订票人数等。
2.能够浏览班次信息,显示信息总和(如果已发出站的要要显示“已经开出”)。
3.查询路线:可按班次号查询 ,可按终点站查询。
4.售票功能:当查询出已定票人数小于额定载量且当前系统时间小于发车时间才能售票,自动更新已售票人数。
5.退票功能:输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数。
第二章 总体设计
1)系统总体设计框架
车票管理系统
录入班次信息
浏览班次信息
查询路线
售票
退票
保存信息
退出系统
按班次查询
按终点站查询
2)主要功能流程图:
录入班次信息功能流程图:
按y继续录入班次
信息录入成功
输入错误
录入班次
输入发车时间
输入行车时间
输入起点站
输入额定载量
按任意键返回主菜单
按Y继续查找,按任意键返回主菜单
按2终点站查询
按1按班次查询
进入查询界面
浏览班次功能流程图:
依据提示操作
进入售票界面
售票系统工作流程图:
售票成功
班次不存在
票已售完
车已发出
继续售票按Y,返回主菜单按任意键
第三章 详细设计
3.1功能模块设计
3.1.1售票函数
while(选择的是“Y”)
{打印当前时间
打印“班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数”
for()
{
输出班次信息
』
提示输入车的班次
}
if(当查询出已定票人数小于额定载量且当前系统时间小于发车时间时)
{提示售票成功!
订票人数加1;
}
IF(额定载量小于订票人数)
{
提示票已售完!;
}
else if(输入的班次号小于零)
{该车不存在!}
else if(当前系统时间晚于发车时间)
{
提示车已发出!
}
提示继续售票按Y,按任意键返回主菜单!
输入一个字符;
}
}
3.1.2退票函数
while(输入的是Y的时候)
{
提示输入要退票的车次;
输入一个字符;
}
if(输入的班次号存在和系统时间比发车时间晚)
{订票人数-1;
提示退票成功!
}
else if(输入的班次号小于零)
提示该班次不存在!;
)
else if(要退票的那辆车的发车时间早过现在系统时间)
{
提示车已发出不能退票!;
提示继续退票请按(Y),返回主菜单按任意键;
输入一个字符;
}
}
3.1.3菜单函数
{
打印“车票管理系统”;
打印“系统时间”;
打印“录入班次信息”;
打印“查询班次信息”;
打印“售票”;
打印“退票”;
打印“保存车次信;";
打印“退出系统”;
打印“请选择(0--6)”;
打印“车票管理系统;
得到一个字符;
返回值;
}
struct Buses{//定义汽车
int number;
struct Times time;
char start[30];
char end[30];
float time_cost;
int carry_number;
int booK_number;
};
数据结构2
3.2数据结构设计(可选)
struct Times
{int hour;
int min;
int sec;
};
数据结构1
程序中涉及的数据过多,本人决定采用两个结构体处理数据。其中时间为一个数据结构体(即结构1),它又是汽车结构体(即结构2)的一个成员元素,这样处理数据容易些。
第四章 调试分析
本人在写代码的过程中觉得难控制的是那个班次数。因为本系统提供了个录入信息功能,能够不定时的增加班次,即这个班次数是不确定的。而这个班次数又影响到查询函数,退票函数,售票函数等,另外还影响到一些功能小函数,如比较时间函数等。经过上网查找资料,我发现有一个巧妙的方法能够解决这个问题,即设定一个静态局部变量(即代码中的H),这样每当班次号改变之后这个H的值就和它的班次号一样大,这样就能够解决之前提到的问题了。另外,这个系统要有一个保存文件功能,由于本人对文件保存处理不清楚,设计过程中一直搞不明白。最后在网上查到了相关信息才能够弄出。
以下是该程序运行的部分结果:
主界面:
信息录入图和浏览时刻表:
查询售票图:
退票图:
保存信息图:
第五章 总 结
经历近几天的学习和锻炼,这个车票管理系统算是做出来了(不过我承认我是参考网上代码所得,我基本能看懂)。它基本有前面提到过的功能,即录入班次信息,浏览班次信息,售票和退票,保存文件。有一个扩展功能,即能够退出系统(代码中的sys_exit()函数)。
不过当前我发现它一个不足之出,就是不能对输入时间的格式起限制作用。如我能够输入26:30:00,它系统不会提示说输入错误提示再输入一个正确的时间。还有,就是整个代码条理不够清晰,只是用到一个主函数和调用其它函数,可读性差!我认为最好是能分模块化处理,分文件处理,这样条理性强,可读性高,再者修改也容易。不过由于本人水平有限,不能这样处理。
经历这近几天的锻炼,我也比较满意自己的表现。在这过程中我查阅了很多书,学到了很多课堂上没有的东西。很多知识我之前不知道的现在大部分都知道了,不过理解不够深透,,导致在这近几天里碰了不少壁!
近几天我觉得编程既是一项费时费力但也是有趣的事。说它费时费力是因为它繁琐,而有趣是因为我很享受一段段的小程序编成功之后的喜悦,苦尽干来啊。我觉得编程是一件快乐的差事,我想我今后会加把时间学习它,把它学好。
第六章 附录
程序代码:
#include"stdio.h"
#include"time.h"
#include"windows.h"
#include"string.h"
#include"dos.h"
#include"stdlib.h"
#include"ctype.h"
#define Max 50//最大贮赌量
#define null 0
static int H=0;
struct Times
{//定义时钟
int hour;
int min;
int sec;
};
struct Buses{//定义汽车
int number;
struct Times time;
char start[30];
char end[30];
float time_cost;
int carry_number;
int booK_number;
};
struct Buses bus[Max];
time_t now = time(0);
tm *tnow =localtime(&now);
void load();//载入车次信息
void lu(void);//声明录入函数
void chaxun(struct Buses bus[]);//声明查询路线函数
void save(struct Buses bus[]);//声明保存函数
int caidan();//声明菜单录数
void liulan(struct Buses bus[]);//声明浏览函数
void tuipiao(struct Buses bus[]);//退票
void shoupiao(struct Buses bus[]);//声明售票函数
void xitongtuichu();//声明退出函数
//工具函数
struct Buses copy(struct Buses b1,struct Buses b2);//赋值
void sort_time(struct Buses bus[]);//声明按时间发车的先后顺序排序
int compare_time(struct Times t1,struct Times t2);//时间比较函数
int compare_systime(struct Buses bus,tm *T);//比较发车时间与当前系统时间的函数
void print(struct Buses bus);//声明输入出函数
int number_search(struct Buses bus[],int num);//声明按班次查询函数
int end_search(struct Buses bus,char ends[]);//声明按终点查询函数
void main(){//主函数
while(1){
system("cls");
switch(caidan()){
case 1: lu(); break;
case 2: liulan(bus); break;
case 3: chaxun(bus); break;
case 4: shoupiao(bus); break;
case 5: tuipiao(bus); break;
case 6: save(bus); break;
case 0: xitongtuichu(); break;
}
}
}
int compare_systime(struct Buses bus,tm *T){//与系统时间的比较函数
if(bus.time.hour>=T->tm_hour){
return 1;
if(bus.time.min>=T->tm_min){
return 1;
if(bus.time.sec>T->tm_sec)
return 1;
else return 0;
}
return 0;
}
return 0;
}
struct Buses copy(struct Buses b1,struct Buses b2){
b1.booK_number=b2.booK_number;
b1.carry_number=b2.carry_number;
strcpy(b1.end,b2.end);
b1.number=b2.number;
strcpy(b1.start,b2.start);
b1.time.hour=b2.time.hour;
b1.time.min=b2.time.min;
b1.time.sec=b2.time.sec;
b1.time_cost=b2.time_cost;
return b1;
}
void liulan(struct Buses bus[]){//浏览车次
getchar();
system("cls");
int i;
printf("\n\t\t\t\t车辆时刻表\n");
printf("\t\t\t**************************\n");
printf("\t班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数");
printf("\n\t--------------------------------------------------------------\n");
sort_time(bus);
for(i=0;i<H;i++){
print(bus[i]);
}
printf("\t--------------------------------------------------------------\n");
printf("\t\t\t\t%d条记录!\n",H);
printf("\t按任意键返回主菜单...");
getchar();
}
int compare_time(struct Times t1,struct Times t2){//比较时间大小
if(t1.hour>t2.hour){
return 1;
if(t1.min>=t2.min){
return 1;
if(t1.sec>=t2.sec)
return 1;
else return 0;
}
return 0;
}
return 0;
}
void sort_time(struct Buses bus[]){//按发车时间排序
int i,j,k;
struct Buses b={0};
for(i=0;i<H-1;i++){
k=i;
for(j=i+1;j<H;j++){
if(compare_time(bus[i].time,bus[j].time)){
k=j;
if(k!=i){
b=copy(b,bus[i]);
bus[i]=copy(bus[i],bus[k]);
bus[k]=copy(bus[k],b);
}
}
}
}
}
int number_search(struct Buses bus[],int n){//按班次查询
int i;
for(i=0;i<H;i++){
if(bus[i].number==n)
return i;
}
return -1;
}
int end_search(struct Buses bus,char ends[]){//按终点站查询
if(strcmp(bus.end,ends)==0)
return 1;
else
return -1;
}
void print(struct Buses bus){
if(!compare_systime(bus,tnow))
printf("\t%-6d%-2d:%-2d:%-2d%6s%8s%8.1f%10d%10d(已发出)\n",bus.number,bus.time.hour,
bus.time.min,bus.time.sec,bus.start,bus.end,bus.time_cost,bus.carry_number,bus.booK_number);
else
printf("\t%-6d%-2d:%-2d:%-2d%6s%8s%8.1f%10d%10d\n",bus.number,bus.time.hour,
bus.time.min,bus.time.sec,bus.start,bus.end,bus.time_cost,bus.carry_number,bus.booK_number);
}
int caidan(){
int a;
system("cls");//以下是菜单图案
printf("\n\n");
printf("\t\t 车票管理系统 \n");
printf("\t\t ***************** (%d年%d月%d日)\n",
1900+tnow->tm_year,tnow->tm_mon+1,tnow->tm_mday);
printf("\t\t|----------------------------------------------|\n");
printf("\t\t| 菜单 |\n");
printf("\t\t|----------------------------------------------|\n");
printf("\t\t| (1) 录入班次信息 |\n");
printf("\t\t|----------------------------------------------|\n");
printf("\t\t| (2) 显示班次信息 |\n");
printf("\t\t|----------------------------------------------|\n");
printf("\t\t| (3) 查询班次信息 |\n");
printf("\t\t|----------------------------------------------|\n");
printf("\t\t| (4) 售票 |\n");
printf("\t\t|----------------------------------------------|\n");
printf("\t\t| (5) 退票 |\n");
printf("\t\t|----------------------------------------------|\n");
printf("\t\t| (6) 保存车次信息 |\n");
printf("\t\t|----------------------------------------------|\n");
printf("\t\t| (0) 退出系统 |\n");
printf("\t\t|----------------------------------------------|\n");
printf("\n\t\t请选择(0-6):");
scanf("%d",&a);
return(a);
}
void save(struct Buses bus[]){//保存函数体
getchar();
FILE *fp;
int i;
if((fp=fopen("Bus_system","wb"))==null){
printf("不能打开文件\n");
return;
}
for(i=0;i<H;i++)
if(fwrite(&bus[i],sizeof(struct Buses),1,fp)!=1)
printf("文件保存出错!\n");
fclose(fp);
printf("文件保存成功!");
getchar();
}
void lu(){//录入函数
int i=H,f=1;
char flag='Y';
while(toupper(flag)=='Y'){
system("cls");
printf("\n\t\t车次信息录入\n请输入车的班次:");
scanf("%d",&bus[i].number);
getchar();
while(number_search(bus,bus[i].number)>=0){
printf("你输入的班次已存在请重新输入!:");
scanf("%d",&bus[i].number);
getchar();
}
printf("请输入时间如:(20:30:00) :");
scanf("%d:%d:%d",&bus[i].time.hour,&bus[i].time.min,&bus[i].time.sec);
getchar();
printf("请输入车的起点站:");
scanf("%s",bus[i].start);
getchar();
printf("请输入车的终点站:");
scanf("%s",bus[i].end);
getchar();
printf("请输入行车时间:");
scanf("%f",&bus[i].time_cost);
getchar();
printf("请输入车的额定载量:");
scanf("%d",&bus[i].carry_number);
getchar();
bus[i].booK_number=0;
H++;
i++;
printf("信息录入成功!\n");
printf("继续录入请按(Y),返回主菜单按任意键...");
flag=getchar();
}
}
void chaxun(struct Buses bus[]){//查询路线
int a,i=0;
int m=0;
char flag='Y';
while(toupper(flag)=='Y'){
char end[30];
system("cls");
printf("\n按班次查询请按 1\n终点站查询请按 2\n请选择(1-2):");
scanf("%d",&a);
while(a!=1&&a!=2){
printf("注意只能选择1或2!\n请重新输入:");
scanf("%d",&a);
getchar();
}
switch(a)
{
case 1:{
printf("请输入车次号:");
scanf("%d",&m);
getchar();
i=number_search(bus,m);
if(i>=0){
printf("\n\t\t\t\t车辆时刻表\n");
printf("\t\t\t**************************\n");
printf("\t班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数");
printf("\n\t--------------------------------------------------------------\n");
print(bus[i]);
printf("\t--------------------------------------------------------------\n");
}
else
printf("\n\t\t\t没有你要查找的记录!\n");
}break;
case 2:{
printf("请输入车的终点站:");
scanf("%s",end);
getchar();
while(i<H){
if((m=end_search(bus[i],end))==1){
printf("\n\t\t\t\t车辆时刻表\n");
printf("\t\t\t**************************\n");
printf("\t班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数");
printf("\n\t--------------------------------------------------------------\n");
print(bus[i]);
i++;}
break;
}
for(i;i<H;i++){
if(end_search(bus[i],end)==1)
print(bus[i]);
}
if(m==1)printf("\t--------------------------------------------------------------\n");
}
for(i=0;i<H;i++){
if(end_search(bus[i],end)!=1)
printf("\n\t\t\t没有到该站的车!\n");break;
}
}
printf("\t\t继续查找请按(Y),返回主菜单按任意键...");
flag=getchar();
}
}
void shoupiao(struct Buses bus[]){//售票函数
int i,n;
char flag='Y';
while(toupper(flag)=='Y'){
system("cls");
printf("\n\t\t\t\t车辆时刻表\n");
printf("\t\t\t************************** 当前时间(%d:%d:%d)\n",
tnow->tm_hour,tnow->tm_min,tnow->tm_sec);
printf("\t班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数");
printf("\n\t--------------------------------------------------------------\n");
for(int j=0;j<H;j++){
print(bus[j]);
}
printf("\t--------------------------------------------------------------\n");
printf("\t请输入车的班次:");
scanf("%d",&i);
n=number_search(bus,i);
getchar();
if(n>=0&&bus[n].carry_number>bus[n].booK_number&&compare_systime(bus[n],tnow)){
printf("\n\t\t\t售票成功!\n");
bus[n].booK_number++;
printf("\t班次 发车时间 起点站 终点站 行车时间 额定载量 已定票人数");
printf("\n\t--------------------------------------------------------------\n");
print(bus[n]);
printf("\n\t--------------------------------------------------------------\n");
}
if(bus[n].carry_number<=bus[n].booK_number)
printf("\n\t\t\t该次车的票已售完!\n");
else if(n<0)
printf("\n\t\t\t该次车不存在!\n");
else if(!compare_systime(bus[n],tnow))
printf("\n\t\t\t该次已发出!\n");
printf("\t\t继续售票请按(Y),返回主菜单按任意键...");
flag=getchar();
}
}
void tuipiao(struct Buses bus[]){//退票函数
int n,i;
char flag='Y';
while(toupper(flag)=='Y'){
system("cls");
printf("\n\n请输入车次:");
scanf("%d",&n);
getchar();
i=number_search(bus,n);
if(i>=0&&compare_systime(bus[i],tnow)){
bus[i].booK_number--;
printf("\n\t\t\t退票成功!\n");
}
else if(i<0)
printf("\n\t\t\t该车次不存在!\n");
else if(!compare_systime(bus[n],tnow))
printf("\n\t\t\t车已发出不能退票!\n");
printf("\t继续退票请按(Y),返回主菜单按任意键...");
flag=getchar();
}
}
void load()//载入车次信息
{ FILE *fp;
int i=0;
while((fp=fopen("Bus_system","rb"))==NULL) //以rb形式打开文件
return;
for(i;!feof(fp);i++,H++)
{
if(fread(&bus[H],sizeof(struct Buses),1,fp)!=1){}
if(feof(fp))
{
fclose(fp);
return;
}
}
fclose(fp);
}
void xitongtuichu(){//退出函数
system("cls");
getchar();
char flag=null;
printf("\n\n\t\t你确定要退出并保存信息吗?(Y/N)");
flag=getchar();
if(toupper(flag)=='Y')
{
save(bus);
exit(0);
}
else if(toupper(flag)=='N')
exit(0);
else
return;
}
参考文献
1、 谭浩强编著, C程序设计 1991年7月
2、 裘宗燕 著,从问题到程序科学出版社,北京大学出版社,1999年4月。
3、 刘瑞挺主编,计算机二级教程,南开大学出版社,1996年10月。
4、 陈朔鹰等编著,C语言程序设计基础教程,兵器工业出版社,1994年9月
5、 姜仲秋等主编,C语言程序设计,南京大学出版社,1998年1月。
6、《C程序设计(第二版)》,谭浩强编,清华大学出版社,1999年12月。
7、《C语言程序设计题解与上机指导》,谭浩强编,清华大学出版社, 11月。
8、《Turbo C 2.0实用大全》,常玉龙等编写,北京航空航天大学出版社,1994年9月。
9、《C语言程序设计习题集(第二版)》,陈朔鹰 陈英主编,人民邮电出版社, 2月。
10、《C语言趣味程序百例精解》,陈朔鹰 陈英主编,北京理工大学出版社,1996年。
11、《C语言程序设计辅导与习题集》,田淑清等,中国铁道出版社, 1月。
12、《C语言编程常见问题解答》,[美]Paul S. R. Chishohm等著,张芳妮 吕波译,清华大学出版社,11996年12月。
展开阅读全文