⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 轮渡管理.cpp

📁 数据结构:轮渡管理
💻 CPP
字号:
//进行轮渡管理的主程序文件“轮渡管理.cpp”
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include"链接队列.cpp"

//输出每次轮渡所载汽车的编号
void Print(int a[],int n)
{
	long t; t=time(0);  //当前机器时间被保存到t中,单位为秒
	cout<<endl;
	cout<<"轮渡开始起航->"<<endl;
	cout<<"本次过江时间:"<<ctime(&t)<<endl;
	    //ctime(&t)函数的值为当前日期和时间的字符串
	cout<<"本次轮渡所载汽车:";
	for(int i=0; i<n; i++)
		cout<<a[i]<<' ';
	cout<<endl;
}

//输出当前汽车排队等待情况
template<class ElemType>
void OutputQueue(QueueLK<ElemType>& q1, QueueLK<ElemType>& q2)
{
	cout<<"客车排队的情况:";
	 sNode<ElemType>* p=q1.GetFront();
	 if(p==NULL) cout<<"暂时无客车等候。"<<endl;
	 while(p!=NULL){
		 cout<<p->data<<' ';
		 p=p->next;
	 }
	 cout<<endl;
	 cout<<"货车排队的情况:";
	 p=q2.GetFront();
	 if(p==NULL) cout<<"暂无货车等候。"<<endl;
	 while(p!=NULL){
		 cout<<p->data<<' ';
		 p=p->next;
	 }
	 cout<<endl;
}

void main()
{
	//q1和q2队列用来分别存储待渡江的客车和货车
    QueueLK<int>q1,q2;
	//用flag保存用户选择,用mark登记轮渡到渡口
	int flag, mark=0;
	//用数组a记录轮渡上汽车号,用n记录汽车的个数
	int a[10], n=0;
	//用t1和t2登记时间
	long t1, t2;
	//程序处理过程
	do {
		//显示功能表并接受用户选择
        L1:cout<<"功能表:"<<endl;
		cout<<"1---车到渡口进行登记"<<endl;
		cout<<"2---轮渡到渡口进行登记"<<endl;
		cout<<"3---汽车上轮渡"<<endl;
		cout<<"4---命令轮渡起航"<<endl;
		cout<<"5---输出当前汽车排队情况"<<endl;
		cout<<"6---结束程序运行"<<endl;
		cout<<"请输你的选择(1-6):";
		do {
			cin>>flag;
			if(flag<1 ||flag>6) cout<<"输入功能号错,重输:";
		} while(flag<1 || flag>6);
		int x,i;
		//根据不同选择进行相应处理
		switch(flag){
		case 1:
			cout<<"输入车辆号,小于100为客车,否则为货车,"<<endl;
			cout<<"可以输入多辆车,用空格分开,直到输入-1为止。"<<endl;
			while (1) {
				cin>>x;
				if(x==-1) break;
				if(x<100) q1.EnQueue(x);
				else q2.EnQueue(x);
			}
			break;
		case 2:
			if(mark==1){
				cout<<"轮渡已在渡口等待,不要重复登记!"<<endl;
				break;
			}
			mark=1;
			n=0;
			t1=time(0);
			break;
		case 3:
			if(q1.EmptyQueue() && q2.EmptyQueue()){
				cout<<"暂无汽车过江!"<<endl;
				if(mark==1 && n!=0){
					t2=time(0)-t1;  //计算到目前为止轮渡等待时间的秒数
					cout<<"轮渡未满,有车"<<n<<"辆,已等待"<<t2/60<<"分";
					cout<<t2%60<<"秒,等候其它汽车上轮渡!"<<endl;
				}
				break;
			}
			if(mark!=1){
				cout<<"轮渡未到,请汽车稍后上轮渡!"<<endl;
				break;
			}
			do {
				i=0;
				//首先上四辆客车
				while(!q1.EmptyQueue() && n<10 && i<4){
					a[n++]=q1.OutQueue();
					i++;
				}
				//满10辆则开船
				if(n==10) {Print(a,n); mark=0; n=0; goto L1;}
				//进4辆客车则接着进一辆货车,不满4辆则由货车补
				if(i==4){
					if(!q2.EmptyQueue()) a[n++]=q2.OutQueue();
				}
				else {
					while(!q2.EmptyQueue() && n<10 && i<5) {
						a[n++]=q2.OutQueue();
						i++;
					}
				}
				//满10辆则开船
				if(n==10) {Print(a,n); mark=0; n=0; goto L1;}
			} while(!q1.EmptyQueue() || !q2.EmptyQueue());
			//只要客车或货车队列不全为空,则循环
			t2=time(0)-t1;   //登记轮渡已经等待时间的秒数
			cout<<"轮渡上有车"<<n<<"辆,已等待"<<t2/60<<"分"<<t2%60;
			cout<<"秒,等候其它汽车上轮渡!"<<endl;
			break;
		case 4:
			if(n==0 || mark==0)
				cout<<"轮渡上无车过江或根本无轮渡!不需要起航!"<<endl;
			else {
				Print(a,n); mark=0; n=0;
			}
			break;
		case 5:
			OutputQueue(q1,q2);
			break;
		case 6:
			if(!q1.EmptyQueue() || !q2.EmptyQueue()) {
				cout<<"还有汽车未渡江,暂时不能结束!"<<endl;
				break;
			}
			if(n!=0) {
				cout<<"轮渡上有车,不能结束,需命令开轮渡!"<<endl;
				break;
			}
			cout<<"程序运行结束!"<<endl;
			return;
		}
	}while(1);
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -