Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МОЙ 2 ТП.doc
Скачиваний:
3
Добавлен:
09.09.2019
Размер:
793.6 Кб
Скачать

Trigger.Cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Lab2V1

{

//класс “Память”, представляющий собой триггер

class Trigger : Element

{

//массив значений входов объекта класса, в массиве учитываются

//все входы (управляющие и информационные)

private bool[] In;

//содержит 2 элемента:

//0 - вход S триггера

//1 - вход R триггера

private bool Out; //состояние на прямом выходе триггера

private bool OutNOT;//состояние на инверсном выходе триггера

//конструктор (по умолчанию сбрасывает экземпляр класса)

public Trigger()

: base("Триггер", 2, 1)//у триггера 2 входа RS 1 выход Q

{

In = new bool[2];

In.Initialize();

Out = false;

Out = true;

}

//конструктор копирования (для операций типа A = B - здесь в А копируется В)

public Trigger(Trigger previous)//в конструктор передается переменная ссылка на тип Триггер

{

previous.In.CopyTo(this.In, 0);//0-индекс с которого начинается копирование массива In

this.Out = previous.Out;

this.OutNOT = previous.OutNOT;

}

//метод, задающий значение на входах экземпляра класса

public bool SetValue(bool[] Value)

{

if (Value.GetLength(0) == In.GetLength(0)) //сравниваем первоначальное число входов = 2 с переданным в валуе

{

Value.CopyTo(this.In, 0);

return true;

}

else

return false;

}

//метод, позволяющие опрашивать состояния отдельного входа экземпляра класса

public bool GetValue(int Index, out bool Error)

{

if (Index < In.GetLength(0))

{

Error = false;

return In[Index];

}

else

{

Error = true;

return false;

}

}

//метод, вычисляющий состояние экземпляра класса (по варианту задания) в зависимости от текущего состояния и значений на входах

public bool Calc()

{

// R=0, S=1 установка 1

if ((In[1]) && (!In[0]))

{

Out = true;

OutNOT = !Out;

return true;

}

// R=1, S=0 установка 0

if ((!In[1]) && (In[0]))

{

Out = false;

OutNOT = !Out;

return true;

}

// S=1, R=1 неопределенное состояние

if ((In[0]) && (In[1]))

{

Random rand = new Random();

int a = rand.Next(0, 1);

Out = Convert.ToBoolean(a);

OutNOT = !Out;

return Out;

}

// S=0, R=0 хранение информации

if ((!In[0]) && (!In[1]))

{

return true;

}

return true;

}

//передача выходного значения c Q

public bool GetOut()

{

return Out;

}

//передача выходного значения c инвертного Q

public bool GetOutNOT()

{

return OutNOT;

}

//переопределение метода equals

public override bool Equals(System.Object obj)

{

Trigger p = obj as Trigger;

if ((object)p == null)

{

return false;

}

return base.Equals(obj) && (In == p.In) && (Out == p.Out) && (OutNOT == p.OutNOT);

}

public override int GetHashCode()

{

return base.GetHashCode() ^ In.GetHashCode() ^ Out.GetHashCode() ^ OutNOT.GetHashCode();

}

// переопределение ==

public static bool operator ==(Trigger a, Trigger b)

{

if (System.Object.ReferenceEquals(a, b))

{

return true;

}

// если один нуль

if (((object)a == null) || ((object)b == null))

{

return false;

}

return (a.OutNOT == b.OutNOT) && (a.Out == b.Out) && (a.In == b.In);

}

public static bool operator !=(Trigger a, Trigger b)// перопределение оператора != по заданию

{

return !(a == b);

}

}

}