C语言火车售票系统


#include<stdio.h>
#include<string.h>
#include<conio.h>//getch
#include<stdlib.h>//动态分配


typedef  struct  route//路线
{
char  num[30];//车次
char  start[40];//起点
char  end[40];//终点
char  time[10];//时间
struct  route   *next;
}r;

 

 


typedef  struct  ticket//车票
{

char  num[30];//车次
int   n;//总数量
int   n1;//剩余数
float  price;//票价

struct  ticket  *next;
}t;

 


r  *  rhead=NULL,*ri=NULL;//全局指针
t  *  thead=NULL,*ti=NULL;//全局指针

 

 

 

 

void initialr()
{
FILE   *fp;
fp=fopen("route.txt","r");
if(!fp){ printf("/n/n火车路线文件不存在!/n/n");    return ;    }

fseek(fp,0,SEEK_END);
int n=ftell(fp)/sizeof(r);
rewind(fp);

int i=0;
for(;i<n;i++)
{
r  *p;
p=(r*)malloc(sizeof(r));
p->next=NULL;

fread(p,sizeof(r),1,fp);

if(rhead==NULL)rhead=ri=p;
else{  ri->next=p;ri=p; }

}


fclose(fp);
printf("/n/n初始化%d个火车路线信息成功!/n/n",n);
}

 

void initialt()
{
FILE   *fp;
fp=fopen("ticket.txt","r");
if(!fp){ printf("/n/n车票文件不存在!/n/n");    return;    }

fseek(fp,0,SEEK_END);
int n=ftell(fp)/sizeof(t);
rewind(fp);

int i=0;
for(;i<n;i++)
{
t *p;
p=(t*)malloc(sizeof(t));
p->next=NULL;

fread(p,sizeof(t),1,fp);

if(thead==NULL)thead=ti=p;
else{  ti->next=p;ti=p; }

}


fclose(fp);
printf("/n/n初始化%d个车票信息成功!/n/n",n);
}


