Advertisement

简易火车票售票系统

阅读量:
复制代码
 #include <iostream>

    
 #include <string>
    
 using namespace std;
    
 #define maxsize 100
    
 int n;//全局站点总数
    
 int max=0,min=0;
    
 int ship[maxsize][maxsize]={0};//全局票数矩阵
    
 int maxnum(int a[])
    
 {
    
 	int i=0;
    
 	int max=0;
    
 	for(i=0;i<n;i++)
    
 	{
    
 		if(a[i]>max) max = a[i];
    
 	}
    
 	return max;
    
 }
    
 int minnum(int a[])
    
 {
    
 	int i=0;
    
 	int min=a[0];
    
 	for(i=0;i<n;i++)
    
 	{
    
 		if(a[i]<min)  min= a[i];
    
 	}
    
 	return min;
    
 }
    
 int strtonum(string s)
    
 {
    
 	int i=0;
    
 	int len=s.length();
    
 	int n=1;
    
 	int sum=0;
    
 	for(i=len-1;i>=0;i--)
    
 	{
    
 		sum=sum+(s[i]-'0')*n;
    
 		n=n*10;
    
 	}
    
 	return sum;
    
 }
    
  
    
 void Find(string s)
    
 {
    
 	int ticks=0;
    
 	int i=0;
    
 	int len=s.length();
    
 	int pos[2]={0};
    
 	int j=0;
    
 	for(i=0;i<len;i++)
    
 	{
    
 		if(s[i]==' ')
    
 		{
    
 			pos[j]=i;
    
 			j++;
    
 		}
    
 		if(j==2) break;
    
 	}
    
 	int start=strtonum(s.substr(pos[0]+1,pos[1]-pos[0]-1));
    
 	int end=strtonum(s.substr(pos[1]+1,len-pos[1]-1));
    
 	for(i=0;i<=max-min;i++)
    
 	{
    
 		for(j=0;j<=max-min;j++)
    
 		{
    
 			if(i<=(start-min) && j>=(end-min))
    
 			{
    
 				ticks=ticks+ship[i][j];
    
 			}
    
 		}
    
 	}
    
 	cout<<ticks<<endl;
    
 }
    
 void sell(string s)
    
 {
    
 	int i=0;
    
 	int flag=0;//票是否卖成功
    
 	int len=s.length();
    
 	int pos[2]={0};
    
 	int j=0;
    
 	for(i=0;i<len;i++)
    
 	{
    
 		if(s[i]==' ')
    
 		{
    
 			pos[j]=i;
    
 			j++;
    
 		}
    
 		if(j==2) break;
    
 	}
    
 	int start=strtonum(s.substr(pos[0]+1,pos[1]-pos[0]-1));
    
 	int end=strtonum(s.substr(pos[1]+1,len-pos[1]-1));
    
 	if(ship[start-min][end-min]>0)
    
 	{
    
 		ship[start-min][end-min]=ship[start-min][end-min]-1;
    
 		flag=1;//直接就有这么目的地的票,卖出去,买成功
    
 	}
    
 	else
    
 	{
    
 		for(i=0;i<=max-min;i++)
    
 		{
    
 			for(j=0;j<=max-min;j++)
    
 			{
    
 				if(i<=(start-min) && j>=(end-min))//没有直接目的地的票,但有可以拆分的票
    
 				{
    
 					if(ship[i][j]>1)
    
 					{
    
 						ship[i][j]=ship[i][j]-1;
    
 						flag=1;
    
 						if(start-min>i)
    
 						{
    
 							ship[i][start-min]=ship[i][start-min]+1;//拆分后剩下的那部票
    
  
    
 						}
    
 						if(j>end-min)
    
 						{
    
 							ship[end-min][j]=ship[end-min][j]+1;
    
 						}
    
  
    
 					}
    
 				}
    
 			}
    
 		}
    
 	}
    
 	if(flag==0) cout<<"没有"<<start<<"到"<<end<<"的票"<<endl;
    
 }
    
 void display()
    
 {
    
 	int i=0,j=0;
    
 	for(i=0;i<=max-min;i++)
    
 	{
    
 		for(j=0;j<=max-min;j++)
    
 		{
    
 			cout<<ship[i][j]<<" ";
    
 		}
    
 		cout<<endl;
    
 	}
    
 }
    
 int main()
    
 {
    
 	cin>>n;//站点总数
    
 	int num[maxsize];
    
 	int i=0,j=0;
    
 	for(i=0;i<n;i++)
    
 	{
    
 		cin>>num[i];
    
 	}
    
 	int ticketcount=0;
    
 	cin>>ticketcount;//票数
    
 	max=maxnum(num);
    
 	min=minnum(num);
    
 	ship[0][max-min]=ticketcount;
    
 	string command[maxsize];
    
 	getchar();
    
 	i=0;
    
 	getline(cin,command[i]);
    
 	while(command[i]!="")
    
 	{
    
 		i++;
    
 		getline(cin,command[i]);
    
 	}
    
 	int mannum=i;
    
 	for(i=0;i<mannum;i++)
    
 	{
    
 		if(command[i][0]=='F')
    
 		{
    
 			Find(command[i]);
    
 		}
    
 		else if(command[i][0]=='S')
    
 		{
    
 			sell(command[i]);
    
 		}
    
 		else
    
 		{
    
 			cout<<command[i]<<"这个命令无效!"<<endl;
    
 		}
    
 	}
    
 	//display();
    
 	return 0;
    
 }
    
    
    
    
    代码解释

代码:

全部评论 (0)

还没有任何评论哟~