Многопоточная проверка массивов - 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();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д