车站售票系统

妖精的绣舞 提交于 2020-04-07 19:38:36

#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define EmFile "C:\\zm.txt"  //密码帐号文件名
#define N 3
#define TEMP 2
#define TRUE 1
#define FALSE 0
int shoudsave=0 ;
int count1=0,count2=0,mark=0,mark1=0 ;
struct train
{  char num[10];//列车号
    char city[10];//目的城市
    char takeoffTime[10];//发车时间
    char receiveTime[10];//到达时间
    int  price;//票价
    int  bookNum ;//票数
 int leftbookNum;
};

//订票人的信息
struct man

 char num[10];//ID
    char name[10];//姓名
    int  bookNum ;//需求的票数
 char password[7];//密码
 int tag;
};
//定义火车信息链表的结点结构
typedef struct node
{   struct train data ;
    struct node * next ;
}Node,*Link ;
struct item_node{
 struct train wanted;
 int    amount;
 struct item_node *next;
};
struct train trains[N];
struct item_node *cart;
//初始界面
void menu()
{   puts("********************************************************");
    puts("*                  欢迎使用订票系统                    *");
    puts("********************************************************");
    puts("*             1:增加一个火车信息                       *");
    puts("*             2:查询一个火车信息                       *");
    puts("*             3:订票                                   *");
 puts("*             4:付款                                   *");
    puts("*             5:更新火车信息                           *");
    puts("*             6:系统给用户的提示信息                   *");
    puts("*             7:保存信息到文件                         *");
 puts("*             8:退出                                   *");
    puts("********************************************************");
}
void PW( char *password, int PWlength)//密码输入
{
 char temp;
 int i = 0;
 
loop:
 printf ( "请输入你的密码(不超过%d位):", PWlength-1 );
 while( 1 )
 {
  temp = getch();
  if ( temp != '\b' && temp != '\r' && i < PWlength )
  {
   printf ( "*" );
   password[i] = temp;
   i++;
  }
  else if ( temp == '\b' )
  {
   printf ( "\b" );
   printf( " " );
   printf( "\b" );
   i--;
  }
  else if( temp == '\r' )
  {
   password[i] = '\0';
   printf( "\n" );
   break;
  }
  else
  {
   printf ( "\nwarming!!!!\n" );
   printf ( "注意!!!\n" );
   printf( "密码长度不能超过%d位\n" ,PWlength-1);
   printf( "请重新输入!!!\n" );
   i = 0;
   goto loop;
  }
 }
 return;
}
void ID(char *name, int IDlength )//账号输入
{
 char temp;
 int i = 0;
 
loop:
 printf ( "请输入你的帐号(不超过%d个字符):", IDlength-1 );
 while( 1 )
 {
  temp = getche();
  if ( temp != '\b' && temp != '\r' && i < IDlength )
  {
   name[i] = temp;
   i++;
  }
  else if ( temp == '\b' )
  {
   printf( " " );
   printf( "\b" );
   i--;
  }
  else if (temp == '\r')
  {
   name[i] = '\0';
   printf( "\n" );
   break;
  }
  else
  {
   printf ( "\nwarming!!!!\n" );
   printf ( "注意!!!\n" );
   printf( "帐号长度不能超过%d位(中文字符不能超过%d位)\n" ,IDlength-1, ( IDlength-1)/2 );
   printf( "请重新输入!!!\n" );
   i = 0;
   goto loop;
  }
 }
}
void Reg()//注册
{
 int tempflag = FALSE;
 FILE *fp;
 man ma;
 int i;
 man tempma;
 int flag;
 ID(ma.name, 19);
 PW(ma.password, 7);
 ma.tag = 1;
 fp = fopen(EmFile, "a+" );
 if ( NULL != fp )
 {
  rewind(fp);
   do
   {
    flag = fread(&tempma, sizeof(man), 1, fp);
    if( 1 == flag )
    {
     tempflag = TRUE;
     if ( 0 == strcmp(ma.name, tempma.name) )
     {
      if( 1 == tempma.tag )
      {
       fclose(fp);
       printf( "该帐号已注册,不能再次注册!!!\n" );
       system("pause");
       i = TEMP;
      }
      else
      {
       fseek (fp, sizeof(man), 1);
       i = FALSE;
      }
     }
     else
     {
      i= TRUE;
     }
    }
    else
    {
     if ( tempflag )
     {
      fseek(fp,0,2);
      flag = fwrite(&ma,sizeof(man),1,fp);
      if ( 1== flag )
      {
       printf( "注册成功!!!\n" );
       system("pause");
       fclose(fp);
       i = TEMP;
      }
      else
      {
       printf( "error!!!\n" );
       system("pause");
       exit(1);
      }
     }
     else
     {
      rewind(fp);
      flag = fwrite(&ma,sizeof(man),1,fp);
      if ( 1== flag )
      {
       printf( "注册成功!!!\n" );
       system("pause");
       fclose(fp);
       i = TEMP;
      }
      else
      {
       printf( "error!!!\n" );
       system("pause");
       exit(1);
      }
     }
    }
   }while( TRUE == i );

   if( TEMP != i )
   {
    fwrite ( &ma, sizeof(man), 1, fp );
    flag = ferror(fp);
    if ( 0 == flag )
    {
     clearerr(fp);
     fclose(fp);
     printf ( "注册成功!!!\n" );
    }
    else
    {
     printf ( "error:00024\n" );  //EmFile读取失败
     system( "pause" );
     exit(1);
    }
   }
  }
  else
  {
   printf ( "error:00002\n错误!!!n" );    //EmFile 创建失败
   printf ( "系统退出!!" );
   exit(1);
  }
}
bool Login()//登录
{
 FILE *fp;
 int flag;
 int count = 0;
 int tempflag = 0;
 man ma;
 char na[10],mi[10];
 fp = fopen(EmFile, "r");
 if ( NULL != fp )
 {
  //ID(ma.name, 19);
  //PW(ma.password, 7);
  printf("请输入帐户名:");
  scanf("%s",na);
  printf("请输入密码:");
  scanf("%s",mi);
  do
  {
   flag = fread(&ma,sizeof(ma),1, fp);
   if ( 1 == flag )
   {
    if ( 0 == strcmp(ma.name,na) && ma.tag == 1)
    {
     tempflag = 0;
     while(count<3)
     {
      if ( 0 != count )
      {
       PW(mi,7);
      }
      if( 0 == strcmp(ma.password,mi) )
      {
       fclose(fp);
       Sleep(1000);
       system("cls");
       return TRUE;
      }
      else
      {
       printf( "密码错误!!!\n" );
       count++;
       if( 3 == count )
       {
        printf ( "密码错误三次!\n" );
        printf( "系统退出\n" );
        fclose(fp);
        Sleep(1000);
        system("cls");
        return FALSE;
       }
      }
     }
    }
    else
    {
     tempflag = 1;
    }
   }
   else
   {
    printf( "无此帐号,请核对帐号重新登录系统\n" );
    tempflag = 0;
    fclose(fp);
    Sleep(1000);
    system("cls");
    return FALSE;
   }
   
  }while( tempflag );
 }
 else
 {
  printf( "error: 000010\n 错误!!!\n" ); //Emfile打开失败
  exit(0);
  }
}
//添加一个火车信息
void InsertTraininfo(Link linkhead)
{   struct node *p,*r,*s ;
    char num[10];
    r = linkhead ;
    s = linkhead->next ;
    while(r->next!=NULL)
    r=r->next ;
    while(1)
    {   printf("请输入火车车次(0-返回)");
        scanf("%s",num);
        if(strcmp(num,"0")==0)
          break ;
        while(s)
        {     if(strcmp(s->data.num,num)==0)
            {
                printf("the train '%s'has been born!\n",num);
                return ;
            }
            s = s->next ;
        }
        p = (struct node*)malloc(sizeof(struct node));
        strcpy(p->data.num,num);
        printf("输入火车所到达的城市:");
        scanf("%s",p->data.city);
        printf("输入火车开车时间:");
        scanf("%s",p->data.takeoffTime);
        printf("输入火车到达时间:");
        scanf("%s",&p->data.receiveTime);
        printf("输入票价:");
        scanf("%d",&p->data.price);
        printf("输入票数:");
        scanf("%d",&p->data.bookNum);
        p->next=NULL ;
        r->next=p ;
        r=p ;
        shoudsave = 1 ;
    }
}
//打印火车票信息
void printTrainInfo(struct node*p)
{   puts("\nThe following is the record you want:");
    printf(">>车次: %s\n",p->data.num);
    printf(">>所到达城市: %s\n",p->data.city);
    printf(">>开车时间: %s\n",p->data.takeoffTime);
    printf(">>到达时间:%s\n",p->data.receiveTime);
    printf(">>票价:  %d\n",p->data.price);
    printf(">>票数: %d\n",p->data.bookNum);
}
struct node * Locate1(Link l,char findmess[],char numorcity[])
{   Node*r ;
    if(strcmp(numorcity,"num")==0)
    {
        r=l->next ;
        while(r)
        {
            if(strcmp(r->data.num,findmess)==0)
            return r ;
            r=r->next ;
        }
    }
    else if(strcmp(numorcity,"city")==0)
    {
        r=l->next ;
        while(r)
        {
            if(strcmp(r->data.city,findmess)==0)
            return r ;
            r=r->next ;
        }
    }
    return 0 ;
}
//查询火车信息
void QueryTrain(Link l)
{
    Node *p ;
    int sel ;
    char str1[5],str2[10];
    if(!l->next)
    {
        printf("There is not any record !");
        return ;
    }
    printf("选择:\n>>1:按照火车车次;\n>>2:按照所到城市:\n");
    scanf("%d",&sel);
    if(sel==1)
    {
        printf("输入火车车次:");
        scanf("%s",str1);
        p=Locate1(l,str1,"num");
        if(p)
        {
            printTrainInfo(p);
        }
        else
        {
            mark1=1 ;
            printf("\nthe file can't be found!");
        }
    }
    else if(sel==2)
    {
        printf("输入所到城市:");
        scanf("%s",str2);
        p=Locate1(l,str2,"city");
        if(p)
        {
            printTrainInfo(p);
        }
        else
        {
            mark1=1 ;
            printf("\nthe file can't be found!");
        }
    }
}

