public int CompareTo(object obj) { if ((object)this == obj) { return(0); } егистр tmp = ( егистр)obj; string[] outPutA = GetOutputValue().Split(" "); string[] outPutB = tmp.GetOutputValue().Split(" "); int sumA = 0, sumB = 0; for (int i = 0; i < capacity; ++i) { sumA += Int32.Parse(outPutA[i]); sumB += Int32.Parse(outPutB[i]); } // Больше тот регистр, у которого больше единиц на выходе. if (sumA < sumB) { return(-1); } if (sumA > sumB) { return(1); } return(0); }
static void Main(string[] args) { // Выполнить задания лабораторной работы 9, используя для хранения экземпляров // разработанных классов стандартные параметризованные коллекции. Во всех классах // реализовать интерфейс IComparable и перегрузить операции отношения для // реализации значимой семантики сравнения объектов по какому-либо полю на // усмотрение студента. // Задача 6. // 1. Описать базовый класс Элемент. Закрытые поля: имя элемента (строка // символов); количество входов элемента; количество выходов элемента. // Методы: конструктор класса без параметров; конструктор, задающий имя и // устанавливающий равным 1 количество входов и выходов; конструктор, задающий // значения всех полей элемента. Свойства: имя элемента (только чтение); // количество входов элемента; количество выходов элемента. // 2. На основе класса Элемент описать производный класс Комбинационный, // представляющий собой комбинационный элемент (двоичный вентиль), который // может иметь несколько входов и один выход. Поле — массив значений входов. // Методы: конструкторы; метод, задающий значение на входах экземпляра класса; // метод, позволяющий опрашивать состояние отдельного входа экземпляра класса; // метод, вычисляющий значение выхода (по варианту задания). // 3. На основе класса Элемент описать производный класс Память, представляющий // собой триггер. Триггер имеет входы, соответствующие типу триггера // (см. далее вариант задания), и входы установки и сброса. Все триггеры // считаются синхронными, сам синхровход в состав триггера не включается. // Поля: массив значений входов объекта класса, в массиве учитываются все // входы (управляющие и информационные); состояние на прямом выходе триггера; // состояние на инверсном выходе триггера. Методы: конструктор (по умолчанию сбрасывает // экземпляр класса); конструктор копирования; метод, задающий значение на // входах экземпляра класса; методы, позволяющие опрашивать состояния // отдельного входа экземпляра класса; метод, вычисляющий состояние экземпляра // класса (по варианту задания) в зависимости от текущего состояния и // значений на входах; метод, переопределяющий операцию == для экземпляров // класса. 4. Создать класс Регистр, используя класс Память как вложенный // класс. Поля: состояние входа «Сброс» — один для экземпляра класса; состояние // входа «Установка» — один для экземпляра класса; массив типа Память // заданной в варианте размерности; массив (массивы), содержащий значения на // соответствующих входах элементов массива типа Память. Методы: метод, задающий // значение на входах экземпляра класса; метод, позволяющий опрашивать состояние // отдельного выхода экземпляра класса; О метод, вычисляющий значение нового // состояния экземпляра класса. Все поля классов Элемент, Комбинационный и // Память должны быть описаны с ключевым словом pri vate. В задании // перечислены только обязательные члены и методы класса. Можно задавать // дополнительные члены и методы, если они не отменяют обязательные и // обеспечивают дополнительные удобства при работе с данными классами, // например, описать функции вычисления выхода/состояния как виртуальные. // 5. Для проверки функционирования созданных классов написать программу, // использующую эти классы. В программе должны быть продемонстрированы все // свойства созданных классов. Конкретный тип комбинационного элемента, тип // триггера и разрядность регистра выбираются в соответствии с вариантом // задания: Вариант 5, Комбинационный элемент ИЛИ-НЕ, Число входов 8, Триггер V, // Разрядность регистра 9. try { // Тестируем элементы класса Элемент и его потомков List <Элемент> elems = new List <Элемент>(); elems.Add(new Элемент("Элемент1")); elems.Add(new Элемент("Элемент2", 2, 2)); elems.Add(new Комбинационный("Элемент3 - Комбинационный", new byte[] { 0, 0, 1, 0, 1, 1, 1, 0 })); elems.Add(new Комбинационный()); Console.WriteLine($"Состояние элемента {elems[2].Name}: " + elems[2].GetOutputValue()); byte inp2 = elems[2].GetInputValue(3); Console.WriteLine($"На третьм входе Элемента 3 значение {inp2}"); elems[2].SetInputs(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0 }); Console.WriteLine("Новое состояние третьего элемента: " + elems[2].GetOutputValue()); Console.WriteLine("Состояние четвертого элемента по умолчанию: " + elems[3].GetOutputValue()); // Тестируем класс Регистр и Память. егистр registr1 = new егистр(); registr1.SetInputs(new byte[, ] { { 1, 1 }, { 1, 0 }, { 0, 1 }, { 0, 0 }, { 1, 1 }, { 1, 0 }, { 0, 1 }, { 1, 1 }, { 0, 0 } }); Console.WriteLine(registr1.GetOutputValue()); егистр.Память trigger = registr1.memory[0]; string result = ""; for (int i = 0; i < registr1.memory.Length; ++i) { result = ""; if (trigger == registr1.memory[i]) { result += $" {i + 1}"; } if (result != "") { Console.WriteLine("Найдены совпадающие с первым триггеры. Их номера:" + result); } } registr1.SetInputs(new byte[, ] { { 1, 0 }, { 1, 1 }, { 0, 1 }, { 1, 1 }, { 0, 1 }, { 0, 1 }, { 1, 1 }, { 1, 1 }, { 0, 1 } }); result = registr1.GetOutputValue(); // Ожидается последовательность 1 0 0 1 1 1 1 0 0. Console.WriteLine(result); // Поместим экзмепляры памяти в параметризированную коллекцию List. List <егистр.Память> memory = new List <егистр.Память>(registr1.memory); int a = 0; } catch (Exception e) { Console.WriteLine("Возникла ошибка: " + e.Message); } }