Advertisement
Garey

Untitled

Feb 8th, 2021 (edited)
1,089
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.81 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <locale.h>
  4.  
  5. int numberOfProcesses,
  6. totalCPUBurstTime,
  7. * arrivalTime,
  8. * CPUBurstTime,
  9. * CPUBurstTimeCopy,
  10. * processNumber,
  11. minimumArrivalTime,
  12. * processSequenceForEachSecond,
  13. * processFinishSequence,
  14. * waitingTime;
  15.  
  16. float averageTurnAroundTime,
  17. averageWaitingTime = 0;
  18.  
  19. /* помощни масиви за изчертавато на Гант диаграмата */
  20. int* processNumberGantt,
  21. * CPUBurstTimeGantt,
  22. ganttSize;
  23.  
  24. void drawGanttChart();
  25.  
  26. int findAptProcessNumber(int);
  27.  
  28. void Show();
  29. void Load(int&);
  30. void Finish(int&, int&, int&);
  31. void Dispatch();
  32.  
  33. int main()
  34. {
  35.     /* кирилица */
  36.     setlocale(LC_ALL, "bgr");
  37.  
  38.     int i, j, temp;
  39.  
  40.     printf("Въведете броя на процесите : ");
  41.     scanf("%d", &numberOfProcesses);
  42.  
  43.     arrivalTime = (int*)malloc(sizeof(int) * numberOfProcesses);
  44.     CPUBurstTime = (int*)malloc(sizeof(int) * numberOfProcesses);
  45.     CPUBurstTimeCopy = (int*)malloc(sizeof(int) * numberOfProcesses);
  46.     processNumber = (int*)malloc(sizeof(int) * numberOfProcesses);
  47.     waitingTime = (int*)malloc(sizeof(int) * numberOfProcesses);
  48.     processFinishSequence = (int*)malloc(sizeof(int) * numberOfProcesses);
  49.  
  50.     minimumArrivalTime = 2147483647;
  51.  
  52.     for (i = 0; i < numberOfProcesses; i++)
  53.     {
  54.         Load(i);
  55.     }
  56.  
  57.     processSequenceForEachSecond = (int*)malloc(sizeof(int) * totalCPUBurstTime);
  58.  
  59.     Dispatch();
  60.  
  61.     Show();
  62.  
  63.     drawGanttChart();
  64.  
  65.     /* освобождаване на заделената динамична памет */
  66.     free(arrivalTime);
  67.     free(CPUBurstTime);
  68.     free(CPUBurstTimeCopy);
  69.     free(processNumber);
  70.     free(processSequenceForEachSecond);
  71.     free(processFinishSequence);
  72.     free(waitingTime);
  73.     free(processNumberGantt);
  74.     free(CPUBurstTimeGantt);
  75.  
  76.     return 0;
  77. }
  78.  
  79. int findAptProcessNumber(int currentTime)
  80. {
  81.     int i, min = 2147483647, pNumber;
  82.     for (i = 0; i < numberOfProcesses; i++)
  83.         if (arrivalTime[i] <= currentTime && min > CPUBurstTime[i] && CPUBurstTime[i] != 0)
  84.         {
  85.             min = CPUBurstTime[i];
  86.             pNumber = i;
  87.         }
  88.  
  89.     return pNumber;
  90. }
  91.  
  92. void drawGanttChart()
  93. {
  94.     const int maxWidth = 100;
  95.     int scalingFactor, i, counter, tempi, currentTime;
  96.     printf("Гант диаграма : \n\n");
  97.  
  98.     scalingFactor = maxWidth / totalCPUBurstTime;
  99.     for (i = 0; i < scalingFactor * totalCPUBurstTime + 2 + ganttSize; i++)
  100.         printf("-");
  101.     printf("\n|");
  102.     counter = 0, tempi = 0;
  103.     for (i = 0; i < scalingFactor * totalCPUBurstTime; i++)
  104.         if (i == CPUBurstTimeGantt[counter] * scalingFactor + tempi)
  105.         {
  106.             counter++;
  107.             tempi = i;
  108.             printf("|");
  109.         }
  110.         else if (i == (CPUBurstTimeGantt[counter] * scalingFactor) / 2 + tempi)
  111.             printf("P%d", processNumberGantt[counter] + 1);
  112.         else
  113.             printf(" ");
  114.     printf("|");
  115.     printf("\n");
  116.     for (i = 0; i < scalingFactor * totalCPUBurstTime + 2 + ganttSize; i++)
  117.         printf("-");
  118.     printf("\n");
  119.  
  120.     /* печатане на времевите маркери */
  121.     counter = 0;
  122.     tempi = 0;
  123.     currentTime = minimumArrivalTime;
  124.     printf("%d", currentTime);
  125.     for (i = 0; i < scalingFactor * totalCPUBurstTime; i++)
  126.         if (i == CPUBurstTimeGantt[counter] * scalingFactor + tempi)
  127.         {
  128.             tempi = i;
  129.             currentTime += CPUBurstTimeGantt[counter];
  130.             counter++;
  131.             printf("%2d", currentTime);
  132.         }
  133.         else
  134.         {
  135.             printf(" ");
  136.         }
  137.     currentTime += CPUBurstTimeGantt[counter];
  138.     printf("%2d\n\n", currentTime);
  139. }
  140.  
  141.  
  142. void Show() {
  143.     printf("\nПроцес\t|\tTw\t|\tTr\n\n");
  144.  
  145.     for (int i = 0; i < numberOfProcesses; i++)
  146.     {
  147.         printf("\nP[%d]\t|\t%d\t|\t%d",
  148.             processFinishSequence[i] + 1,
  149.             waitingTime[processFinishSequence[i]],
  150.             waitingTime[processFinishSequence[i]] + CPUBurstTimeCopy[processFinishSequence[i]]);
  151.     }
  152.  
  153.     printf("\n\nСредно време, изразходено за изчакване на процесора = %.2f", averageWaitingTime);
  154.     printf("\nСредно оборотно време = %.2f\n\n", averageTurnAroundTime);
  155. }
  156.  
  157. void Load(int &i) {
  158.     processFinishSequence[i] = -1;
  159.     waitingTime[i] = 0;
  160.     processNumber[i] = i;
  161.     printf("\nВъведете данните за процес номер %d\n", i + 1);
  162.     printf("\n");
  163.     printf("Време на пристигане : ");
  164.     scanf("%d", &arrivalTime[i]);
  165.     printf("Необходимо време за изпълнение : ");
  166.     scanf("%d", &CPUBurstTime[i]);
  167.     CPUBurstTimeCopy[i] = CPUBurstTime[i];
  168.     totalCPUBurstTime += CPUBurstTime[i];
  169.  
  170.     if (minimumArrivalTime > arrivalTime[i])
  171.         minimumArrivalTime = arrivalTime[i];
  172. }
  173.  
  174.  
  175. void Finish(int &i, int &pNumber, int &counter) {
  176.     processSequenceForEachSecond[i - minimumArrivalTime] = pNumber;
  177.     CPUBurstTime[pNumber]--;
  178.  
  179.     if (CPUBurstTime[pNumber] == 0)
  180.     {
  181.         processFinishSequence[counter++] = pNumber;
  182.     }
  183. }
  184.  
  185. void Dispatch()
  186. {
  187.     int i, j, pNumber, prevProcess, tempCPUBurstTime, counter, prevProcesss;
  188.     counter = 0;
  189.     for (i = minimumArrivalTime; i < totalCPUBurstTime + minimumArrivalTime; i++)
  190.     {
  191.         pNumber = findAptProcessNumber(i);
  192.  
  193.         Finish(i, pNumber, counter);
  194.  
  195.         /* изчисляване време на изчакване на всеки процес */
  196.         for (j = 0; j < numberOfProcesses; j++)
  197.             if (CPUBurstTime[j] != 0 && arrivalTime[j] <= i && j != pNumber)
  198.                 waitingTime[j]++;
  199.     }
  200.  
  201.     /* изчисляване размера на масивите за Гант диаграмата */
  202.     ganttSize = 1;
  203.     prevProcess = processSequenceForEachSecond[0];
  204.     for (i = 0; i < totalCPUBurstTime; i++)
  205.     {
  206.         if (prevProcess != processSequenceForEachSecond[i])
  207.             ganttSize++;
  208.         prevProcess = processSequenceForEachSecond[i];
  209.     }
  210.  
  211.     /* заделяне на памет за масивите за Гант диаграмата */
  212.     processNumberGantt = (int*)malloc(sizeof(int) * ganttSize);
  213.     CPUBurstTimeGantt = (int*)malloc(sizeof(int) * ganttSize);
  214.  
  215.     /* вкарване на данните в масивите за Гант диаграмата */
  216.     prevProcess = processSequenceForEachSecond[0];
  217.     tempCPUBurstTime = 0;
  218.     counter = 0;
  219.     for (i = 0; i < totalCPUBurstTime; i++)
  220.     {
  221.         if (prevProcess != processSequenceForEachSecond[i])
  222.         {
  223.             processNumberGantt[counter] = prevProcess;
  224.             CPUBurstTimeGantt[counter] = tempCPUBurstTime;
  225.             counter++;
  226.             tempCPUBurstTime = 0;
  227.         }
  228.         tempCPUBurstTime++;
  229.         prevProcess = processSequenceForEachSecond[i];
  230.     }
  231.  
  232.     CPUBurstTimeGantt[ganttSize - 1] = tempCPUBurstTime;
  233.     processNumberGantt[ganttSize - 1] = prevProcess;
  234.  
  235.  
  236.     /* изчисляване на средното време на изчакване Tw и оборотното време Tr */
  237.     averageWaitingTime = 0;
  238.     averageTurnAroundTime = 0;
  239.     for (i = 0; i < numberOfProcesses; i++)
  240.     {
  241.         averageWaitingTime += waitingTime[i];
  242.         averageTurnAroundTime += waitingTime[i] + CPUBurstTimeCopy[i];
  243.     }
  244.     averageWaitingTime = averageWaitingTime / (float)numberOfProcesses;
  245.     averageTurnAroundTime = averageTurnAroundTime / (float)numberOfProcesses;
  246.  
  247. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement