系统完整代码

作者: 时间:2020-07-09 点击数:

/*
车票管理系统
一车站每天有n个 发车班次,每个班次都有班次号、固定发车时间,起点站、终点站、行车时间,固定的载客量、已订票人数
如:
班次   发车时间   起点站   终点站   行车时间   载客量    已订票人数
1          8:00      安阳    郑州       3        45            30
2          6:40      安阳    北京       5        40            20
功能要求:
1、管理员功能
(1)录入班次信息(信息用文件保存),可不定时地增加班次数据(注意班次号不能重复)
(2)删除班次信息
(3)浏览班次信息,可显示出所有班次当前状态
2、普通用户功能
(1)查询路线:可按班次号查询,也可按终点站查询
(2)订票:输入姓名和班次后实现订票功能(只能买订票人数小于载客量且当前系统时间小于发车时间的车次)
(3)查票:输入姓名可查询本人已经买到的查票信息。
(4)退票:输入姓名和退票班次,当本班车未发出时才能退票,自动更新已订票人数
其他要求:
(1)编程使用c语言
(2)采用菜单界面
(3)学生可自动增加新功能模块(视情况可另加分)
*/
/*
单级菜单:
多级菜单:
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <Windows.h>
#include <time.h>
struct car
{
int cch;  
char time1[10];  //11:30
char start[20];  
char last[20];  
int time2;  
int biggest;  
int people;
};
struct ticket
{
char xm[20];
int cch;
char time1[10];
char start[20];
char last[20];
int time2;
};
struct sysin
   {
       char ID[10];
       char Password[15];
   };
int comparetime(char *s)  //判断发车时间和当前系统时间
{
int a[3]={0},i,j;
   i=0,j=0;
time_t t;
struct tm *lt;
//将字符串时间整理出十和分(分别在a[0]和a[1])
while(s[i])
{
   if (s[i]>='0' && s[i]<='9')
a[j]=a[j]*10+s[i]-'0';
   else
j++;
   i++;
   }
//获取当前系统时间的十和分
time(&t);
lt=localtime(&t);//lt->tm_hour,lt->tm_min
if ((a[0]>lt->tm_hour)||((a[0]==lt->tm_hour)&&(a[1]>lt->tm_min)))
 return 1;
else
 return 0;
}
void sysload()   /** 系统管理员登录页面 **/
{    
struct sysin User1,User2;
FILE *file1;
int length,i=0;
void manager();
file1=fopen("d:\\test\\sysin.txt","r");//read
while (i<3)
{
  fflush(stdin);
  printf("请输入管理员账号和密码:\n");
  scanf("%s",User1.ID);
  scanf("%s",User1.Password);
if (file1==NULL)
{
 file1=fopen("d:\\test\\sysin.txt","w");  
 fputs(User1.ID,file1);fputc('\n',file1);
 fputs(User1.Password,file1);
 fclose(file1);
 break;
}
else
{
 if (i==0)
 
{
   fgets(User2.ID,50,file1);
      length=strlen(User2.ID);
         User2.ID[length-1]='\0';
      fgets(User2.Password,50,file1);
 }
 if(strcmp(User1.ID,User2.ID)==0)
       {
           if(strcmp(User1.Password,User2.Password)==0)  //账号密码都正确输出
           {
              break;
           }
           else
              printf("密码错误,请重新输入\n");
       }
       else
           printf("账号错误,请重新输入\n");

}
    i++;
}
   fclose(file1); //关闭文件
if (i<3)
 manager();
}
void addcar()   /** 录入班次车次 **/
{
struct car car[100];
int j,k=0,i,flag=0;
FILE *file1;
printf("录入几班列车:");
scanf("%d",&j);
fflush(stdin);
printf("班次: 发车时间: 始发站: 终点站: 行车时间: 额定载客量:\n");
while(k<j)
{
printf("班次:");
scanf("%d",&car[k].cch);
fflush(stdin);
//检测班次号有无重复(如重复则重新录入)
for(i=0;i<k;i++)
if (car[i].cch==car[k].cch) break;
if (i<k) {printf("班次号重复,请重输\n");continue;}
printf("发车时间:");
scanf("%s",car[k].time1);
fflush(stdin);
printf("始发站:");
scanf("%s",car[k].start);
fflush(stdin);
printf("终点站:");
scanf("%s",car[k].last );
fflush(stdin);
printf("行车时间:");
scanf("%d",&car[k].time2);
fflush(stdin);
printf("额定载客量:");
scanf("%d",&car[k].biggest);
car[k].people=0;
fflush(stdin);
k++;
}
file1=fopen("d:\\test\\addcar.txt","r");
if(file1==NULL)
{
file1=fopen("d:\\test\\addcar.txt","w");
}
fclose(file1);
file1=fopen("d:\\test\\addcar.txt","a+");
for(i=0; i<j; i++)
{
fwrite(&car[i],sizeof(struct car),1,file1);
}
fclose(file1);
printf("录入成功!");
}
void allcar()
{
struct car st;
FILE * file1=fopen("d:\\test\\addcar.txt","r");
if (file1!=NULL)
{
 printf("---------------------------------------------------------------------------------------------\n");
 while (fread(&st,sizeof(struct car),1,file1)==1)
  {
   printf("|车次:%2d|发车时间:%6s|始发站:%6s|终点站:%6s|行车时间:%2d|额定载客量:%2d|已订票人数:%2d|\n",st.cch,st.time1,st.start,st.last,st.time2,st.biggest,st.people);
  }
  fclose(file1);
  printf("---------------------------------------------------------------------------------------------\n");
}
else
printf("目前没有任何车次信息,请耐心等待!\n");
  getchar();
  getchar();
}
void delcar()
{
   struct car tt[100];
int n=0,i,j,x;
FILE * file1=fopen("d:\\test\\addcar.txt","r");
if (file1!=NULL)
 {
printf("请输入删除班次:\n");
scanf("%d",&x);
while (fread(&tt[n],sizeof(struct car),1,file1)==1)
      n++;
fclose(file1);
for(i=0;i<n;i++)
 if (tt[i].cch==x) break;
if (tt[i].people==0)
{
for(j=i;j<n;j++)
 tt[j]=tt[j+1];  //把要删除的班次覆盖掉了
n--;
file1=fopen("d:\\test\\addcar.txt","w");
for(i=0;i<n;i++)
   fwrite(&tt[i],sizeof(struct car),1,file1);
fclose(file1);
printf("%d号班次删除成功\n",x);
}
else
 printf("%d号车有人订票,不能删除!\n",x);
}
else
   printf("目前没有任何车次信息,请耐心等待!\n");
getchar();
getchar();
}
void searchroad()  /** 查询路线 **/
{
   char ch;
   int flag1=0,flag2=0,cc;
char zdz[20];
struct car st;    
   FILE *file1=fopen("d:\\test\\addcar.txt","r");
if (file1!=NULL)
{
printf(" 请输入查询方式:\n 1.班次查询\n 2.终点站查询\n ");
fflush(stdin);
   ch=getchar();
   if(ch=='1')
   {
       printf("请输入你乘坐的班次:");
       scanf("%d",&cc);
      while (fread(&st,sizeof(struct car),1,file1)==1)
       {
           if((st.cch==cc)&&comparetime(st.time1))
           {
               printf("车次信息:\n");                
   printf("|车次:%2d|发车时间:%6s|始发站:%6s|终点站:%6s|行车时间:%2d|额定载客量:%2d|\n",st.cch,st.time1,st.start,st.last,st.time2,st.biggest);
   flag1=1;
               break;
           }
       }
       fclose(file1);
       if(flag1==0)
       {
           printf("对不起,未查询到相关的车次信息!\n");
       }
   }
else if(ch=='2')
   {
       printf("请输入你乘坐车次的终点站:");
       scanf("%s",zdz);  
       while (fread(&st,sizeof(struct car),1,file1)==1)
       {            
           if((strcmp(st.last,zdz)==0)&&comparetime(st.time1))
           {
               printf("您的车次信息如下:\n");    
   printf("|车次:%2d|发车时间:%6s|始发站:%6s|终点站:%6s|行车时间:%2d|额定载客量:%2d|\n",st.cch,st.time1,st.start,st.last,st.time2,st.biggest);
               flag2=1;
           }
        }        
       fclose(file1);  
       if(flag2==0)
       {
           printf("对不起,未查询到相关的车次信息!\n");
       }
}
}
else
printf("目前任何车次信息,请耐心等待!\n");
getchar();
getchar();
}
void addticket(char *s,struct car carx)
{
FILE *fp;
struct ticket st;
fp=fopen("d:\\test\\addticket.dat","rb");
if (fp==NULL)
  fp=fopen("d:\\test\\addticket.dat","wb");  
fclose(fp);
fp=fopen("d:\\test\\addticket.dat","ab+");
strcpy(st.xm,s);
st.cch=carx.cch;strcpy(st.start,carx.start);strcpy(st.last,carx.last);
st.time2=carx.time2;strcpy(st.time1,carx.time1);
fwrite(&st,sizeof(struct ticket),1,fp);
fclose(fp);
}
void buyticket()  /** 售票系统 **/
{
char first[20],name[20];
   char end[20];
struct car car[100];
   int flag=0;
   int cc,i,n=0;      
   FILE * file1=fopen("d:\\test\\addcar.txt","r");
if (file1!=NULL)
{
printf("请输入您的起始站:");
   scanf("%s",first);
   printf("请输入您的终点站:");
   scanf("%s",end);
 printf("车次信息如下:\n");
   while (fread(&car[n],sizeof(struct car),1,file1)==1)
   {      
if ((strcmp(car[n].start,first)==0)&&(strcmp(car[n].last,end)==0)&&(car[n].people<car[n].biggest)&&comparetime(car[n].time1))
       {        
 printf("|车次:%2d|发车时间:%6s|始发站:%6s|终点站:%6s|行车时间:%2d|额定载客量:%2d|\n",car[n].cch,car[n].time1,car[n].start,car[n].last,car[n].time2,car[n].biggest);
           flag=1;
       }
    n++;
    }
       if(flag==0)
       {
           printf("对不起,未查询到相关车次信息!");
       }
 fclose(file1);
}
 else
  {printf("目前还没有车次信息!\n");getchar();
getchar();return;}
       
   if(flag==1)
   {
       FILE *file1=fopen("d:\\test\\addcar.txt","w");
       printf("请输入您的姓名和购买车次:");
       scanf("%s%d",name,&cc);
       for(i=0; i<n; i++)
       {
   if(cc==car[i].cch)
           {
               printf("订票成功!\n");
               car[i].people=car[i].people+1;
   addticket(name,car[i]);
           }
           fwrite(&car[i],sizeof(struct car),1,file1);          
        }
 fclose(file1);
  }
getchar();
getchar();
}
void findticket()
{
FILE *fp;
struct ticket st;
char name[20];
int i=0,flag=0;
printf("请输入您的姓名:\n");
fflush(stdin);
gets(name);
fp=fopen("d:\\test\\addticket.dat","rb");
if (fp!=NULL)  
{
while (fread(&st,sizeof(struct ticket),1,fp)==1)
{
 i++;
 if (strcmp(st.xm,name)==0)
 {flag=1;printf("|序号:%2d|姓名:%8s|车次:%2d|始发站:%6s|终点站:%6s|行车时间:%2d|\n",i,st.xm,st.cch,st.start,st.last,st.time2);}
}
fclose(fp);
}
if (flag==0) printf("%s同志,您当前没有订好的车票!\n",name);
getchar();
getchar();
}
void backticket()
{
   FILE *fp;
int bch,flag=0,n=0,k,i;
char name[20];
struct ticket st[10];
struct car tt[50];
printf("请输入姓名和车次:\n");
fflush(stdin);
scanf("%s%d",name,&bch);
//判断该乘客买了该班次的票?
fp=fopen("d:\\test\\addticket.dat","rb");
if (fp!=NULL)
{
 while (fread(&st[n],sizeof(struct ticket),1,fp)==1)
{
 if ((strcmp(st[n].xm,name)==0)&&(st[n].cch==bch))
 {flag=1;k=n;}
  n++;  
}
 fclose(fp);
 if (flag==0) {printf("你没有买该班次的票!\n");getchar(); getchar();return;}
}
else
{printf("目前没有任何车票信息!\n");getchar(); getchar();return;}
if (flag==1)
     if (comparetime(st[k].time1))  //如果发车时间未到
  {
   //从购票文件中去掉该张票
   fp=fopen("d:\\test\\addticket.dat","wb");
   for(i=0;i<n;i++)
    if (i!=k)
     fwrite(&st[i],sizeof(struct ticket),1,fp);
   fclose(fp);
   //修改班次文件中的已订票人数
   fp=fopen("d:\\test\\addcar.txt","r");
   n=0;
   while (fread(&tt[n],sizeof(struct car),1,fp)==1)
   {  
    if (tt[n].cch==bch)
     tt[n].people=tt[n].people-1;
    n++;
   }
   fclose(fp);
   fp=fopen("d:\\test\\addcar.txt","w");
   for(i=0;i<n;i++)
    fwrite(&tt[i],sizeof(struct car),1,fp);
   fclose(fp);
   printf("退票成功!\n");
   getchar();
   getchar();
  }  
}

