В наше время, когда автоматизация и оптимизация процессов являются ключевыми элементами успешного функционирования многих организаций, эффективное управление очередью заявок становится более важным, чем когда-либо. Программа «Очередь заявок» представляет собой мощный инструмент, предназначенный для упорядочения, распределения и мониторинга задач, требующих обработки в различных сферах деятельности, от обслуживания клиентов в банках и медицинских учреждениях до управления технической поддержкой и разработки программного обеспечения. В данной статье мы рассмотрим суть и важность программы «Очередь заявок», а также предоставим подробный обзор ее основных характеристик и функциональных возможностей.
Теория
Алгоритм программы «Заявки на проверку телевизоров»:
- Инициализация. Создать очередь (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++; } }