Многопоточная проверка массивов - C#
Формулировка задачи:
Всем доброго времени суток!
Понимаю что это личное дело каждого, помогать или нет, тем не менее прошу помощи. Есть задачка для которой нужно самое оптимальное решение, дело в том что я начинающий программист в области С#, так что не ругайте сильно...
Написать программу, которая в многопоточном режиме образом обрабатывает массивы х[10], у[15] и z[20].
В главном потоке:
1. Создаются массивы
2. Значения элементов массивов определяются случайным образом.
3. С клавиатуры читаются значения а и b, с и d , p и q с контролем корректности ввода c использованием dll-библиотеки
4. Запускаются потоки
5. Ожидается завершение потоков
6. Выводится на экран:
• значение а и b
• массив х
• кол-во элементов массива х, которые лежат в диапазоне значений a<=x[i]<=b;
• значение с и d
• массив y
• кол-во элементов массива y, которые лежат в диапазоне значений c<=y[i]<=d;
• значение p и q
• массив z
• кол-во элементов массива z, которые лежат в диапазоне значений p<=x[i]<=q;
забыл сказать, dll библиотека уже реализована, называется ConsoleLybrary.dll
и создана на базе следующего кода:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleLibrary { public class Get { static int valueInt32; //поле корректного int static string buf; //сюда читаем строку ввода static bool error; //true, если есть ощибка ввода static float valueFloat; //поле корректного float static double valueDouble; //поле корректного double //сообщения static string msg = "\n Ошибка\n"; static string msgRead = msg + "Нет данного.\n"; static string msgInt32 = msg + "Это не целое int.\n"; static string msgRange = msg + "Значение вне диапазона [{0} - {1}].\n"; static string msgFloat = msg + "Это не вещественное float.\n"; static string msgDouble = msg + "Это не вещественное double.\n"; static string msgLastName1 = msg + "Исправьте первый символ фамилии.\n"; static string msgLastName2 = msg + "Превышено количество символов фамилии[{0}-{1}].\n"; static string msgLastName3 = msg + ""; // методы private обслуживающие внутренние потребности класса //вызывается при FormatException static void PutError(string msgError) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(msgError); Console.ResetColor(); Console.WriteLine("Повторите ввод:"); } //Вызывается при OverflowException static void PutError(string msgError, double min, double max) { Console.ForegroundColor = ConsoleColor.Red; if (buf.Length >= 1) Console.WriteLine(msgError, min, max); Console.ResetColor(); Console.WriteLine("Повторите ввод:"); } //Вызывается для ввода с клавиатуры //Формирует Error пустого ввода static void Read() { buf = ""; buf = Console.ReadLine().Trim(); if (buf.Length == 0) { error = true; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine(msgRead); Console.ResetColor(); Console.WriteLine("Повторите ввод:"); } else error = false; } //Методы пользователя класса. //Чтение с клавиатуры данного типа int public static int Int32() { do { Read(); if (error) continue; try { valueInt32 = Convert.ToInt32(buf); } catch (FormatException) { error = true; PutError(msgInt32); } catch (OverflowException) { error = true; PutError(msgRange, System.Int32.MinValue, System.Int32.MaxValue); } } while (error); return valueInt32; } //чтение с клавиатуры типа int в заданном диапазоне public static int Int32(int min, int max) { int result; do { result = Int32(); if ((result >= min) && (result <= max)) break; PutError(msgRange, min, max); } while (true); return result; } //чтение с клавиатуры типа float public static float Float() { do { Read(); if (error) continue; try { valueFloat = Convert.ToSingle(buf); } catch (FormatException) { error = true; PutError(msgFloat); } catch (OverflowException) { error = true; PutError(msgRange, System.Single.MinValue, System.Single.MaxValue); } } while (error); return valueFloat; } //чтение с клавиатуры типа float в заданном диапазоне public static float Float(float min, float max) { float result; do { result = Float(); if ((result >= min) && (result <= max)) break; PutError(msgRange, min, max); } while (true); return result; } //чтение с клавиатуры типа double public static double Double() { do { Read(); if (error) continue; try { valueDouble = Convert.ToDouble(buf); } catch (FormatException) { error = true; PutError(msgDouble); } catch (OverflowException) { error = true; PutError(msgRange, System.Double.MinValue, System.Double.MaxValue); } } while (error); return valueDouble; } //чтение с клавиатуры типа float в заданном диапазоне public static double Double(double min, double max) { double result; do { result = Double(); if ((result >= min) && (result <= max)) break; PutError(msgRange, min, max); } while (true); return result; } //чтение с клавиатуры фамилии //ограничение длины public static string LastName(int maxSize) { string s = ""; char h; int i; bool pr; while (Console.ReadKey().Key != ConsoleKey.N) { Console.WriteLine("Введите фамилию >\n"); s = Console.ReadLine(); bool isUpper = char.IsUpper(s[0]); i = s.Length; if ((i < 2) || (i > maxSize)) { Console.WriteLine("Dlina familii doljna biti ot 2 do " + maxSize + " simvolov"); Console.WriteLine("Press any key for continue or n for exit..."); continue; } if (!isUpper) { Console.WriteLine("Familia doljna nacinatsia s zaglavnoi bucvi"); Console.WriteLine("Press any key for continue or n for exit..."); continue; } h = s[0]; if (h == 'Ъ' || h == 'Ь') { Console.WriteLine("Familia ne mojet nacinatsia s bucvi " + h); Console.WriteLine("Press any key for continue or n for exit..."); continue; } for (i = 0; i <= s.Length - 1; i++) { pr = Char.IsLetter(s[i]); if (!pr) { Console.WriteLine("V familii ne mojet biti cifr. Proverite " + i + " simvol"); Console.WriteLine("Press any key for continue or n for exit..."); continue; } } } return s; } } }
Решение задачи: «Многопоточная проверка массивов»
textual
Листинг программы
static void Main(string[] args) { var _a = 1; var _b = 5; var _c = 2; var _d = 18; var _p = 7; var _q = 10; Random _rand = new Random(); var x = Enumerable.Range(0, 10) .Select(r => Convert.ToInt32(_rand.Next(10))) .ToArray(); var y = Enumerable.Range(0, 15) .Select(r => Convert.ToInt32(_rand.Next(15))) .ToArray(); var z = Enumerable.Range(0, 20) .Select(r => Convert.ToInt32(_rand.Next(20))) .ToArray(); var tasks = new Task<int>[3]; tasks[0] = Task<int>.Run(() => { return x.Count(input => input >= _a && input <= _b); }); tasks[1] = Task<int>.Run(() => { return y.Count(input => input >= _c && input <= _d); }); tasks[2] = Task<int>.Run(() => { return z.Count(input => input >= _p && input <= _q); }); Task.WaitAll(tasks); Console.WriteLine(_a+" "+_b); Console.WriteLine(String.Join(" ", x )); Console.WriteLine(tasks[0].Result); Console.WriteLine(); Console.WriteLine(_c + " " + _d); Console.WriteLine(String.Join(" ", y)); Console.WriteLine(tasks[1].Result); Console.WriteLine(); Console.WriteLine(_p + " " + _q); Console.WriteLine(String.Join(" ", z)); Console.WriteLine(tasks[2].Result); Console.WriteLine(); Console.ReadKey(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д