C++实现火车售票
编写程序实现火车站售票程序(以一节车厢为例)。
下图是火车车厢内座位的布局,座位号从1到80;
其中1、2、 5、6位于一个间隔内,3、4、7、8也是一个间隔内的座位…等等;以下情况不算相邻: 1和5; 2和3等等。
售票规则总则:
1.假设每次最多售4张;
2.售1张票原则:随便售出一张没有售出的票;
3.售2张票原则:优先售2张相邻的票、如果没有2张相邻的票就随便售出两张票;所谓2张相邻包括:1和2; 3和4; 5和6; 7和8等等;以下情况不算相邻: 1和5; 2和3等等
4.售3张或4票原则:优先售一个间隔内的票;
注:随便售出:可以指定从小号开始。如果剩余票数不足,就提示不足, 不售票。如果不能满足优先原则, 则可从小号票开始出售。
程序要求:
1.定义存储车厢座位信息的数据结构和相关状态信息;
2.编写程序模拟售票过程,售票张数n由用户输入。(n =1,2,3,4)
3.程序输出如下所示
源代码
#include <iostream>
using namespace std;
int seat(int ticket[4][20])
{
int m,n;
int a;
for (m=0; m<4; m++)
{
a = 0;
for (n=0; n<20; n++)
{
switch(m)
{
case 0:
ticket[m][n] = 1+a;
a += 4;
break;
case 1:
ticket[m][n] = 2+a;
a += 4;
break;
case 2:
ticket[m][n] = 3+a;
a += 4;
break;
case 3:
ticket[m][n] = 4+a;
a += 4;
break;
}
}
}
return ticket[4][20];
}
void start(int ticket[4][20])
{
cout << "原始座位图:" << endl;
int m,n;
int a;
for (m=0; m<4; m++)
{
if (m == 2)
{
cout << endl;
}
a = 0;
for (n=0; n<20; n++)
{
if (!(a%2))
{
cout << "|";
printf("%2d",ticket[m][n]);
}
else
{
printf(" %2d",ticket[m][n]);
}
a++;
}
cout << "|" << endl;
}
}
int sale(int ticket[4][20])
{
int m,n;
for(n=0; n<20; n++)
{
for(m=0; m<4; m++)
{
if(ticket[m][n] != 0)
{
cout << ticket[m][n] << " ";
ticket[m][n] = 0;
return ticket[4][20];
}
}
}
}
int sale1(int ticket[4][20])
{
int m,n;
for(n=0; n<20; n++)
{
for(m=0; m<4; m++)
{
if(ticket[m][n] != 0)
{
cout << "你所购买的票为:" << ticket[m][n] << endl;
ticket[m][n] = 0;
return ticket[4][20];
}
}
}
}
int sale2(int ticket[4][20])
{
int m,n;
for(n=0; n<20; n++)
{
for(m=0; m<3; m+=2)
{
if(ticket[m][n]!=0 && ticket[m+1][n]!=0)
{
cout << "你所购买的票为:" << ticket[m][n] << " " << ticket[m+1][n] << endl;
ticket[m][n] = 0;
ticket[m+1][n] = 0;
return ticket[4][20];
}
}
}
cout << "你所购买的票为:";
sale(ticket);
sale(ticket);
cout << endl;
return ticket[4][20];
}
int sale3(int ticket[4][20])
{
int m,n;
for(n=0; n<19; n+=2)
{
for(m=0; m<3; m+=2)
{
if(ticket[m][n]!=0 && ticket[m+1][n]!=0 && ticket[m][n+1]!=0)
{
cout << "你所购买的票为:" << ticket[m][n] << " " << ticket[m+1][n] << " " << ticket[m][n+1] << endl;
ticket[m][n] = 0;
ticket[m+1][n] = 0;
ticket[m][n+1] = 0;
return ticket[4][20];
}
else if(ticket[m+1][n]!=0 && ticket[m][n+1]!=0 && ticket[m+1][n+1]!=0)
{
cout << "你所购买的票为:" << ticket[m+1][n] << " " << ticket[m][n+1] << " " << ticket[m+1][n+1] << endl;
ticket[m+1][n] = 0;
ticket[m][n+1] = 0;
ticket[m+1][n+1] = 0;
return ticket[4][20];
}
}
}
cout << "你所购买的票为:";
sale(ticket);
sale(ticket);
sale(ticket);
cout << endl;
return ticket[4][20];
}
int sale4(int ticket[4][20])
{
int m,n;
for(n=0; n<19; n+=2)
{
for(m=0; m<3; m+=2)
{
if(ticket[m][n]!=0 && ticket[m+1][n]!=0 && ticket[m][n+1]!=0 && ticket[m+1][n+1])
{
cout<< "你所购买的票为:" << ticket[m][n] << " " << ticket[m+1][n] << " " << ticket[m][n+1] << " " << ticket[m+1][n+1] << endl;
ticket[m][n] = 0;
ticket[m+1][n] = 0;
ticket[m][n+1] = 0;
ticket[m+1][n+1] = 0;
return ticket[4][20];
}
}
}
cout << "你所购买的票为:";
sale(ticket);
sale(ticket);
sale(ticket);
sale(ticket);
cout << endl;
return ticket[4][20];
}
void update(int ticket[4][20])
{
int m,n;
int a;
for (m=0; m<4; m++)
{
if (m == 2)
{
cout << endl;
}
a = 0;
for (n=0; n<20; n++)
{
if (!(a%2))
{
cout << "|";
}
if(ticket[m][n] == 0)
{
cout << " - ";
}
else
{
printf("%2d ",ticket[m][n]);
}
a++;
}
cout << "|" << endl;
}
}
int main()
{
int ticket[4][20];
seat(ticket);
start(ticket);
int sum = 80;
for(; sum>0;)
{
cout << "输入要购买的票数:" << endl;
int n;
cin >> n;
switch(n)
{
case 1:
if(sum >= 1)
{
sale1(ticket);
sum -= 1;
update(ticket);
}
else
{
cout << "票不够1张" << endl;
}
break;
case 2:
if(sum >= 2)
{
sale2(ticket);
sum -= 2;
update(ticket);
}
else
{
cout << "票不够2张" << endl;
}
break;
case 3:
if(sum >= 3)
{
sale3(ticket);
sum -= 3;
update(ticket);
}
else
{
cout << "票不够3张" << endl;
}
break;
case 4:
if(sum >= 4)
{
sale4(ticket);
sum -= 4;
update(ticket);
}
else
{
cout << "票不够4张" << endl;
}
break;
default:
cout << "一次最多购买4张." << endl;
break;
}
}
system("pause");
return 0;
}