C++实现模拟电梯

题目:

编写一个程序,模拟电梯的功能。功能接口包括电梯上行按钮、下行按钮、楼层选择和电梯在行驶过程中的楼层显示。 要求:  

1.由用户选择按上行按钮还是下行按钮,选择操作后再由用户输入要进入的楼层,进而电梯开始运行,显示所到的每一楼层层数。

2.如果是上行,则选择输入的楼层号不能比当前楼层号小,否则应给出不合法提示。

3.如果是下行,则选择输入的楼层号不能比当前楼层号大,否则应给出不合法提示。 

4.电梯一旦开始运作就会始终运行,直到窗口关闭。 

5.电梯在经过不同楼层时,最好每个楼层的显示之间能有延迟,最终停靠的楼层的输出形式能更加醒目。如果可以,在电梯最初开始运行时,能在电梯由内部显示当前日期(提示:实现这些功能时,需要调用系统api,实现时间显示功能可以使用CDate类)。

我们将这部分功能分为五个部分:

1、图形界面

2、接受上下行

3、选择楼层

4、上下行函数

5、上下行动画

电梯类

首先定义电梯类,我们用getmove记录用户的上下行输入,用getfloor记录用户的目标楼层,同时用静态变量current_floor记录电梯当前楼层

class Elevator
{
public:
	static int current_floor;	//current_floor表示现在楼层
	int getmove, getfloor;		//getmove接受上下行变量,gerfloor接受目标楼层
	void interface2();			//图形界面
	void move_receive();		//接受上下行
	void select_floor();		//选择楼层
	void move_up();				//上行函数
	void move_down();			//下行函数
	void time1();				//时间函数

	Elevator()
	{
		getmove = 1;
		getfloor = 1;
		z = 0;
	}
	~Elevator()
	{ }
private:
	void animation_up();				//上行动画
	void animation_down();				//下行动画
	int z;								//运行次数

};

图形界面

图形界面就相当于电梯的显示屏,用来提示用户输入,同时我们通过调用时间函数实现时间输出

注:SYSTEMTIME类和GetLocalTime函数都在windows.h头文件下

void Elevator::interface2()					//定义图形界面函数
{
	z++;
	if(z>1)
		Sleep(2000);
	system("cls");
	cout << "欢迎使用智慧电梯系统" << endl;
	time1();
	cout << "    --" << "1、上行" << "--" << endl;
	cout << "    --" << "2、下行" << "--" << endl;
	cout << "    --" << "3、结束" << "--" << endl;
}
void Elevator::time1()
{
	SYSTEMTIME s;
	GetLocalTime(&s);
	cout << s.wYear << "年" << s.wMonth << "月" << s.wDay <<"日  ";
	cout << s.wHour << ":" << s.wMinute << endl;
}

接受上下行

这部分接受用户的上下行输入,如果用户输入了1~3之外的数字,需要报错,并提示用户重新输入

void Elevator::move_receive()		//定义接受上下行函数
{
	while (1)
	{
		cout << "请输入方向" << endl;
		cin >> getmove;
		if (getmove >= 1 && getmove <= 3)
		{
			break;
		}
		else 
			cout << "输入错误!" << endl;
		
	}
}

选择楼层

接受用户的目标楼层,判断调用上行函数还是下行函数,如果电梯不在用户的楼层,首先调用上下行函数让电梯来到用户楼层

void Elevator::select_floor()		//定义接受楼层函数
{
	cout << "请输入当前楼层:";
	cin >> getfloor;
	if (getfloor > current_floor)
	{
		move_up();
	}
	else if (getfloor < current_floor)
	{
		move_down();
	}
	else if (getfloor == current_floor);
	cout << "请输入目标楼层:";
	cin >> getfloor;
}

上下行函数

这两个函数是对题目中2、3条的实现,同时调用对应的动画

void Elevator::move_up()			//定义上行函数
{
	if (getfloor > 10 || getfloor < 1)
	{
		cout << "输入错误,本栋楼只有10层" << endl;
	}
	else if (current_floor < getfloor)
	{
		animation_up();
	}
	else if (current_floor >= getfloor)
	{
		cout << "本次电梯上行!" << endl;
	};
}
void Elevator::move_down()			//定义下行函数
{
	if (getfloor > 10 || getfloor < 1)
	{
		cout << "输入错误,本栋楼只有10层" << endl;
	}
	else if (current_floor > getfloor)
	{
		animation_down();
	}
	else if (current_floor <= getfloor)
	{
		cout << "本次电梯下行!" << endl;
	}
}

上下行动画

这个函数主要实现动画显示,以及电梯运行到了第几层,同时要注意题目要求延迟显示,我们通过sleep函数来实现,sleep(1000)代表延迟一秒

注:sleep函数在windows.h头文件下

void Elevator::animation_up()		//定义上行动画
{
	int i;
	system("cls");
	for (i = 0; current_floor < getfloor; current_floor++)
	{
		cout << " --第" << current_floor << "层--" << endl;
		cout << "    / \\    " << endl;
		cout << "   / | \\   " << endl;
		cout << "     |     " << endl;
		cout << "     |     " << endl;
		Sleep(2000);
		i++;
		if (i % 2 == 0)
			system("cls");

	}
	system("cls");
	cout << "电梯到达第" << current_floor << "层" << endl ;

}
void Elevator::animation_down()		//定义上行动画
{
	int i;
	system("cls");
	for (i = 0; current_floor > getfloor; current_floor--)
	{
		cout << " --第" << current_floor << "层--" << endl;
		cout << "     |     " << endl;
		cout << "     |     " << endl;
		cout << "   \\ | /   " << endl;
		cout << "    \\ /    " << endl;
		Sleep(2000);
		i++;
		if (i % 2 == 0)
			system("cls");

	}
	system("cls");
	cout << "电梯到达第" << current_floor << "层" << endl ;
}

以下为完整代码:

注:类中的静态变量要在类外初始化

#include<string>
#include<iostream>
#include<stdio.h>
#include<Windows.h>
using namespace std;
class Elevator
{
public:
	static int current_floor;	//current_floor表示现在楼层
	int getmove, getfloor;		//getmove接受上下行变量,gerfloor接受目标楼层
	void interface2();			//图形界面
	void move_receive();		//接受上下行
	void select_floor();		//选择楼层
	void move_up();				//上行函数
	void move_down();			//下行函数
	void time1();				//时间函数

	Elevator()
	{
		getmove = 1;
		getfloor = 1;
		z = 0;
	}
	~Elevator()
	{ }
private:
	void animation_up();				//上行动画
	void animation_down();				//下行动画
	int z;								//运行次数

};
int Elevator::current_floor = 1;
void Elevator::interface2()					//定义图形界面函数
{
	z++;
	if(z>1)
		Sleep(2000);
	system("cls");
	cout << "欢迎使用智慧电梯系统" << endl;
	time1();
	cout << "    --" << "1、上行" << "--" << endl;
	cout << "    --" << "2、下行" << "--" << endl;
	cout << "    --" << "3、结束" << "--" << endl;
}
void Elevator::time1()
{
	SYSTEMTIME s;
	GetLocalTime(&s);
	cout << s.wYear << "年" << s.wMonth << "月" << s.wDay <<"日  ";
	cout << s.wHour << ":" << s.wMinute << endl;
}
void Elevator::move_receive()		//定义接受上下行函数
{
	while (1)
	{
		cout << "请输入方向" << endl;
		cin >> getmove;
		if (getmove >= 1 && getmove <= 3)
		{
			break;
		}
		else 
			cout << "输入错误!" << endl;
		
	}
}
void Elevator::select_floor()		//定义接受楼层函数
{
	cout << "请输入当前楼层:";
	cin >> getfloor;
	if (getfloor > current_floor)
	{
		move_up();
	}
	else if (getfloor < current_floor)
	{
		move_down();
	}
	else if (getfloor == current_floor);
	cout << "请输入目标楼层:";
	cin >> getfloor;
}
void Elevator::move_up()			//定义上行函数
{
	if (getfloor > 10 || getfloor < 1)
	{
		cout << "输入错误,本栋楼只有10层" << endl;
	}
	else if (current_floor < getfloor)
	{
		animation_up();
	}
	else if (current_floor >= getfloor)
	{
		cout << "本次电梯上行!" << endl;
	};
}
void Elevator::move_down()			//定义下行函数
{
	if (getfloor > 10 || getfloor < 1)
	{
		cout << "输入错误,本栋楼只有10层" << endl;
	}
	else if (current_floor > getfloor)
	{
		animation_down();
	}
	else if (current_floor <= getfloor)
	{
		cout << "本次电梯下行!" << endl;
	}
}
void Elevator::animation_up()		//定义上行动画
{
	int i;
	system("cls");
	for (i = 0; current_floor < getfloor; current_floor++)
	{
		cout << " --第" << current_floor << "层--" << endl;
		cout << "    / \\    " << endl;
		cout << "   / | \\   " << endl;
		cout << "     |     " << endl;
		cout << "     |     " << endl;
		Sleep(2000);
		i++;
		if (i % 2 == 0)
			system("cls");

	}
	system("cls");
	cout << "电梯到达第" << current_floor << "层" << endl ;

}
void Elevator::animation_down()		//定义上行动画
{
	int i;
	system("cls");
	for (i = 0; current_floor > getfloor; current_floor--)
	{
		cout << " --第" << current_floor << "层--" << endl;
		cout << "     |     " << endl;
		cout << "     |     " << endl;
		cout << "   \\ | /   " << endl;
		cout << "    \\ /    " << endl;
		Sleep(2000);
		i++;
		if (i % 2 == 0)
			system("cls");

	}
	system("cls");
	cout << "电梯到达第" << current_floor << "层" << endl ;
}

