Программа «Очередь заявок»

В наше время, когда автоматизация и оптимизация процессов являются ключевыми элементами успешного функционирования многих организаций, эффективное управление очередью заявок становится более важным, чем когда-либо. Программа «Очередь заявок» представляет собой мощный инструмент, предназначенный для упорядочения, распределения и мониторинга задач, требующих обработки в различных сферах деятельности, от обслуживания клиентов в банках и медицинских учреждениях до управления технической поддержкой и разработки программного обеспечения. В данной статье мы рассмотрим суть и важность программы «Очередь заявок», а также предоставим подробный обзор ее основных характеристик и функциональных возможностей.

Теория

Алгоритм программы «Заявки на проверку телевизоров»:

  • Инициализация. Создать очередь (Queue) для каждого контроллера (controlPoint1, controlPoint2, controlPoint3).
  • Установить начальное значение для переменных:
    requestID = 1 (начальный идентификатор заявки).
    startTime = текущее время (момент запуска программы).
  • Бесконечный цикл. Начать бесконечный цикл, который будет работать постоянно.
  • Обработка заявки. Получить текущее время (currentTime).
  • Рассчитать количество прошедших минут с момента начала работы программы (elapsedMinutes).
  • Проверка времени. Проверить, если elapsedMinutes больше 35 минут, то:
  • Вывести сообщение: «Заявка ожидает больше 35 минут и не обслуживается.»
  • Продолжить следующую итерацию цикла.
  • Создание новой заявки. Создать новую заявку (TVRequest) с данными:
    Идентификатор заявки (requestID).
    Время поступления (currentTime).
  • Распределение по контроллерам. Проверить, есть ли свободные места у контроллеров (например, controlPoint1, controlPoint2, controlPoint3):
  • Если у controlPoint1 есть свободные места (< 3):
  • Добавить новую заявку в controlPoint1.
  • Вывести сообщение: «Заявка requestID направлена на контроллер 1.»
  • Иначе, если у controlPoint2 есть свободные места (< 3):
  • Добавить новую заявку в controlPoint2.
  • Вывести сообщение: «Заявка requestID направлена на контроллер 2.»
  • Иначе, если у controlPoint3 есть свободные места (< 3):
  • Добавить новую заявку в controlPoint3.
  • Вывести сообщение: «Заявка requestID направлена на контроллер 3.»
  • В противном случае (все контроллеры заняты):
  • Вывести сообщение: «Все контроллеры заняты, заявка requestID поставлена в очередь.»
  • Добавить новую заявку в очередь (например, использовать массив или структуру данных).
  • Увеличение идентификатора заявки. Увеличить requestID на 1, чтобы подготовиться к следующей заявке.
  • Повторение. Вернуться к шагу 3 и продолжить обработку следующих заявок в бесконечном цикле.

Этот алгоритм моделирует ситуацию с поступлением заявок на проверку к 3 контроллерам и управление очередью, при соблюдении условия, что заявка не обслуживается, если она пребывает в очереди больше 35 минут.

C++

Пример программы на C++, которая моделирует ситуацию с поступлением заявок на проверку телевизоров к 3 контроллерам и управляет очередью. Если заявка находится в очереди больше 35 минут, она не обслуживается:

#include <iostream>
#include <queue>
#include <ctime>
#include <cstdlib>
#include <chrono>
#include <thread>

using namespace std;

struct TVRequest {
    int requestID;
    chrono::steady_clock::time_point arrivalTime;
};