void newr()
{

 printf("/n/n/n█新建火车路线█/n/n");

loop:

    r *p;
 p=(r *)malloc(sizeof(r));
    p->next=NULL;

loop1:

 printf("/n请输入火车号/n/n");
 scanf("%s",p->num);
//检验
 r  *pj=rhead;
 while(pj)
 {
  if(strcmp(pj->num,p->num)==0){  printf("/n/n错误,该火车号已经存在,请重新输入!/n");   goto  loop1;    }
  pj=pj->next;
 }
//检验 


 printf("/n请输入起始站/n/n");
 scanf("%s",p->start);
 printf("/n请输入终点站/n/n");
 scanf("%s",&p->end);
 printf("/n请输入发车时间(时:分)/n/n");
 scanf("%s",&p->time);

if(rhead==NULL)rhead=ri=p;
else{  ri->next=p;  ri=p;   }

printf("/n/n创建新火车路线成功!/n/n");

char c;
printf("/n/n您想---继续新建(A)--退出新建(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;  else  return;

}

 

void newt()
{

 printf("/n/n/n█新建车票█/n/n");

loop:

    t *p;
 p=(t *)malloc(sizeof(t));
    p->next=NULL;

 
 printf("/n请输入要新建车票的火车号/n/n");
 scanf("%s",p->num);
//检验是否已经售票
 int y=0;
 t  *pt=thead;
 while(pt)
 {
  if(strcmp(pt->num,p->num)==0){y=1;break;}  
  pt=pt->next;
 }

if(y) { printf("/n错误,该火车号已经开始售票!/n/n");goto loop;}


//检验是否存在
  y=1;
 r  *pj=rhead;
 while(pj)
 {
  if(strcmp(pj->num,p->num)==0){y=0;break;}  
  pj=pj->next;
 }
 if(y) { printf("/n错误,无该火车号!/n/n");goto loop;}
//-----------------------------------------------------------
 
 printf("/n请输入总票数:/n/n");
 scanf("%d",&p->n);
 p->n1=p->n;
 printf("/n请输入票价:(元)/n/n");
 scanf("%f",&p->price);

if(thead==NULL)thead=ti=p;
else{  ti->next=p;  ti=p;   }

printf("/n/n创建火车票成功!/n/n");

char c;
printf("/n/n您想---继续新建(A)--退出新建(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;  else  return;

}


void showr()
{

r *p;
p=rhead;

printf("/n/n/n                        █火车信息数据库█          ");
printf("/n|--------------------------------------------------------------------------|");
int i=0;

while(p)
{
 i++;
printf("/n|车号:%s  路线:  %s---------->%s  发车时间:%s",p->num ,p->start ,p->end ,p->time);

 

//-----------------------
int jy=1;
  t*p1=thead;
            while(p1)
   {          if(strcmp(p1->num,p->num)==0) {printf("/t[已售票]");  jy=0; }     p1=p1->next; }    


if(jy) printf("/t[未售票]");
//-----------------------

 


printf("/n|--------------------------------------------------------------------------|");
p=p->next;
}

printf("/n█火车总数:   %d    ",i);
printf("/n|--------------------------------------------------------------------------|/n/n/n/n/n/n");

}

 

 

void showt()
{
printf("/n/n/n                        █火车票信息数据库█          ");
printf("/n|--------------------------------------------------------------------------|");

int i=0;
 t*p=thead;
            while(p)
   {  i++;
printf("/n|车号:%s    票价:%f    剩余:%d   总数:%d   已卖:%d",p->num ,p->price ,p->n1 ,p->n,p->n-p->n1);
printf("/n|--------------------------------------------------------------------------|");
p=p->next;   
   }

}

 

 

void modifyr()
{

 

printf("/n/n/n       █修改路线█          ");

loop:
printf("/n/n/n请输入要修改的火车号:");
char n[20];
scanf("%s",n);

r *p=rhead;

int y=1;
while(p)

   if(strcmp(n,p->num)==0)
   {y=0;
    printf("/n请输入新起始点/n/n");
 scanf("%s",p->start);

 printf("/n请输入新终点站/n/n");
 scanf("%s",p->end);


 printf("/n请输入新发车时间/n/n");
 scanf("%s",p->time); }

p=p->next;

}


if(y)printf("/n/n错误,要修改的车号不存在!/n/n");
else   printf("/n/n修改成功!/n/n");
char c;
printf("/n/n您想---继续修改(A)--退出修改(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;else  return;
}

 

void delr()
{


printf("/n/n/n       █删除路线█          ");

loop:
printf("/n/n/n请输入要删除的火车号:");
char n[20];
scanf("%s",n);

r *p=rhead,*p1=rhead;

int y=0;
int  jy=1;
while(p)

 
 if(strcmp(n,p->num)==0)
 {  

  //检验-----------------------------------------------------------
  t *p2=thead;
  while(p2)
  {
       if(strcmp(p->num,p2->num)==0&&p2->n!=p2->n1)
        printf("/n/n错误,已售票,无法删除!!/n/n");

     p2=p2->next;
   }
  //检验---------------------------------------------------------
  
  jy=0;
  if(p==rhead)rhead=rhead->next;
     else  p1->next=p->next;
     break;
 }


y++;  
if(y>1)p1=p1->next;
p=p->next;

}


if(jy)printf("/n/n错误,要删除的车号不存在!/n/n");
else   printf("/n/n删除成功!/n/n");
char c;
printf("/n/n您想---继续删除(A)--退出删除(E)---/n");
c=getch();
if(c=='A'||c=='a')goto loop;else  return;

}

 

 


void lookr()
{

char  c,m[20];

do
{//do的开始。

 

printf("/n/n/n              [火车查询菜单]");
printf("/n|----------------------------------|");
printf("/n|           请选择查询方式:        |");
printf("/n|----------------------------------|");
printf("/n|           A[ 火车号查询  ]       |");
printf("/n|----------------------------------|");
printf("/n|           B[ 起始地查询  ]       |");   
printf("/n|----------------------------------|");
printf("/n|           C[ 目的地查询  ]       |");   
printf("/n|----------------------------------|");
printf("/n|           D[ 退      出  ]       |");   
printf("/n|----------------------------------|");

r *p=rhead;
c=getch();
int y;

switch (c)
{
//switch的开始


case 'A':
case'a':
 
 y=1;
    printf("/n/n请输入要查找的火车号/n/n");
     scanf("%s",m);
  
 while(p)
{
 
  if(strcmp(p->num,m)==0)
  {y=0;    
  
printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s  路线:  %s---------->%s  发车时间:%s",p->num ,p->start ,p->end ,p->time);

//检验
                int jy=1;
                t*p1=thead;
                while(p1)
    {   
     
       if(strcmp(p1->num,p->num)==0) { printf("/n  总票数:  %d      剩余票数   %d      已卖票数:%d  ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0; }   
    p1=p1->next;        }  

if(jy) printf("/t[未售票]");
//检验                
printf("/n|--------------------------------------------------------------------------|");
                                        }


       p=p->next; 
}
             

if(y)  printf("失败,您查询的火车不存在!/n/n");
break;

 


case'B':
case'b':


      y=0;
 printf("/n/n请输入要查找的起始地/n/n");
     scanf("%s",m);
  
  
 while(p)
{
 
  if(strcmp(p->start,m)==0)
  {y=0;    
  
printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s  路线:  %s---------->%s  发车时间:%s",p->num ,p->start ,p->end ,p->time);

//检验
                int jy=1;
                t*p1=thead;
                while(p1)
    {   
     
       if(strcmp(p1->num,p->num)==0) { printf("/n  总票数:  %d      剩余票数   %d      已卖票数:%d  ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0; }   
    p1=p1->next;        }  

if(jy) printf("/t[未售票]");
//检验                
printf("/n|--------------------------------------------------------------------------|");
                                        }


       p=p->next; 
}
             

if(y)  printf("失败,您查询的火车不存在!/n/n");
break;

 

 


case'C':
case'c':
    
  y=0;
 printf("/n/n请输入要查找的终点站/n/n");
     scanf("%s",m);
    
 while(p)
{
 
  if(strcmp(p->end,m)==0)
  {y=0;    
  
printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s  路线:  %s---------->%s  发车时间:%s",p->num ,p->start ,p->end ,p->time);

//检验
                int jy=1;
                t*p1=thead;
                while(p1)
    {   
     
       if(strcmp(p1->num,p->num)==0) { printf("/n  总票数:  %d      剩余票数   %d      已卖票数:%d  ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0; }   
    p1=p1->next;        }  

if(jy) printf("/t[未售票]");
//检验                
printf("/n|--------------------------------------------------------------------------|");
                                        }


       p=p->next; 
}
             

if(y)  printf("失败,您查询的火车不存在!/n/n");
break;

 


 
}//switch的结束
 


}while(c!='D'&&c!='d');

 


}

 

 

 

 


void sell()
{
printf("/n/n/n              [火车售票]");

char m[20];
int y=1;
printf("/n/n请输入要购买的火车号/n/n");
scanf("%s",m);
r *p=rhead;  
 while(p)
{
  if(strcmp(p->num,m)==0)
  {y=0;    
  
printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s  路线:  %s---------->%s  发车时间:%s",p->num ,p->start ,p->end ,p->time);

                int jy=1;
                t*p1=thead;
                while(p1)
    {
     if(strcmp(p1->num,p->num)==0)
     {
     printf("/n  总票数:  %d      剩余票数   %d      已卖票数:%d  ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0;
     if(p1->n1==0){printf("/n/n错误,您要购买的火车号已经售完!/n/n");goto  loop;}
                  loop1:
     printf("/n/n请输入要购买的数量:/n/n");
     int nn;
     scanf("%d",&nn);
     if(nn>p1->n1){printf("/n/n错误,您要购买的数量不足!/n/n");goto  loop1;}
     else{p1->n1-=nn;printf("/n/n请付%f元!",p1->price*nn);printf("/n/n买票操作成功!/n/n");goto  loop;}  
     }   
      p1=p1->next;        }  

if(jy) printf("/t[未售票]");
//检验                
printf("/n|--------------------------------------------------------------------------|");
                                        }


       p=p->next; 
}
             
if(y)  printf("失败,您查询的火车不存在!/n/n");
loop:;
}

 


void back()
{
printf("/n/n/n              [火车退票]");

char m[20];
int y=1;
printf("/n/n请输入要退票的火车号/n/n");
scanf("%s",m);
r *p=rhead;  
 while(p)
{
  if(strcmp(p->num,m)==0)
  {y=0;    
  
printf("/n|--------------------------------------------------------------------------|");
printf("/n|车号:%s  路线:  %s---------->%s  发车时间:%s",p->num ,p->start ,p->end ,p->time);

                int jy=1;
                t*p1=thead;
                while(p1)
    {
     if(strcmp(p1->num,p->num)==0)
     {
     printf("/n  总票数:  %d      剩余票数   %d      已卖票数:%d  ",p1->n ,p1->n1 ,p1->n-p1->n1 ); jy=0;
     if(p1->n1==p1->n){printf("/n/n错误,您要退的火车号未起售!/n/n");goto  loop;}
                  loop1:
     printf("/n/n请输入要退票的数量:/n/n");
     int nn;
     scanf("%d",&nn);
     if(nn+p1->n1>p1->n){printf("/n/n错误,您要退的数量有误!/n/n");goto  loop1;}
     else{p1->n1+=nn;printf("/n/n请收%f元!",p1->price*nn);printf("/n/n退票操作成功!/n/n");goto  loop;}  
     }   
      p1=p1->next;        }  

if(jy) printf("/t[未售票]");
//检验                
printf("/n|--------------------------------------------------------------------------|");
                                        }


       p=p->next; 
}
             
if(y)  printf("失败,您查询的火车不存在!/n/n");
loop:;
}

 

 

 

 

 

void  add()
{
printf("/n/n/n                  [添加车票]          ");
char m[20];
printf("/n/n请输入要增加的火车号/n/n");
scanf("%s",m);
int y=1;
 t*p=thead;
while(p)
{
    if(strcmp(m,p->num)==0)
   { y=0;
  printf("/n  总票数:  %d      剩余票数   %d      已卖票数:%d  ",p->n ,p->n1 ,p->n-p->n1 ); 
     loop1:
  printf("/n/n请输入要增加的数量:/n/n");
     int nn;
     scanf("%d",&nn);
     if(nn<0){printf("/n/n错误,您的输入为负!/n/n");goto  loop1;}
     else{p->n1+=nn;p->n+=nn;printf("/n/n增加后总票数为%d,剩余票数为%d!/n/n",p->n,p->n1);printf("/n/n增加车票操作成功!/n/n");break;}  
  }  
        p=p->next;
}

 

}

 

void  stop()
{
printf("/n/n/n                  [停止售票]          ");

char m[20];
printf("/n/n请输入要停止售票的火车号/n/n");
scanf("%s",m);
int y=1;
 t*p=thead,*q;
 if(p==NULL) {printf("/n/n无该文件!/n/n");goto loop;}
 if(strcmp(m,p->num)==0){thead=thead->next;free(p);goto loop;}//为首结点时
while(p)
{
  if(strcmp(m,p->next->num)==0)
 { q=p->next;break;}  

        p=p->next;
}

p->next=q->next;

free(q);

loop:;
printf("/n/n%s停止售票成功/n/n",m);

}

 

 

void saver()
{

FILE  * fp;
fp=fopen("route.txt","w");

r *p=rhead;
int i=0;
while(p)
{
 i++;
fwrite(p,sizeof(r),1,fp);
p=p->next;
}


fclose(fp);
printf("/n/n保存%d个火车信息成功!/n",i);

}

 


void savet()
{

FILE  * fp;
fp=fopen("ticket.txt","w");

t *p=thead;
int i=0;
while(p)
{
 i++;
fwrite(p,sizeof(t),1,fp);
p=p->next;
}


fclose(fp);
printf("/n/n保存%d个火车票信息成功!/n",i);

}

 

void  clear()
{

r *p=rhead;
while(p)
{
r *temp=p->next;
free(p);
p=temp;

}
rhead=NULL;
printf("/n/n清空火车票路线信息成功!/n");

 

r *p1=rhead;
while(p1)
{
r *temp=p1->next;
free(p1);
p1=temp;
}
rhead=NULL;
printf("/n/n清空火车票信息成功!/n");

 


}
void show1()

 

printf("/n |----------------------------------------|");
printf("/n |          █主      菜      单 █       |");             
printf("/n |----------------------------------------|");
printf("/n |          A  火   车   查   询          |"); 
printf("/n |----------------------------------------|");
printf("/n |          B  购   买   车   票          |"); 
printf("/n |----------------------------------------|");
printf("/n |          C  退   回   车   票          |");
printf("/n |----------------------------------------|");
printf("/n |          D  系   统   管   理          |");
printf("/n |----------------------------------------|");
printf("/n |          E  清   空   数   据          |");
printf("/n |----------------------------------------|");
printf("/n |          F  退   出   程   序          |");             
printf("/n |----------------------------------------|");
printf("/n |             请您选择一个任务           |");
printf("/n |----------------------------------------|/n/n/n");
}

 

 


void show2()
{


printf("/n |--------------------------- -|");
printf("/n |    █管  理  菜   单█      |");             
printf("/n |-----------------------------|");
printf("/n |  A   增  加  路  线         |"); 
printf("/n |-----------------------------|");
printf("/n |  B   修  改  路  线         |"); 
printf("/n |-----------------------------|");
printf("/n |  C   新  建  车  票         |");
printf("/n |-----------------------------|"); 
printf("/n |  D   增  加  车  票         |");
printf("/n |-----------------------------|");
printf("/n |  E   取  消  路  线         |");
printf("/n |--------------------------- -|");
printf("/n |  F   退  出  程  序         |");
printf("/n |----------------------------|");
printf("/n |     请您选择一个任务        |");
printf("/n |----------------------------|/n/n/n");
}


void show()
{


printf("/n |--------------------------- -|");
printf("/n |    █查  询  菜   单█      |");             
printf("/n |-----------------------------|");
printf("/n |  A   查  询  火  车         |"); 
printf("/n |-----------------------------|");
printf("/n |  B   查  询  车  票         |"); 
printf("/n |-----------------------------|");
printf("/n |  C   具  体  查  询         |");
printf("/n |-----------------------------|");
printf("/n |  D   退  出  程  序         |");
printf("/n |-----------------------------|/n/n");
}

 

 

 

 

void  main()
{
initialr();
initialt();
char c1;
do {//do 1


show1();

c1=getch();

 

switch ( c1 )
{//switch

case 'a':
case 'A':
 
 char c;
 do{

 show();
 c=getch();
 switch(c)
 {
case 'a':
case 'A':showr();break;
case 'b':
case 'B':showt();break;
case 'c':
case 'C':lookr();break;
  
case 'd':
case 'D':break;

 }

 }while(c!='D'&&c!='d');
 
break;
  

case 'b':
case 'B':sell();break;
 
 


 
case 'c':
case 'C':back();break;
  
 

 

 

case 'd':
case 'D':

 char c2;

 do{
  show2();
 
       c2=getch();

switch ( c2)
 
{
case 'a':
case 'A':newr();break;

case 'b':
case 'B':modifyr();break;

case 'c':
case 'C':newt();break;

case 'd':
case 'D':add();break;

case 'e':
case 'E': stop();break;
 
case 'f':
case 'F': break;

}

}while(c2!='f'&&c2!='F');
break;


 

case 'e':
case 'E':clear();break;
 


case 'f':
case 'F': break;

}//switch

}//do1
while(c1!='f'&&c1!='F');

saver();
savet();

 

printf("/n/n  ★ 谢谢您的使用!★");

}

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页