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