int main() {
    queue<TVRequest> controlPoint1;
    queue<TVRequest> controlPoint2;
    queue<TVRequest> controlPoint3;

    chrono::steady_clock::time_point startTime = chrono::steady_clock::now();

    int requestID = 1;

    while (true) {
        this_thread::sleep_for(chrono::minutes(1));
        chrono::steady_clock::time_point currentTime = chrono::steady_clock::now();
        chrono::duration<double> elapsedMinutes = chrono::duration_cast<chrono::minutes>(currentTime - startTime);

        if (elapsedMinutes.count() > 35) {
            cout << "Заявка ожидает больше 35 минут и не обслуживается." << endl;
        } else {
            TVRequest newRequest;
            newRequest.requestID = requestID++;
            newRequest.arrivalTime = currentTime;

            if (controlPoint1.size() < 3) {
                controlPoint1.push(newRequest);
                cout << "Заявка " << newRequest.requestID << " направлена на контроллер 1." << endl;
            } else if (controlPoint2.size() < 3) {
                controlPoint2.push(newRequest);
                cout << "Заявка " << newRequest.requestID << " направлена на контроллер 2." << endl;
            } else if (controlPoint3.size() < 3) {
                controlPoint3.push(newRequest);
                cout << "Заявка " << newRequest.requestID << " направлена на контроллер 3." << endl;
            } else {
                cout << "Все контроллеры заняты, заявка " << newRequest.requestID << " поставлена в очередь." << endl;
            }
        }
    }

    return 0;
}

В этой программе создается очередь для каждого контроллера, и заявки направляются на контроллеры в зависимости от доступных мест. Если все контроллеры заняты, заявка ставится в очередь. Программа также отслеживает время, прошедшее с момента старта, и если заявка находится в очереди больше 35 минут, она не обслуживается.

C#

using System;
using System.Collections.Generic;
using System.Threading;
using System.Diagnostics;

class Program
{
    static Queue<TVRequest> controlPoint1 = new Queue<TVRequest>();
    static Queue<TVRequest> controlPoint2 = new Queue<TVRequest>();
    static Queue<TVRequest> controlPoint3 = new Queue<TVRequest>();

    static Stopwatch stopwatch = new Stopwatch();

    static int requestID = 1;

    static void Main()
    {
        stopwatch.Start();

        while (true)
        {
            Thread.Sleep(60000); // Подождать 1 минуту (60 000 миллисекунд)

            if (stopwatch.Elapsed.TotalMinutes > 35)
            {
                Console.WriteLine("Заявка ожидает больше 35 минут и не обслуживается.");
            }
            else
            {
                var newRequest = new TVRequest { RequestID = requestID++, ArrivalTime = DateTime.Now };

                if (controlPoint1.Count < 3)
                {
                    controlPoint1.Enqueue(newRequest);
                    Console.WriteLine($"Заявка {newRequest.RequestID} направлена на контроллер 1.");
                }
                else if (controlPoint2.Count < 3)
                {
                    controlPoint2.Enqueue(newRequest);
                    Console.WriteLine($"Заявка {newRequest.RequestID} направлена на контроллер 2.");
                }
                else if (controlPoint3.Count < 3)
                {
                    controlPoint3.Enqueue(newRequest);
                    Console.WriteLine($"Заявка {newRequest.RequestID} направлена на контроллер 3.");
                }
                else
                {
                    Console.WriteLine($"Все контроллеры заняты, заявка {newRequest.RequestID} поставлена в очередь.");
                }
            }
        }
    }
}

class TVRequest
{
    public int RequestID { get; set; }
    public DateTime ArrivalTime { get; set; }
}

Python

import queue
import time

control_point_1 = queue.Queue()
control_point_2 = queue.Queue()
control_point_3 = queue.Queue()

start_time = time.time()

request_id = 1

while True:
    time.sleep(60)  # Подождать 1 минуту (60 секунд)

    elapsed_minutes = time.time() - start_time

    if elapsed_minutes > 35 * 60:  # Перевести минуты в секунды
        print("Заявка ожидает больше 35 минут и не обслуживается.")
    else:
        new_request = (request_id, time.time())

        if control_point_1.qsize() < 3:
            control_point_1.put(new_request)
            print(f"Заявка {new_request[0]} направлена на контроллер 1.")
        elif control_point_2.qsize() < 3:
            control_point_2.put(new_request)
            print(f"Заявка {new_request[0]} направлена на контроллер 2.")
        elif control_point_3.qsize() < 3:
            control_point_3.put(new_request)
            print(f"Заявка {new_request[0]} направлена на контроллер 3.")
        else:
            print(f"Все контроллеры заняты, заявка {new_request[0]} поставлена в очередь.")
        
        request_id += 1

