************\n");
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
printf("\n| 班次 | 发车时间 | 起点站 | 终点站 |行车时间|额定载量| 已售票 |\n");
}
/***************************************打印表尾************************************************/
void ShowTable2(int i) //线框调用2。不用没次输。
{
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
}
/**************************查找函数11**************************/
void search() ////查询调用
{
int i;
char s1[10]={'\0'},s2[10]={'\0'};
system("cls"); //刷屏
printf("1. 按班次查询\n");
printf("2. 按终点站查询\n");
printf("3. 退出\n");
printf("请选择(1-3):\n");
scanf("%d",&i);
load(); // 调用按班次查询函数
switch(i) //多分枝选择语句
{
case 1: printf("请输入要查询的班次:\n"); //////s1为班次
scanf("%s",s1);
find(s1,s2); /////调用查找函数222 2
break;
case 2: printf("请输入要查询终点站:\n"); /////s2为终点站
scanf("%s",s2);
find(s1,s2); /////调用查找函数222 2
break;
case 3: break;
default : printf("输入错误!\n");
break;
}
printf("按任意键继续....\n");
getch(); ///从控制台读取一个字符,但不显示在屏幕上
}
/********************************查询函数22*********************************/
void find(char s1[],char s2[])
{
int i,h=0,m;
ShowTable1(); ////调用线框1
if(s2[0]=='\0')
m=1; ///1为无条件执行
else m=0;
for(i=0;i<class_num;i++)
if(strcmp(s1,records[i].num)==0||strcmp(s2,records[i].to)==0)
////判断字符串比较是否相等,, 待比较的字符串
{
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,records[i].min,
records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);
h+=2;
if(m==1)
break;
}
ShowTable2(h); ////调用线框2
if(h==0)
printf("要查找的班次不存在!\n");
}
/***********************增加函数****************************/
void add() // //增加记录
{
int i,j=5;
load(); // 调用按班次查询函数
system("cls"); //刷屏
printf("1. 增加班次\n");
printf("2. 返回\n");
printf("请选择(1-2)\n");
scanf("%d",&i);
if(i==1)
{
system("cls"); //刷屏
printf("1. 请输入要增加的班次:\n");
scanf("%s",records[class_num].num);
for(i=0;i<class_num;i++)
if(strcmp(records[class_num].num,records[i].num)==0)
//判断字符串比较是否相等,, 待比较的字符串 判断车次没重复
{
printf("输入错误!\n");
getch(); /////从控制台读取一个字符,但不显示在屏幕上
break;
}
if(i==class_num)
{
get(i,j); ////修改及增加班次*
class_num++; ///使班次数加1
save(); //调用保存函数
}
}
}
/********************************售票函数*****************************/
void Ticketorder() //*售票函数***
{
int i;
char num[10];
system("cls"); //刷屏
printf("1. 售票\n");
printf("2. 返回\n");
printf("请选择(1-2):\n");
scanf("%d",&i);
if(i==1)
{
load(); // 调用按班次查询函数
search(); //查找函数**
printf("请输入要订票的班次(若无请输入0):\n");
scanf("%s",num);
for(i=0;i<class_num;i++)
if(strcmp(num,records[i].num)==0)//判断字符串比较是否相等,, 待比较的字符串
if(records[i].max>records[i].now&&whether(i)==1)
//判断时间是否超出函数***并且***没超出最大客量
{
records[i].now++; ///使已售的暑假1
printf("通向%s班次为%s的票订票成功!\n",records[i].to,records[i].num);
save(); //调用保存函数
getch(); /////从控制台读取一个字符,但不显示在屏幕上
break;
}
else
{
printf("该班次已满或已发出!\n");
getch(); /////从控制台读取一个字符,但不显示在屏幕上
}
}
}
/****************************退票删除函数***************************************/
void Ticketdelete() //删除函数*
{
int i;
char num[10];
system("cls"); //刷屏
printf("1. 退票\n");
printf("2. 返回\n");
printf("请选择(1-2)\n:");
scanf("%d",&i);
if(i==1)
{
system("cls"); //刷屏
load(); // 调用按班次查询函数
printf("请输入要退票的班次:\n");
scanf("%s",num);
i=findnum(num); //调用班次查询函数
if(strcmp(num,records[i].num)==0) //判断字符串比较是否相等 待比较的字符串
if(whether(i)) //判断时间是否超出函数***
{
printf("确定(Y/N)?");
scanf("%s",num);
if(num[0]=='y'||num[0]=='Y')
{
records[i].now--; //使已售票加1
printf("退票成功!\n");
save(); //调用保存函数
getch(); //从控制台读取一个字符,但不显示在屏幕上
}
}
else
{
printf("该班车已发出,无法退票!\n");
getch(); /////从控制台读取一个字符,但不显示在屏幕上
}
if(i==class_num)
{ printf("输入错误!\n");
getch(); /////从控制台读取一个字符,但不显示在屏幕上
}
}
}
/********************************修改函数*********************************/
void change() //修改函数**
{
char num[10],s[10];
int h=0,j=13,i;
load(); // 调用按班次查询函数
system("cls"); //刷屏
printf("请输入要修改的班次:\n");
scanf("%s",num);
i=findnum(num); //调用班次查询函数
if(i==class_num)
{
printf("输入错误,无此班次!\n");
getch(); ///从控制台读取一个字符,但不显示在屏幕上
}
else
{
printf("确定修改(Y/N)?\n");
scanf("%s",s);
if(s[0]=='y'||s[0]=='Y')
{
get(i,j); ////修改及增加班次*
save(); //调用保存函数
}
}
}
/*******************************删除函数**********************************/
void deletemessage() //删除班次信息
{
int i,h=0;
char num[10];
system("cls"); //刷屏
printf("1. 删除班次\n");
printf("2. 返回\n");
printf("请选择(1-2):\n");
scanf("%d",&i);
if(i==1)
{
system("cls"); //刷屏
printf("请输入要删除的班次:\n");
scanf("%s",num);
i=findnum(num); //调用班次查询函数
if(i==class_num)
{
printf("输入错误,无此班次!\n");
getch(); ///从控制台读取一个字符,但不显示在屏幕上
}
else
{
printf("确定?(y/n)\n");
scanf("%s",num);
if(num[0]=='y'||num[0]=='Y')
{
for(;i<class_num-1;i++)
records[i]=records[i+1];
class_num--; ////班次总数减1
save(); //调用保存函数
printf("删除成功!\n");
getch();
}
}
}
}
/****************************按班次查询函数****************************/
int findnum(char s1[]) //查找班次
{
int i,h=0;
ShowTable1(); //线框调用1,,,不用没次输
for(i=0;i<class_num;i++)
{
if(strcmp(s1,records[i].num)==0) //判断字符串比较是否相等,如果符合则输出车次等信息
{
printf("|----------|----------|----------|----------|--------|--------|--------|\n");
printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,
records[i].min,records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);
h+=2; ///加2使输出的框架合适
break;
}
}
ShowTable2(h); ///调用框架2
return i;
}
/**************************************保存函数*******************************/
void save() //////保存函数
{
FILE *fp1,*fp2; //文件行指针
if((fp1=fopen("d:车票管理系统.dat","wb"))==NULL) //打开文件、为输出打开一个二进制文件
{
printf("文件打开错误!\n");
exit(0);
}
if((fp2=fopen("d:车票管理系统0.dat","wb"))==NULL) //打开文件、为输出打开一个二进制文件
{
printf("文件打开错误!\n");
exit(0);
}
fwrite(&class_num,sizeof(int),1,fp2); //写入文件信息
fwrite(records,sizeof(CLASS),class_num,fp1);
fclose(fp1);fclose(fp2); ///关闭文件
}
/*******************************按班次查询函数*******************************/
void load() //按班次查询函数
{
FILE *fp1,*fp2;
if((fp1=fopen("d:车票管理系统.dat","rb"))==NULL)
{
system("cls"); //刷屏
printf("文件打开错误!\n");
getch(); ///从控制台读取一个字符,但不显示在屏幕上
exit(0);
}
if((fp2=fopen("d:车票管理系统0.dat","rb"))==NULL)
{
system("cls"); //刷屏
printf("文件打开错误!\n");
getch(); ///从控制台读取一个字符,但不显示在屏幕上
exit(0); //退出
}
fread(&class_num,sizeof(int),1,fp2); ///读入信息
fread(records,sizeof(CLASS),class_num,fp1);/////读入信息
fclose(fp1);fclose(fp2); ///文件关闭
}
/******************************退出函数***************************/
void quit() //退出函数******
{
char s[5];
printf("确认退出?(Y/N)\n");
scanf("%s",s);
if(s[0]=='y'||s[0]=='Y')
exit(0); //程序中止执行,返回调用过程..state 0-正常中止非0-非正常
}
/*************************修改及增加班次*******************************/
void get(int i,int j) // 修改及增加班次*
{
for(;;)
{
printf("请输入发车时间(xx xx)");scanf("%s%s",records[i].hour,records[i].min);
if((atoi(records[i].hour)<24&&atoi(records[i].hour)>=0)&&(atoi(records[i].min)<60&&atoi(records[i].min)>=0))
break;
else
{
printf("输入错误!\n");
getch(); /////从控制台读取一个字符,但不显示在屏幕上
}
}
printf("请输入起点站:\n");
scanf("%s",records[i].from);
printf("请输入终点站:\n");
scanf("%s",records[i].to);
printf("请输入行车时间:\n");
scanf("%f",&records[i].hours);
printf("请输入额定载量:\n");
scanf("%d",&records[i].max);
for(;;)
{
printf("请输入已售票数:\n");
scanf("%d",&records[i].now);
if(records[i].now<=records[i].max)
break;
else
{
printf("输入错误!\n");
getch(); /////从控制台读取一个字符,但不显示在屏幕上
}
}
}
/********************************判断时间是否超出函数**********************************/
int whether(int i) //判断时间是否超出函数***
{
struct tm *local; //时间结构体
time_t t; //把当前时间给t
t=time(NULL); //NULL在stdio.h中定义为0
local=localtime(&t); /////获取当前系统时间
if(local->tm_hour<atoi(records[i].hour)||local->tm_hour==atoi(records[i].hour)&&local->tm_min<atoi(records[i].min))
//atoi将字符串转换成一个整数值
return 1;
else
return 0;
}
,
目录
一、课程概述…………………………………………………………1
二、总体设计…………………………………………………………1
三、详细设计…………………………………………………………3
四、程序测试…………………………………………………………3
五、课程总结…………………………………………………………9
六、源程序……………………………………………………………10
一.系统概述
车票管理系统功能概述
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据
(2)浏览班次信息,可显示出所有班次当前状总(如果当前系统时间超过了某班次的发车时间,则显示“此班已发出”的提示信息)。
(3)查询路线(起点、终点):可按班次号查询 ,可按终点站查询
(4)增加及修改班次和删除班次信息
(5)售票和退票功能
当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新已售票人数,退票时,输入退票的班次,当本班车未发出时才能退票,自动更新已售票人数
二.车票管理系统总体设计
1.车票管理系统总体设计思想
车票管理系统的功能为1.录入班次;2.显示所有班次;3.查询班次;4.增加班次;5.售票;6.退票;7.修改班次;8.删除班次;9.退出。
车票管理系统软件的功能模块有:
(1)提供菜单界面,方便用户对程序个功能进行选择,选择要实现的功能按enter键进入该功能。
(2)接受用户输入的功能项,按enter键结束输入并将进入该系统,其需要的结果显示出来,方便用户查看。
(3)完成每次功能,可保存用户的修改的信息,及时更新文件信息。下次查询时内容为最新信息。实时的信息更新对比等。
2.总体设计流程图
三.车票管理系统软件详细设计
一个名TICKET的结构体进行定义,包括num[10] hour[3]; min[3] from[10]; to[10]; hours max; now;等结构体成员。
然后对调用函数进行定义。int system_time()系统时间,void NewMessage() 新纪录录入函数,void ShowTable1() void ShowTable2(int i) 线框调用1和2不用没次输,void Display()显示所有函数,void add()增加记录,void save() 保存函数,void save()保存函数,void load() 按班次查询函数,void search() 查询函数,void change()修改函数,void quit()退出函数,void Ticketorder() 售票函数,void Ticketdelete()删除函数,int menu_select()菜单函数, int whether(int)判断时间是否超出函数,void find(char s1[],char s2[]) 查询函数★//s1为班次//s2为终点站,void deletemessage()删除函数,int findnum(char s1[])班次查询函数,void get(int,int)修改及增加班次,char *menu[]菜单函数。
该系统将这些信息均放在文件d:车票管理系统0中。
最后定义main()函数,利用函数调用,实现程序的各种功能。将其放在系统文件d:车票管理系统0中。
四.程序测试
菜单界面
![](/UploadFiles/20240614082531854034.jpg)
菜单界面
如上图所示,该程序为用户提供菜单界面,用户可以对程序的各种功能进行选择,方便用户使用。选择1-9并按enter键进行操作。如选择出错,系统将提出警告,并提醒用户重新进行选择。
录入班次界面
![](/UploadFiles/20240614082531166035.jpg)
第一次输入时的界面
![](/UploadFiles/20240614082531703036.jpg)
第二次输入时的界面
如上图所示,该功能实现录入班次信息。选择1按enter键进入该功能,程序提醒用户输入车次.发车时间.起始站.终点站.行车时间.额定载量.已售票数,输入完毕后按enter键将完成录入班次结果,同时程序将再次提醒用户进行新的选择。而第二次输入时提醒已经输过,不能在加。
查询所有班次界面
![](/UploadFiles/20240614082532661037.jpg)
字符串重新统计界面
如上图所示,该功能实现显示所有班次。选择2按enter键进入该功能,程序提直接显示出信息,按enter键,程序进入菜单项,程序将再次提醒用户进行新的选择。
查询班次界面
![](/UploadFiles/20240614082532469038.jpg)
查询班次界面
![](/UploadFiles/20240614082532521039.jpg)
选择查询方式的界面
如上图所示,该功能将实现程序运行班次的查询。选择3并按enter键将实现该功能。分班次和终点站两种方式查询。
增加班次界面
![](/UploadFiles/20240614082532819040.jpg)
增加功能界面
![](/UploadFiles/20240614082533679041.jpg)
增加前界面
![](/UploadFiles/20240614082533124042.jpg)
增加后界面
如上图所示,该功能将增加班次信息,帮助用户更新班次信息。选择4并按enter键将实现该功能,再按提示输入就行。按任意键返回主菜单。
售票界面
![](/UploadFiles/20240614082533280043.jpg)
选择售票功能界面
![](/UploadFiles/20240614082533837044.jpg)
选择后的界面
![](/UploadFiles/20240614082533603045.jpg)
订票时的界面
如上图所示,该功能将帮助人们选择买票。选择5按enter键实现该功能,按任意键关闭程序。买票程序可提示买票成功否,且自动判断是否可卖。
退票界面
![](/UploadFiles/20240614082534559046.jpg)
退票时的界面
如上图所示,该功能将帮助人们选择退票。选择6按enter键实现该功能,按任意键关闭程序。退票程序可提示退票成功否,且自动判断是否可退。
修改班次界面
![](/UploadFiles/20240614082534664047.jpg)
修改班次时的界面
如上图所示,该功能将帮助人们修改班次信息。选择7按enter键实现该功能,按任意键关闭程序。按提示操作修改班次。
删除班次界面
![](/UploadFiles/20240614082534626048.jpg)
删除班次时的界面
如上图所示,该功能可删除班次信息。选择8按enter键实现该功能,按任意键关闭程序。按提示操作删除班次。
![](/UploadFiles/20240614082534353049.jpg)
退出时的界面
如上图所示,该功能可退出系统。选择9按enter键实现该功能。
五.课程设计总结
为了提高我们的实践能力和合作能力,让我们学以致用,能灵活运用所学的知识进行再创造,学校特安排我们进行为期一周的C语言课程设计实习,并安排了专门的指导老师帮助辅导,让我们在规范化、严谨化、实用化上面有了很大进展。为今后的工作适应环境。
在此次车票管理系统开发过程中,有很多东西值得我们思考并总结。
开发过程大体可分为以下几个步骤:
(1)思考总体设计方案:总体结构和模块外部设计,功能分配。思考要实现整个程序大体需要的几个模块和其中用到的 C语言基本操作符、语句格式等。
(2)画出总体设计方案流程图:用流程图的形式展现你的基本编程思想。
(3)流程图具体化:即将流程图中的几大模块的具体实现思考清楚,可以用流程图的形式展现.并想好实现的关键代码框架。
(4)编辑程序代码:这是一个至关重要复杂而且需要反复修改的环节,在此环节中你将发现总体设计和模块思想会存在很多问题,需不断改进.如何实现各函数功能,达到预期效果也将是一项繁复的工作。
(5)代码的调试:在Visual C++6.0环境下输入代码并进行调试和正确运行。在调试过程中会遇到很多需要精化的地方,需要十足的耐心与细心,不断改进完善程序。
(6)最后修饰:程序可以正确运行之后,再不影响程序功能的情况下,运用各种辅助性符号,使界面更加美观漂亮,操作更人性化.增强程序的新意与可行性。
通过这次课程设计,使我们更加熟悉的掌握了C语言的运用。帮助我们熟悉了更多C语言的功能,提高了我们的动手能力,学到了许多解决实际问题的宝贵经验.同时也挖掘出了我们潜在的能力,使我们对自己更有自信,对编程也更有兴趣。我相信,只要努力、勤奋、坚持不懈,就没有什么做不到的事,不能还没开始就退缩,要勇于拼搏,敢于创新。
六.附录源程序
#include<stdio.h> ///宏定义函数
#include<string.h> //串操作及内存操作函数
#include<stdlib.h> /////调用系统函数
#include<time.h> ///时间库函数
#include<conio.h> ///输入输出函数
#define N 1000 //宏定义多条记录
typedef struct TICKET ////定义新结构体TICKET
{
char num[10]; //车次编号
char hour[3]; //时间,,小时
char min[3]; //分钟
char from[10]; //起始站
char to[10]; //终点站
float hours; //车程实际时间
int max; //最大车载容量
int now; //已售票数
}CLASS;
int class_num=0; ///初始班次总数为0
CLASS records[N]; // 多条记录
int system_time(); //系统时间
void NewMessage(); //新纪录*录入函数******
void ShowTable1(); //线框调用1,,,不用没次输
void ShowTable2(int i); //线框调用2,,,不用没次输
void Display(); //显示所有函数
void add(); //增加记录
void save(); // 保存函数
void load(); // 按班次查询函数
void search(); //查询函数
void change(); //修改函数**
void quit(); ////////// //退出函数******
void Ticketorder(); // //*售票函数***
void Ticketdelete(); //删除函数*
int menu_select(); //菜单函数*
int whether(int); ////判断时间是否超出函数***
void find(char s1[],char s2[]); //查询函数★//s1为班次//s2为终点站
void deletemessage(); //删除函数
int findnum(char s1[]); //班次查询函数
void get(int,int); //修改及增加班次*
char *menu[]={"*****************欢迎使用车票查询系统*****************",
"\n*******************MENU功能菜单***********************",
"\n◤ ★ 1. 录入班次 ◥",
"\n◆ ★ 2. 显示所有班次 ◆",
"\n◆ ★ 3. 查询班次 ◆",
"\n◆ ★ 4. 增加班次 ◆",
"\n◆ ★ 5. 售票 ◆",
"\n◆ ★ 6. 退票 ◆",
"\n◆ ★ 7. 修改班次 ◆",
"\n◆ ★ 8. 删除班次 ◆",
"\n◣ ★ 9. 退出 ◢"};
/**************************主函数***************************/
void main()
{
system("cls"); //刷屏
while(1) //菜单函数循环
{
switch(menu_select()) //菜单函数*
{
case 1: NewMessage();break; ////新纪录*录入函数******
case 2: Display();break; // //显示
case 3: search();break; //查找函数**
case 4: add();break; // //增加记录
case 5: Ticketorder();break; ////*售票函数***
case 6: Ticketdelete();break; //删除函数*
case 7: change();break; //修改函数**
case 8: deletemessage();break; //////选择调用删除函数
case 9: quit();break; //////退出函数******
}
}
}
/***********************菜单函数**************************/
int menu_select() /////////菜单函数*
{
char s[5]; ///定义要输入的数字功能
int c,i;
system("cls"); //刷屏
system("color 09");//改变颜色
for(i=0;i<11;i++)
{
printf("%s",menu[i]); //输出菜单各项)
}
i=0;
while(c<0||c>9) //判断是否是1到9的命令
{
printf("\n"); ///输出换行
printf("******************************************************");
printf("\n请选择(1-9):▁▂▃▄▆▇");
scanf("%s",s);
c=atoi(s); //atoi将字符串转换成一个整数值
} ///输出菜单面
return c; ////返回请求
}
/*******************************录入函数************************************/
void NewMessage() //*录入函数******
{
int i=0,j=5,h; ////
char s[5];
FILE *fp; ////定义文件型指针变量
system("cls"); //刷屏
if((fp=fopen("d:车票管理系统0.dat","rb"))!=NULL) //fopen打开文件
{
printf("车票信息已经存在请选择增加功能!\n");
printf("任意输入则返回菜单\n");
scanf("%s",s);
i=1; //通过是1
}
if(i==0)
{
system("cls"); //刷屏
printf("请输入要录入班次总数:\n");
scanf("%d",&class_num); //指向班次指针
system("cls"); //刷屏
for(i=0;i<class_num;i++)
{
system("cls"); //刷屏
printf("请输入第%d个班次信息:\n",i+1);
h=-1;
for(;h!=i;) ///循环输出
{
printf("请输入班次:\n");
scanf("%s",records[i].num);
for(h=0;h<i;h++)
if(strcmp(records[h].num,records[i].num)==0)
//判断字符串比较是否相等,, 待比较的字符串
{
printf("输入错误!该班次已存在!\n");
break; ///返回
}
}
get(i,j); ////修改及增加班次*
j=5;
}
save(); //调用保存函数
}
}
/*******************************显示所有函数********************************/
void Display() //显示所有函数
{
int i,j;
system("cls"); //刷屏
load(); // 调用按班次查询函数
ShowTable1(); //线框调用1,,,不用没次输
for(i=0,j=0;i<class_num;i++,j+=2) /////按班次顺序输出
{
printf("\n|----------|----------|----------|----------|--------|--------|--------|\n");
if(whether(i)) //判断时间是否超出函数***
printf("|%10s|%5s:%-4s|%10s|%10s|%8.1f|%8d|%8d|",records[i].num,records[i].hour,
records[i].min, records[i].from,records[i].to,records[i].hours,
records[i].max,records[i].now);
else
printf("|%10s| 已发车 |%10s|%10s|%8.1f|%8d|%8d|",records[i].num,
records[i].from,records[i].to,records[i].hours,records[i].max,records[i].now);
}
ShowTable2(j); //线框调用2
printf("\n按任意键继续....\n");
getch(); /////从控制台读取一个字符,但不显示在屏幕上
}
/**********************************打印表头***********************************************/
void ShowTable1() //线框调用1,,,不用没次输
{
int i=2;
system("cls"); //刷屏
printf("**************************MESSAGE车程信息**********************