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

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

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

Доброго времени суток! Стоит такая задача: вывести наибольшее число в каждой строке матрицы m*n. Проверку выполнять с помощью 2-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);
        }
    }
Проблема вот в чем: программа выводит всё хорошо и без ошибок, но в конце бросает IndexOutOfRangeException (строку пометил в коде доп. класса) или же просто останавливается (т.е. выводится вся нужная информация или часть, а надпись "Для продолжения нажмите любую клавишу..." не выводится и консоль просто ждет чего-то). Подскажите, пожалуйста, как это можно исправить? P.S. использовал 3 потока и семафор, может с ним что-то накосячил?
разобрался, спасибо)

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

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;
        }
    }
}

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


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

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

13   голосов , оценка 4.308 из 5
Похожие ответы