学习过C语言之后,第一次完成这样较大规模的程序,程序仍有许多不完美的地方。
该火车票务系统有两个操作身份可供选择:管理员和乘客。管理员有更新、添加、删除、修改列车信息以及指定可休假车长的功能;乘客可以查看列车信息、买票、退票。管理员和乘客均具有登录功能,但只有乘客可实现注册。
整个程序数据信息的存储基本上全部使用文件完成,利用文件的读取完成大部分功能。为了体现链表的使用,特意在管理员指定可休假车长的功能运用了链表的创建、删除,将链表与文件结合使用。
在信息数据处理方面,很好的把乘客购票情况与管理员对列车信息操作后的全新的列车情况进行关联,模拟现实中火车票务系统的实时购票、退票、查看功能。
为了使界面更美观,更改了控制台及字体的颜色。
本人能力有限,程序中还有一些地方考虑的不周全,希望大家看过之后,能给出宝贵的意见。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <windows.h>
#define SIZE1 10 //原始列车信息总数
#define SIZE2 20 //添加列车信息可用的总数
#define SIZE3 5 //原始管理员及已注册乘客的数量
#define LEN sizeof(struct Mem3)
#define COLOR1 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),\
4|FOREGROUND_INTENSITY|BACKGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_RED) //输出红色字体
#define COLOR2 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),\
0|BACKGROUND_GREEN|BACKGROUND_BLUE|BACKGROUND_RED) //恢复原来的屏幕颜色
int count=0; //定义全局变量,用于记录增加的列车信息数量
int more=0; //定义全局变量,用于记录注册乘客的数量
char name1[10]; //定义全局变量,记录乘客账户名
int xy; //定义全局变量,记录乘客购票数量
struct Mem1 //管理员信息结构体
{
char name1[10]; //管理员名单
long int num1; //管理员密码
}mem1[SIZE3];
struct Mem2 //乘客信息结构体
{
char name2[10]; //乘客账号名
long int num2; //乘客密码
int num[SIZE3]; //乘客购买车票的班次号
}mem2[SIZE1];
struct Line
{
int num1; //班次
int time; //发车时间
char sta1[10]; //起点站
char sta2[10]; //终点站
double num2; //行车时间
int max; //额定数量
int real; //已订票人数
int price; //票价
}line[SIZE2];
struct Mem3
{
char name3[10];
int num3;
char sex[2];
struct Mem3 *next;
};
struct Mem3 *creat(void); //建立车长信息链表
void print(struct Mem3 *head); //用链表打印车长信息函数
struct Mem3 *dellian(struct Mem3 *head, int num); //用链表删除车长信息
void tian(); //乘客注册函数
void menu1 (); //主菜单函数
void menu2 (); //管理员菜单
void menu3 (); //乘客选择菜单
void login1 (); //管理员登录
void login2 (); //乘客登录函数
void choice1 (); //选择返回函数
void choice2 (); //选择管理员再操作函数
void choice3(); //选择用户再操作函数
void choice4 (); //用户查看信息后选择操作函数
void save (); //更新函数
void print(); //输出函数
void printtime(); //乘客可见输出函数
void change (); //修改函数
void add (); //增加函数
void del (); //删除函数
void look1 (); //发车时间函数
void look2 (); //班次号函数
void look3 (); //已购人数函数
void seek1 (); //班次号查询函数
void seek2 (); //终点站查询函数
void seek3 (); //可购票查询函数
void buy (); //购票系统函数
void deny (); //退票函数
void choice1 () //选择返回主菜单函数
{
int i;
printf("是否回到主菜单?是 1;\t否 0\t");
scanf("%d",&i);
system("cls"); //清屏
switch (i)
{
case 1: //返回主菜单
menu1();
break;
case 0: //退出系统
printf("成功退出系统!!\n");
exit(0);
break;
default: //提示出错
COLOR1;
printf("出错!!!!\n");
COLOR2;
exit(0);
}
}
void choice2 () //选择管理员再操作函数
{
int i;
printf("\n\n\n对于以上信息,您的选择是:\n1、确认无误\n2、修改\n3、增加\n4、删除\n");
printf("我的选择是:");
scanf("%d",&i);
system("cls"); //清屏
switch (i) //对应管理员操作选择
{
case 1:
choice1(); //无误可退出或返回主菜单
break;
case 2:
change(); //调用修改函数
system("cls"); //清屏
printf("修改后的总信息表如下:\n");
print();
choice2();
break;
case 3:
add(); //调用增加函数
system("cls"); //清屏
printf("添加后的总信息表如下:\n");
print();
choice2();
break;
case 4:
del(); //调用删除函数
//system("cls"); //清屏
printf("删除后的总信息表如下:\n");
print();
choice2();
break;
default:
COLOR1;
printf("出错!!!!\n\n\n\n\n");
COLOR2;
choice1();
}
}
void choice3() //选择用户再操作函数
{
int i;
printf("\n\n\n是否继续进行操作?是 1;\t否 0;\n");
printf("我的选择是:");
scanf("%d",&i);
system("cls"); //清屏
switch (i)
{
case 1:
menu3();
break;
case 0:
printf("成功退出系统!!!\n");
exit(0);
default :
COLOR1;
printf("出错!!!!\n\n\n\n");
COLOR2;
choice1();
}
}
void choice4 () //用户查看信息后选择操作函数
{
int i;
printf("\n\n请选择下一步操作:\n1、购票\n2、退票\n3、返回上一级目录\n0、退出\n");
printf("\n\n我的选择是:");
scanf("%d",&i);
system("cls"); //清屏
switch (i)
{
case 1:
buy();
break;
case 2:
deny();
break;
case 3:
menu3();
break;
case 0:
printf("成功退出!!!!\n\n");
exit(0);
break;
default :
COLOR1;
printf("出错!!!!!\n\n");
COLOR2;
exit(0);
}
}
void login1 () //管理员登录
{
FILE *fp;
int i,flag=0,j=1,n=0; //flag用于判断 ,j用于记录决定,n用于记录身份编号
char name[10];
long int num; //临时存储输入的密码
int m=0;
if((fp=fopen("memory1.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
} //打开管理员信息文件
for (i=0;i<SIZE3;i++){
fread(&mem1[i],sizeof(struct Mem1),1,fp);
}
printf("请输入您的账号:");
scanf("%s",name);
for(i=0;i<SIZE3;i++){
if(strcmp(name,mem1[i].name1)==0){
flag=1;
n=i;
}
}
if (flag==1){
for (i=1;i<=3;i++){
printf("\n\n请输入您的密码:");
scanf("%ld",&num);
if(num==mem1[n].num1){
m=1;
system("cls"); //清屏
menu2(); //进入管理员菜单
}
if(m==0){
COLOR1;
printf("密码错误!!\n\n还有%d次输入机会!!\n\n",3-i);
COLOR2;
if(i==3){
break;
}
printf("是否重新输入?\t是 1;\t否 0;");
scanf("%d",&j);
system("cls"); //清屏
if(j==0){
choice1();
}
}
}
if(m==0){
COLOR1;
printf("三次输入错误密码,无法进入系统!!!\n\n");
COLOR2;
choice1();
}
}
if(flag==0){
COLOR1;
printf("\n\n\n您不是该系统的管理员!!\n\n\n");
COLOR2;
choice1();
}
fclose(fp); //关闭文件
}
void login2 () //乘客登录函数
{
FILE *fp;
int i,flag=0,j=1,n=0; //flag用于判断 ,j用于记录决定,n用于记录身份编号
int dec=0; //用于记录选择
long int num; //临时存储输入的密码
//int m=0; //用于记录输入的密码是否正确
if((fp=fopen("memory2.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
} //打开乘客信息文件
for (i=0;i<SIZE3;i++){
fread(&mem2[i],sizeof(struct Mem2),1,fp);
}
printf("请输入您的账号:");
scanf("%s",name1);
for(i=0;i<SIZE3;i++){
if(strcmp(name1,mem2[i].name2)==0){
flag=1;
n=i;
}
}
if (flag==1){
for (i=1;i<=3;i++){
printf("\n\n请输入您的密码:");
scanf("%ld",&num);
if(num==mem2[n].num2){
flag=2;
//m=1;
system("cls"); //清屏
menu3(); //进入乘客菜单
}
if(flag!=2){
COLOR1;
printf("密码错误!!\n\n还有%d次输入机会!!\n\n",3-i);
COLOR2;
if(i==3){
break;
}
printf("是否重新输入?\t是 1;\t否 0;");
scanf("%d",&j);
system("cls"); //清屏
if(j==0){
choice1();
}
}
}
if(flag!=2&&j!=0){
COLOR1;
printf("三次输入错误密码,无法进入系统!!!\n\n");
COLOR2;
choice1();
}
}
if(flag==0){
printf("\n\n\n您不是已注册的乘客!!\n");
printf("\n\n\n是否选择注册?是 1;\t否 0;\n");
printf("我的选择是:");
scanf("%d",&dec);
system("cls");
if(dec==0){
system("cls"); //清屏
choice1();
}
else {
tian(); //调用用户注册函数
}
}
fclose(fp); //关闭文件
}
void tian () //乘客注册函数
{
FILE *fp;
Mem2 temp; //临时结构体变量,用于存储添加用户的信息
int i=1,j;
if ((fp=fopen("memory2.txt","ab"))==NULL){
printf("cannot open file\n");
return;
} //打开原有文件用于追加列车信息
printf("请输入您的账户名:");
scanf("%s",temp.name2);
printf("请输入您的密码:");
scanf("%ld",&temp.num2);
for(i=0;i<SIZE3;i++){
temp.num[i]=0;
}
strcpy(name1,temp.name2); //记录进入系统的乘客账号名
more++;
if(more>SIZE1-SIZE3) {
printf("\n\n\n已超过额定数量,无法继续添加!\n");
}
if (fwrite(&temp,sizeof(struct Mem2),1,fp)!=1){
printf("file write error\n");
} //将添加的信息追加到原来的文件中
fclose(fp);
printf("\n\n\n注册成功!!!\n");
menu3(); //可进入乘客菜单
}
void menu1 () //主菜单函数
{
printf("\t\t\t\t\t/**********欢迎来到票务系统**********/\n");
printf("\t\t\t\t\t请选择身份:\n");
printf("\t\t\t\t\t1、管理员\n\t\t\t\t\t2、乘客\n\t\t\t\t\t0、退出系统\n");
int n; //任意数,用于各项选择时使用
printf("我的身份是:");
scanf("%d",&n);
system("cls"); //清屏
switch (n) //身份选择后,可进入不同的菜单界面
{
case 1:
login1(); //管理员登录
break;
case 2:
login2(); //用户登录或注册
break;
case 0: //退出系统
printf("已成功退出系统!\n");
exit(0);
break;
default: //报错
printf("出错!!!!\n");
exit(0);
}
}
void menu2 () //管理员菜单
{
int i; //用于记录管理员选择
printf("\t\t\t\t\t/**********欢迎来到管理员系统**********/\n");
printf("\t\t\t\t\t请选择您要进行的操作:\n");
printf("\t\t\t\t\t1、查看所有列车信息\n\t\t\t\t\t2、更新所有列车时刻表\n\t\t\t\t\t3、添加列车信息\n\t\t\t\t\t4、删除列车信息\n\t\t\t\t\t5、修改列车信息\n\t\t\t\t\t6、指定休假车长\n\t\t\t\t\t0、退出系统\n");
printf("我的选择是:");
scanf("%d",&i);
system("cls"); //清屏
switch (i)
{
case 1:
printf("基本列车信息如下:\n");
print();
choice2();
break;
case 2:
save(); //调用更新函数
system("cls"); //清屏
printf("您已输入的信息如下:\n");
print();
choice2();
break;
case 3:
add(); //调用添加函数
system("cls"); //清屏
printf("添加后的总信息表如下:\n");
print();
choice2();
break;
case 4:
del(); //调用删除函数
system("cls"); //清屏
printf("删除后的总信息表如下:\n");
print();
choice2();
break;
case 5:
change();
system("pause"); //清屏
printf("修改后的总信息表如下:\n");
print();
choice2();
break;
case 6:
struct Mem3 *head;
int num;
printf("在职车长信息如下\n");
head=creat();
print(head);
printf("请输入要休假的车长序号(按0结束):");
scanf("%d",&num);
while (num != 0) {
head = dellian(head,num);
printf("仍在职的车长信息为:\n");
print(head);
printf("请输入要休假的车长序号(按0结束):");
scanf("%d", &num);
}
choice1();
break;
case 0:
system("cls"); //清屏
printf("成功退出系统!!\n");
exit(0);
default :
printf("出错!!!!\n");
choice1();
}
}
void menu3 () //乘客菜单
{
int i; //用于记录乘客选择
printf("\t\t\t\t\t/**********欢迎来到乘客票务系统**********/\n");
printf("\t\t\t\t\t请选择您要进行的操作:\n");
printf("\t\t\t\t\t1、查看所有列车时刻表\n\t\t\t\t\t2、查看指定列车信息\n\t\t\t\t\t3、购票\n\t\t\t\t\t4、退票\n\t\t\t\t\t0、退出\n");
printf("我的选择是:");
scanf("%d",&i);
system("cls"); //清屏
switch (i)
{
case 1:
printf("请选择您要查看的方式:\n按发车时间 1;\t按班次号 2;\t按已购人数 3;\n");
printf("我的选择是:");
scanf("%d",&i);
switch (i)
{
case 1:
look1(); //调用发车时间函数
break;
case 2:
look2(); //调用票价函数
break;
case 3:
look3(); //调用已购人数函数
break;
default :
COLOR1;
printf("出错!!!!\n");
COLOR2;
choice1();
}
case 2:
printf("请选择您的查找方式:\n按班次号 1;\t按终点站 2;\t按可购票 3;\n");
printf("我的选择是:");
scanf("%d",&i);
switch(i)
{
case 1:
seek1(); //调用班次号查询函数
break;
case 2:
seek2(); //调用终点站查询函数
break;
case 3:
seek3(); //调用可购票查询函数
break;
default :
COLOR1;
printf("出错!!!!\n");
COLOR2;
choice1();
}
case 3:
buy(); //调用购票函数
break;
case 4:
deny(); //调用退票函数
break;
case 0:
printf("成功退出系统!!!\n");
exit(0);
default :
COLOR1;
printf("出错!!!!\n");
COLOR2;
choice1();
}
}
void save () //更新函数
{
FILE *fp;
int i;
if ((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
return;
} //创建并打开一个文件用于存储原始的列车信息
printf("请输入列车信息(10个):\n");
for (i=0;i<SIZE1+count;i++){
scanf("%d%d%s%s%lf%d%d%d",&line[i].num1,&line[i].time,line[i].sta1,\
line[i].sta2,&line[i].num2,&line[i].max,&line[i].real,&line[i].price);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&line[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
} //信息被写入文件
fclose(fp); //关闭文件
}
void print() //管理员可见输出函数
{
FILE *fp;
int i;
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
} //打开数据文件
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[i].num1,line[i].time,\
line[i].sta1,line[i].sta2,line[i].num2,line[i].max,line[i].real,line[i].price);
printf("\n");
}
fclose(fp); //关闭文件
}
void printtime() //乘客可见输出函数
{
time_t t;
struct tm *lt;
time(&t);
lt=localtime(&t);
FILE *fp;
int i;
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
} //打开数据文件
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
for (i=0;i<SIZE1+count;i++){
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[i].num1,line[i].time,\
line[i].sta1,line[i].sta2,line[i].num2,line[i].max,line[i].real,line[i].price);
if(lt->tm_hour>=line[i].time){
printf(" 此车已开走!");
}
printf("\n");
}
fclose(fp);
}
void change () //修改函数
{
FILE *fp;
int i,n=0; //n用于记录要修改的班次号
int flag,m;
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
printf("请输入您要修改列车的班次号:");
scanf("%d",&n);
flag=0;
for(i=0;i<SIZE1+count;i++){
if(n==line[i].num1){
flag=1;
}
}
if (flag==0){
COLOR1;
printf("没有该班次列车!!无法修改!!\n\n");
COLOR2;
printf("请选择下一步操作:\n1、继续修改\n2、返回菜单\n0、退出\n");
printf("我的选择是:");
scanf("%d",&m);
system("cls"); //清屏
switch(m)
{
case 1:
change();
system("cls");
printf("修改后的总信息表如下:\n");
print();
choice2();
break;
case 2:
menu2();
break;
case 0:
printf("成功退出!!!\n\n\n");
exit(0);
break;
default:
printf("出错!!!!\n\n\n");
exit(0);
}
}
for (i=0;i<SIZE1+count;i++){
if(line[i].num1==n){
printf("\n\n\n请重新输入列车相关信息:\n");
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
scanf("%d%d%s%s%lf%d%d%d",&line[i].num1,&line[i].time,line[i].sta1,\
line[i].sta2,&line[i].num2,&line[i].max,&line[i].real,&line[i].price);
}
} //先修改原来的信息
fclose(fp);
if((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&line[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
}
void add () //增加函数
{
FILE *fp;
int i=1,j;
int num; //用于记录添加的列车班次号
int flag=0,m;
if ((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
return;
} //打开原有文件用于追加列车信息
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
printf("请输入您要添加的列车班次号:");
scanf("%d",&num);
for(i=0;i<SIZE1+count;i++){
if(num==line[i].num1){
flag=1;
}
}
if (flag==1){
COLOR1;
printf("已有该班次列车!!无法添加!!\n\n");
COLOR2;
printf("请选择下一步操作:\n1、继续添加\n2、返回菜单\n0、退出\n");
printf("我的选择是:");
scanf("%d",&m);
system("cls"); //清屏
switch(m)
{
case 1:
add();
system("cls");
printf("添加后的总信息表如下:\n");
print();
choice2();
break;
case 2:
menu2();
break;
case 0:
printf("成功退出!!!\n\n\n");
exit(0);
break;
default:
printf("出错!!!!\n\n\n");
exit(0);
}
}
while(count<=SIZE2-SIZE1){
//if (i!=0){
printf("\n\n\n请输入要添加列车的相关信息:\n");
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
scanf("%d%d%s%s%lf%d%d%d",&line[SIZE1+count].num1,&line[SIZE1+count].time,line[SIZE1+count].sta1,line[SIZE1+count].sta2,\
&line[SIZE1+count].num2,&line[SIZE1+count].max,&line[SIZE1+count].real,&line[SIZE1+count].price);
//printf("\n\n\n是否继续添加?是 1;\t否 0;");
//scanf("%d",&i);
count++;
break;
//}
//else {
//break;
//}
}
if(count>SIZE2-SIZE1) {
printf("已超过额定数量,无法继续添加!\n");
}
fclose(fp);
if((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&line[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
}
void del () //删除函数
{
FILE *fp;
Line temp[SIZE1+count]; //临时存储剩余信息
int i=1,n=0,num=0,max=SIZE1+count;
int j=1,k;
int flag;
int m; //用于记录管理员选择
if ((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
return;
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
fclose(fp);
if ((fp=fopen("memory2.txt","rb"))==NULL){
printf("cannot open file\n");
return;
}
for (i=0;i<SIZE3+more;i++){
fread(&mem2[i],sizeof(struct Mem2),1,fp);
}
fclose(fp);
flag=0;
printf("请输入要删除的班次号:");
scanf("%d",&num);
for(i=0;i<SIZE1+count;i++){
if(num==line[i].num1){
flag=1;
}
}
if (flag==0){
COLOR1;
printf("没有该班次列车!!无法删除!!\n\n");
COLOR2;
printf("请选择下一步操作:\n1、继续删除\n2、返回菜单\n0、退出\n");
printf("我的选择是:");
scanf("%d",&m);
system("cls"); //清屏
switch(m)
{
case 1:
del();
system("cls"); //清屏
printf("删除后的总信息表如下:\n");
print();
choice2();
break;
case 2:
menu2();
break;
case 0:
printf("成功退出!!!\n\n\n");
exit(0);
break;
default:
printf("出错!!!!\n\n\n");
exit(0);
}
}
for (i=0;i<SIZE1+count;i++){
if(line[i].num1!=num){ //存储剩余班次信息
//printf("%d\n\n\n",i);
temp[n].num1=line[i].num1;
temp[n].num2=line[i].num2;
temp[n].time=line[i].time;
strcpy(temp[n].sta1,line[i].sta1);
strcpy(temp[n].sta2,line[i].sta2);
temp[n].max=line[i].max;
temp[n].real=line[i].real;
temp[n].price=line[i].price;
n++;
}
}
for (i=0;i<SIZE3+more;i++){
for (j=0;j<SIZE3;j++){
if (num==mem2[i].num[j]){
mem2[i].num[j]=0;
}
}
}
Mem2 camp;
for(k=0;k<SIZE3+more;k++){
for (i=0;i<SIZE3;i++){
for (j=0;j<SIZE3-i-1;j++){
if (mem2[k].num[j]<mem2[k].num[j+1]){
camp.num[0]=mem2[k].num[j];
mem2[k].num[j]=mem2[k].num[j+1];
mem2[k].num[j+1]=camp.num[0];
}
}
}
}
if((fp=fopen("memory2.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE3+more;i++){
if (fwrite(&mem2[i],sizeof(struct Mem2),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
SIZE1+count--;
if (n==max){
printf("已没有数据可以再删除!!\n");
}
if((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&temp[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
}
void look1 () //发车时间函数
{
FILE *fp;
int i,j;
Line temp; //定义结构体临时变量,用于记录
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
for(i=0;i<SIZE1+count-1;i++){
for (j=0;j<SIZE1+count-i-1;j++){
if(line[j].time>line[j+1].time){
temp=line[j];
line[j]=line[j+1];
line[j+1]=temp;
}
}
}
fclose(fp);
if((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&line[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
printf("您所需的信息为:\n");
printtime();
choice4();
}
void look2 () //班次号函数
{
FILE *fp;
int i,j;
Line temp; //定义结构体临时变量,用于记录
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
for(i=0;i<SIZE1+count-1;i++){
for (j=0;j<SIZE1+count-i-1;j++){
if(line[j].num1>line[j+1].num1){
temp=line[j];
line[j]=line[j+1];
line[j+1]=temp;
}
}
}
fclose(fp);
if((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&line[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
printf("您所需的信息为:\n");
printtime();
choice4();
}
void look3 () //已购人数函数
{
FILE *fp;
int i,j;
Line temp; //定义结构体临时变量,用于记录
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
for(i=0;i<SIZE1+count-1;i++){
for (j=0;j<SIZE1+count-i-1;j++){
if(line[j].real>line[j+1].real){
temp=line[j];
line[j]=line[j+1];
line[j+1]=temp;
}
}
}
fclose(fp);
if((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&line[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
printf("您所需的信息为:\n");
printtime();
choice4();
}
void seek1 () //班次号查询函数
{
time_t t;
struct tm *lt;
time(&t);
lt=localtime(&t);
FILE *fp;
int i,j=1,num=0;
int m,n;
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
fclose(fp);
while (1){
if(j!=0){
m=0;
printf("请输入您要查询的班次号:");
scanf("%d",&num);
for (i=0;i<SIZE1+count;i++){
if(num==line[i].num1){
m=1;
n=i;
}
}
if (m==1){
printf("该班次的信息为:\n");
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[n].num1,line[n].time,\
line[n].sta1,line[n].sta2,line[n].num2,line[n].max,line[n].real,line[n].price);
if(lt->tm_hour>line[i].time){
printf("此车已开走!");
}
printf("\n");
}
else {
COLOR1;
printf("没有该班次列车信息!!!!\n");
COLOR2;
choice4();
break;
}
}
else {
break;
}
printf("是否继续查询?是 1;\t否 0;");
scanf("%d",&j);
}
if (j==0){
system("cls"); //清屏
choice4();
}
}
void seek2 () //终点站查询函数
{
time_t t;
struct tm *lt;
time(&t);
lt=localtime(&t);
Line temp;
FILE *fp;
int i,j=1;
char s[10];
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
while (1){
int k=0;
if(j!=0){
printf("请输入您要查询的终点站:");
scanf("%s",s);
printf("该班次的信息为:\n");
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
for (i=0;i<SIZE1+count;i++){
if(strcmp(s,line[i].sta2)==0){
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[i].num1,line[i].time,\
line[i].sta1,line[i].sta2,line[i].num2,line[i].max,line[i].real,line[i].price);
if(lt->tm_hour>line[i].time){
printf("此车已开走!");
}
printf("\n");
k=1;
}
}
}
else{
break;
}
if (k==0){
COLOR1;
printf("\n\n\n没有该终点站的相关列车信息!!!\n");
COLOR2;
}
printf("是否继续查询?是 1;否 0;");
scanf("%d",&j);
system("cls");
}
if (j==0){
system("cls"); //清屏
choice4();
}
fclose(fp);
}
void seek3 () //可购票查询函数
{
time_t t;
struct tm *lt;
time(&t);
lt=localtime(&t);
FILE *fp;
int i,flag=0; //flag作为判断变量
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
printf("当前可售票的车次为:\n");
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
for(i=0;i<SIZE1+count;i++){
if((lt->tm_hour<line[i].time)&&(line[i].real<line[i].max)){
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[i].num1,line[i].time,\
line[i].sta1,line[i].sta2,line[i].num2,line[i].max,line[i].real,line[i].price);
printf("\n");
flag=1;
}
}
if(flag==0){
COLOR1;
printf("\n\n\n当前没有可购票的车次!请耐心等待!!\n");
COLOR2;
}
fclose(fp);
choice4();
}
void buy () //购票系统函数
{
FILE *fp;
int i,j,k;
time_t t;
struct tm *lt;
time(&t);
lt=localtime(&t);
char sta[10];
int flag=0; //临时判断变量
int num=1; //临时记录要购买的班次号
double realprice; //记录应付票价
int n=0; //记录乘客身份编号
int l;
int log1[SIZE3];
int log2=0;
int y;
int record[SIZE1+count];
int q;
int p; //判断是否有该终点站
for (i=0;i<SIZE3;i++){
log1[i]=0;
}
if((fp=fopen("memory2.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE3+more;i++){
fread(&mem2[i],sizeof(struct Mem2),1,fp);
}
fclose(fp); //读取乘客已购票信息
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
printf("您已购车票的信息如下:\n");
for(i=0;i<SIZE3+more;i++){
if(strcmp(name1,mem2[i].name2)==0){
n=i;
//printf("%d\n",i);
}
}
xy=0;
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
for(i=0;i<SIZE3;i++){
for(j=0;j<SIZE1+count;j++){
if(line[j].num1==mem2[n].num[i]){
log1[i]=line[j].num1;
//printf("%d\n\n\n\n",line[j].num1);
xy++;
}
}
}
for (i=0;i<SIZE3;i++){
int m=0;
for (j=0;j<SIZE3;j++){
if(log1[i]==log1[j]){
//printf("%d\n",log1[i]);
log2++; //计算购买票的数量
}
}
for (k=0;k<SIZE1+count;k++){
if (line[k].num1==log1[i]){ //比对是否有该列车信息
//printf("k的值是%d\n",k);
for (l=0;l<i;l++){
if (log1[l]==log1[i]){ //比对是否之前已打印过该车票信息
//printf("%d\n\n\n\n",log1[i]);
m=1;
}
}
if (m==0){ //打印未输出过的已购车票信息
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[k].num1,line[k].time,\
line[k].sta1,line[k].sta2,line[k].num2,line[k].max,line[k].real,line[k].price);
printf("\t总计%d张",log2);
printf("\n");
}
}
}
log2=0;
}
while (num!=0){
if(xy>=5){
COLOR1;
printf("每位乘客最多购5张车票!!!无法再继续购票!!!\n\n");
COLOR2;
choice3();
} //是否还需要在此导入?????
printf("\n\n\n请输入您要到达的目的地:");
scanf("%s",sta);
p=0;
for (i=0;i<SIZE1+count;i++){
if(strcmp(sta,line[i].sta2)==0){
p=1;
}
}
if(p==0){
COLOR1;
printf("没有可购票的列车!!!请耐心等待!!!\n\n");
COLOR2;
choice4();
}
printf("可供选择的班次如下:\n");
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
y=0;
for (i=0;i<SIZE1+count;i++){
if((line[i].real<line[i].max)&&(strcmp(sta,line[i].sta2)==0)&&(lt->tm_hour<line[i].time)){
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[i].num1,line[i].time,\
line[i].sta1,line[i].sta2,line[i].num2,line[i].max,line[i].real,line[i].price);
printf("\n");
flag=1;
record[y]=line[i].num1; //记录可购列车车次号
y++;
}
}
if(flag==1){
printf("请输入您要购买的班次:");
scanf("%d",&num);
q=0;
for (i=0;i<y;i++){
if(num==record[i]){
q=1;
}
} //检验是否输入了可购车次以外的车次号
if(q==1){
mem2[n].num[xy]=num;
xy++;
//printf("%d\n",xy);
for(i=0;i<SIZE1+count;i++){
if(num==line[i].num1){
printf("请选择您要购买票的种类:全票 1;\t儿童票 2;\t学生票 3; ");
scanf("%d",&num);
switch (num) //按不同种类的票计算价格
{
case 1:
realprice=line[i].price*1;
break;
case 2:
realprice=line[i].price*0.5;
break;
case 3:
realprice=line[i].price*0.8;
break;
}
line[i].real+=1; //多售出一票
printf("购票成功!\n\n\n您的车票信息为:\n");
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%.2f",line[i].num1,line[i].time,\
line[i].sta1,line[i].sta2,line[i].num2,line[i].max,line[i].real,realprice);
printf("\n");
flag=0;
if((fp=fopen("memory2.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE3+more;i++){
if (fwrite(&mem2[i],sizeof(struct Mem2),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
if((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&line[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
break;
}
}
}
else {
COLOR1;
printf("\n\n输入了错误的班次号!!!\n");
COLOR2;
}
}
else {
COLOR1;
printf("\n\n\n当前没有可购买的车票!请耐心等待!!\n");
COLOR2;
break;
}
printf("是否继续购票?是 1;\t否 0;\t");
scanf("%d",&num);
system("cls"); //清屏
}
fclose(fp);
//原先在这里把已买车票的信息导入乘客Memory2.txt中!!!
choice3();
}
void deny () //退票函数
{
FILE *fp;
int i,j,m=0,y=1;
int x=0; //记录退票的数量
time_t t;
struct tm *lt;
time(&t);
lt=localtime(&t);
int num=1; //临时记录要购买的班次号
double money=0.0; //退票赔偿费
int n=0; //临时记录乘客序号
int k;
int l; //临时记录退票的班次号
int log2=0;
int log1[SIZE3];
int p=0;
int flag=0;
for (i=0;i<SIZE3;i++){
log1[i]=0;
}
if((fp=fopen("data.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
fread(&line[i],sizeof(struct Line),1,fp);
}
fclose(fp);
if((fp=fopen("memory2.txt","rb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE3+more;i++){
fread(&mem2[i],sizeof(struct Mem2),1,fp);
}
fclose(fp); //读取乘客已购票信息
printf("您已购车票的信息如下:\n");
for (i=0;i<SIZE3+more;i++){
if(strcmp(name1,mem2[i].name2)==0){
n=i;
}
}
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
for(i=0;i<SIZE3;i++){
for(j=0;j<SIZE1+count;j++){
if(line[j].num1==mem2[n].num[i]){
log1[i]=line[j].num1;
}
}
}
for (i=0;i<SIZE3;i++){
for (j=0;j<SIZE3;j++){
if(log1[i]==log1[j]){
log2++;
}
}
for (k=0;k<SIZE1+count;k++){
int z=0;
if (line[k].num1==log1[i]){
//printf("k的值是%d\n",k);
for (l=0;l<i;l++){
if (log1[l]==log1[i]){
z=1;
}
}
if (z==0){
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[k].num1,line[k].time,\
line[k].sta1,line[k].sta2,line[k].num2,line[k].max,line[k].real,line[k].price);
printf("\t总计%d张",log2);
printf("\n");
}
}
}
log2=0;
}
while (y!=0){
l=0;
printf("请输入您要退票的班次号:");
scanf("%d",&num);
flag=0;
for (i=0;i<SIZE3;i++){
if (num==mem2[n].num[i]){
flag=1;
}
} //判断输入的车次号是否存在
if (flag==1){
for(i=0;i<SIZE1+count;i++){
x=0;
if((lt->tm_hour<line[i].time)&&(num==line[i].num1)){
x=1;
printf("您要退票的列车信息如下:\n");
printf("车次 发车时间 始发站 终点站 行车时间 额定数量 已订票人数 票价\n");
printf("%d\t%d点\t%s\t%s\t%.1f时\t\t%d\t%d\t%d",line[i].num1,line[i].time,\
line[i].sta1,line[i].sta2,line[i].num2,line[i].max,line[i].real,line[i].price);
printf("\n是否确定退票?是 1;\t否 0;");
scanf("%d",&m);
if(m==1){
l=num;
if(((line[i].time)-(lt->tm_hour))>=2){
money=0;
}
else if((line[i].time-lt->tm_hour)>=1){
money=line[i].price*0.05;
}
else {
money=line[i].price*0.1;
}
line[i].real-=1;
printf("退票成功!!\n需补交退票赔偿费:%.2f元\n",money);
break;
}
else {
choice4();
}
}
}
}
else {
COLOR1;
printf("\n\n输入了错误的班次号!!!!\n");
COLOR2;
}
p=0;
for (i=0;i<SIZE3+more;i++){
if(l==mem2[n].num[i]){
mem2[n].num[i]=0;
p=1;
}
if (p==1){
break;
}
} //保证一次只退一张票
if(x==0){
COLOR1;
printf("无法退票!!\n");
COLOR2;
j=0;
}
Mem2 temp;
for (i=0;i<SIZE3;i++){
for (j=0;j<SIZE3-i-1;j++){
if (mem2[n].num[j]<mem2[n].num[j+1]){
temp.num[0]=mem2[n].num[j];
mem2[n].num[j]=mem2[n].num[j+1];
mem2[n].num[j+1]=temp.num[0];
}
}
} //剩余已购车票降次排序
if((fp=fopen("memory2.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE3+more;i++){
if (fwrite(&mem2[i],sizeof(struct Mem2),1,fp)!=1)
printf("file write error\n");
}
fclose(fp); //重新导入文件
if((fp=fopen("data.txt","wb"))==NULL){
printf("cannot open file\n");
exit(0);
}
for (i=0;i<SIZE1+count;i++){
if (fwrite(&line[i],sizeof(struct Line),1,fp)!=1)
printf("file write error\n");
}
printf("是否继续退票?是 1;\t否 0;");
scanf("%d",&y);
system("cls");
}
fclose(fp); //重新导入文件
choice3();
}
int ll; //用于链表的计数工具
struct Mem3 *creat(void) //建立车长信息链表
{
FILE *fp;
int i;
if((fp=fopen("mem3.txt","r"))==NULL){
printf("cannot open file\n");
exit(0);
} //打开乘客信息文件
struct Mem3 *head;
struct Mem3 *p1, *p2;
ll = 0;
p1 = p2 = (struct Mem3 *)malloc(LEN);
fscanf(fp,"%d",&p1->num3);
fscanf(fp,"%s",p1->name3);
fscanf(fp,"%s",p1->sex);
head = NULL;
i=0;
while (i<SIZE1) {
ll = ll + 1;
if (ll == 1)
head = p1;
else
p2->next = p1;
p2 = p1;
p1 = (struct Mem3 *)malloc(LEN);
fscanf(fp,"%d",&p1->num3);
fscanf(fp,"%s",p1->name3);
fscanf(fp,"%s",p1->sex);
i++;
}
fclose(fp);
p2->next = NULL;
return head;
}
void print(struct Mem3 *head) //用链表打印车长信息函数
{
struct Mem3 *p;
p = head;
if (head != NULL)
do
{
printf("%-8d%-8s%-8s",p->num3,p->name3,p->sex);
printf("\n");
p = p->next;
} while (p != NULL);
}
struct Mem3 *dellian(struct Mem3 *head, int num) //用链表删除车长信息
{
struct Mem3 *p1, *p2;
if (head == NULL) {
printf("\n list null!\n");
return 0;
}
p2 = NULL;
p1 = head;
while ((num != p1->num3)&&(p1->next != NULL)) {
p2 = p1;
p1 = p1->next;
}
if (num == p1->num3) {
if (p1 == head)
head = p1->next;
else
p2->next = p1->next;
printf("可以休息的车长是:%d\n", num);
ll = ll - 1;
}
else
printf("%d 不是车长!!!无信息!!!\n", num);
return head;
}
int main () //主函数
{
system("color 70");
menu1();
system("pause"); //防止闪退
return 0;
}