void menu3()
{
       printf("#====================================#\n");
 printf("# 1.          查询班次信息           #\n");
 printf("# 2.            订    票             #\n");
 printf("# 3.            查    票             #\n");
 printf("# 4.            退    票             #\n");  
 printf("# 0.          返回主菜单             #\n");
 printf("#====================================#\n");
 printf("请输入0~4选项:");
}
void menu1()
{
       printf("#====================================#\n");
 printf("#       欢迎使用车票管理系统         #\n");
 printf("#====================================#\n");
       printf("# 1.         管理员登录              #\n");
       printf("# 2.        普通用户登录             #\n");
       printf("# 0.          退出系统               #\n");
 printf("#====================================#\n");
 printf("请输入0~2选项:");

}
void menu2()
{
       printf("#====================================#\n");
       printf("# 1.        添加车次信息             #\n");
       printf("# 2.        删除车次信息             #\n");
 printf("# 3.        浏览车次信息             #\n");
       printf("# 0.         返回主菜单              #\n");
 printf("#====================================#\n");
 printf("请输入0~3选项:");
}
void manager()
{
int choice;
void initmenu();
while (1)
{
 system("CLS");
 menu2();
 scanf("%d",&choice);
 switch(choice)
 {
 case 1:
  addcar();
  break;
 case 2:
  delcar();
  break;
 case 3:
  allcar();
  break;
 case 0:
  break;
 }
 if (choice==0)
  break;
}
initmenu();
}
void normal()
{
int choice;
void initmenu();
void searchroad();
   void buyticket();
void findticket();
void backticket();
while (1)
{
 system("CLS");
 menu3();
 scanf("%d",&choice);
 switch(choice)
 {
 case 1:
  searchroad();
  break;
 case 2:
  buyticket();
  break;
       case 3:
  findticket();
  break;
 case 4:
  backticket();
  break;
 case 0:
  break;
 }
 if (choice==0)
  break;
}
initmenu();
}
void initmenu()
{
int choice;
 system("CLS");
 menu1();
 scanf("%d",&choice);
 switch(choice)
 {
 case 1:
  sysload();
  break;
 case 2:
  normal();
     break;
 case 0:
  break;
 }
   if (choice==0)
{
         printf("                                     正在退出..");
               Sleep(1000);
               printf(".\n");
               Sleep(1000);
               printf(".\n");
               printf("                                     退出成功 .\n");
   Sleep(500);
   return;
}
 
}
int main()
{
   initmenu();
return 0;
}

Copyright© 2020 Anyang Institute of Technology.All rights reserved.

学院地址:河南省安阳市黄河大道西段