Program.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. using System;
  2. namespace Мат_моделирование
  3. {
  4. class Program
  5. {
  6. static void Main(string[] args)
  7. {
  8. while (true)
  9. {
  10. Console.WriteLine("Сделать первоначальное распределение по методу северо-западного угла в транспортной задаче с учетом преобразования исходной матрицы А в матрицу В по правилу:В = {mахл + 1}-А");
  11. uint r, c;//размерности матрицы и векторов
  12. while (true)//ввод потребителей(размерности по столбцам)
  13. {
  14. try
  15. {
  16. Console.Write("Введите количество потребителей: ");
  17. c = Convert.ToUInt32(Console.ReadLine());
  18. if (c < 2)
  19. {
  20. Console.WriteLine("Потребителей должно быть не менее двух! Повторите ввод");
  21. }
  22. else
  23. {
  24. break;
  25. }
  26. }
  27. catch
  28. {
  29. Console.WriteLine("Введены некорректные данные!");
  30. }
  31. }
  32. while (true)//ввод поставщиков(размерности по стокам)
  33. {
  34. try
  35. {
  36. Console.Write("Введите количество поставщиков: ");
  37. r= Convert.ToUInt32(Console.ReadLine());
  38. if (r < 2)
  39. {
  40. Console.WriteLine("Поставщиков должно быть не менее двух! Повторите ввод");
  41. }
  42. else
  43. {
  44. break;
  45. }
  46. }
  47. catch
  48. {
  49. Console.WriteLine("Введены некорректные данные!");
  50. }
  51. }
  52. int i = 0, j = 0;//переменные для циклов
  53. uint[,] matrxA = new uint[r, c];//матрица затрат
  54. Console.WriteLine("Ввод таблицы затрат на перевозку продукции:");//ввод данных в таблицу затрат
  55. for (i = 0; i < matrxA.GetLength(0); i++)
  56. {
  57. for (j = 0; j < matrxA.GetLength(1); j++)
  58. {
  59. while (true)
  60. {
  61. try
  62. {
  63. Console.Write($"Введите стоимость перевозки от {i + 1} поставщика к {j + 1} потребителю: ");
  64. matrxA[i, j] = Convert.ToUInt32(Console.ReadLine());
  65. break;
  66. }
  67. catch
  68. {
  69. Console.WriteLine("Введены некорректные данные!");
  70. }
  71. }
  72. }
  73. Console.WriteLine();
  74. }
  75. Console.WriteLine("Таблица затрат на перевозку продукции:");//вывод таблицы затрат на экран
  76. for (i = 0; i < matrxA.GetLength(0); i++)
  77. {
  78. for (j = 0; j < matrxA.GetLength(1); j++)
  79. {
  80. Console.Write(matrxA[i, j] + "\t");
  81. }
  82. Console.WriteLine();
  83. }
  84. char otv;//переменная для диалога с пользователем
  85. //Изменение матрицы
  86. while (true)
  87. {
  88. while (true)
  89. {
  90. try
  91. {
  92. Console.Write("\nХотите изменить данные о таблице?\nДа(любая клавиша)/Нет(N)\nОтвет: ");
  93. otv = Convert.ToChar(Console.ReadLine());
  94. break;
  95. }
  96. catch
  97. {
  98. Console.WriteLine("Введены некорректные данные!");
  99. }
  100. }
  101. if (otv.Equals('n') || otv.Equals('т') || otv.Equals('N') || otv.Equals('Т'))
  102. {
  103. break;
  104. }
  105. else
  106. {
  107. Console.Write("Введите номер поставщика, затем номер потребителя, который вы хотите изменить\nОтвет:\n");
  108. while (true)
  109. {
  110. i = Convert.ToInt32(Console.ReadLine());
  111. j = Convert.ToInt32(Console.ReadLine());
  112. if (i < c + 1 && j < r + 1)
  113. {
  114. while (true)
  115. {
  116. try
  117. {
  118. Console.Write("Введите новое значение: ");
  119. uint temp = Convert.ToUInt32(Console.ReadLine());
  120. if (temp != 0)
  121. {
  122. Console.WriteLine($" Была изменена {i} {j} ячейка таблицы c {matrxA[i - 1, j - 1]} на {temp}");
  123. matrxA[i - 1, j - 1] = temp;
  124. break;
  125. }
  126. else
  127. {
  128. Console.WriteLine("Вы ввели нулевое значение! Повторите ввод");
  129. }
  130. }
  131. catch
  132. {
  133. Console.WriteLine("Введены некорректные данные!");
  134. }
  135. }
  136. break;
  137. }
  138. else
  139. {
  140. Console.WriteLine("Введенная размерность не соответствует матрице! Повторите ввод");
  141. }
  142. }
  143. }
  144. }
  145. Console.Clear();
  146. uint max = 0;//нахождение максимальной затраты на перевозку
  147. for (i = 0; i < matrxA.GetLength(0); i++)
  148. {
  149. for (j = 0; j < matrxA.GetLength(1); j++)
  150. {
  151. if (matrxA[i, j] > max)
  152. {
  153. max = matrxA[i, j];
  154. }
  155. }
  156. }
  157. Console.WriteLine($"Максимальная затрата на перевозку равна - {max}");
  158. uint[,] matrxB = new uint[r, c];//новая таблица затрат, пересчитанная по правилу, указанному в задании
  159. for (i = 0; i < matrxB.GetLength(0); i++)
  160. {
  161. for (j = 0; j < matrxB.GetLength(1); j++)
  162. {
  163. matrxB[i, j] = (max + 1) - matrxA[i, j];
  164. }
  165. }
  166. Console.WriteLine("Пересчитанная таблица затрат:");//вывод на экран новой таблицы затрат
  167. for (i = 0; i < matrxB.GetLength(0); i++)
  168. {
  169. for (j = 0; j < matrxB.GetLength(1); j++)
  170. {
  171. Console.Write(matrxB[i, j] + "\t");
  172. }
  173. Console.WriteLine();
  174. }
  175. uint[] m = new uint[r];//вектор мощности поставщиков
  176. uint[] n = new uint[c];//вектор спроса потребителей
  177. uint valueM = 0, valueN = 0;
  178. while (true)
  179. {
  180. Console.WriteLine("Ввод данных о количестве продукции поставщиков (m):");//ввод данных в вектор мощности поставщиков
  181. for (i = 0; i < m.Length; i++)
  182. {
  183. while (true)
  184. {
  185. try
  186. {
  187. Console.Write($"Введите количество продукции у {i + 1} поставщика: ");
  188. m[i] = Convert.ToUInt32(Console.ReadLine());
  189. break;
  190. }
  191. catch
  192. {
  193. Console.WriteLine("Введены некорректные данные!");
  194. }
  195. }
  196. }
  197. Console.WriteLine("Ввод данных о запрашиваемом количестве продукции потребителями(n):");//ввод данных в вектор спроса потребителей
  198. for (i = 0; i < n.Length; i++)
  199. {
  200. while (true)
  201. {
  202. try
  203. {
  204. Console.Write($"Введите количество необходимой продукции для {i + 1} потребителя: ");
  205. n[i] = Convert.ToUInt32(Console.ReadLine());
  206. break;
  207. }
  208. catch
  209. {
  210. Console.WriteLine("Введены некорректные данные!");
  211. }
  212. }
  213. }
  214. for (i = 0; i < m.Length; i++)
  215. {
  216. valueM += m[i];
  217. }
  218. for (i = 0; i < n.Length; i++)
  219. {
  220. valueN += n[i];
  221. }
  222. if (valueM == valueN)
  223. {
  224. break;
  225. }
  226. else//проверка на равенство суммы элементов векторов
  227. {
  228. Console.WriteLine("Вектор мощности (m) и cпроса (n) должны быть равны, повторите ввод!");
  229. valueM = 0;
  230. valueN = 0;
  231. }
  232. }
  233. Console.WriteLine("Вектор мощности (m):");//вывод на экран
  234. for (i = 0; i < m.Length; i++)
  235. {
  236. Console.Write($"{m[i]} ");
  237. }
  238. Console.WriteLine("\nВектор спроса (n):");//вывод на экран
  239. for (i = 0; i < n.Length; i++)
  240. {
  241. Console.Write($"{n[i]} ");
  242. }
  243. Console.WriteLine("\nМатрица тарифов:");//вывод на экран матрицы и векторов
  244. Console.Write(" ");
  245. for (i = 0; i < n.Length; i++)
  246. {
  247. Console.Write($"{n[i]} ");
  248. }
  249. Console.WriteLine();
  250. for (i = 0; i < matrxB.GetLength(0); i++)
  251. {
  252. Console.Write($"{m[i]} ");
  253. for (j = 0; j < matrxB.GetLength(1); j++)
  254. {
  255. Console.Write($"{matrxB[i, j]} ");
  256. }
  257. Console.WriteLine();
  258. }
  259. uint[,] raspr = new uint[r, c];//массив для распределения
  260. for (i = 0; i < raspr.GetLength(0); i++)
  261. {
  262. for (j = 0; j < raspr.GetLength(1); j++)
  263. {
  264. raspr[i, j] = 0;
  265. }
  266. }
  267. i = 0;
  268. j = 0;
  269. //алгоритм распределения
  270. while (i < r && j < c)
  271. {
  272. if (n[j] > m[i])
  273. {
  274. raspr[i, j] = m[i];
  275. n[j] -= m[i];
  276. m[i] = 0;
  277. i++;
  278. }
  279. else
  280. {
  281. raspr[i, j] = n[j];
  282. m[i] -= n[j];
  283. n[j] = 0;
  284. j++;
  285. }
  286. }
  287. Console.WriteLine();
  288. for (i = 0; i < raspr.GetLength(0); i++)
  289. {
  290. for (j = 0; j < raspr.GetLength(1); j++)
  291. {
  292. Console.Write($"{raspr[i, j]} ");
  293. }
  294. Console.WriteLine();
  295. }
  296. uint F = 0;//нахождение функции распределения
  297. for (i = 0; i < raspr.GetLength(0); i++)
  298. {
  299. for (j = 0; j < raspr.GetLength(1); j++)
  300. {
  301. if (raspr[i, j] != 0)
  302. {
  303. F += raspr[i, j] * matrxB[i, j];
  304. }
  305. }
  306. }
  307. Console.WriteLine($"F = {F} у.д.е");
  308. while (true)
  309. {
  310. try
  311. {
  312. Console.Write("\nПовторить программу?\nДа(Y)/Нет(N)\nОтвет: ");
  313. otv = Convert.ToChar(Console.ReadLine());
  314. break;
  315. }
  316. catch
  317. {
  318. Console.WriteLine("Введены некорректные данные!");
  319. }
  320. }
  321. if (!(otv.Equals('Y') || otv.Equals('y') || otv.Equals('н') || otv.Equals('Н')))
  322. {
  323. break;
  324. }
  325. else if (!(otv.Equals('N') || otv.Equals('N') || otv.Equals('Т') || otv.Equals('т')))
  326. {
  327. Console.Clear();
  328. }
  329. else
  330. {
  331. Console.Clear();
  332. }
  333. }
  334. }
  335. }
  336. }