Java

import java.util.LinkedList;
import java.util.Queue;
import java.util.Timer;
import java.util.TimerTask;

public class TVControlSystem {
    public static void main(String[] args) {
        Queue<TVRequest> controlPoint1 = new LinkedList<>();
        Queue<TVRequest> controlPoint2 = new LinkedList<>();
        Queue<TVRequest> controlPoint3 = new LinkedList<>();
        Timer timer = new Timer();

        timer.scheduleAtFixedRate(new TimerTask() {
            int requestID = 1;
            long startTime = System.currentTimeMillis();

            @Override
            public void run() {
                long currentTime = System.currentTimeMillis();
                long elapsedMinutes = (currentTime - startTime) / (60 * 1000);

                if (elapsedMinutes > 35) {
                    System.out.println("Заявка ожидает больше 35 минут и не обслуживается.");
                } else {
                    TVRequest newRequest = new TVRequest(requestID++, currentTime);

                    if (controlPoint1.size() < 3) {
                        controlPoint1.add(newRequest);
                        System.out.println("Заявка " + newRequest.getRequestID() + " направлена на контроллер 1.");
                    } else if (controlPoint2.size() < 3) {
                        controlPoint2.add(newRequest);
                        System.out.println("Заявка " + newRequest.getRequestID() + " направлена на контроллер 2.");
                    } else if (controlPoint3.size() < 3) {
                        controlPoint3.add(newRequest);
                        System.out.println("Заявка " + newRequest.getRequestID() + " направлена на контроллер 3.");
                    } else {
                        System.out.println("Все контроллеры заняты, заявка " + newRequest.getRequestID() + " поставлена в очередь.");
                    }
                }
            }
        }, 0, 60000);  // Запустить каждую минуту (60 000 миллисекунд)
    }
}

class TVRequest {
    private int requestID;
    private long arrivalTime;

    public TVRequest(int requestID, long arrivalTime) {
        this.requestID = requestID;
        this.arrivalTime = arrivalTime;
    }

    public int getRequestID() {
        return requestID;
    }
}

Pascal

program TVControlSystem;

{$APPTYPE CONSOLE}

uses
  SysUtils, Classes, DateUtils;

type
  TVRequest = record
    RequestID: Integer;
    ArrivalTime: TDateTime;
  end;

var
  ControlPoint1: TQueue<TVRequest>;
  ControlPoint2: TQueue<TVRequest>;
  ControlPoint3: TQueue<TVRequest>;

  RequestID: Integer;
  StartTime: TDateTime;
  ElapsedMinutes: Integer;

procedure Initialize;
begin
  ControlPoint1 := TQueue<TVRequest>.Create;
  ControlPoint2 := TQueue<TVRequest>.Create;
  ControlPoint3 := TQueue<TVRequest>.Create;
  RequestID := 1;
  StartTime := Now;
end;

procedure ProcessRequest;
var
  CurrentTime: TDateTime;
  NewRequest: TVRequest;
begin
  CurrentTime := Now;
  ElapsedMinutes := MinutesBetween(CurrentTime, StartTime);

  if ElapsedMinutes > 35 then
  begin
    WriteLn('Заявка ожидает больше 35 минут и не обслуживается.');
  end
  else
  begin
    NewRequest.RequestID := RequestID;
    NewRequest.ArrivalTime := CurrentTime;

    if ControlPoint1.Count < 3 then
    begin
      ControlPoint1.Enqueue(NewRequest);
      WriteLn('Заявка ', NewRequest.RequestID, ' направлена на контроллер 1.');
    end
    else if ControlPoint2.Count < 3 then
    begin
      ControlPoint2.Enqueue(NewRequest);
      WriteLn('Заявка ', NewRequest.RequestID, ' направлена на контроллер 2.');
    end
    else if ControlPoint3.Count < 3 then
    begin
      ControlPoint3.Enqueue(NewRequest);
      WriteLn('Заявка ', NewRequest.RequestID, ' направлена на контроллер 3.');
    end
    else
    begin
      WriteLn('Все контроллеры заняты, заявка ', NewRequest.RequestID, ' поставлена в очередь.');
    end;
    Inc(RequestID);
  end;
