Очередь, рабочий день мойки автомобилей, С++

Добрый день! Нужна ваша помощь. Есть такое задание:

Создать программу, имитирующую рабочий день мойки автомобилей.
Программа должна содержать класс, описывающий автомойку и класс,
описывающий очередь автомобилей.
Рабочий день длится 480 минут(1 минута 1 итерация цикла). Каждую минуту, с шансом
10%, в очередь добавляется новая машина. Если мойка свободна, первая машина из
очереди перемещается на мойку. Помывка одной машины занимает 10 минут.
Определить максимальное время простоя мойки за день и максимальную величину
очереди.
Есть вот такой класс очередь

#pragma once

template<class T>
class Queue
{
    T* arr = nullptr;
    int capacity = 0;
    int size = 0;
public:
    Queue();

    Queue(int c);

    Queue(const Queue& obj);

    Queue(Queue&& obj) noexcept;

    ~Queue();

    Queue<T>& operator=(const Queue& obj);

    Queue<T>& operator=(Queue&& obj) noexcept;

    void push(T val);

    T pop();

    T peek() const;

    bool is_empty() const;

    bool is_full() const;
};

template<class T>
Queue<T>::Queue()
{
    capacity = 100;
    arr = new T[capacity]{};
}

template<class T>
Queue<T>::Queue(int c)
{
    capacity = c;
    arr = new T[capacity]{};
}

template<class T>
Queue<T>::Queue(const Queue& obj)
{
    capacity = obj.capacity;
    size = obj.size;
    arr = new T[capacity]{};
    for (int i = 0; i < size; ++i)
    {
        arr[i] = obj.arr[i];
    }
}

template<class T>
Queue<T>::Queue(Queue&& obj) noexcept
{
    capacity = obj.capacity;
    size = obj.size;
    arr = obj.arr;

    obj.capacity = 0;
    obj.size = 0;
    obj.arr = nullptr;
}

template<class T>
Queue<T>::~Queue()
{
    if (capacity)
        delete[]arr;
}

template<class T>
Queue<T>& Queue<T>::operator=(const Queue& obj)
{
    if (this == &obj)
        return *this;
    if (capacity)
        delete[]arr;
    capacity = obj.capacity;
    size = obj.size;
    arr = new T[capacity]{};
    for (int i = 0; i < size; ++i)
    {
        arr[i] = obj.arr[i];
    }
    return *this;
}

template<class T>
Queue<T>& Queue<T>::operator=(Queue&& obj) noexcept
{
    if (this == &obj)
        return *this;
    if (capacity)
        delete[]arr;
    capacity = obj.capacity;
    size = obj.size;
    arr = obj.arr;

    obj.capacity = 0;
    obj.size = 0;
    obj.arr = nullptr;
    return *this;
}

template<class T>
void Queue<T>::push(T val)
{
    arr[size++] = val;
}

template<class T>
T Queue<T>::pop()
{
    T tmp = arr[0];
    for (int i = 1; i < size; ++i)
    {
        arr[i - 1] = arr[i];
    }
    size--;
    return tmp;
}

template<class T>
T Queue<T>::peek() const
{
    return arr[0];
}

template<class T>
bool Queue<T>::is_empty() const
{
    return size == 0;
}

template<class T>
bool Queue<T>::is_full() const
{
    return size == capacity;
}


Нужно создать классы для автомобилей и мойки. Как собрать все вместе? С чего начать?

Тут наверно просто надо симулировать работу этой мойки с помощью цикла и очереди.

Если нужен еще класс мойки, то например как-то так:

main:

while (carwash.isOpened())
{
    if (шанс 10%)
    {
        carwash.add(Car(...));
    }

    carwash.process();
}

В CarWash сделать поле queue, в add просто push туда, а в process проверять текущее состояние (моется ли сейчас машина и т.д., тоже поля в этом классе), pop если свободна и т.д., увеличивать время на 1.
isOpened == время < 480

Ну и на каждой итерации считать

(например в мейне, тогда CarWash еще должен предоставить функции для получения queue.size() и занятости мойки).

1 лайк

Что-то типа такого Queue* queue?

Queue<Car> queue