way.txt 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. using System;
  2. namespace Indexs
  3. {
  4. class program
  5. {
  6. static void Main(string[] args)
  7. {
  8. while(true)
  9. {
  10. Console.Clear();
  11. Console.WriteLine("Дана таблица работ для сетевого графика. Построить сетевой график и найти критический путь.");
  12. int[] ri = new int[] { 1, 1, 1, 2, 2, 3, 4 }; // начало пути
  13. int[] rj = new int[] { 2, 3, 5, 3, 4, 4, 5 }; // конец пути
  14. int[] dij = new int[ri.Length]; // объявление масива
  15. m1: int otv = 0;
  16. while (true)
  17. {
  18. Console.Write($"Введите номер способа заполнения продолжительностей работ\n1.Вручную\n2.Рандомно\nОтвет: ");
  19. try
  20. {
  21. otv = int.Parse(Console.ReadLine());
  22. break;
  23. }
  24. catch
  25. {
  26. Console.WriteLine("Введено некорректное значение! Повторите ввод");
  27. }
  28. }
  29. switch (otv) // выбор ручного или автоматического заполнения
  30. {
  31. case 1:
  32. int a = 0;
  33. for (int i = 0; i < dij.Length; i++)
  34. {
  35. while (true) // проверка введенного значения
  36. {
  37. Console.Write($"Ввдеите продолжительность {i + 1} работы: "); // ввод продолжительности работ
  38. a = Convert.ToInt32(Console.ReadLine());
  39. if (a > 0)
  40. {
  41. dij[i] = a;
  42. break;
  43. }
  44. else
  45. {
  46. Console.WriteLine($"Введено некорректное значение! Повторите ввод.");
  47. }
  48. }
  49. }
  50. break;
  51. case 2:
  52. Random rnd = new Random();
  53. for (int i = 0; i < dij.Length; i++) // рандомное заполнение
  54. {
  55. dij[i] = rnd.Next(1, 100);
  56. }
  57. break;
  58. default:
  59. Console.WriteLine($"Введено некорректное значение! Повторите ввод.");
  60. goto m1;
  61. break;
  62. }
  63. Console.Clear();
  64. Console.WriteLine($"Работы и их продолжительность:");
  65. for (int i = 0; i < dij.Length; i++)
  66. {
  67. Console.WriteLine($"{ri[i]}-{rj[i]}({dij[i]})"); // вывод таблицы
  68. }
  69. Console.WriteLine();
  70. int[,] table = new int[4, 5];
  71. int[][] pathes = new int[4][]; // массив из массивов (ступенчатый массив)
  72. pathes[0] = new int[5];
  73. pathes[1] = new int[6]; // пути , одна ячейка для F
  74. pathes[2] = new int[5];
  75. pathes[3] = new int[3];
  76. for (int i = 0; i < ri.Length; i++)
  77. {
  78. table[ri[i] - 1, rj[i] - 1] = dij[i]; // заполнение таблицы с продолжительностями в днях
  79. }
  80. pathes[0][0] = 1;
  81. pathes[0][1] = 2; // пути заполняются
  82. pathes[0][2] = 4;
  83. pathes[0][3] = 5;
  84. pathes[1][0] = 1;
  85. pathes[1][1] = 2;
  86. pathes[1][2] = 3;
  87. pathes[1][3] = 4;
  88. pathes[1][4] = 5;
  89. pathes[2][0] = 1;
  90. pathes[2][1] = 3;
  91. pathes[2][2] = 4;
  92. pathes[2][3] = 5;
  93. pathes[3][0] = 1;
  94. pathes[3][1] = 5;
  95. for (int j = 0; j < pathes.Length; j++) // перебирает массивы внутри массива
  96. {
  97. for (int i = 1; i < pathes[j].Length - 1; i++) // перебирает элементы конкретного массива
  98. {
  99. pathes[j][pathes[j].Length - 1] += table[pathes[j][i - 1] - 1, pathes[j][i] - 1]; // обращаемся к последнему элементу массива и плюсуем значение пути
  100. }
  101. }
  102. for (int j = 0; j < pathes.Length; j++)// перебират массивы внутри массива
  103. {
  104. Console.Write($"Путь {j + 1}: "); // выводит путь индекс пути
  105. for (int i = 0; i < pathes[j].Length - 1; i++) // последняя f его не выводим
  106. {
  107. if (i == pathes[j].Length - 2)
  108. {
  109. Console.Write($"{pathes[j][i]}");
  110. }
  111. else
  112. {
  113. Console.Write($"{pathes[j][i]}-");
  114. }
  115. }
  116. Console.WriteLine($"; F = {pathes[j][pathes[j].Length - 1]}"); // вывод f
  117. }
  118. int MaxF = int.MinValue; /// для поиска максимального f
  119. int ind = 0; // индекс максимального пути
  120. for (int i = 0; i < pathes.Length; i++)
  121. {
  122. if (MaxF < pathes[i][pathes[i].Length - 1])
  123. {
  124. MaxF = pathes[i][pathes[i].Length - 1];
  125. ind = i;
  126. }
  127. }
  128. Console.Write($"Критический путь - Путь {ind + 1}: ");//вывод критического пути и его индекс
  129. for (int i = 0; i < pathes[ind].Length - 1; i++)
  130. {
  131. if (i == pathes[ind].Length - 2)
  132. {
  133. Console.Write($"{pathes[ind][i]}");
  134. }
  135. else
  136. {
  137. Console.Write($"{pathes[ind][i]}-");
  138. }
  139. }
  140. Console.WriteLine($"; F = {pathes[ind][pathes[ind].Length - 1]}");
  141. while (true)
  142. {
  143. Console.Write($"Хотите повторить выполнение программы ? (0 - нет, любая цифра - да)");
  144. try
  145. {
  146. otv = int.Parse(Console.ReadLine());
  147. break;
  148. }
  149. catch
  150. {
  151. Console.WriteLine("Введено некорректное значение! Повторите ввод");
  152. }
  153. }
  154. if (otv == 0)
  155. {
  156. break;
  157. }
  158. }
  159. }
  160. }
  161. }