end;

begin
  Initialize;
  while True do
  begin
    ProcessRequest;
    Sleep(60000); // Подождать 1 минуту (60 000 миллисекунд)
  end;
end.

JavaScript

class TVRequest {
  constructor(requestID, arrivalTime) {
    this.requestID = requestID;
    this.arrivalTime = arrivalTime;
  }
}

const controlPoint1 = [];
const controlPoint2 = [];
const controlPoint3 = [];

let requestID = 1;
let startTime = Date.now();

function processRequest() {
  const currentTime = Date.now();
  const elapsedMinutes = Math.floor((currentTime - startTime) / (60 * 1000));

  if (elapsedMinutes > 35) {
    console.log('Заявка ожидает больше 35 минут и не обслуживается.');
  } else {
    const newRequest = new TVRequest(requestID, currentTime);

    if (controlPoint1.length < 3) {
      controlPoint1.push(newRequest);
      console.log(`Заявка ${newRequest.requestID} направлена на контроллер 1.`);
    } else if (controlPoint2.length < 3) {
      controlPoint2.push(newRequest);
      console.log(`Заявка ${newRequest.requestID} направлена на контроллер 2.`);
    } else if (controlPoint3.length < 3) {
      controlPoint3.push(newRequest);
      console.log(`Заявка ${newRequest.requestID} направлена на контроллер 3.`);
    } else {
      console.log(`Все контроллеры заняты, заявка ${newRequest.requestID} поставлена в очередь.`);
    }

    requestID++;
  }
}

setInterval(processRequest, 60000); // Запускать каждую минуту (60 000 миллисекунд)

PHP

<?php

class TVRequest {
    public $requestID;
    public $arrivalTime;

    public function __construct($requestID, $arrivalTime) {
        $this->requestID = $requestID;
        $this->arrivalTime = $arrivalTime;
    }
}

$controlPoint1 = [];
$controlPoint2 = [];
$controlPoint3 = [];

$requestID = 1;
$startTime = time();

while (true) {
    sleep(60); // Подождать 1 минуту (60 секунд)

    $currentTime = time();
    $elapsedMinutes = ($currentTime - $startTime) / 60; // Перевести секунды в минуты

    if ($elapsedMinutes > 35) {
        echo "Заявка ожидает больше 35 минут и не обслуживается." . PHP_EOL;
    } else {
        $newRequest = new TVRequest($requestID, $currentTime);

        if (count($controlPoint1) < 3) {
            array_push($controlPoint1, $newRequest);
            echo "Заявка {$newRequest->requestID} направлена на контроллер 1." . PHP_EOL;
        } elseif (count($controlPoint2) < 3) {
            array_push($controlPoint2, $newRequest);
            echo "Заявка {$newRequest->requestID} направлена на контроллер 2." . PHP_EOL;
        } elseif (count($controlPoint3) < 3) {
            array_push($controlPoint3, $newRequest);
            echo "Заявка {$newRequest->requestID} направлена на контроллер 3." . PHP_EOL;
        } else {
            echo "Все контроллеры заняты, заявка {$newRequest->requestID} поставлена в очередь." . PHP_EOL;
        }

        $requestID++;
    }
}
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
Давайте поможем друг другу! Если вы нашли ошибку или хотите предложить лучшее решение, пожалуйста, напишите об этом в комментариях.

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

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