Моделирование лифта на C ++ [closed]

Я написал эту программу для лифтов на 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 ответ
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) {

Возможно, есть еще кое-что, что вы можете изменить в своем коде, это всего лишь небольшой снимок, надеюсь, он поможет

  • 1

    Нет причин, по которым вы могли бы получить сбои при использовании обычных указателей в C ++. Пока std::shared_ptr может быть безопаснее, это не всегда уместно и снижает производительность. Настоящая проблема в коде OP заключается в том, что он реализует свой собственный связанный список. Вместо, std::list<int> можно использовать для получения того же результата. Но еще лучше было бы просто использовать std::vector здесь.

    — Г. Сон

  • Конечно, вы можете использовать необработанные указатели, которые обладают большей производительностью, чем общие, но, с моей точки зрения, сначала сделайте код правильно, а как только это будет сделано, затем оптимизируйте.

    — camp0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *