Я написал эту программу для лифтов на C ++, и она работает достаточно хорошо. Однако он всегда будет отдавать приоритет нижнему этажу, независимо от близости. Я не уверен, как оптимизировать его, чтобы он отдавал приоритет направлению более близкого конца. Под концом я подразумеваю первый и последний этажи в отсортированном списке. Вот что я имею в виду:
В настоящее время вывод программы следующий:
Лифт сейчас находится на 10 этаже.
Пассажирские входы — это этажи 1, 2, 3 и 11.
Лифт спускается, пассажиры опускаются в 1, 2, 3, 11.
В идеале, поскольку этаж 11 ближе к 10, чем этаж 1, я бы хотел, чтобы это было так:
Лифт сейчас находится на 10 этаже.
Пассажирские входы — это этажи 1, 2, 3 и 11.
Лифт должен подняться, высадить пассажира в 11, затем спуститься, высадить пассажира в точке 3, затем 2, затем 1.
Вот код:
#include <iostream>
// including windows.h/unistd to use Sleep()/sleep() that will simulate a delay
#ifdef _WIN32
#include <Windows.h>
#else
#include <unistd.h>
#endif
using namespace std;
// using a Doubly Linked List
struct node {
int data;
node *next;
node *prev;
};
node *head = NULL;
node *last = NULL;
node *current = head;
// function to display all constructed totalFloors
void displayFloors() {
node *temp = head;
while (temp != NULL) {
cout << temp->data << " ";
temp = temp->next;
}
cout << endl;
}
// function to make the actual totalFloors
void constructFloors(int totalNodes) {
for (int i = 1; i <= totalNodes; i++) {
node *newNode = new node;
last = head;
newNode->data = i;
newNode->next = NULL;
if (head == NULL) {
newNode->prev = NULL;
head = newNode;
current = head;
} else {
while (last->next != NULL) {
last = last->next;
}
last->next = newNode;
newNode->prev = last;
}
}
}
// function to move the elevator
void moveElevator(int destination) {
if (current->data == destination) {
cout << "You are already at floor " << destination << endl;
} else if (current->data <= destination) {
cout << "The elevator is going up....." << endl;
Sleep(1500);
while (current->data < destination) {
if (current->next)
current = current->next;
Sleep(1500);
cout << "Elevator is now at Floor....." << current->data << endl;
}
cout << "You have arrived at your destination." << endl;
} else if (current->data >= destination && destination >= head->data) {
cout << "The elevator is going down....." << endl;
Sleep(1500);
while (current->data > destination) {
current = current->prev;
Sleep(1500);
cout << "Elevator is now at Floor....." << current->data << endl;
}
if (current->prev)
current = current->prev;
cout << "You have arrived at your destination." << endl;
}
}
int main() {
int passenger[4], totalFloors, floor, continueFlag = 1;
cout << "This is an Elevator Simulator." << endl
<< "Due to the pandemic, the elevator will also" << endl
<< "simulate a maximum four-person capacity." << endl
<< "Input a number of floors to construct for the elevator " << endl
<< "or input a character to end simulation: ";
cin >> totalFloors;
if (!totalFloors) {
cout << "Simulation ended. Have a great day!" << endl;
return 0;
}
constructFloors(totalFloors);
cout << "The following floors have been created: ";
displayFloors();
cout << "The elevator is currently at Floor " << current->data << endl;
cout << "Please enter your destinations respectively "
<< "or enter a character to end simulation." << endl;
while (continueFlag == 1) {
int i, j, x;
for (i = 0; i < 4; i++) {
cout << "Passenger " << i + 1
<< ", please enter your destination: ";
cin >> passenger[i];
if (!passenger[i]) {
cout << "Simulation ended. Have a great day!" << endl;
return 0;
}
}
for (i = 0; i < 4; i++) {
for (j = 0; j < 4 - i - 1; j++) {
if (passenger[j] > passenger[j + 1]) {
int temp = passenger[j];
passenger[j] = passenger[j + 1];
passenger[j + 1] = temp;
}
}
}
for (i = 0; i < 4; i++) {
cout << passenger[i] << " ";
}
cout << endl;
for (x = 0; x < 4; x++) {
floor = passenger[x];
moveElevator(floor);
}
cout << "The elevator is now taking in new passengers." << endl;
}
cout << "Simulation ended. Have a great day!" << endl;
return 0;
}
Кроме того, не стесняйтесь импровизировать любой из моих существующих кодов, если это возможно.
1 ответ
Ваш код выглядит так, как будто вы пришли из фона переменного тока, вот список распространенных ошибок, которые вы можете легко решить
struct node {
int data;
node *next;
node *prev;
};
В c ++ используйте классы и интеллектуальные указатели, если хотите избежать ошибок сегментации.
class Node {
int data;
std::shared_ptr next;
std::shared_ptr prev;
};
приращение цикла на c ++ отличается от c
for (int i = 1; i <= totalNodes; i++) {
преобразовать в
for (int i = 0; i < totalNodes; ++i) {
Возможно, есть еще кое-что, что вы можете изменить в своем коде, это всего лишь небольшой снимок, надеюсь, он поможет
![Моделирование лифта на C ++ [closed] TheFAQ.ru](https://thefaq.ru/wp-content/uploads/2023/01/logo-250.png)
Нет причин, по которым вы могли бы получить сбои при использовании обычных указателей в C ++. Пока
std::shared_ptrможет быть безопаснее, это не всегда уместно и снижает производительность. Настоящая проблема в коде OP заключается в том, что он реализует свой собственный связанный список. Вместо,std::list<int>можно использовать для получения того же результата. Но еще лучше было бы просто использоватьstd::vectorздесь.— Г. Сон
Конечно, вы можете использовать необработанные указатели, которые обладают большей производительностью, чем общие, но, с моей точки зрения, сначала сделайте код правильно, а как только это будет сделано, затем оптимизируйте.
— camp0