Потоки и поиск в матрице - C#
Формулировка задачи:
Доброго времени суток!
Стоит такая задача: вывести наибольшее число в каждой строке матрицы m*n. Проверку выполнять с помощью 2-3 потоков.
Вот код моей программы:
Доп. класс:
Проблема вот в чем: программа выводит всё хорошо и без ошибок, но в конце бросает IndexOutOfRangeException (строку пометил в коде доп. класса) или же просто останавливается (т.е. выводится вся нужная информация или часть, а надпись "Для продолжения нажмите любую клавишу..." не выводится и консоль просто ждет чего-то).
Подскажите, пожалуйста, как это можно исправить?
P.S. использовал 3 потока и семафор, может с ним что-то накосячил?
static void Main(string[] args) { Console.WriteLine("Введите размерность матрицы:"); Console.Write("Столбцы: "); int cols = Int32.Parse(Console.ReadLine()); Console.Write("Ряды: "); int rows = Int32.Parse(Console.ReadLine()); MSystem ms = new MSystem(cols, rows); Console.WriteLine("Сгенерированная матрица:"); ms.ShowMatr(); Console.WriteLine("Большее число каждой строки:"); ms.ShowBiggestValues(); }
using System.Threading; class MSystem { private int cols, rows; private int[,] matr; private static Semaphore _pool; private bool[] check; public MSystem(int _cols, int _rows) { cols = _cols; rows = _rows; matr = new int [rows,cols]; check = new bool[rows]; _pool = new Semaphore(0, 3); FillMatr(); } public void ShowMatr() { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) Console.Write("{0} ", matr[i, j]); Console.WriteLine(); } } private void FillMatr() { Random rd = new Random(); for (int i = 0; i < rows; i++) for (int j = 0; j < cols; j++) matr[i, j] = rd.Next(0, 55); Console.WriteLine("Автозаполнение выполнено."); Thread.Sleep(500); } public void ShowBiggestValues() { for (int i = 0; i < 3; i++) { Thread tr = new Thread(new ParameterizedThreadStart(Count)); tr.Start(i+1); } _pool.Release(3); } private void Count(object number) { int result = 0; int index = -1; int max = -1; while (result != -1) { // плучения индекса ещё не проверенной строки for (int i = 0; i < rows; i++) { if (!check[i]) { index = i; max = matr[i,0]; check[i] = true; break; } else index = -1; } if (result != -1) { // работа со строкой (если есть) for (int j = 0; j < cols; j++) if (matr[index, j] > max) // ВОТ ТУТ БРОСАЕТ IndexOutOfRangeException max = matr[index, j]; // вывод результата Console.WriteLine("Поток {0}: больший элемент в строке {1} - {2}", number, index+1, max); // задержка Thread.Sleep(1000); } _pool.WaitOne(); } Console.WriteLine("Поток {0} закончил работу.", number); } }
разобрался, спасибо)
Решение задачи: «Потоки и поиск в матрице»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; class Program { static void Main(string[] args) { int[,] arr = { { 1,2,3,4,5}, {2,3,6,7,8 }, {10,20,3,4,5 }, { 1,2,3,4,5}, {2,3,6,7,8 }, {10,20,3,4,5 }, }; Func<int[,], Task<IEnumerable<IEnumerable<int>>>> ToTaskEnum = async array => await Task.Run(() => { return arr.ToEnumerable(); }); Func<Task<IEnumerable<IEnumerable<int>>>, Task<IEnumerable<int>>> GetMax = async toTaskEnum => await Task.Run(async () => { var result = await toTaskEnum; return result.Select(col => col.Max()); }); Action<Task<IEnumerable<int>>> WriteResult = async _result => await Task.Run(async () => { var result = await _result; Console.WriteLine(string.Join(" ", result)); }); WriteResult(GetMax(ToTaskEnum(arr))); Console.ReadKey(false); } } public static class ToEnum { public static IEnumerable<IEnumerable<int>> ToEnumerable(this int[,] arr) { for (int i = 0; i < arr.GetLength(0); i++) { var list = new List<int>(); for (int j = 0; j < arr.GetLength(1); j++) list.Add(arr[i, j]); yield return list; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д