Многопоточная проверка массивов - 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();
}