Слияние кода завершено, страница обновится автоматически
#include "Elevator.h"
#include "Rule.h"
#include <iostream>
using namespace std;
Elevator::Elevator (bool(*fun)(int)) {
rule = fun;
spaceTime = 0;
isPick = false;
state = 0;
while(!rule(currentFloor = Rule::random(Rule::FloorNumber)));
iarriveFloor = vector<bool>(Rule::FloorNumber+1, false);
oarriveFloor = vector<bool>(Rule::FloorNumber+1, false);
maxFloor = 0;
minFloor = Rule::FloorNumber + 1;
}
// 设置电梯状态
void Elevator::setState (int s) {
state = s;
}
// 获取电梯状态
int Elevator::getState () {
return state;
}
// 设置当前层数
void Elevator::setCurrentFloor () {
if (currentFloor + state <= Rule::FloorNumber && currentFloor + state >= 0) {
currentFloor += state;
} else {
cout << "Error:设置出错,当前楼层" << currentFloor << endl;
state = -state;
}
}
// 返回当前楼层数
int Elevator::getCurrentFloor () {
return currentFloor;
}
// 获取当前人数
int Elevator::getCurrentPerson () {
return personSet.size();
}
// 计算当前重量
int Elevator::getWeight() {
int weight = 0;
set<Person*>::iterator tp = personSet.begin();
for (; tp!= personSet.end(); tp++) {
weight += (*tp)->getWeight();
}
return weight;
}
// 是否超重
bool Elevator::overLoad () {
// 重量超出
return getWeight() >= Rule::MaxK || getCurrentPerson() >= Rule::MaxK;
// 人数超出
// return getCurrentPerson() >= Rule::MaxK;
}
// 楼层可达检测
bool Elevator::canArrive (int te) {
return rule(te);
}
// 设置内可达层数
void Elevator::setiArriveFloor (int f) {
// 设置该层可达性
iarriveFloor[f] = true;
// 重置可达最高层
maxFloor = maxFloor > f ? maxFloor : f;
// 重置可达最低层
minFloor = minFloor < f ? minFloor : f;
// 设置电梯状态
if (getState() == 0) {
if(f > getCurrentFloor()) setState(1);
else if (f < getCurrentFloor()) setState(-1);
}
}
// 设置外可达层数
void Elevator::setoArriveFloor (int f) {
// 设置该层可达性
oarriveFloor[f] = true;
// 重置可达最高层
maxFloor = maxFloor > f ? maxFloor : f;
// 重置可达最低层
minFloor = minFloor < f ? minFloor : f;
// 设置电梯状态
if (getState() == 0) {
if(f > getCurrentFloor()) setState(1);
else if (f < getCurrentFloor()) setState(-1);
}
}
// 取消可达层数
void Elevator::cancelArriveFloor (int f) {
// 取消该层可达性
iarriveFloor[f] = false;
oarriveFloor[f] = false;
// 重置可达最高层
if (maxFloor == f) {
// 从盖层往下遍历
for (int i = f-1; i >= 0; i --) {
// 以致最低层或者找到下一最高层
if (i == 0 || iarriveFloor[i] == true || oarriveFloor[i] == true) {
maxFloor = i;
break;
}
}
}
// 重置可达最低层
if (minFloor == f) {
// 从该层往上遍历
for (int i = f+1; i <= Rule::FloorNumber + 1; i ++) {
// 以致最高层或者找到下一最底层
if (i == Rule::FloorNumber+1 || iarriveFloor[i] == true || oarriveFloor[i] == true) {
minFloor = i;
break;
}
}
}
}
// 获取可达最高层
int Elevator::getMaxFloor () {
return maxFloor;
}
// 获取可达最低层
int Elevator::getMinFloor () {
return minFloor;
}
// 设置电梯是否正在上下人
void Elevator::setIsPick(bool b) {
isPick = b;
}
// 电梯是否正在上人
bool Elevator::getIsPick () {
return isPick;
}
// 设置电梯关门时间
int Elevator::setCloseTime () {
closeTime = Rule::CloseTime;
}
// 电梯关门时间减少
void Elevator::decreaseCloseTime() {
closeTime = closeTime > 0 ? closeTime - 1 : 0;
}
// 返回电梯关门时间
int Elevator::getCloseTime () {
return closeTime;
}
// 设置电梯在楼层之间的时间
void Elevator::setSpaceTime () {
spaceTime = Rule::S;
}
// 在楼层之间的时间减1秒
void Elevator::decreaseSpaceTime () {
if(spaceTime > 0) spaceTime--;
}
// 获取电梯在楼层之间的时间
int Elevator::getSpaceTime () {
return spaceTime;
}
// 电梯上人
void Elevator::pickUpPerson (Person *p) {
personSet.insert(p);
}
// 电梯下人
void Elevator::pickDownPerson (Person *p) {
if (personSet.find(p) == personSet.end()) {
cout << "Error:集合中无此人" << endl;
return;
}
personSet.erase(p);
}
// 打印信息
void Elevator::printSelf () {
cout << "\t\t\t" << "当前楼层:" << currentFloor << endl;
cout << "\t\t\t";
switch (state) {
case 0:
cout << "无状态" << endl;
break;
case 1:
cout << "上升" << endl;
break;
case -1:
cout << "下降" << endl;
break;
default:
cout << "电梯状态异常" << endl;
}
cout << "\t\t\t" << "电梯人数:" << getCurrentPerson() << endl;
cout << "\t\t\t" << "电梯重量:" << getWeight() << endl;
cout << "\t\t\t" << "最高层:" << maxFloor << "\t\t" << "最低层:" << minFloor << endl;
cout << "\t\t\t" << "状态:";
if (isPick == true)
cout << "\t\t" << "正在上人";
if (spaceTime > 0)
cout << "\t\t" << "处在楼层之间";
if (closeTime > 0)
cout << "\t\t" << "门未关闭";
cout << endl;
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )