正文

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

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

分享到:

1.编写程序实现火车站售票程序(以一节车厢为例)。 下图(图1)是火车车厢内座位的布局,座位号从1到80; 其中1,2, 5,6位于一个间隔内,3、4、7、8也是一个间隔内的座位… 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张相邻包括:1和2;  3和4;  5和6;  7和8等等 以下情况不算相邻: 1和5;  2和3等等                             售3张或4票原则:优先售一个间隔内的票; 如果剩余票数不足,就提示不足, 不售票. 如果不能满足优先原则, 则售任何位置的票.   程序要求: 1, 定义存储车厢座位信息的数据结构和相关状态信息; 2, 编写程序模拟售票过程,程序运行允许多次售票。 3,  程序的输入为test.txt。第一行是售票的次数n,下面的n行为每次需要销售的票数,如: 4 2 4 2 3 即售票4次,每次分别为2、4、2、3。 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;}

阅读(2395) | 评论(0)


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

评论

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