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

📄 电梯管理 程序.cpp

📁 电梯管理 程序.rar 电梯管理 程序.rar
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//电梯管理程序
#include <windows.h>
#include <iostream.h>
#include <stdio.h>
#define max_persons 15
bool operation_state=1;			//控制电梯是否运行	
	
struct floors					//楼层状态
{bool up;						//楼层的“上”按钮状态
 bool down;						//楼层的“下”按钮状态
 int up_persons;				//在该楼层等待上楼的人数
 int down_persons;				//在该楼层等待下楼的人数
}floor[12];


struct lift_state				//电梯状态
{int stay_in_floor;             //电梯所在的楼层
 bool up;						//电梯的运动状态
 bool down;						//电梯的运动状态
 bool stay;						//电梯的运动状态
 int all_persons;				//电梯内的总人数
 int out_persons[12];			//电梯内的人准备在各层出去的人数
 bool inbutton_state[12];		//电梯内的按钮状态
}lift1={0,0,0,1,0};
lift_state lift2={0,0,0,1,0};

DWORD id1,id2,id3;
HANDLE hbutton,hprint,hprint2;

DWORD WINAPI print(PVOID);
DWORD WINAPI button(PVOID);
DWORD WINAPI print2(PVOID);



void main(void)					//主函数
{int i;	
 //初始化电梯状态
 for (i=0;i<12;i++)
 {lift1.inbutton_state[i]=0;
  lift1.out_persons[i]=0;
  lift2.inbutton_state[i]=0;
  lift2.out_persons[i]=0;
 }
 //初始化楼层状态
 for (i=0;i<12;i++)
 {floor[i].up=0;
  floor[i].down=0;
  floor[i].up_persons=0;
  floor[i].down_persons=0;
 }
  hprint2=CreateThread(NULL,0,print2,0,0,&id3);			//创建管理输出的线程
  hprint=CreateThread(NULL,0,print,0,0,&id2);			//创建管理输出的线程
  hbutton=CreateThread(NULL,0,button,0,0,&id1);			//创建管理各种按钮的线程
  while (operation_state)
	  ;
}