void calculate()
{
 float total=0,pay;
 struct item_node *p;
 int   i;
 FILE   *fp;
 if((fp=fopen("c:\\train.txt","wb"))==NULL){
  printf("打开文件失败:  \n");
  exit(0);
 }
 for(i=0;(fread(trains+i,sizeof(struct train),1,fp))!=0;i++);
 fclose(fp);
 p=cart;
 while(p!=NULL){
  total+=p->wanted.price*p->amount;
  for(i=0;strcmp(trains[i].num,p->wanted.num)!=0;i++);
  trains[i].leftbookNum-=p->amount;
  p=p->next;
  
 }
 printf("总计 %7.2f",total);
 printf("\n输入实付金额: ");
 scanf("%f",&pay);
 printf("实付:         %7.2f    找零:          %7.2f",pay,pay-total);
 if((fp=fopen("goods","w"))==NULL){
  printf("打开文件失败.\n");
  return;
 }
 fwrite(trains,sizeof(struct train),N,fp);
 fclose(fp);
}
void add()
{
 FILE *fp;
 int   i,n;
 char  str[20];
 char  choice1,choice2;
 struct item_node *p,*p1;
 do
 {
  printf("输入车次: ");
  fflush(stdin);
  gets(str);
  if((fp=fopen("c:\\train.txt","a+"))==NULL){
   printf("打开文件失败\n");
   continue;
  }
  for(i=0;fread(trains+i,sizeof(struct train),1,fp)!=0;i++){
   if((strcmp(trains[i].num,str)==0 && trains[i].leftbookNum!=0)){
    printf("已经找到所乘车次:  \n");
    printf("---------------------\n");
    printf("车次  目的地  开车时间  到达时间  票价  余票\n");
    printf("%s%6s%10s%10s%4d   %4d\n",trains[i].num,trains[i].city,trains[i].takeoffTime,trains[i].receiveTime,trains[i].price,trains[i].leftbookNum);
    printf("请输入所需数量: ");
    scanf("%d",&n);
    if(n>trains[i].leftbookNum){
     printf("余票不足\n");
     break;
    }
    printf("\n是否购买?(Y/N)");
    fflush(stdin);
    choice1=getchar();
    if(choice1=='Y'||choice1=='y')
    {
     p1=(struct item_node*)malloc(sizeof(struct item_node));
     if(p1==NULL){
      printf("内存申请失败!\n");
      exit(1);
     }
     p1->amount=n;
     p1->wanted=trains[i];
     p1->next=NULL;
     p=cart;
     if(cart==NULL)
      cart=p1;
     else{
      while(p->next!=NULL)
       p=p->next;
      p1->next=p->next;
      p->next=p1;
     }
    }
    break;
   }
  }
  if(i==N)
   printf("未找到所需车次\n");
  fclose(fp);
  printf("是否继续购买?(Y/N)");
  choice2=getchar();
 }while(choice2=='Y'||choice2=='y');
}

//修改火车信息
void UpdateInfo(Link l)
{
    Node*p ;
    char findmess[20],ch ;
    if(!l->next)
    {
        printf("\nthere isn't record for you to modify!\n");
        return ;
    }
    else
    {
        QueryTrain(l);
        if(mark1==0)
        {
            printf("\nDo you want to modify it?\n");
            getchar();
            scanf("%c",&ch);
            if(ch=='y')
            {
                printf("\nInput the number of the train:");
                scanf("%s",findmess);
                p=Locate1(l,findmess,"num");
                if(p)
                {
                    printf("输入新的车次:");
                    scanf("%s",&p->data.num);
                    printf("输入新的到达城市:");
                    scanf("%s",&p->data.city);
                    printf("输入新的开车时间");
                    scanf("%s",&p->data.takeoffTime);
                    printf("输入新的到达时间:");
                    scanf("%s",&p->data.receiveTime);
                    printf("输入新的票价:");
                    scanf("%d",&p->data.price);
                    printf("输入新的票数:");
                    scanf("%d",&p->data.bookNum);
                    printf("\nmodifying record is sucessful!\n");
                    shoudsave=1 ;
                }
                else
                printf("\t\t\tcan't find the record!");
            }
        }
        else
         mark1=0 ;
    }
}
//系统给用户的提示信息
void AdvicedTrains(Link l)
{
    Node*r ;
    char str[10];
    int mar=0 ;
    r=l->next ;
    printf("输入要到达的城市: ");
    scanf("%s",str);
    while(r)
    {
        if(strcmp(r->data.city,str)==0&&r->data.bookNum<200)
        {
            mar=1 ;
            printf("\nyou can select the following train!\n");
            printf("\n\nplease select the fourth operation to book the ticket!\n");
            printTrainInfo(r);
        }
        r=r->next ;
    }
    if(mar==0)
    printf("\n\t\t\tyou can't book any ticket now!\n");
   
}

