prosras.txt 19 KB

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