Advertisement
anticlown

Очереди с приоритетом("Процессор", 3 сем.)

Oct 2nd, 2023 (edited)
956
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3.  
  4. using namespace std;
  5.  
  6. //инициализация очереди
  7. void initializeOrder(queue <int>(&queueMatrix)[3][3]) {
  8.    
  9.     //инициализация запросов времени для 1-го клиента
  10.     int clientRequests1[10] = {4, 2, 3, 4, 6, 8, 9, 3, 2, 1};
  11.     for (int i = 0; i < 10; i++)
  12.         queueMatrix[0][0].push(clientRequests1[i]);
  13.  
  14.     //инициализация запросов времени для 2-го клиента
  15.     int clientRequests2[10] = {4, 2, 6, 8, 7, 3, 1, 2, 4, 6};
  16.     for (int i = 0; i < 10; i++)
  17.         queueMatrix[1][0].push(clientRequests2[i]);
  18.  
  19.     //инициализация запросов времени для 3-го клиента
  20.     int clientRequests3[10] = { 2, 3, 4, 5, 9, 7, 6, 8, 3, 2 };
  21.     for (int i = 0; i < 10; i++)
  22.         queueMatrix[1][1].push(clientRequests3[i]);
  23.  
  24.     //инициализация запросов времени для 4-го клиента
  25.     int clientRequests4[11] = { 3, 3, 4, 2, 4, 6, 8, 9, 7, 2, 1 };
  26.     for (int i = 0; i < 10; i++)
  27.         queueMatrix[2][0].push(clientRequests4[i]);
  28.  
  29.     //инициализация запросов времени для 5-го клиента
  30.     int clientRequests5[10] = { 2, 1, 2, 4, 5, 2, 4, 6, 8, 9};
  31.     for (int i = 0; i < 10; i++)
  32.         queueMatrix[2][1].push(clientRequests5[i]);
  33.  
  34.     //инициализация запросов времени для 6-го клиента
  35.     int clientRequests6[10] = { 1, 2, 1, 6, 1, 9, 8, 1, 6, 8 };
  36.     for (int i = 0; i < 10; i++)
  37.         queueMatrix[2][2].push(clientRequests6[i]);
  38. }
  39.  
  40. //структура, описывающая клиента
  41. struct client {
  42.     int priority;
  43.     int index;
  44. };
  45.  
  46. client findClient(int(&currentClient)[3], const char(&busyArr)[3][3][1000], int& currentSec, queue <int>(&clientMatrix)[3][3], int& numberOfProperties, int(&clientsArr)[3]) {
  47.     client clientInstance;
  48.     clientInstance.priority = clientInstance.index = -1;
  49.     for (int i = 0; i < numberOfProperties; ++i)
  50.     {
  51.         int previousClient = currentClient[i];
  52.         ++currentClient[i];
  53.         currentClient[i] %= clientsArr[i];
  54.  
  55.         for (int j = 0; j < clientsArr[i]; ++j) {
  56.             if ((!clientMatrix[i][currentClient[i]].empty()) && (busyArr[i][currentClient[i]][currentSec] == 'O'))
  57.             {
  58.                 clientInstance.priority = i;
  59.                 clientInstance.index = currentClient[i];
  60.                 return clientInstance;
  61.             }
  62.             ++currentClient[i];
  63.             currentClient[i] %= clientsArr[i];
  64.         }
  65.     }
  66.     return clientInstance;
  67. }
  68.  
  69. //методы процессора
  70. bool hasToWork(queue <int>(&clientMatrix)[3][3]) {
  71.     for (int i = 0; i < 3; ++i)
  72.         for (int j = 0; j < 3; ++j)
  73.             if (!clientMatrix[i][j].empty())
  74.                 return 1;
  75.     return 0;
  76. }
  77.  
  78. void initializeBusy(char(&a)[3][3][1000]) {
  79.     for (int i = 0; i < 3; ++i)
  80.         for (int j = 0; j < 3; ++j)
  81.             for (int k = 0; k < 1000; ++k)
  82.                 a[i][j][k] = 'O';
  83.     return;
  84. }
  85.  
  86. //процедуры вывода в консоль
  87. void printBusy(char(&requestQueue)[1000], int& wholeTime, int& processingTact) {
  88.     for (int i = max(0, wholeTime - processingTact * 4); i < wholeTime; ++i)
  89.     {
  90.         cout << requestQueue[i] << " ";
  91.         if (i % processingTact == processingTact - 1)
  92.             cout << "| ";
  93.     }
  94.     cout << "\n";
  95.     return;
  96. }
  97.  
  98. void printQueue(queue <int>& requestQueue, int priorityIndex, int clientIndex) {
  99.     cout << "Клиент приоритета " << priorityIndex + 1 << " под номером " << clientIndex + 1 << ": ";
  100.     if (requestQueue.empty())
  101.         cout << "запросов больше нет.\n";
  102.     else
  103.     {
  104.         for (int i = 0; i < requestQueue.size(); ++i)
  105.         {
  106.             requestQueue.push(requestQueue.front());
  107.             cout << requestQueue.front() << " ";
  108.             requestQueue.pop();
  109.         }
  110.         cout << "\n";
  111.     }
  112. }
  113.  
  114. int main() {
  115.     setlocale(LC_ALL, "Rus");
  116.  
  117.     queue <int> queueMatrix[3][3];
  118.     initializeOrder(queueMatrix);
  119.     char processorBusynessTable[3][3][1000];
  120.     int clientsArr[3] = { 1, 2, 3 };
  121.     int numberOfProperties = 3;
  122.     int processingTact, inputTact;
  123.     initializeBusy(processorBusynessTable);
  124.  
  125.     cout << "Пожалуйста, введите время такта обработки(условные ед. времени): ";
  126.     cin >> processingTact;
  127.     cout << "Пожалуйста, введите время такта ввода(условные ед. времени): ";
  128.     cin >> inputTact;
  129.     cout << "\n\n\t\t\t\t\t\t\tОбработка началась...\n\n";
  130.  
  131.     bool shouldEndWork = 0, isDowntime;
  132.     int currentClient[3] = { -1, -1, -1 };
  133.     int currentSec = 0;
  134.     int downtime = 0;
  135.  
  136.     while (!shouldEndWork)
  137.     {
  138.         client clientInstance = findClient(currentClient, processorBusynessTable, currentSec, queueMatrix, numberOfProperties, clientsArr);
  139.         cout << "Приоритет текущего клиента: " << clientInstance.priority + 1
  140.             << "\nНомер текущего клиента в своей очереди: " << clientInstance.index + 1
  141.             << "\nТекущая секунда: " << currentSec
  142.             << "\n-------------------------------------------------------------"
  143.             << "\nОставшиеся запросы:\n";
  144.  
  145.         /*
  146.         U - обращение клиента к процессору
  147.         b - обдумывание после обращения
  148.         O - ожидание
  149.         */
  150.         if (clientInstance.priority != -1)
  151.         {
  152.             for (int i = 0; i < min(processingTact, queueMatrix[clientInstance.priority][clientInstance.index].front()); ++i)
  153.             {
  154.                 processorBusynessTable[clientInstance.priority][clientInstance.index][currentSec] = 'U';
  155.                 ++currentSec;
  156.             }
  157.  
  158.             for (int k = currentSec - processingTact; k < currentSec; k++)
  159.             {
  160.                 isDowntime = true;
  161.                 for (int i = 0; i < 3; i++)
  162.                     for (int j = 0; j < 3; j++)
  163.                         if (processorBusynessTable[i][j][k] == 'U')
  164.                             isDowntime = false;
  165.                 if (isDowntime)
  166.                     downtime++;
  167.             }
  168.  
  169.             queueMatrix[clientInstance.priority][clientInstance.index].push(queueMatrix[clientInstance.priority][clientInstance.index].front() - processingTact);
  170.             queueMatrix[clientInstance.priority][clientInstance.index].pop();
  171.  
  172.             for (int i = 1; i < queueMatrix[clientInstance.priority][clientInstance.index].size(); ++i)
  173.             {
  174.                 queueMatrix[clientInstance.priority][clientInstance.index].push(queueMatrix[clientInstance.priority][clientInstance.index].front());
  175.                 queueMatrix[clientInstance.priority][clientInstance.index].pop();
  176.             }
  177.  
  178.             if (queueMatrix[clientInstance.priority][clientInstance.index].front() <= 0)
  179.             {
  180.                 queueMatrix[clientInstance.priority][clientInstance.index].pop();
  181.                 for (int i = 0; i < inputTact; ++i)
  182.                     processorBusynessTable[clientInstance.priority][clientInstance.index][currentSec + i] = 'b';
  183.             }
  184.  
  185.             currentSec += currentSec % processingTact ? processingTact - currentSec % processingTact : 0;
  186.  
  187.         }
  188.         else
  189.             currentSec += processingTact;
  190.  
  191.         //вывод очередей запросов в консоль
  192.         printQueue(queueMatrix[0][0], 0, 0);
  193.         printQueue(queueMatrix[1][0], 1, 0);
  194.         printQueue(queueMatrix[1][1], 1, 1);
  195.         printQueue(queueMatrix[2][0], 1, 2);
  196.         printQueue(queueMatrix[2][1], 2, 0);
  197.         printQueue(queueMatrix[2][2], 2, 1);
  198.  
  199.         //вывод таблицы обработки в консоль
  200.         for (int i = 0; i < 3; i++)
  201.             for (int j = 0; j < 3; j++)
  202.                 printBusy(processorBusynessTable[i][j], currentSec, processingTact);
  203.  
  204.         cout << "\n\n";
  205.  
  206.         shouldEndWork = !hasToWork(queueMatrix);
  207.     }
  208.  
  209.     cout << "Общее время работы: " << currentSec << " условных единиц времени.\n";
  210.     cout << "Общее время простоя: " << downtime << " условных единиц времени.\n";
  211.     cout << "КПД: " << (currentSec - downtime) * 100 / currentSec << "%.\n";
  212.  
  213.     return 0;
  214. }
  215.  
Advertisement
Comments
  • # Bash 0.21 KB | 0 0
    1. WHAT IS "вывод таблицы обработки в консоль" OR "Пожалуйста, введите время такта обработки(условные ед. времени" OR "КПД"??Russian?????
Add Comment
Please, Sign In to add comment
Advertisement