火车站售票程序(C语言)

火车车厢内座位的布局

159               7377
2610               7478
                  
3711               7579
4812               7680

座位号从1到80;其中1.2.5.6位于一个间隔内,3.4.7.8也是一个间隔内的座位.售票规则总则,假设每次最多售4张;

售1张票;随机

售2张票:优先售货员张相邻的票,如果没有2张相邻的票就随机卖两张;所谓张相邻包括:1和2,3和4,5和6,7和8等等;

以下情况不算相邻:1和5,2和3等

售3张或4张:优先售一个间隔内的票如果不足,就提示,不售票如果不能满足优先原则,则售任何位置的票.

request.txt

2 4 1 2 3 1 4 1 4  3

1 3 2 3 3 1 2 1 1 4

程序如下:

 #include "stdio.h"
 #define A SeatState[i][j]=='T'//同一间隔内座位状态信息,T表示未售出
 #define B SeatState[i+1][j]=='T'
 #define C SeatState[i][j+1]=='T'
 #define D SeatState[i+1][j+1]=='T'
 int Seatmessage[4][20];//存放座位号的数组
 char SeatState[4][20];//存放座位状态信息的数组
 static int Count=0;//记录售出票数的静态常量

 bool GetRequest(int *p)//将每次购票的要求从文件读入
  {
   static FILE* fp = fopen("d://request.txt","r");
   static int nIndex = 0;
   static int inputData[80] = {0};
   static bool isfirst = true;
   int i;
 if(isfirst)
   {
    for(i = 0; i < 80; i++ )
    {
     if(fscanf(fp,"%d",&inputData[i]) == EOF)
      break;
    }
    isfirst = false;
    fclose(fp);
   }
   if(inputData[nIndex] == 0 || nIndex == 80) return false;
   *p = inputData[nIndex++];
   return true;
  }

 void OutputResult(int * SeatNum, int Count)//将每次售票结果输入到文件
  {
   FILE* fp = fopen("d://result.txt","a");
   int i;
  /* fprintf(fp,"==========================/n");  */
   for(i = 0; i < Count; i++)
   {
    fprintf(fp,"%d,", SeatNum[i]);
   }
   fprintf(fp,"/n");
   fclose(fp);
  }

 void sale1()//售出一张票的函数
  {
  int i=0,j=0,SeatNum[5];
  for(i=0;i<4;i++)
   {
  for(j=0;j<20;j++)
    {if(A)
    break;
    }
   if(A)
   break;
   }
   SeatNum[0]=Seatmessage[i][j];
   SeatState[i][j]='F';
   Count++;
   OutputResult(SeatNum,1);
  }
  void sale2()//售出两张票的函数
   {
   int i=0,j=0,SeatNum[5];
   for(i=0;i<3;i+=2)
    {
    for(j=0;j<20;j++)
     {
     if(A&&B)
     break;
     }
     if(A&&B)
     break;
    }
  /* printf("%d  %d/n",i,j);  */
    
      if(A&&B)
      {
       SeatNum[0]=Seatmessage[i][j];
       SeatNum[1]=Seatmessage[i+1][j];
       SeatState[i][j]='F';
       SeatState[i+1][j]='F';
       Count+=2;
       OutputResult(SeatNum,2);
      }
      else
       {
        for(int k=0;k<2;k++)
        sale1();
       }
   }

  void sale3()//售出三张票的函数
   {
   int i=0,j=0,SeatNum[5];
   for(i=0;i<3;i+=2)
    {
    for(j=0;j<18;j+=2)
     {
     if(A&&B&&C)
      {
       break;   
      }
     else if(A&&B&&D)
      {
       break;
      }
      else if(A&&C&&D)
       {
        break;
       }
       else if(B&&C&&D)
        {
         break;
        }
     }
    if(A&&B&&C)break;
    else if(A&&B&&D)break;
    else if(A&&C&&D)break;
    else if(B&&C&&D)break;
    }
   if(A&&B&&C)
   {
      SeatNum[0]=Seatmessage[i][j];
      SeatNum[1]=Seatmessage[i+1][j];
      SeatNum[2]=Seatmessage[i][j+1];
      SeatState[i][j]='F';
      SeatState[i+1][j]='F';
      SeatState[i][j+1]='F';
      Count+=3;
      OutputResult(SeatNum,3);
   }
   else if((A&&B&&D))
     {
      SeatNum[0]=Seatmessage[i][j];
      SeatNum[1]=Seatmessage[i+1][j];
      SeatNum[2]=Seatmessage[i+1][j+1];
      SeatState[i][j]='F';
      SeatState[i+1][j]='F';
      SeatState[i+1][j+1]='F';
      Count+=3;
      OutputResult(SeatNum,3); 
     }
   else if(A&&C&&D)
     {
      SeatNum[0]=Seatmessage[i][j];
      SeatNum[1]=Seatmessage[i][j+1];
      SeatNum[2]=Seatmessage[i+1][j+1];
      SeatState[i][j]='F';
      SeatState[i][j+1]='F';
      SeatState[i+1][j+1]='F';
      Count+=3;
      OutputResult(SeatNum,3);
     }
   else if(B&&C&&D)
     {
      SeatNum[0]=Seatmessage[i+1][j];
      SeatNum[1]=Seatmessage[i][j+1];
      SeatNum[2]=Seatmessage[i+1][j+1];
      SeatState[i+1][j]='F';
      SeatState[i][j+1]='F';
      SeatState[i+1][j+1]='F';
      Count+=3;
      OutputResult(SeatNum,3);
     }
   else
    {
     for(int k=0;k<3;k++)
     sale1();
    }
  }

  void sale4()//售出四张票的函数
   { 
   int i=0,j=0,SeatNum[5];
   for(i=0;i<3;i+=2)
    {
    for(j=0;j<18;j+=2)
     {
      if(A&&B&&C&&D)
      break;
     }
    if(A&&B&&C&&D)
    break;
    }
     
     if(A&&B&&C&&D)
      {
       SeatNum[0]=Seatmessage[i][j];
       SeatNum[1]=Seatmessage[i+1][j];
       SeatNum[2]=Seatmessage[i][j+1];
       SeatNum[3]=Seatmessage[i+1][j+1];
       SeatState[i][j]='F';
       SeatState[i+1][j]='F';
       SeatState[i][j+1]='F';
       SeatState[i+1][j+1]='F';
       Count+=4; 
       OutputResult(SeatNum,4);
      }
     else
      {
       for(int k=0;k<4;k++)
       sale1();
      }
  }

 void main()
   {
    for(int i=0;i<4;i++)
    for(int j=0;j<20;j++)
    Seatmessage[i][j]=i+4*j+1;
    /* for(i=0;i<4;i++)
      {
      for(int j=0;j<20;j++)
       {
        printf("%4d",Seatmessage[i][j]);
       } 
      printf("/n");
      } */
    //用二维数组存储座位号信息

    for(i=0;i<4;i++)
    {
    for(int j=0;j<20;j++)
     {
      SeatState[i][j]='T';
     /* printf("%4c",SeatState[i][j]); */
     } 
   /* printf("/n"); */
    } //初始状态为T时说明票尚未卖出

   int *p;
   int S[2];
   p=S;
   while(GetRequest(S))
  /* {printf("%d/n",*p);} */  //输出读入的需求 
  if(*p<=80-Count)
   switch(*p)
   {
    case 1 : sale1();break;
    case 2 : sale2();break;
    case 3 : sale3();break;
    case 4 : sale4();break;
    default : printf("error/n");
   }
  else
   if(*p>80-Count)
    {
     printf("票数不足,您最多还可以买到%d张票!!!/n",80-Count);
     break;
    }
/* for(i=0;i<4;i++) //屏幕显示坐位信息与状态
 {
 for(int j=0;j<20;j++)
  {
   printf("%4d",Seatmessage[i][j]);
  } 
   printf("/n");
 }
 for(i=0;i<4;i++)
  {
  for(int j=0;j<20;j++)
   {
    printf("%4c",SeatState[i][j]);
   }
  }
  */

/* printf("%d/n",Count);*/   //统计售出的票数
 }

 
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值