Anonim_999

bogdan

Nov 22nd, 2022
879
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.14 KB | None | 0 0
  1. using System;
  2. using System.Threading;
  3.  
  4. namespace ConsoleApp23
  5. {
  6.     class Program
  7.     {
  8.         public static string[] A = new string[0]; //Массив чисел
  9.         public static int CountElements; //Количество элементов
  10.         public static int CountThreads; //Количество потоков
  11.         public static int SubArrayLen; //Длина части массива
  12.         public static int CountWords = 0; //результат
  13.         public static object Locker = new object();
  14.  
  15.         static void Main(string[] args)
  16.         {
  17.             string userInput; // переменная хранит пользовательский ввод
  18.  
  19.             while (A.Length <= 1)
  20.             {
  21.                 Console.Write("Напишите текст более одного слова: ");
  22.                 userInput = Console.ReadLine();
  23.                 A = userInput.Split();
  24.             }
  25.             CountElements = A.Length;
  26.             ShowArray(A);
  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();
  39.             SubArrayLen = CountElements / CountThreads + 1; //Длина части массива
  40.             Thread[] threads = new Thread[CountThreads]; //Массив потоков
  41.  
  42.             for (int i = 0; i < CountThreads; i++) //Цикл, который пробегает по потокам, дает им часть массива, имя и запускает их
  43.             {
  44.                 PartArray partArray = new PartArray
  45.                 {
  46.                     StartIndex = i * SubArrayLen,
  47.                     EndIndex = (i + 1) * SubArrayLen
  48.                 };
  49.  
  50.                 if (partArray.EndIndex > CountElements) //Проверка на выход за границы массива
  51.                     partArray.EndIndex = CountElements;
  52.                 threads[i] = new Thread(() => FindWithSimbol(partArray));
  53.                 threads[i].Name = "Поток№" + (i + 1);
  54.                 threads[i].Start();
  55.             }
  56.  
  57.             foreach (Thread thread in threads) //Цикл ожидания заверщения потоков
  58.             {
  59.                 Console.WriteLine($"{thread.Name} - on");
  60.                 thread.Join();
  61.                 Console.WriteLine($"{thread.Name} - off");
  62.             }
  63.             Console.WriteLine($"Слов начинающихся на 'b': {CountWords}"); //Вывод результата
  64.             Console.ReadLine();
  65.         }
  66.  
  67.         private static void ShowArray(string[] array)
  68.         {
  69.             foreach (string word in array)
  70.                 Console.WriteLine(word);
  71.         }
  72.         /*
  73.             Метод, который перебирает слова по части массива
  74.             проверяет содержание нужной буквы и если так, то добовляет в счетчик
  75.          */
  76.         private static void FindWithSimbol(PartArray partArray)
  77.         {
  78.             char simbol = 'b';
  79.             int start = partArray.StartIndex;
  80.             int end = partArray.EndIndex;
  81.  
  82.             for (int i = start; i < end; i++)
  83.                 if (A[i].Contains(simbol))
  84.                     lock (Locker)
  85.                         CountWords++;
  86.         }
  87.     }
  88.  
  89.     class PartArray //Класс хранит 2 переменные, начальный и конечный индекс части массива
  90.     {
  91.         public int StartIndex;
  92.         public int EndIndex;
  93.     }
  94. }
Advertisement
Add Comment
Please, Sign In to add comment