int main()
{

	Elevator elevator;
	while (elevator.getmove != 3)
	{
		elevator.interface2();		//输出界面
		elevator.move_receive();	//接受上下行键入
		if (elevator.getmove != 3)
		{
			elevator.select_floor();	//接受楼层键入

			if (elevator.getmove == 1)
			{
				elevator.move_up();		//上行
			}
			else if (elevator.getmove == 2)
			{
				elevator.move_down();	//下行
			}
		}
		else
		{
			printf("程序已退出");
			continue;
		}
	}
	return 0;
}

  • 17
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设计一个电梯模拟系统。这是一个离散的模拟程序,由随机事件驱动,以模拟时钟决定乘客或电梯的动作发生的时刻和顺序,系统在某个模拟瞬间处理有待完成的各种事情,然后把模拟时钟推进到某个动作预定要发生的下一时刻。 要求: (1)模拟某校九层教学楼的电梯系统。该楼有一个自动电梯,能在每层停留,其中第一层是大楼的进出层,即是电梯的“本垒层”,电梯“空闲”时,将来到该层候命。 电梯一共有八个状态,即正在开门(Opening)、已开门(Opened)、正在关门(Closing)、已关门(Closed)、等待(Waiting)、移动(Moving)、加速(Accelerate)、减速(Decelerate)。 (2)乘客可随机地进出于任何层。对每个人来说,他有一个能容忍的最长等待时间,一旦等候电梯时间过长,他将放弃。最后一个人放弃能不能取消按键? (3)模拟时钟从0开始,时间单位为0.1秒。人和电梯的各种动作均要消耗一定的时间单位(简记为t),比如: 有人进出时,电梯每隔40t测试一次,若无人进出,则关门; 关门和开门各需要20t; 每个人进出电梯均需要25t; 电梯加速需要15t; 下行时要不要加速? 上升时,每一层需要51t,减速需要14t;每一层和减速? 下降时,每一层需要61t,减速需要23t; 如果电梯在某层静止时间超过300t,则驶回1层候命。驶回本垒层间接到消息? (4)电梯调度规则如下: ①就近原则:电梯的主要调度策略是首先响应沿当前行进方向上最近端的请求直到满足最远端请求。若该方向上无请求时,就改变移动方向; ②在就近原则无法满足的情况下,首先满足更高层的请求; ③电梯的最大承载人数为13人,电梯人数达到13人后,在有人出电梯之前,不接受进入电梯的请求; ④乘客上下电梯时先出后进。进电梯时乘客是按发出乘坐请求的顺序依次进入,每次只能进入一人且每个人花费的时间都为25t; ⑤电梯在关门期间(电梯离开之前)所在层提出请求的乘客同样允许进入。 (5)按时序显示系统状态的变化过程,即发生的全部人和电梯的动作序列。 扩展要求: 实现电梯模拟的可视化界面。用动画显示电梯的升降,人进出电梯。设计有下列对象:电梯、人、电梯控制板及其上各种按钮、模拟时钟等。
以下是一个简单的电梯模拟系统利用队列实现C++ 代码: ``` #include <iostream> #include <queue> using namespace std; enum Direction { UP, DOWN, STAY }; class Elevator { public: Elevator(int floors) : floors(floors), currentFloor(1), direction(STAY), doorOpen(true) {} void update() { if (direction == UP) { currentFloor++; } else if (direction == DOWN) { currentFloor--; } if (currentFloor == targetFloor) { openDoor(); direction = STAY; requests.pop(); } if (requests.empty()) { direction = STAY; } else if (requests.front() > currentFloor) { direction = UP; } else if (requests.front() < currentFloor) { direction = DOWN; } } void addRequest(int floor) { requests.push(floor); if (direction == STAY) { if (floor > currentFloor) { direction = UP; } else if (floor < currentFloor) { direction = DOWN; } } } bool isDoorOpen() { return doorOpen; } private: int floors; int currentFloor; int targetFloor; Direction direction; bool doorOpen; queue<int> requests; void openDoor() { doorOpen = true; cout << "Opening door on floor " << currentFloor << endl; } void closeDoor() { doorOpen = false; cout << "Closing door on floor " << currentFloor << endl; } }; int main() { Elevator elevator(10); // 创建一个10层的电梯 // 添加一些请求 elevator.addRequest(5); elevator.addRequest(2); elevator.addRequest(8); // 模拟电梯运行 while (!elevator.isDoorOpen()) { elevator.update(); } elevator.closeDoor(); // 模拟电梯运行 while (!elevator.isDoorOpen()) { elevator.update(); } elevator.closeDoor(); // 模拟电梯运行 while (!elevator.isDoorOpen()) { elevator.update(); } elevator.closeDoor(); return 0; } ``` 这段代码创建了一个 Elevator 类来表示电梯,其中使用了一个队列来存储请求。在主函数中,我们添加了一些请求,然后模拟电梯的运行过程。每次更新电梯的状态时,我们会检查是否到达了请求的目标楼层,如果到达了,则打开电梯门,并将请求从队列中移除。如果队列为空,则电梯停止运行。如果有新的请求加入队列,我们会更新电梯的运行方向。 当电梯门打开时,我们会模拟乘客进出电梯的过程,并在电梯门关闭时继续模拟电梯的运行过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又菜又爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值