Program.cs 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664
  1. using System;
  2. namespace matmodelirovanie
  3. {
  4. class program
  5. {
  6. static void Main(string[] args)
  7. {
  8. while (true)
  9. {
  10. Console.WriteLine("Задача №3.\nНахождение оптимального распределения трех видов механизмов между тремя участками работ. ");//постановка задачи
  11. uint r1, r2;//размерности матрицы и векторов
  12. r1 = 3;
  13. r2 = 3;
  14. char otv;//переменная для диалога
  15. uint[,] arr = new uint[r2, r1];//матрица затрат
  16. uint[] m = new uint[r2];//вектор мощности
  17. uint[] n = new uint[r1];//вектор спроса
  18. uint valueM = 0, valueN = 0;//переменные для подсчета суммы
  19. uint min = uint.MaxValue;//переменная для поиска минимального элемента
  20. uint max = uint.MinValue;//переменная для поиска максимального элемента
  21. uint minL = uint.MinValue;
  22. uint maxx = uint.MinValue;//переменная для поиска максимального элемента
  23. int indI = 0, indJ = 0;//переменные для хранения индекса минимального элемента
  24. int indII = 0, indJJ = 0;//переменные для хранения индекса максимального элемента
  25. uint[,] raspr = new uint[r2, r1];//массив в котором хранятся значения, куда и сколько использовалось механизмов
  26. uint F = 0;//целевая функция
  27. string[] postavki = new string[0];//массив строк в котором прописано, кто с кем заключил договор
  28. string[,] itog = new string[r2, r1];//матрица, которая схожа с исходной, но в ней проставлены поставки через слеш
  29. Console.WriteLine();
  30. Console.WriteLine("Ввод данных об эффективности использования механизмов конкретного типа на участках работы:");
  31. for (int i = 0; i < arr.GetLength(0); i++)
  32. {
  33. for (int j = 0; j < arr.GetLength(1); j++)
  34. {
  35. while (true) // ввод данных об эффективности использования механизмов конкретного типа на участках работы
  36. {
  37. try
  38. {
  39. Console.Write($"Введите производительность {i + 1}-го механизма при работе на {j + 1}-ом участке: ");
  40. arr[i, j] = Convert.ToUInt32(Console.ReadLine());
  41. if (arr[i, j] > 0)
  42. break;
  43. else
  44. {
  45. Console.WriteLine($"Не можеть быть 0");
  46. }
  47. }
  48. catch
  49. {
  50. Console.WriteLine("Введены некорректные данные!");
  51. }
  52. }
  53. }
  54. }
  55. while (true) // ввод данных об количестве механизмов каждого типа
  56. {
  57. Console.WriteLine();
  58. Console.WriteLine("Ввод данных о количестве механизмов каждого типа:");
  59. for (int i = 0; i < m.Length; i++)
  60. {
  61. while (true)
  62. {
  63. try
  64. {
  65. Console.Write($"Введите количество механизмов {i + 1}-го типа: ");
  66. m[i] = Convert.ToUInt32(Console.ReadLine());
  67. break;
  68. }
  69. catch
  70. {
  71. Console.WriteLine("Введены некорректные данные!");
  72. }
  73. }
  74. }
  75. Console.WriteLine();
  76. Console.WriteLine("Ввод данных о запрашиваемых механизмах для каждого участка:");
  77. for (int i = 0; i < n.Length; i++)
  78. {
  79. while (true) //ввод данных о запрашиваемых механизмах для каждого участка
  80. {
  81. try
  82. {
  83. Console.Write($"Введите количество запрашиваемых механизмов для {i + 1}-го участка работы: ");
  84. n[i] = Convert.ToUInt32(Console.ReadLine());
  85. break;
  86. }
  87. catch
  88. {
  89. Console.WriteLine("Введены некорректные данные!");
  90. }
  91. }
  92. }
  93. for (int i = 0; i < m.Length; i++) // проверка на одинаковость суммы векторов
  94. {
  95. valueM += m[i];
  96. }
  97. for (int i = 0; i < n.Length; i++)
  98. {
  99. valueN += n[i];
  100. }
  101. if (valueM == valueN)
  102. {
  103. break;
  104. }
  105. else
  106. {
  107. Console.WriteLine("Вектор механизмов и участков работ должны быть равны, повторите ввод!");
  108. valueM = 0;
  109. valueN = 0;
  110. }
  111. }
  112. Console.WriteLine();
  113. //вывод таблицы производительности и векторов
  114. Console.WriteLine("\nТаблица производительности:");
  115. for (int i = 0; i < arr.GetLength(0); i++)
  116. {
  117. for (int j = 0; j < arr.GetLength(1); j++)
  118. {
  119. Console.Write($"{arr[i, j]} ");
  120. }
  121. Console.WriteLine();
  122. }
  123. Console.WriteLine();
  124. Console.WriteLine("Вектор механизмов (m):");
  125. for (int i = 0; i < m.Length; i++)
  126. {
  127. Console.Write($"{m[i]} ");
  128. }
  129. Console.WriteLine();
  130. Console.WriteLine("\nВектор участков работы (n):");
  131. for (int i = 0; i < n.Length; i++)
  132. {
  133. Console.Write($"{n[i]} ");
  134. }
  135. //Возможность изменять матрицу
  136. while (true)
  137. {
  138. while (true)
  139. {
  140. try
  141. {
  142. Console.Write("\nХотите изменить данные в таблице?\nЕсли нет, то нажмите на кнопку Д на клавиатуре\nЕсли да, то можете нажать на любую другую кнопку\nОтвет: ");
  143. otv = Convert.ToChar(Console.ReadLine());
  144. break;
  145. }
  146. catch
  147. {
  148. Console.WriteLine("Введены некорректные данные!");
  149. }
  150. }
  151. if (otv.Equals('l') || otv.Equals('д') || otv.Equals('Д') || otv.Equals('L'))
  152. {
  153. break;
  154. }
  155. else
  156. {
  157. Console.Write("Введите номер вида механизма, затем номер участка работ, который вы хотите изменить\nОтвет:\n");
  158. while (true)
  159. {
  160. int i = Convert.ToInt32(Console.ReadLine()), j = Convert.ToInt32(Console.ReadLine());
  161. if (i < r2 + 1 && j < r1 + 1)
  162. {
  163. while (true)
  164. {
  165. try
  166. {
  167. Console.Write("Введите новое значение: ");
  168. uint temp = Convert.ToUInt32(Console.ReadLine());
  169. if (temp != 0)
  170. {
  171. Console.WriteLine($"Вы изменили {i} {j} ячейку таблицы c {arr[i - 1, j - 1]} на {temp}");
  172. arr[i - 1, j - 1] = temp;
  173. break;
  174. }
  175. else
  176. {
  177. Console.WriteLine("Нельзя ввести нулевое значение! Повторите ввод");
  178. }
  179. }
  180. catch
  181. {
  182. Console.WriteLine("Введены некорректные данные!");
  183. }
  184. }
  185. break;
  186. }
  187. else
  188. {
  189. Console.WriteLine("Введенная размерность не соответствует! Повторите ввод");
  190. }
  191. }
  192. }
  193. }
  194. Console.Clear();
  195. Console.WriteLine("\nМатрица:"); //вывод матрицы тарифов
  196. Console.Write(" ");
  197. for (int i = 0; i < n.Length; i++)
  198. {
  199. Console.Write($"{n[i]} ");
  200. }
  201. Console.WriteLine();
  202. for (int i = 0; i < arr.GetLength(0); i++)
  203. {
  204. Console.Write($"{m[i]} ");
  205. for (int j = 0; j < arr.GetLength(1); j++)
  206. {
  207. Console.Write($"{arr[i, j]} ");
  208. }
  209. Console.WriteLine();
  210. }
  211. for (int i = 0; i < raspr.GetLength(0); i++) // создание таблицы распределения и заполнение её пока что нулями
  212. {
  213. for (int j = 0; j < raspr.GetLength(1); j++)
  214. {
  215. raspr[i, j] = 0;
  216. }
  217. }
  218. max = uint.MinValue; // Максимальное значение
  219. for (int i = 0; i < arr.GetLength(0); i++) // поиск максимального и преобразование по формуле Maxl+1-A
  220. {
  221. for (int j = 0; j < arr.GetLength(1); j++)
  222. {
  223. if (arr[i, j] > max)
  224. {
  225. max = arr[i, j];
  226. }
  227. }
  228. }
  229. max = max + 1;
  230. for (int i = 0; i < arr.GetLength(0); i++)
  231. {
  232. for (int j = 0; j < arr.GetLength(1); j++)
  233. {
  234. arr[i, j] = max - arr[i, j]; // преобразование по формуле Maxl+1-A
  235. }
  236. }
  237. Console.WriteLine("\nПреобразование значений матрицы:"); // вывод преобразованной таблицы
  238. for (int i = 0; i < arr.GetLength(0); i++)
  239. {
  240. for (int j = 0; j < arr.GetLength(1); j++)
  241. {
  242. Console.Write($" {arr[i, j]} ");
  243. }
  244. Console.WriteLine();
  245. }
  246. while (true) //алгоритм решения по минимальному элементу
  247. {
  248. min = uint.MaxValue;
  249. valueM = 0;
  250. valueN = 0;
  251. for (int i = 0; i < arr.GetLength(0); i++)
  252. {
  253. for (int j = 0; j < arr.GetLength(1); j++)
  254. {
  255. if (arr[i, j] < min && raspr[i, j] == 0 && m[i] != 0 && n[j] != 0)
  256. {
  257. min = arr[i, j];
  258. indI = i;
  259. indJ = j;
  260. }
  261. }
  262. }
  263. if (n[indJ] != 0 && m[indI] != 0)
  264. {
  265. if (n[indJ] > m[indI])
  266. {
  267. raspr[indI, indJ] = m[indI];
  268. n[indJ] -= m[indI];
  269. m[indI] = 0;
  270. }
  271. else
  272. {
  273. raspr[indI, indJ] = n[indJ];
  274. m[indI] -= n[indJ];
  275. n[indJ] = 0;
  276. }
  277. }
  278. for (int i = 0; i < m.Length; i++) // проверка на то, что первоначальное рапределение выполнено полностью
  279. {
  280. valueM += m[i];
  281. }
  282. for (int i = 0; i < n.Length; i++)
  283. {
  284. valueN += n[i];
  285. }
  286. if (valueM == 0 && valueN == 0)
  287. {
  288. break;
  289. }
  290. }
  291. Console.WriteLine("\nПервоначальное распределение методом минимального элемента:");
  292. uint zap = 0;//переменная для подсчета заполненных клеток, понадобиться для проверки вырожденности
  293. for (int i = 0; i < itog.GetLength(0); i++) //вывод матрицы, в которой через слеш написаны поставки
  294. {
  295. for (int j = 0; j < itog.GetLength(1); j++)
  296. {
  297. if (raspr[i, j] != 0)
  298. {
  299. itog[i, j] = $"{arr[i, j]}/{raspr[i, j]}";
  300. zap = zap + 1;
  301. }
  302. else
  303. {
  304. itog[i, j] = $"{arr[i, j]} ";
  305. }
  306. Console.Write($"{itog[i, j]} ");
  307. }
  308. Console.WriteLine();
  309. }
  310. uint strst = r1 + r2 - 1;
  311. minL = uint.MaxValue; //проверка на вырожденность
  312. Console.WriteLine();
  313. Console.WriteLine("\nПроверка на вырожденность:");
  314. if (strst != zap) //если количество заполненных клеток не равно столбцы+строки-1, то приписание 0 в мин поставку из свободных
  315. {
  316. Console.WriteLine("Таблица вырождена");
  317. for (int i =
  318. 0; i < arr.GetLength(0); i++) // поиск миним. эл среди не заполненных
  319. {
  320. for (int j = 0; j < arr.GetLength(1); j++)
  321. {
  322. if (raspr[i, j] == 0)
  323. {
  324. if (arr[i, j] < minL)
  325. {
  326. minL = arr[i, j];
  327. indI = i;
  328. indJ = j;
  329. }
  330. }
  331. }
  332. }
  333. raspr[indI, indJ] = 9999; // помечаем не заполненные минимальные клетки
  334. for (int i = 0; i < itog.GetLength(0); i++)
  335. {
  336. for (int j = 0; j < itog.GetLength(1); j++)
  337. {
  338. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  339. {
  340. itog[i, j] = $"{arr[i, j]}/{raspr[i, j]}";
  341. }
  342. else if (raspr[i, j] == 9999)
  343. {
  344. itog[i, j] = $"{arr[i, j]}/{raspr[i, j] - 9999}"; //добавление поставки 0
  345. }
  346. else
  347. {
  348. itog[i, j] = $"{arr[i, j]} ";
  349. }
  350. Console.Write($"{itog[i, j]} ");
  351. }
  352. Console.WriteLine();
  353. }
  354. }
  355. else
  356. {
  357. Console.WriteLine("Таблица не вырождена");
  358. }
  359. metka:
  360. Console.WriteLine();
  361. int[] U = new int[r2]; // начальное заполнение массива потенциалов, для дальнейшего решения
  362. int[] V = new int[r1];
  363. for (int i = 0; i < r1; i++)
  364. {
  365. U[i] = 99;
  366. V[i] = 99;
  367. }
  368. //Для заполненных клеток рассчитываются потенциалы Uj и Vi
  369. // проверка на то, является ли ячейка пустой и не записаны ли для неё потенциалы, если нет, то высчитывается потенциал
  370. Console.WriteLine("Расчёт потенциалов");
  371. while (true)
  372. {
  373. bool proverk = true; // для выхода из бесконечного цикла
  374. U[0] = 0; // первому элементу u всегда присваивается 0
  375. for (int j = 0; j < r2; j++)
  376. {
  377. for (int i = 0; i < r1; i++)
  378. {
  379. if (raspr[i, j] != 0)
  380. {
  381. if (U[j] != 99)
  382. {
  383. V[i] = Convert.ToInt32(arr[i, j] - U[j]); // растановка потенциалов V
  384. }
  385. else if (V[i] != 99)
  386. {
  387. U[j] = Convert.ToInt32(arr[i, j] - V[i]);// растановка потенциалов U
  388. }
  389. }
  390. }
  391. }
  392. for (int i = 0; i < r1; i++) // если все потенциалы расставлены, т.е они перестали быть = 99, то выходим из бессконечного цикла
  393. {
  394. if (U[i] == 99 || V[i] == 99)
  395. {
  396. proverk = false;
  397. }
  398. }
  399. if (proverk)
  400. {
  401. break;
  402. }
  403. }
  404. Console.WriteLine("Таблица с раставленными потенциалами:"); // вывод таблицы с потенциалами
  405. for (int i = 0; i < arr.GetLength(0); i++)
  406. {
  407. for (int j = 0; j < arr.GetLength(1); j++)
  408. {
  409. Console.Write($"{itog[i, j]} ");
  410. }
  411. Console.Write($" {V[i]}");
  412. Console.WriteLine();
  413. }
  414. for (int i = 0; i < arr.GetLength(1); i++)
  415. {
  416. Console.Write($"{U[i]} ");
  417. }
  418. Console.WriteLine();
  419. Console.WriteLine();
  420. int[,] Delta = new int[r2, r1]; // задаеем массив дельт
  421. int maxxx = 0; // задаем максимпальной дельте 0
  422. Console.WriteLine("Для пустых клеток расчет дельты:");
  423. for (int i = 0; i < arr.GetLength(0); i++) //определение оптимальности - расчет дельта
  424. {
  425. for (int j = 0; j < arr.GetLength(1); j++)
  426. {
  427. if (raspr[i, j] == 0) // если клетка пустая, то считаем дельту
  428. {
  429. Delta[i, j] = Convert.ToInt32(U[j] + V[i] - arr[i, j]);
  430. if (Delta[i, j] > maxxx) // если посчитанная дельта больше макс.дельты, то присваиваем максимальной дельте полученную дельту и запоминаем её индексы
  431. {
  432. maxxx = Delta[i, j];
  433. indI = i;
  434. indJ = j;
  435. }
  436. if (Delta[i, j] == maxxx && Delta[i, j] != 0) // выводим положительные дельты
  437. {
  438. Console.WriteLine($"{i + 1}{j + 1} = {Delta[i, j]} - max");
  439. }
  440. else // выводим не положительные дельты
  441. {
  442. Console.WriteLine($"{i + 1}{j + 1} = {Delta[i, j]}");
  443. }
  444. }
  445. }
  446. }
  447. Console.WriteLine();
  448. int[,] optimal = new int[r2, r1]; // массив оптимальности, для построения цикла перераспределения
  449. int indi = indI; // переприсвоение индексов максимальной дельты
  450. int indj = indJ;
  451. bool proverk1 = true; // для выхода из бесконечного цикла
  452. bool proverk2 = true;
  453. if (maxxx > 0) // проверка на оптимальность
  454. {
  455. Console.WriteLine("Решение не оптимальное:");
  456. for (int i = 0; i < optimal.GetLength(0); i++)
  457. {
  458. for (int j = 0; j < optimal.GetLength(0); j++)
  459. {
  460. optimal[i, j] = 0; // заполнение массива 0, понадобится для дальнейших расчетов
  461. if (i == indI && j == indJ) //если элемент является максимальрной дельтой, то присваиваем ему 1 (отличный от всех)
  462. {
  463. optimal[i, j] = 1;
  464. }
  465. }
  466. }
  467. F = 0; // промежуточный вывод целувой функции
  468. for (int i = 0; i < raspr.GetLength(0); i++)
  469. {
  470. for (int
  471. j = 0; j < raspr.GetLength(1); j++)
  472. {
  473. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  474. {
  475. F += raspr[i, j] * arr[i, j];
  476. }
  477. }
  478. }
  479. Console.WriteLine($"\nF = {F} у.д.е");
  480. Console.WriteLine();
  481. while (true)
  482. {
  483. proverk2 = true; //для бесконечного цикла
  484. for (int i = 0; i < optimal.GetLength(0); i++)
  485. {
  486. for (int j = 0; j < optimal.GetLength(1); j++)
  487. {
  488. if (i != indi && j != indj && raspr[i, j] != 0 && optimal[i, j] != 2) // находим заполненные клетки, которые не являются максимальной дельтой
  489. {
  490. optimal[i, j] = 2; // присваиваем им 2, для отличия
  491. indI = i;
  492. indJ = j;
  493. proverk2 = false; // выход из бесконечного цикла по j
  494. break;
  495. }
  496. }
  497. if (!proverk2) // выход из бесконечного цикла по i
  498. {
  499. break;
  500. }
  501. }
  502. if (raspr[indI, indj] != 0 && raspr[indi, indJ] != 0) // строим цикл перераспр.
  503. {
  504. optimal[indI, indj] = optimal[indi, indJ] = -1; //помечаем клетку от куда будем вычитать -x
  505. optimal[indI, indJ] = 1;//помечаем клетку куда будем прибавлять +x
  506. proverk1 = false;
  507. }
  508. if (!proverk1) // выход из бесконечного цикла
  509. {
  510. break;
  511. }
  512. }
  513. uint minT = uint.MaxValue;
  514. for (int i = 0; i < optimal.GetLength(0); i++) // выбираем X=MIN(-x)
  515. {
  516. for (int j = 0; j < optimal.GetLength(1); j++)
  517. {
  518. if (optimal[i, j] == -1)
  519. {
  520. if (raspr[i, j] < minT)
  521. {
  522. minT = raspr[i, j];
  523. }
  524. }
  525. }
  526. }
  527. Console.WriteLine($"X = MIN = {minT}");
  528. Console.WriteLine();
  529. for (int i = 0; i < optimal.GetLength(0); i++) // выполняем перераспределение
  530. {
  531. for (int j = 0; j < optimal.GetLength(1); j++)
  532. {
  533. if (optimal[i, j] == -1) // если клетка помечена -1, из её поставки вычитаем MIN
  534. {
  535. raspr[i, j] -= Convert.ToUInt32(minT);
  536. }
  537. if (optimal[i, j] == 1 && raspr[i, j] != 9999) // если клетка помечена 1 и является заполненной к ней прибавляем MIN
  538. {
  539. raspr[i, j] += Convert.ToUInt32(minT);
  540. }
  541. else if (optimal[i, j] == 1 && raspr[i, j] == 999) //если клетка помечена 1 и не заполнена к ней прибавляем MIN
  542. {
  543. raspr[i, j] += Convert.ToUInt32(minT) - 999;
  544. }
  545. }
  546. }
  547. zap = 0; // вывод матрицы после цикла перераспределения
  548. Console.WriteLine("Построенные цикл перераспределения");
  549. for (int i = 0; i < itog.GetLength(0); i++)
  550. {
  551. for (int j = 0; j < itog.GetLength(1); j++)
  552. {
  553. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  554. {
  555. itog[i, j] = $"{arr[i, j]}/{raspr[i, j]} ";
  556. zap++;
  557. }
  558. else if (raspr[i, j] == 9999)
  559. {
  560. itog[i, j] = $"{arr[i, j]}/{raspr[i, j] - 9999} ";
  561. zap++;
  562. }
  563. else
  564. {
  565. itog[i, j] = $"{arr[i, j]} ";
  566. }
  567. Console.Write($"{itog[i, j]} ");
  568. }
  569. Console.WriteLine();
  570. }
  571. goto metka; // опять проверка на оптимальность
  572. }
  573. else
  574. {
  575. Console.WriteLine();
  576. Console.WriteLine("Решение оптимальное:");
  577. max = uint.MinValue; // Максимальное значение
  578. for (int i = 0; i < arr.GetLength(0); i++) // поиск максимального и преобразование по формуле Maxl+1-A
  579. {
  580. for (int j = 0; j < arr.GetLength(1); j++)
  581. {
  582. if (arr[i, j] > max)
  583. {
  584. max = arr[i, j];
  585. }
  586. }
  587. }
  588. max = max + 1;
  589. for (int i = 0; i < arr.GetLength(0); i++)
  590. {
  591. for (int j = 0; j < arr.GetLength(1); j++)
  592. {
  593. arr[i, j] = max - arr[i, j]; // преобразование по формуле Maxl+1-A
  594. }
  595. }
  596. Console.WriteLine("\nОбратное преобразование матрицы:"); // вывод преобразованной таблицы
  597. for (int i = 0; i < itog.GetLength(0); i++)
  598. {
  599. for (int j = 0; j < itog.GetLength(1); j++)
  600. {
  601. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  602. {
  603. itog[i, j] = $"{arr[i, j]}/{raspr[i, j]}";
  604. zap++;
  605. }
  606. else if (raspr[i, j] == 9999)
  607. {
  608. itog[i, j] = $"{arr[i, j]}/{raspr[i, j] - 9999}";
  609. zap++;
  610. }
  611. else
  612. {
  613. itog[i, j] = $"{arr[i, j]} ";
  614. }
  615. Console.Write($"{itog[i, j]} ");
  616. }
  617. Console.WriteLine();
  618. }
  619. F = 0;//подсчет и вывод целевой функции
  620. for (int i = 0; i < raspr.GetLength(0); i++)
  621. {
  622. for (int j = 0; j < raspr.GetLength(1); j++)
  623. {
  624. if (raspr[i, j] != 0 && raspr[i, j] != 9999)
  625. {
  626. F += raspr[i, j] * arr[i, j];
  627. }
  628. }
  629. }
  630. Console.WriteLine($"\nF = {F} у.д.е");
  631. }
  632. // повтор выполнения программы
  633. while (true)
  634. {
  635. try
  636. {
  637. Console.Write("\nХотите повторить выполнение программы?\nЕсли да, то нажмите на кнопку Y(на англ) на клавиатуре\nЕсли нет, то можете нажать на любую другую кнопку\nОтвет: ");
  638. otv = Convert.ToChar(Console.ReadLine());
  639. break;
  640. }
  641. catch
  642. {
  643. Console.WriteLine("Введены некорректные данные!");
  644. }
  645. }
  646. if (!(otv.Equals('Y') || otv.Equals('y') || otv.Equals('н') || otv.Equals('Н')))
  647. {
  648. Console.WriteLine("Программу выполнила студентка группы 31П\nЛебедева Александра Федоровна");
  649. break;
  650. }
  651. else
  652. {
  653. Console.Clear();
  654. }
  655. }
  656. }
  657. }
  658. }