Задание 1. Многопоточное умножение матриц. (Многопоточность. Класс Parrallel). Модифицируйте домашнее задание после первой лекции (умножение матриц) или пример из лекции 1 для многопоточного выполнения перемножения матриц. Сравните время выполнения умножения матриц в 1 поток и несколько. Для оптимального исполнения умножения рекомендуется использовать класс Parallel. (Parrallel.For()). Постарайтесь оптимально подобрать блок кода выполняемый в одном потоке (не слишком маленький, чтобы уменьшить накладные расходы). Задание 2. Копирование файлов. (Многопоточность. Синхронизация потоков). Реализуйте копирование файла большого размера блоками в 2 потока (один поток читает, другой параллельно пишет). Чтение файла и запись необходимо проводить блоками. Размер блока можно задавать константой. Прочитанные и незаписанные в новый файл блоки можно хранить, например, в очереди. Ограничьте размер очереди, например, 10 прочитанными, но не записанными блоками (считаем, что память не безгранична). Организуйте безопасное взаимодействие потоков с очередью. Копируемый файл и место копирования желательно задавать в командной строке. Сравните время копирования большого файла в 1 поток и в 2. Примечание. Файл и место копирования должны располагаться на разных Физических дисках (иначе выигрыша от параллельного копирования может вообще не быть, может даже быть медленнее). Если на вашем компьютере всего 1 физический диск, копируйте файл с него на флешку или наоборот 8860 Эффективность языка C#. Напишите на языке C# программу, которая умножает две матрицы, заданные в виде прямоугольных двумерных массивов (практически написана в примере) и при помощи вложенных массивов, и засекает время, необходимое для выполнения умножения матриц на данной машине. Размер матрицы задается как параметр командной строки, программа должна распечатать время (в секундах), требуемое для умножения матриц, а также производительность процедуры умножения матриц на вашем компьютере (в ГФлопс, т.е. миллиардах вещественных операций в секунду). Инициализация матрицы должна проводится случайным образом (время инициализации во время решения не включать). Примечания: 1. Для преобразования строки в целое число можно использовать статический метод int int.Parse(string s) Например: string Chislo = "3000"; int i = int.Parse(Chislo); 2. Для генерации случайных чисел можно использовать класс Random в пространстве имен System и его метод double Random.NextDouble(), который возвращает случайное вещественное число в диапазоне от 0 до 1. Пример Random rnd = new Random(); double d = rnd.NextDouble(); 3. Для замера времени можно использовать свойство TickCount класса Environment – оно возвращает количество миллисекунд, прошедших с момента запуска системы до настоящего времени. Обложив этими вызовами ваш код умножения матриц, а затем вычитая одно значение из другого, можно получить общее время выполнения кода. Например: int start = Environment.TickCount; /* вычисления */ int time = Environment.TickCount - start; Поскольку разрешающая способность этого таймера низка, размер матрицы должен быть большим (скажем, 1000 х 1000), чтобы погрешность была маленькой. Количество операций при умножении матриц N x N считается примерно как 2 * N * N * N, для получения ГФлопс нужно разделить количество операций на время (в секундах). 8861 Задание 1. Комплексные числа (структуры, перегрузка операций, приведения типов, методы object) Разработайте структуру Complex, которая хранит в себе комплексное число (в виде вещественной и мнимой части). Эта структура должна поддерживать следующие операции: Арифметические операции (реализованы через перегрузку операций) Получение вещественной и мнимой части, а также модуля и аргумента (реализованы через свойства) Конструктор комплексного числа из одного и двух вещественных, а также функцию, создающую комплексное число по модулю и аргументу Операции сравнения (равенство-неравенство), при этом соответствующим образом должны быть перегружены методы Equals() и GetHashCode(). Посмотрите примеры на MSDN или в хелпе. Преобразование в красивую (т.е. 1-2i, например, а не 1 + -2i, или 1, а не 1+0i, или 2i, а не 0+2i, или 1+i, а не 1+1i) строку при помощи перегрузки метода ToString(). Преобразование в вещественное число (явное) и из вещественного в комплексное (неявное) при помощи перегрузки преобразований Задача 2. Трехмерные геометрические фигуры (классы, наследование, абстрактные и виртуальные методы, свойства) Реализовать базовый класс Body3D, который поддерживает основные операции с трехмерными фигурами (площадь поверхности, объем, сумма длин ребер и т.д.). Реализовать производные классы для конкретных фигур. Должны быть реализованы как минимум следующие фигуры: Параллелепипед прямоугольный Шар Тэтраэдр (не обязательно правильный) Задача 3. Различные типы матриц (классы, наследование, абстрактные и виртуальные методы, перегрузка операций) Разработать базовый абстрактный класс для работы с матрицами. Он не должен содержать никаких данных – только объявления методов и стандартные операции для работы с матрицами. Реализовать конкретные классы для конкретных типов матриц: Полная матрица (хранится в виде двумерного массива) Диагональная матрица (хранятся только диагональные элементы, остальные все нули) Трехдиагональная матрица (хранятся только главная диагональ и 2 диагонали вокруг нее; остальные элементы – нули). Реализовать арифметические операции для работы с матрицами (сложение, умножение). При этом конкретная вызываемая операция определяется в зависимости от типа времени выполнения обоих аргументов. Например, если складываются 2 диагональные матрицы, то должна получаться диагональная матрица, при этом нулевые элементы, складываться не должны. Если же складывается диагональная матрица с обычной, то должна получаться обычная матрица. Примечание. Это можно реализовать, например, следующим образом. Пусть требуется переопределить операцию Matrix operator*(Matrix a, Matrix b), чтобы она работала указанным образом. Тогда определяются следующие операции: Операция умножения по умолчанию Matrix defmul(Matrix a, Matrix b), которая просто строит новую полную матрицу и вычисляет каждый ее элемент по обычному алгоритму. Специальные операции умножения. Например, DiagMatrix diagmul(DiagMatrix a, DiagMatrix b) принимает только диагональные матрицы, и в результате возвращает диагональную матрицу, учитывая только диагональные элементы при перемножении. В операторе operator* организовать выбор нужной операции по типам (a.GetType() и b.GetType(), соответственно), и в зависимости от пары типов, выбирать специальную реализацию. Если специальной реализации нет – выбирать обычную.