//实现管理各种按钮的函数
DWORD WINAPI button(PVOID PARAM)
	{char ch;
	 while (operation_state)
	 {
	  ch=getchar();
	 SuspendThread(hprint);		 //挂起print线程
	 SuspendThread(hprint2);	//挂起print2线程
	  switch (ch)
	  {   case '`': floor[0].up=1;cout<<"请输入在地下2层等待上楼的人数:"<<endl;cin>>floor[0].up_persons;break;
	      case '1': floor[1].up=1;cout<<"请输入在地下1层等待上楼的人数:"<<endl;cin>>floor[1].up_persons;break;
	      case '2':floor[1].down=1;cout<<"请输入在地下1层等待下楼的人数:"<<endl;cin>>floor[1].down_persons;break;
	      case '3':floor[2].up=1;cout<<"请输入在第0层等待上楼的人数:"<<endl;cin>>floor[2].up_persons;break;
	      case '4':floor[2].down=1;cout<<"请输入在第0层等待下楼的人数:"<<endl;cin>>floor[2].down_persons;break;
		  case '5':floor[3].up=1;cout<<"请输入在第1层等待上楼的人数:"<<endl;cin>>floor[3].up_persons;break;
		  case '6':floor[3].down=1;cout<<"请输入在第1层等待下楼的人数:"<<endl;cin>>floor[3].down_persons;break;
		  case '7':floor[4].up=1;cout<<"请输入在第2层等待上楼的人数:"<<endl;cin>>floor[4].up_persons;break;
		  case '8':floor[4].down=1;cout<<"请输入在第2层等待下楼梯的人数:"<<endl;cin>>floor[4].down_persons;break;
		  case '9':floor[5].up=1;cout<<"请输入在第3层等待上楼的人数:"<<endl;cin>>floor[5].up_persons;break;
		  case '0':floor[5].down=1;cout<<"请输入在第3层等待下楼的人数:"<<endl;cin>>floor[5].down_persons;break;
		  case '-':floor[6].up=1;cout<<"请输入在第4层等待上楼的人数:"<<endl;cin>>floor[6].up_persons;break;
		  case '=':floor[6].down=1;cout<<"请输入在第4层等待下楼的人数:"<<endl;cin>>floor[6].down_persons;break;
		  case '\\':floor[7].up=1;cout<<"请输入在第5层等待上楼的人数:"<<endl;cin>>floor[7].up_persons;break;
		  case 'q':floor[7].down=1;cout<<"请输入在第5层等待下楼的人数:"<<endl;cin>>floor[7].down_persons;break;
		  case 'w':floor[8].up=1;cout<<"请输入在第6层等待上楼的人数:"<<endl;cin>>floor[8].up_persons;break;
		  case 'e':floor[8].down=1;cout<<"请输入在第6层等待下楼的人数:"<<endl;cin>>floor[8].down_persons;break;
		  case 'r':floor[9].up=1;cout<<"请输入在第7层等待上楼的人数:"<<endl;cin>>floor[9].up_persons;break;
		  case 't':floor[9].down=1;cout<<"请输入在第7层等待下楼的人数:"<<endl;cin>>floor[9].down_persons;break;
		  case 'y':floor[10].up=1;cout<<"请输入在第8层等待上楼的人数:"<<endl;cin>>floor[10].up_persons;break;
		  case 'u':floor[10].down=1;cout<<"请输入在第8层等待下楼的人数:"<<endl;cin>>floor[10].down_persons;break;
		  case 'i':floor[11].down=1;cout<<"请输入在第9层等待下楼的人数:"<<endl;cin>>floor[11].down_persons;break;
		  case 'a':lift1.inbutton_state[0]=1;cout<<"请输入电梯内1的人准备在地下2层出去的人数:"<<endl;cin>>lift1.out_persons[0];break;
		  case 's':lift1.inbutton_state[1]=1;cout<<"请输入电梯内1的人准备在地下1层出去的人数:"<<endl;cin>>lift1.out_persons[1];break;
		  case 'd':lift1.inbutton_state[2]=1;cout<<"请输入电梯内1的人准备在第0层出去的人数:"<<endl;cin>>lift1.out_persons[2];break;
		  case 'f':lift1.inbutton_state[3]=1;cout<<"请输入电梯内1的人准备在第1层出去的人数:"<<endl;cin>>lift1.out_persons[3];break;
		  case 'g':lift1.inbutton_state[4]=1;cout<<"请输入电梯内1的人准备在第2层出去的人数:"<<endl;cin>>lift1.out_persons[4];break;
		  case 'h':lift1.inbutton_state[5]=1;cout<<"请输入电梯内1的人准备在第3层出去的人数:"<<endl;cin>>lift1.out_persons[5];break;
		  case 'j':lift1.inbutton_state[6]=1;cout<<"请输入电梯内1的人准备在第4层出去的人数:"<<endl;cin>>lift1.out_persons[6];break;
		  case 'k':lift1.inbutton_state[7]=1;cout<<"请输入电梯内1的人准备在第5层出去的人数:"<<endl;cin>>lift1.out_persons[7];break;
		  case 'l':lift1.inbutton_state[8]=1;cout<<"请输入电梯内1的人准备在第6层出去的人数:"<<endl;cin>>lift1.out_persons[8];break;
		  case ';':lift1.inbutton_state[9]=1;cout<<"请输入电梯内1的人准备在第7层出去的人数:"<<endl;cin>>lift1.out_persons[9];break;
		  case '\'':lift1.inbutton_state[10]=1;cout<<"请输入电梯内1的人准备在第8层出去的人数:"<<endl;cin>>lift1.out_persons[10];break;
		  case 'z':lift1.inbutton_state[11]=1;cout<<"请输入电梯内1的人准备在第9层出去的人数:"<<endl;cin>>lift1.out_persons[11];break;
		  case 'A':lift2.inbutton_state[0]=1;cout<<"请输入电梯内2的人准备在地下2层出去的人数:"<<endl;cin>>lift2.out_persons[0];break;
		  case 'S':lift2.inbutton_state[1]=1;cout<<"请输入电梯内2的人准备在地下1层出去的人数:"<<endl;cin>>lift2.out_persons[1];break;
		  case 'D':lift2.inbutton_state[2]=1;cout<<"请输入电梯内2的人准备在第0层出去的人数:"<<endl;cin>>lift2.out_persons[2];break;
		  case 'F':lift2.inbutton_state[3]=1;cout<<"请输入电梯内2的人准备在第1层出去的人数:"<<endl;cin>>lift2.out_persons[3];break;
		  case 'G':lift2.inbutton_state[4]=1;cout<<"请输入电梯内2的人准备在第2层出去的人数:"<<endl;cin>>lift2.out_persons[4];break;
		  case 'H':lift2.inbutton_state[5]=1;cout<<"请输入电梯内2的人准备在第3层出去的人数:"<<endl;cin>>lift2.out_persons[5];break;
		  case 'J':lift2.inbutton_state[6]=1;cout<<"请输入电梯内2的人准备在第4层出去的人数:"<<endl;cin>>lift2.out_persons[6];break;
		  case 'K':lift2.inbutton_state[7]=1;cout<<"请输入电梯内2的人准备在第5层出去的人数:"<<endl;cin>>lift2.out_persons[7];break;
		  case 'L':lift2.inbutton_state[8]=1;cout<<"请输入电梯内2的人准备在第6层出去的人数:"<<endl;cin>>lift2.out_persons[8];break;
		  case ':':lift2.inbutton_state[9]=1;cout<<"请输入电梯内2的人准备在第7层出去的人数:"<<endl;cin>>lift2.out_persons[9];break;
		  case '"':lift2.inbutton_state[10]=1;cout<<"请输入电梯内2的人准备在第8层出去的人数:"<<endl;cin>>lift2.out_persons[10];break;
		  case 'Z':lift2.inbutton_state[11]=1;cout<<"请输入电梯内2的人准备在第9层出去的人数:"<<endl;cin>>lift2.out_persons[11];break;
		  case 'x':operation_state=0;break;
	  }
	  ResumeThread(hprint);		 //恢复print线程
	  ResumeThread(hprint2);	 //恢复print2线程
	 }
	 return 0;
	}


