КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Отчет о лабораторной работе №3 1 страница
ComEl.cs Trigger.cs Registr.cs Element.cs Program.cs Second using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Second { class Program { public static Element[] ArrElem; public static Registr Rg; public static Registr Reg; public static Registr Reg2;
static void Main(string[] args) { ArrElem = new Element[3]; ArrElem[0] = new ComEl(6); ArrElem[1] = new Trigger(); ArrElem[2] = new Trigger(); Rg = new Registr(); Reg = new Registr(); Reg2 = new Registr(); char Key; do { Console.Clear(); Console.WriteLine("\t\tЛабораторная работа № 2"); Console.WriteLine("\n1. Использование класса: \"Комбинационный элемент\" "); Console.WriteLine("\n2. Использование класса: \"Память\" "); Console.WriteLine("\n3. Использование класса: \"Регистр\" "); Console.WriteLine("\n4. Выход из приложения"); Key = Console.ReadKey(true).KeyChar; switch (Key) { case '1': { First(); break; } case '2': { Second(); break; } case '3': { Fird(); break; } } } while (Key!= '4'); } // Реализация методов класса ComEl public static void First() { ComEl r = (ComEl)ArrElem[0]; char Key; do { Console.Clear(); Console.WriteLine("\t\t\tКласс: \"Комбинационный элемент\""); Console.WriteLine("\n1.Задать значения на входах."); Console.WriteLine("\n2.Получить значение со входа."); Console.WriteLine("\n3. Получить значение с выхода."); Console.WriteLine("\n4. Вернуться в меню."); Key = Console.ReadKey().KeyChar; switch (Key) { case '1': { Console.Clear(); Console.WriteLine("Введите значения на входах в формате ХХХХХХ, (0 - false, 1 - true):\n"); String buf; buf = Console.ReadLine(); bool[] tmp = new bool[r.QtyInP]; try { for (int i = 0; i < r.QtyInP; i++) if (buf[i] == '0') tmp[i] = false; else tmp[i] = true; if (r.SetInp(tmp)) Console.WriteLine("Значения успешно установленны!"); else
Console.WriteLine("Ошибка при установки значений!"); Console.ReadKey(); } catch (Exception e) { Console.WriteLine("Ошибка:" + e.Message); } Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); break; } // end case 1 case '2': { Console.Clear(); bool Error, Value; do { Console.WriteLine("Введите номер входа(от 0 до " + (r.QtyInP - 1).ToString() + "):"); String In = Console.ReadLine(); if (In.Length > 1) Console.WriteLine("Неверная разрядность числа!"); else try { int a = Convert.ToInt32(In); Value = r.GetValue(a, out Error); Console.WriteLine("Значение на выходе " + a + ": " + Value); } catch (Exception e) { Console.WriteLine("Ошибка:" + e.Message); } } while (Console.ReadKey().Key!= ConsoleKey.Escape); break; } case '3': { Console.Clear(); Console.WriteLine("Значение на выходе элемента(" + r.NameP + "): " + r.Result().ToString()); Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); break; }
} } while (Key!= '4');
} //End First // Реализация методов класса Триггер(Память) public static void Second() { char Key; do { Console.Clear(); Console.WriteLine("\t\t\tКласс: \"Память\""); Console.WriteLine("\n1.Задать значения на входах Т - триггера."); Console.WriteLine("\n2.Получить значение со входа Т - триггера."); Console.WriteLine("\n3. Получить значение с выхода Т - триггера."); Console.WriteLine("\n4. Проверка метода Equals."); Console.WriteLine("\n5. Вернуться в меню."); Key = Console.ReadKey().KeyChar; Trigger T = (Trigger)ArrElem[1]; Trigger T2 = (Trigger)ArrElem[2]; switch (Key) { case '1': { Console.Clear(); Console.WriteLine("Введите значение на входах в формате ХХ (0 - false, 1 - true;), \nпервый Х - значение на входе установки, второй Х - значение на входе сброса:"); string buf; bool[] tmp2 = new bool[T.QtyInP]; try { buf = Console.ReadLine(); for (int i = 0; i < T.QtyInP; i++) if (buf[i] == '0') tmp2[i] = false; else tmp2[i] = true;
if (T.SetValue(tmp2)) { Console.WriteLine("Значения на входах успешно установленны!"); } else Console.WriteLine("Ошибка! Значения на входах не установленны!"); }//end try catch (Exception e) { Console.WriteLine("Ошибка! " + e.Message); } Console.WriteLine("Для продолжения нажмите любую клавишу..."); break; } case '2': { Console.Clear(); bool Error, Value; do { Console.WriteLine("Введите номер входа (0 - вход установки, 1 - вход сброса):"); String buf = Console.ReadLine(); try { int In = Convert.ToInt32(buf); Value = T.GetValue(In, out Error); if (!Error) Console.WriteLine("Значение на входе: " + Value.ToString()); else Console.WriteLine("Входа с таким номером ен существует!"); } catch (Exception e) { Console.WriteLine("Ошибка! " + e.Message); } Console.WriteLine("Для выхода в главное меню нажмите Escape."); } while (Console.ReadKey().Key!= ConsoleKey.Escape); break; } case '3': { Console.Clear(); T.Calculate(); Console.WriteLine("Значение на прямом выходе:" + T.GetOut().ToString()); Console.WriteLine("Значение на инверсном выходе:" + T.GetNOut().ToString()); Console.ReadKey(); break; } case '4': { Console.Clear(); Console.WriteLine("Введите значение на входе первого триггера в формате ХХ (0 - false, 1 - true;), \nпервый Х - значение на входе установки, второй Х - значение на входе сброса:"); string buf; bool[] tmp2 = new bool[T.QtyInP]; try { // bool f = false; buf = Console.ReadLine(); for (int i = 0; i < T.QtyInP; i++) if (buf[i] == '0') tmp2[i] = false; else if (buf[i] == '1') tmp2[i] = true; // else { f = true; break; }
if (T.SetValue(tmp2)) //&& (f == false)) { Console.WriteLine("Значения на входах успешно установленны!"); } else { Console.WriteLine("Ошибка! Значения на входах не установленны!"); Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); } }//end try catch (Exception e) { Console.WriteLine("Ошибка! " + e.Message); Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); } T.Calculate();
// Второй триггер Console.WriteLine("Введите значение на входе второго триггера в формате ХХ (0 - false, 1 - true;), \nпервый Х - значение на входе установки, второй Х - значение на входе сброса:"); try { // bool f = false; buf = Console.ReadLine(); // Convert.ToInt32(buf); for (int i = 0; i < T2.QtyInP; i++) if (buf[i] == '0') tmp2[i] = false; else if (buf[i] == '1') tmp2[i] = true; //else { f = true; break; }
if (T2.SetValue(tmp2))// && (f == false)) { Console.WriteLine("Значения на входах успешно установленны!"); } else { Console.WriteLine("Ошибка! Значения на входах не установленны!"); Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); } }//end try catch (Exception e) { Console.WriteLine("Ошибка! " + e.Message); Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); } T2.Calculate();
if (T.Equals(T2)) Console.WriteLine("Триггеры равны!"); else Console.WriteLine("Триггеры не равны!"); Console.WriteLine("Для выхода нажмите любую клавишу..."); Console.ReadKey(); break; } } //end switch
} while (Key!= '5');
}
public static void Fird() { char Key; do { Console.Clear(); Console.WriteLine("\tКласс \"Регистр\""); Console.WriteLine("\n1.Задать значения на входах регистра."); Console.WriteLine("\n2.Получить значение с заданного выхода регистра."); Console.WriteLine("\n3.Получить значение на выходе регистра."); Console.WriteLine("\n4. Проверка метода Equals."); Console.WriteLine("\n5. Вернуться в меню."); Key = Console.ReadKey().KeyChar;
switch (Key) { case '1': { Console.Clear(); Console.WriteLine("Установление значений на входе 10 Т-триггеров."); Console.WriteLine("Введите 20 цифр (0 - false, 1 - true),\n каждая из которых будет задавать значение для одного из триггеров"); String buf; bool[] tmp1 = new bool[20]; try { buf = Console.ReadLine(); for (int i = 0; i < 20; i++) if (buf[i] == '0') tmp1[i] = false; else tmp1[i] = true; if (Rg.SetValue(tmp1)) { Console.WriteLine("Значения успешно установленны!"); for (int i = 0; i < 20; i++) Console.WriteLine(tmp1[i]); } else { Console.WriteLine("Ошибка! Значения не установленны!"); for (int i = 0; i < 20; i++) Console.WriteLine(tmp1[i]); } } catch (Exception e) { Console.WriteLine("Ошибка! " + e.Message); } Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); break; } case '2': { Console.Clear(); bool Error, Value;
do { Console.WriteLine("Введите номер выхода регистра(от 0 до 9):"); String buf = Console.ReadLine(); if (buf.Length > 1) Console.WriteLine("Триггер с таким номером не существоет"); else try { int a = Convert.ToInt32(buf); Value = Rg.GetOut(a, out Error); if (!Error) Console.WriteLine("Значение у выбраного триггера на выходе: " + Value.ToString()); else Console.WriteLine("Триггер С таким номером не существует!"); } catch (Exception e) { Console.WriteLine("Ошибка! " + e.Message); } Console.WriteLine("Для выхода нажмите ESC, для повтора нажмите любую клавишу..."); } while (Console.ReadKey().Key!= ConsoleKey.Escape); break; } case '3': { Console.Clear(); Console.WriteLine("Значение регистра: " + Rg.Result()); Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); break; } case '4': { Console.Clear(); Console.WriteLine("Установление значения на входе 10 Т-триггеров."); Console.WriteLine("Введите 20 цифр (логические 1 или 0) каждая из которых будет означать значение на входе. Лишние символы не учитываются"); String tmp; bool[] tmp2 = new bool[20]; try { bool f = false; tmp = Console.ReadLine(); for (int i = 0; i < 20; i++) if (tmp[i] == '0') tmp2[i] = false; else if (tmp[i] == '1') tmp2[i] = true; else { f = true; break; } if ((Reg.SetValue(tmp2) && (f == false))) Console.WriteLine("Значения на входе регистра установлены."); else { Console.WriteLine("Ошибка при установлении значений на входе."); Console.WriteLine("Для выхода нажмите любую клавишу..."); Console.ReadKey(true); break; } } catch (Exception e) { Console.WriteLine("Ошибка: " + e.Message); Console.WriteLine("Для выхода нажмите любую клавишу..."); Console.ReadKey(true); break; }
Reg.Result();
Console.WriteLine("\nЗадайте значения для второго регистра.\n"); // второй регистр try { bool f = false;
tmp = Console.ReadLine(); for (int i = 0; i < 20; i++) if (tmp[i] == '0') tmp2[i] = false; else if (tmp[i] == '1') tmp2[i] = true; else { f = true; break; } if ((Reg2.SetValue(tmp2) && (f == false))) Console.WriteLine("Значения на входе регистра установлены."); else { Console.WriteLine("Ошибка при установлении значений на входе."); Console.WriteLine("Для выхода нажмите любую клавишу..."); Console.ReadKey(true); break; } } catch (Exception e) { Console.WriteLine("Ошибка: " + e.Message); Console.WriteLine("Для выхода нажмите любую клавишу..."); Console.ReadKey(true); break; }
Reg2.Result();
if (Reg.Equals(Reg2)) Console.WriteLine("\nРегистры равны"); else Console.WriteLine("\nРегистры разные"); Console.WriteLine("\nДля выхода нажмите любую клавишу..."); Console.ReadKey(true); break; } } } while (Key!= '4'); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Second { class Element { string Name; int QtyIn; int QtyOut;
//Конструктор без параметров public Element() { } //Конструктор задающий имя и кол-во вх, вых =1 public Element(String Name) { this.Name = Name; QtyIn = 1; QtyOut = 1; } //Конструктор задающий значение всех полей public Element(String Name, int QtyIn, int QtyOut) { this.Name = Name; this.QtyIn = QtyIn; this.QtyOut = QtyOut; } //Свойство Name(только чтение) public string NameP { get { return Name; } } //Свойство QtyIn public int QtyInP { get { return QtyIn; } set { if (value > 0) QtyIn = value; else QtyIn = 0; } } //Свойство QtyOut public int QtyOutP { get { return QtyOut; } set { if (value > 0) QtyOut = value; else QtyOut = 0; } }
//Переопределение метода Equals public override bool Equals(object obj) { if (obj == null || GetType()!= obj.GetType()) return false;
Element temp = (Element)obj; return (Name == temp.Name) && (QtyIn == temp.QtyIn) && (QtyOut == temp.QtyOut); }
//Метод GetHashCode у одинаковых объектах должен быть одинаковым: public override int GetHashCode() { return Name.GetHashCode() ^ QtyIn.GetHashCode() ^ QtyOut.GetHashCode(); }
} } using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Second { class Registr {
Trigger[] Reg; bool[] Input; bool[] Qt;
public Registr() { Reg = new Trigger[10]; Qt = new bool[10]; for (int i = 0; i < 10; i++) { Reg[i] = new Trigger(); Qt[i] = true; } Input = new bool[20]; }
public bool SetValue(bool[] NewValue) { if (Input.GetLength(0) == NewValue.GetLength(0)) { bool[] tmp = new bool[2]; NewValue.CopyTo(Input, 0); for (int i = 0; i < Reg.GetLength(0); i++) { tmp[0] = Input[i * 2]; tmp[1] = Input[i * 2 + 1]; if (Reg[i].SetValue(tmp) == false) return false; } return true; } else return false; }
public bool GetOut(int Index, out bool Error) { if (Index < Reg.GetLength(0)) { Error = false; Reg[Index].Calculate(); return Reg[Index].GetOut(); } else { Error = true; return false; } }
public String Result() { String res = ""; bool[] tmp = new bool[2]; for (int i = 0; i < 10; i++) { tmp[0] = Input[i * 2]; tmp[1] = Input[i * 2 + 1]; Reg[i].SetValue(tmp); Reg[i].SetQt(Qt[i]); Reg[i].Calculate(); res = res + (Convert.ToInt32(Reg[i].GetOut())).ToString(); } return res; }
//переопределение метода equals public override bool Equals(System.Object obj) { // если параметр не может быть приведен к CombElem false: Registr p = obj as Registr; if ((object)p == null) { return false; }
// сравнение на общее число элементов массива Input if (Input.Length!= p.Input.Length) return false;
//сравнение массива со значением входов for (int i = 0; i < Input.Length; i++) { if (Input[i]!= p.Input[i]) return false; }
// сравнение на общее число элементов массива Reg if (Reg.Length!= p.Reg.Length) return false;
//сравнение массива триггеров for (int i = 0; i < Reg.Length; i++) { if (!Reg[i].Equals(p.Reg[i])) return false; }
return true; }
//метод hashCode у одинаковых объектов должен быть одинаковым: public override int GetHashCode() { return Input.GetHashCode() ^ Reg.GetHashCode(); }
public static bool operator ==(Registr a, Registr b) { return a.Equals(b); }
public static bool operator!=(Registr a, Registr b) { return!(a == b); }
} } using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Second { class Trigger: Element { bool[] Input; bool Out, NOut, Qt = true; //Конструктор(по умолчанию сбрасывает экземпляр класса) public Trigger() : base("Триггер", 2, 1) { Input = new bool[2]; Out = false; NOut = false; } // Конструктор копирования public Trigger(Trigger Prev) { Prev.Input.CopyTo(this.Input, 0); this.Out = Prev.Out; this.NOut = Prev.NOut; }
//метод, задающий значения на входах public bool SetValue(bool[] Value) { if (Value.GetLength(0) == Input.GetLength(0)) { Value.CopyTo(this.Input, 0); return true; } else return false; } //Метод опрашивающий входы public bool GetValue(int Index, out bool Error) { if (Index < Input.GetLength(0)) { Error = false; return Input[Index]; } else { Error = true; return false; } } public bool SetQt(bool Value) { return Qt = Value; }
//Метод вычисляющий состояние экземпляра класса на выходе public bool Calculate() { if (!Input[1]) //R = 0; { if (Input[0] == Qt) // S = Qt { Out = Input[0]; NOut =!Out; } else { Out =!Input[0]; NOut =!Out; Qt = Input[0]; } } else { Out = false; Qt = false; NOut = false; } return Out; } //Значение на выходе public bool GetOut() { return Out; } //Значение на инверсном выходе public bool GetNOut() { return NOut; }
//переопределение метода equals public override bool Equals(System.Object obj) { // если параметр не может быть приведен к CombElem false: Trigger p = obj as Trigger; if ((object)p == null) { return false; }
// сравнение на общее число элементов массива Input if (Input.Length!= p.Input.Length) return false;
//сравнение массива со значением входов for (int i = 0; i < Input.Length; i++) { if (Input[i]!= p.Input[i]) return false; } return true; }
public override int GetHashCode() { return base.GetHashCode() ^ NOut.GetHashCode(); }
// переопределение == public static bool operator ==(Trigger a, Trigger b) { return (a.NOut == b.NOut) && (a.Out == b.Out) && (a.Input == b.Input); }
public static bool operator!=(Trigger a, Trigger b) { return!(a == b); }
} } using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Second { class ComEl: Element { bool[] Inputs; // Конструктор public ComEl(int CntIn): base ("Комбинационный элемент МОД2-НЕ", CntIn, 1) { Inputs = new bool[CntIn]; } // Метод задающий значения на входах public bool SetInp(bool[] Value) { if (Inputs.GetLength(0) == Value.GetLength(0)) { Value.CopyTo(Inputs, 0); return true; } else return false; } public bool GetValue(int Index, out bool Error) { if (Index < Inputs.GetLength(0)) { Error = false; return Inputs[Index]; } else { Error = true; return false; } } public bool Result() { bool tmp = Inputs[0]; for (int i = 1; i < Inputs.GetLength(0); i++) { tmp = tmp ^ Inputs[i]; } return tmp; }
//Переопределение метода Equals public override bool Equals(object obj) { ComEl temp = obj as ComEl; if ((object) temp == null) { return false; } return base.Equals(obj) && (Inputs == temp.Inputs); }
//Метод GetHashCode у одинаковых объектах должен быть одинаковым: public override int GetHashCode() { return base.GetHashCode() ^ Inputs.GetHashCode(); }
} }
ЭКРАННЫЕ ФОРМЫ Приложение Б (обязательное)
Рисунок Б.1 – Главное меню приложения Рисунок Б.2 – Ввод входных значений элемента Рисунок Б.3 – Вывод значения заданного входа элемента Рисунок Б.4 – Вывод значения на выходе элемента Рисунок Б.5 – Ввод входных значений триггера Рисунок Б.6 – Вывод значения заданного входа триггера Рисунок Б.7 – Вывод значения на выходах триггера Рисунок Б.8 – Ввод входных значений регистра Рисунок Б.9 – Вывод значения заданного выхода регистра Рисунок Б.10 –Вывод значения на выходах регистра
по дисциплине «Технологии программирования»
Выполнил: ст. гр.08ВО1 Немова О.С. Проверил: Зимин А.П.
Задание
В программах требуется описать базовый класс (возможно, абстрактный), в котором с помощью виртуальных или абстрактных методов и свойств задается интерфейс для производных классов. Целью лабораторной работы является максимальное использование наследования, даже если для конкретной задачи оно не даетвыигрыша в объеме программы. Во всех классах следует переопределить метод Equals, чтобы обеспечить сравнение значений, а не ссылок. Функция main должна содержать массив из элементов базового класса, заполненный ссылками на производные классы. В этой функции должно демонстрироваться использование всех разработанных элементов классов.
1. Описать базовый класс “Элемент”. Закрытые поля: · имя элемента (строка символов); · количество входов элемента; · количество выходов элемента. Методы: · конструктор класса без параметров; · конструктор, задающий имя и устанавливающий равным 1 количество входов и выходов; · конструктор, задающий значения всех полей элемента. Свойства: · имя элемента (только чтение); · количество входов элемента; · количество выходов элемента. 2. На основе класса “Элемент” описать производный класс “Комбинационный элемент”, представляющий собой комбинационный элемент (двоичный вентиль), который может иметь несколько входов и один выход. Поле — массив значений входов. Методы: · конструкторы; · метод, задающий значение на входах экземпляра класса; · метод, позволяющий опрашивать состояние отдельного входа экземпляра класса; · метод, вычисляющий значение выхода (по варианту задания). 3. На основе класса “Элемент” описать производный класс “Память”, представляющий собой триггер. “Триггер” имеет входы, соответствующие типу триггера (см. далее вариант задания), и входы установки и сброса. Все триггеры считаются синхронными, сам синхровход в состав триггера не включается. Поля:
Дата добавления: 2017-02-01; Просмотров: 107; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |