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;}

评论