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);
}
}
}