//用于输出电梯1的线程
DWORD WINAPI print(PVOID PARAM2)
{int t_inperson=0,t_outperson=0;	//用于临时存放电梯状态
 bool flag1,flag2,flag3,flag4,flag5,flag6,flag7,flag8,flag9,flag10,flag11,flag12,flag13,flag14,flag15,flag16,flag17,flag18,flag_up,flag_stay,flag_down;
 bool in_high=0,in_low=0,out_high=0,between=0,high_down=0,between_near=0,between_up=0,high=0,low=0,between_down=0,low_up=0,out_low=0;
 int i,t_high_floor,t_low_floor;
	while (operation_state)		//用于输出电梯状态的死循环
  {
	  Sleep(2500);				//先让print线程睡眠2.5秒,这样在这段时间里电梯能响应电梯内、外的按钮
	  in_high=0;
	  out_high=0;
      for (i=lift1.stay_in_floor+3;i<=11;i++)
	  {
		  in_high=in_high || lift1.inbutton_state[i];
		  out_high=out_high || floor[i].up || floor[i].down;
	  }
	  in_low=0;
	  for (i=lift1.stay_in_floor+1;i>=0;i--)
		  in_low=in_low || lift1.inbutton_state[i];
	  t_high_floor=(lift1.stay_in_floor>lift2.stay_in_floor)? lift1.stay_in_floor:lift2.stay_in_floor;
	  t_low_floor=(lift1.stay_in_floor<lift2.stay_in_floor)? lift1.stay_in_floor:lift2.stay_in_floor;
	  between=0;
	  for (i=t_low_floor+3;i<t_high_floor+2;i++)
		  between=between || floor[i].up || floor[i].down;
	  high_down=0;
	  for (i=lift2.stay_in_floor+3;i<=11;i++)
	      high_down=high_down || floor[i].down;
	  between_near=0;
	  for (i=t_low_floor+3;i<=t_low_floor+(t_high_floor-t_low_floor)/2+2;i++)
		  between_near=between_near || floor[i].up || floor[i].down;
	  between_up=0;
      for (i=t_low_floor+3;i<t_high_floor+2;i++)
		  between_up=between_up || floor[i].up;
	  high=0;
	  for (i=lift2.stay_in_floor+3;i<=11;i++)
		  high=high || floor[i].up || floor[i].down;
	  between_down=0;
	  for (i=t_low_floor+3;i<=t_high_floor+2;i++)
		  between_down=between_down || floor[i].down;
	  low_up=0;
      for (i=lift2.stay_in_floor+1;i>=0;i--)
		  low_up=low_up || floor[i].up;
	  out_low=0;
	  for (i=0;i<lift1.stay_in_floor+2;i++)
		  out_low=out_low || floor[i].up || floor[i].down;
	  low=0;
      for (i=lift2.stay_in_floor+1;i>=0;i--)
		  low=low || floor[i].up || floor[i].down; 
	  if (lift1.up)	
	  {
		  if (lift1.stay_in_floor<9)
		     lift1.stay_in_floor++;			//更新电梯所在的楼层
		  floor[lift1.stay_in_floor+2].up=0;	//更新电梯外的“上”按钮状态
		  lift1.inbutton_state[lift1.stay_in_floor+2]=0;//更新电梯内该层按钮状态
		  flag1=in_high;
		  flag2=!flag1&(lift1.stay_in_floor>lift2.stay_in_floor)&out_high; 
		  flag3=!flag1&(lift1.stay_in_floor==lift2.stay_in_floor)&out_high&(lift2.down || lift2.stay);
		  flag4=!flag1&(lift1.stay_in_floor<lift2.stay_in_floor)&lift2.up&between;
		  flag5=!flag1&(lift1.stay_in_floor<lift2.stay_in_floor)&lift2.up&high_down;
		  flag6=!flag1&(lift1.stay_in_floor<lift2.stay_in_floor)&lift2.stay&between_near;
		  flag7=!flag1&(lift1.stay_in_floor<lift2.stay_in_floor)&lift2.down&between_up;
		  flag8=!flag1&(lift1.stay_in_floor<lift2.stay_in_floor)&lift2.down&high;
		  flag_up=flag1 || flag2 ||flag3 ||flag4 ||flag5 ||flag6 ||flag7 ||flag8;
		  if (flag_up)
		  {
			   lift1.all_persons=lift1.all_persons-lift1.out_persons[lift1.stay_in_floor+2]+floor[lift1.stay_in_floor+2].up_persons;//更新电梯1内的总人数
			   t_inperson=floor[lift1.stay_in_floor+2].up_persons;
			   floor[lift1.stay_in_floor+2].up_persons=0;	//更新在该层楼等待进入电梯的人数
			   t_outperson=lift1.out_persons[lift1.stay_in_floor+2];	
			   lift1.out_persons[lift1.stay_in_floor+2]=0;	//更新在该层楼出去电梯的人数
		  }
		  else if (!flag_up)
		  {
			  flag9=!flag1&(lift1.stay_in_floor>lift2.stay_in_floor)&lift2.up&!out_high&!between_down;
			  flag10=!flag1&(lift1.stay_in_floor>lift2.stay_in_floor)&lift2.stay&!out_high&!between_near;
			  flag11=!flag1&(lift1.stay_in_floor>lift2.stay_in_floor)&lift2.down&!out_high&!between&!low_up;
			  flag12=!flag1&(lift1.stay_in_floor==lift2.stay_in_floor)&lift2.up&!out_low;
			  flag13=!flag1&(lift1.stay_in_floor==lift2.stay_in_floor)&lift2.stay&!out_low&!out_high;
			  flag14=!flag1&(lift1.stay_in_floor==lift2.stay_in_floor)&lift2.down&!out_high;
			  flag15=!flag1&(lift1.stay_in_floor<lift2.stay_in_floor)&lift2.up&!out_low&!between&!high_down;
			  flag16=!flag1&(lift1.stay_in_floor<lift2.stay_in_floor)&lift2.stay&!out_low&!between_near&!high_down;
			  flag17=!flag1&(lift1.stay_in_floor<lift2.stay_in_floor)&lift2.down&!out_low&!between_up&!high;
			  flag_stay=flag9 || flag10 || flag11 || flag12 || flag13 || flag14 || flag15 || flag16 || flag17;
			  if (flag_stay)
			  {
				   lift1.all_persons=lift1.all_persons-lift1.out_persons[lift1.stay_in_floor+2];//更新电梯1内的总人数
			       t_outperson=lift1.out_persons[lift1.stay_in_floor+2];	

⌨️ 快捷键说明

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