正文

火车售票 -- C2007-11-25 18:44:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xboy/31149.html

分享到:

1.编写程序实现火车站售票程序(以一节车厢为例)。

下图(图1)是火车车厢内座位的布局,座位号从180

其中12, 56位于一个间隔内,3478也是一个间隔内的座位

1

5

9

13

………

………

65

69

73

77

2

6

10

14

66

70

74

78

过道

3

7

11

15

………

………

67

71

75

79

4

8

12

16

68

72

76

80

       售票规则总则 假设每次最多售4张;

                      

1张票原则:随便售出一张没有售出的票;

2张票原则:优先售2张相邻的票、如果没有2张相邻的票就随便售出两张票;

                        所谓2张相邻包括:12;  34;  56;  78等等

以下情况不算相邻: 15;  23等等

                           

3张或4票原则:优先售一个间隔内的票;

如果剩余票数不足,就提示不足, 不售票.

如果不能满足优先原则, 则售任何位置的票.

 

程序要求:

1, 定义存储车厢座位信息的数据结构和相关状态信息;

2, 编写程序模拟售票过程,程序运行允许多次售票。

3,  程序的输入为test.txt。第一行是售票的次数n,下面的n行为每次需要销售的票数,如:

4

2

4

2

3

即售票4次,每次分别为2423

4,  程序输入为result.txt。其格式为:

第一列是票数,后面是票的座位号。票数和座位和之间用空格分开。座位号之间用逗号分开。如:

1 1

2 3,4

4 9,10,13,14

2 5,6

3 11,12,15,1

 

-------------------------以下是具体实现----------------------------------------------

#include "stdio.h"
#define MAXNO 81
#define MAXNUM 4

void init();      //初始化,1--未售出,0--售出
void dealSold(int);     //票售出后,调整头指针
void irregular(int, int*);   //不满足优先级规则时处理
int sales(int, int*);

typedef struct{
 int number[MAXNO];     //0-未售出
 int left;      //剩余票数
 int head;      //指示当前的表头
}Tickets;

Tickets tickets;

void init(){
 int i=0;
 for(; i<MAXNO; i++){
  tickets.number[i] = 1;
 }
 tickets.left = MAXNO - 1;
 tickets.head = 1;
}

void dealSold(int num){
 while(tickets.number[tickets.head] == 0) tickets.head++;
 tickets.left -= num;
}

void irregular(int num, int *buff){
 int count=0;
 int item= tickets.head;
 while(count < num) {
  if(tickets.number[item] != 0){
   tickets.number[item]=0;
   printf("%d ", item);
   buff[count]=item;
   count++;
  }
  item++;
 }
}

int sales(int num, int *buff){
 int irrgular = 1;    //是否满足优先原则标志,1为不满足
 int item = tickets.head;
 if(num > MAXNUM){
  printf("您一次最多只能买%d张票", MAXNUM);
  return 0;
 }
 if(num > tickets.left){
  printf("很抱歉,仅剩下%d张票", tickets.left);
  return 0;
 }
 switch(num){
  case 1:   
   break;
  case 2:
   while(item % 2 == 0 || tickets.number[item] == 0 || tickets.number[item + 1] == 0)
    item++;
   if(item < MAXNO-num-1) {
    tickets.number[item] = tickets.number[item+1] = 0;
    printf("%d %d", item, item+1);
    buff[0]=item; buff[1]=item+1;
    irrgular = 0;
   }
   break;
  case 3:
   for(; item<MAXNO-num-1 && irrgular; item++){
    if((item/4) % 2 == 0){   //偶数列
     if(item%4 % 2 == 1){  //奇数行
      if(tickets.number[item] != 0 && tickets.number[item+1] !=0 && tickets.number[item+4] != 0){
       tickets.number[item] = tickets.number[item+1] = tickets.number[item+4] = 0;
       printf("%d %d %d", item, item+1, item+4);
       buff[0]=item; buff[1]=item+1; buff[2]=item+4;
       irrgular = 0;       
      }else if(tickets.number[item] != 0 && tickets.number[item+4] !=0 && tickets.number[item+5] != 0){
       tickets.number[item] = tickets.number[item+4] = tickets.number[item+5] = 0;
       printf("%d %d %d", item, item+4, item+5);
       buff[0]=item; buff[1]=item+4; buff[2]=item+5;
       irrgular = 0;      
      }else if(tickets.number[item+1] != 0 && tickets.number[item+4] !=0 && tickets.number[item+5] != 0){
       tickets.number[item+1] = tickets.number[item+4] = tickets.number[item+5] = 0;
       printf("%d %d %d", item+1, item+4, item+5);
       buff[0]=item+1; buff[1]=item+4; buff[2]=item+5;
       irrgular = 0;       
      }
     }
    }
   }
   break;
  case 4:
   for(; item<MAXNO-num-1 && irrgular; item++){
    if((item/4 % 2 == 0) && (item%4 % 2 == 1)){
     if(tickets.number[item] !=0 && tickets.number[item+1] !=0 && tickets.number[item+4] != 0 && tickets.number[item + 5] != 0){
      tickets.number[item] = tickets.number[item+1] = tickets.number[item+4] = tickets.number[item + 5] = 0;
      printf("%d %d %d %d", item, item+1, item+4, item+5);
      buff[0]=item; buff[1]=item+1; buff[2]=item+4; buff[3]=item+5;
      irrgular = 0;     
     }
    }
   }   
   break;
  default: printf("请正确输入\n"); return 0;
 }
 
 if(irrgular) irregular(num, buff); //没有符合优先规则的票
 dealSold(num);
 if(tickets.left == 0) {
  printf("\n票以售完\n\n");
  return 0;
 }
 return 1;
}


int main(){
 int num = -1;      //购买数量 
 int i= 0;
 int buff[4]={0};
 FILE *in, *out;
 
 init();
 
 if((out=fopen("result.txt", "w"))==NULL){
  printf("打开文件出错\n");
  exit(0); 
 }
 if((in=fopen("test.txt", "r"))==NULL){
  printf("打开文件出错\n");
  exit(0);
 }
 else{
  while(!feof(in)){
   fscanf(in, "%d", &num);   
   printf("\n要购买的火车票数为:%d\n", num);
   if(sales(num, buff)){
    fprintf(out, "%d ", num);
    for(i=0; i<num; i++){
     fprintf(out, "%d", buff[i]);
     if(i < num-1) fprintf(out, ", ");
    }
    fprintf(out, "\n");
   }
  }
 }
 printf("\n结果已保存在result.txt中\n");
 fclose(in);
 fclose(out);
 
 return 0;
}

阅读(2349) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册