//保存火车信息
void SaveTrainInfo(Link l)
{
    FILE*fp ;
    Node*p ;
    int count=0,flag=1 ;
    fp=fopen("c:\\train.txt","ab");
    if(fp==NULL)
    {
        printf("the file can't be opened!");
        return ;
    }
    p=l->next ;
    while(p)
    {
        if(fwrite(p,sizeof(Node),1,fp)==1)
        {
            p=p->next ;
            count++;
        }
        else
        {
            flag=0 ;
            break ;
        }
    }
    if(flag)
    {
        printf("the number of the record which have been saved is %d\n",count);
        shoudsave=0 ;
    }
    fclose(fp);
}

int main()
{
 system("COLOR 8a");
    FILE*fp1,*fp2 ;
    Node*p,*r ;
    char ch1,ch2 ;
    Link l ;

    int sel ;
 printf("请先登录!!!!!\n\n");
 while(1){
 if (Login())
 {

  l=(Node*)malloc(sizeof(Node));
  l->next=NULL ;
  r=l ;
  fp1=fopen("c:\\train.txt","ab+");
  if((fp1==NULL))
  {
   printf("can't open the file!");
   return 0 ;
  }
  while(!feof(fp1))
  {
   p=(Node*)malloc(sizeof(Node));
   if(fread(p,sizeof(Node),1,fp1)==1)
   {
    p->next=NULL ;
    r->next=p ;
    r=p ;
    count1++;
   }
  }
  fclose(fp1);
  while(1)
  {
   system("cls");
   menu();
   printf("请选择:  ");
   scanf("%d",&sel);
   system("cls");
   switch(sel)
   {
   case 1 :
    InsertTraininfo(l);break ;
   case 2 :
    QueryTrain(l);break ;
   case 3 :
    add();break ;
   case 4:
    calculate();break;
   case 5 :
    UpdateInfo(l);break ;
   case 6 :
    AdvicedTrains(l);break ;
   case 7 :
    SaveTrainInfo(l);break ;
   case 8 :
    return 0;
   }
   printf("\nplease press any key to continue.......");
   getch();
  }
 }
 else{
  printf("请先注册!!!\n");
  printf("按任意键继续\n");
  getch();
  Reg();
  system("cls");
 }
 }
system("cls");
 return 0;
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!