Потоки и поиск в матрице - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Стоит такая задача: вывести наибольшее число в каждой строке матрицы m*n. Проверку выполнять с помощью 2-3 потоков. Вот код моей программы:
Листинг программы
  1. static void Main(string[] args)
  2. {
  3. Console.WriteLine("Введите размерность матрицы:");
  4. Console.Write("Столбцы: ");
  5. int cols = Int32.Parse(Console.ReadLine());
  6. Console.Write("Ряды: ");
  7. int rows = Int32.Parse(Console.ReadLine());
  8. MSystem ms = new MSystem(cols, rows);
  9. Console.WriteLine("Сгенерированная матрица:");
  10. ms.ShowMatr();
  11. Console.WriteLine("Большее число каждой строки:");
  12. ms.ShowBiggestValues();
  13. }
Доп. класс:
Листинг программы
  1. using System.Threading;
  2. class MSystem
  3. {
  4. private int cols, rows;
  5. private int[,] matr;
  6. private static Semaphore _pool;
  7. private bool[] check;
  8. public MSystem(int _cols, int _rows)
  9. {
  10. cols = _cols;
  11. rows = _rows;
  12. matr = new int [rows,cols];
  13. check = new bool[rows];
  14. _pool = new Semaphore(0, 3);
  15. FillMatr();
  16. }
  17. public void ShowMatr()
  18. {
  19. for (int i = 0; i < rows; i++)
  20. {
  21. for (int j = 0; j < cols; j++)
  22. Console.Write("{0} ", matr[i, j]);
  23. Console.WriteLine();
  24. }
  25. }
  26. private void FillMatr()
  27. {
  28. Random rd = new Random();
  29. for (int i = 0; i < rows; i++)
  30. for (int j = 0; j < cols; j++)
  31. matr[i, j] = rd.Next(0, 55);
  32. Console.WriteLine("Автозаполнение выполнено.");
  33. Thread.Sleep(500);
  34. }
  35. public void ShowBiggestValues()
  36. {
  37. for (int i = 0; i < 3; i++)
  38. {
  39. Thread tr = new Thread(new ParameterizedThreadStart(Count));
  40. tr.Start(i+1);
  41. }
  42. _pool.Release(3);
  43. }
  44. private void Count(object number)
  45. {
  46. int result = 0;
  47. int index = -1;
  48. int max = -1;
  49.  
  50. while (result != -1)
  51. {
  52. // плучения индекса ещё не проверенной строки
  53. for (int i = 0; i < rows; i++)
  54. {
  55. if (!check[i])
  56. {
  57. index = i;
  58. max = matr[i,0];
  59. check[i] = true;
  60. break;
  61. }
  62. else
  63. index = -1;
  64. }
  65. if (result != -1)
  66. {
  67. // работа со строкой (если есть)
  68. for (int j = 0; j < cols; j++)
  69. if (matr[index, j] > max) // ВОТ ТУТ БРОСАЕТ IndexOutOfRangeException
  70. max = matr[index, j];
  71. // вывод результата
  72. Console.WriteLine("Поток {0}: больший элемент в строке {1} - {2}", number, index+1, max);
  73. // задержка
  74. Thread.Sleep(1000);
  75. }
  76. _pool.WaitOne();
  77. }
  78. Console.WriteLine("Поток {0} закончил работу.", number);
  79. }
  80. }
Проблема вот в чем: программа выводит всё хорошо и без ошибок, но в конце бросает IndexOutOfRangeException (строку пометил в коде доп. класса) или же просто останавливается (т.е. выводится вся нужная информация или часть, а надпись "Для продолжения нажмите любую клавишу..." не выводится и консоль просто ждет чего-то). Подскажите, пожалуйста, как это можно исправить? P.S. использовал 3 потока и семафор, может с ним что-то накосячил?
разобрался, спасибо)

Решение задачи: «Потоки и поиск в матрице»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. class Program
  6. {
  7.     static void Main(string[] args)
  8.     {
  9.         int[,] arr =
  10.             {
  11.                     { 1,2,3,4,5},
  12.                     {2,3,6,7,8 },
  13.                     {10,20,3,4,5 },
  14.                     { 1,2,3,4,5},
  15.                     {2,3,6,7,8 },
  16.                     {10,20,3,4,5 },
  17.                 };
  18.         Func<int[,], Task<IEnumerable<IEnumerable<int>>>> ToTaskEnum
  19.             = async array
  20.             => await Task.Run(()
  21.             =>
  22.             {
  23.                 return arr.ToEnumerable();
  24.             });
  25.         Func<Task<IEnumerable<IEnumerable<int>>>, Task<IEnumerable<int>>> GetMax
  26.             = async toTaskEnum
  27.             => await Task.Run(async ()
  28.             =>
  29.             {
  30.                 var result = await toTaskEnum;
  31.                 return result.Select(col => col.Max());
  32.             });
  33.  
  34.         Action<Task<IEnumerable<int>>> WriteResult
  35.             = async _result
  36.             => await Task.Run(async ()
  37.             =>
  38.             {
  39.                 var result = await _result;
  40.                 Console.WriteLine(string.Join(" ", result));
  41.             });
  42.         WriteResult(GetMax(ToTaskEnum(arr)));
  43.  
  44.         Console.ReadKey(false);
  45.     }
  46. }
  47. public static class ToEnum
  48. {
  49.     public static IEnumerable<IEnumerable<int>> ToEnumerable(this int[,] arr)
  50.     {
  51.         for (int i = 0; i < arr.GetLength(0); i++)
  52.         {
  53.             var list = new List<int>();
  54.             for (int j = 0; j < arr.GetLength(1); j++)
  55.                 list.Add(arr[i, j]);
  56.             yield return list;
  57.         }
  58.     }
  59. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.308 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы