Anonim_999

SashkaComment

Nov 22nd, 2022
701
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.16 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace ConsoleApp23
  5. {
  6.     class Program
  7.     {
  8.         public static int[] A; //Массив чисел
  9.         public static int CountElements; //Количество элементов
  10.         public static int CountThreads; //Количество потоков
  11.         public static int SubArrayLen; //Длина части массива
  12.         public static int MaxOddNumber = 0; //результат
  13.         public static object Locker = new object();
  14.  
  15.         static void Main(string[] args)
  16.         {
  17.             string userInput; // переменная хранит пользовательский ввод
  18.             Console.Write("Количество элементов в массиве: ");
  19.             userInput = Console.ReadLine();
  20.  
  21.             if (int.TryParse(userInput,out CountElements) == false || CountElements < 1)//Проверка на ввод пользователя
  22.             {
  23.                 CountElements = 10;
  24.                 Console.Write($"Количество элменетов заданы не правильно: {CountElements}");
  25.             }
  26.             A = new int[CountElements];
  27.             Console.WriteLine("\nКоличество потоков: ");
  28.             userInput = Console.ReadLine();
  29.  
  30.             if (int.TryParse(userInput,out CountThreads) == false || CountThreads < 1)//Проверка на ввод пользователя
  31.             {
  32.                 CountThreads = 1;
  33.                 Console.WriteLine($"Количество потоков заданы не правильно: {CountThreads}");
  34.             }
  35.  
  36.             if (CountThreads > CountElements) //Проверка, чтобы количество потоков не было больше количества элементов
  37.                 CountThreads = CountElements;
  38.             Console.WriteLine("Заполнение массива A:");
  39.  
  40.             for (int i = 0; i < CountElements; i++)
  41.             {
  42.                 Console.Write((i+1) + ": ");
  43.  
  44.                 if (int.TryParse(Console.ReadLine(),out A[i]) == false || A[i] < 1)//Проверка на ввод пользователя
  45.                 {
  46.                     Console.WriteLine("Нерпавильный ввод: ");
  47.                     i--;
  48.                 }
  49.             }
  50.             Console.Clear();
  51.             Console.Write("Элементы массива: ");
  52.  
  53.             foreach (int item in A) //Вывод всех элементов массива в консоль
  54.                 Console.Write($"{item} ");
  55.             Console.WriteLine();
  56.             SubArrayLen = CountElements / CountThreads + 1; //Длина части массива
  57.             Thread[] threads = new Thread[CountThreads]; //Массив потоков
  58.  
  59.             for (int i = 0; i < CountThreads; i++) //Цикл, который пробегает по потокам, дает им часть массива, имя и запускает их
  60.             {
  61.                 PartArray partArray = new PartArray
  62.                 {
  63.                     StartIndex = i * SubArrayLen,
  64.                     EndIndex = (i + 1) * SubArrayLen
  65.                 };
  66.  
  67.                 if (partArray.EndIndex > CountElements) //Проверка на выход за границы массива
  68.                     partArray.EndIndex = CountElements;
  69.                 threads[i] = new Thread(() => FindMaxOddNumber(partArray));
  70.                 threads[i].Name = "Поток№" + (i+1);
  71.                 threads[i].Start();
  72.             }
  73.  
  74.             foreach (Thread thread in threads) //Цикл ожидания заверщения потоков
  75.             {
  76.                 Console.WriteLine($"{thread.Name} - начал");
  77.                 thread.Join();
  78.                 Console.WriteLine($"{thread.Name} - закончил");
  79.             }
  80.             Console.WriteLine($"Максимальное нечетное число: {MaxOddNumber}"); //Вывод результата
  81.             Console.ReadLine();
  82.         }
  83.         /*
  84.          Метод с циклом, который пробегает свою часть массива
  85.             проверяет числа на четность
  86.             проверяет больше ли это число чем уже нашли
  87.             и записывает ее в общую переменную
  88.          */
  89.         private static void FindMaxOddNumber(PartArray partArray)
  90.         {
  91.             int start = partArray.StartIndex;
  92.             int end = partArray.EndIndex;
  93.  
  94.             for (int i = start; i < end; i++)
  95.                 if (A[i] % 2 != 0)
  96.                     if (MaxOddNumber < A[i])
  97.                         lock (Locker) //блокирует переменную, и застовляет другие потоки джать, пока она освободится.
  98.                             MaxOddNumber = A[i];
  99.         }
  100.     }
  101.  
  102.     class PartArray //Класс хранит 2 переменные, начальный и конечный индекс части массива
  103.     {
  104.         public int StartIndex;
  105.         public int EndIndex;
  106.     }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment