Program.Cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Lab2V1
{
class Program
{
//объявляем массив
public static Element[] ArrElem;
public static Register Reg;
static void Main(string[] args)
{
// массив из элементов базового класса, который заполняем ссылками на производные классы
ArrElem = new Element[2];//число элеиентов массива ArrElem
ArrElem[0] = new CombElem(4); //передаем в конструктор значеие числа входов
ArrElem[1] = new Trigger();// первый элемент типа триггер
Reg = new Register();//создаем переменную ссылку на экземпляр класса Registr
//цвет текста устанавливаем в белый
Console.ForegroundColor = ConsoleColor.White;
char Key;
do
{
Console.Clear();
Console.WriteLine("Л.р. №2. Для выбора пункта меню нажмите соответствующую клавишу клавиатуры:\n");
Console.WriteLine("\t1. Использование класса \"Комбинационный элемента\".");
Console.WriteLine("\t2. Использование класса \"Память\".");
Console.WriteLine("\t3. Использование класса \"Регистр\".");
Console.WriteLine("\t4. Выход из приложения.");
Key = Console.ReadKey(true).KeyChar;
switch (Key)
{
case '1':
{
Func_1();
break;
}
case '2':
{
Func_2();
break;
}
case '3':
{
Func_3();
break;
}
}
} while (Key != '4');
}
public static void Func_1()
{
CombElem pt = (CombElem)ArrElem[0];//приведение к типу комбэлем (авт.,вызов конструктора комбэлем)
char Key; //ссылка pt типа комбэлем равна ссылке на 0 элемент массива(его приводи к типа комб элем)
do
{
Console.Clear();
Console.WriteLine("Класс \"Комбинационный элемент\".");
Console.WriteLine("\t1. Установить значения на входе элемента.");
Console.WriteLine("\t2. Опросить заданный вход элемента.");
Console.WriteLine("\t3. Вывести значение на выходе элемента.");
Console.WriteLine("\t4. Вернуться в главное меню.");
Key = Console.ReadKey().KeyChar; // считывание клавиши
switch (Key)
{
case '1':
{
Console.Clear();
Console.WriteLine("Устанавливаем значения на входе элемента.");
Console.WriteLine("Введите строку в формате ХХХХ, где Х: \"1\" (\"true\") или \"0\" (\"false\") - количество знаков равно количеству входов. Лишние знаки не учитываются.");
String tmp;
// CountIn = 4 - установили в начали при создании ссылки на экземпляр класса
bool[] tmp2 = new bool[pt.CountIn];
tmp = Console.ReadLine();
try
{
bool f = false;
Convert.ToInt32(tmp);
for (int i = 0; i < pt.CountIn; i++)
{
if (tmp[i] == '0')
tmp2[i] = false;
else if (tmp[i] == '1')
tmp2[i] = true;
else { f = true; break; }
}
if ((pt.SetInput(tmp2)) && (f == false))//вызов метода класса Комб. элемент (задаем значения входов)
Console.WriteLine("Значения на входе успешно установлены.");
else
Console.WriteLine("Ошибка при установлении значений на входе.");
Console.WriteLine("Для продолжения нажмите любую клавишу...");
Console.ReadKey();
}
catch (Exception e)
{
Console.WriteLine("Ошибка: " + e.Message);
Console.WriteLine("Нажмите любую клавишу для выхода");
Console.ReadKey();
}
break;
}
//Опросить заданный вход элемента
case '2':
{
Console.Clear();
char Num;
bool Error, Value;
Console.WriteLine("Опрос заданного входа элемента.");
do
{
Console.Write("\r\nВведите номер элемента (от 0 до " + (pt.CountIn-1).ToString() + ") > и нажмите Enter.\n");
String aa = Console.ReadLine();
if (aa.Length > 1)
Console.WriteLine("Неверная разрядность числа");
else
try
{
int a = Convert.ToInt32(aa);
Value = pt.GetValue(a, out Error); //вызов метода класса Комб. элемент (определяем значение входа)
if (!Error) //error = false - ошибки нет
Console.WriteLine("\nЗначение на данном входе = " + Value.ToString());
else
Console.WriteLine("\nВхода с таким номером не существует.");
}
catch (Exception e)
{
Console.WriteLine("Ошибка: " + e.Message);
}
Console.WriteLine("Для перехода к главному меню нажмите [Esc], для повтора - любую клавишу...");
Num = Console.ReadKey(true).KeyChar;
}
while ((int)Num != 27);
break;
}
case '3':
{
Console.Clear();
Console.WriteLine("Значение на выходе элемента = " + pt.Result().ToString());
Console.WriteLine("Для продолжения нажмите любую клавишу...");
Console.ReadKey(true);
break;
}
}
}
while (Key != '4');
}
public static void Func_2()
{
char Key;
do
{
Console.Clear();
Console.WriteLine("Класс \"Память\".");
Console.WriteLine("\t1. Установить значения на входе RS-триггера ");
Console.WriteLine("\t2. Опросить заданный вход RS-триггера.");
Console.WriteLine("\t3. Вывести значение на выходе RS-триггера.");
Console.WriteLine("\t4. Вернуться в главное меню.");
Key = Console.ReadKey(true).KeyChar;
Trigger tr = (Trigger)ArrElem[1]; //приведение к типу триггер (авт.,вызов конструктора триггер)
switch (Key) //ссылка tr типа триггер равна ссылке на первый элемент массива АррЭлем
{ //АррЭлем приводим к типу триггер
case '1':
{
Console.Clear();
Console.WriteLine("Установление значения на входе триггера");
Console.WriteLine("Введите строку в формате ХХ, где Х - \"1\" (\"true\") или \"0\" (\"false\") - количество знаков равно количеству входов.\nЛишние знаки не учитываются. Первый Х задает вход R, второй вход S.\n");
String bb;
bool[] tmp3 = new bool[tr.CountIn];//задание нового количества входов=2
try
{
bool f = false;
bb = Console.ReadLine();
Convert.ToInt32(bb);
for (int i = 0; i < tr.CountIn; i++)
{
if (bb[i] == '0')
tmp3[i] = false;
else if (bb[i] == '1')
tmp3[i] = true;
else { f = true; break; }
}
if ((tr.SetValue(tmp3)) && (f == false)) // вызываем метод класса Триггер для установки значения входов R, S
{ // tr ссылка на экз класса Триггер, СетВалуе задает значение на входах. возвр тру или фолс
Console.WriteLine("\nЗначения на входе RS-триггера успешно установлены.");
}
else
Console.WriteLine("\nОшибка при установлении значений на входе.");
}
catch (Exception e)
{
Console.WriteLine("Ошибка: " + e.Message);
}
Console.WriteLine("Для продолжения нажмите любую клавишу...");
Console.ReadKey(true);
break;
}
case '2':
{
Console.Clear();
char Num = 'R';
bool Error = false, Value = false;
Console.WriteLine("Опрос заданного входа RS-триггера.");
do
{
Console.Write("\r\nВведите номер элемента от 0 до 1.\nЗначение 0 - соответствует R входу, 1-соответствует S входу\n");
String cc = Console.ReadLine();
try
{
bool f = false;
int cc2 = Convert.ToInt32(cc);
if (cc2 == 1)
Num = 'S';
else if (cc2 == 0)
Num = 'R';
else
f = true;
if (f == false)
Value = tr.GetValue(cc2, out Error); //см. метод класса Триггер, который возвращает значение входа
if ((!Error) && (f == false)) //если ошибка = фолсе, то нет ошибок
Console.WriteLine("\nЗначение на входе "+Num+"= " + Value.ToString());
else
Console.WriteLine("Выхода с таким номером не существует.");
}
catch (Exception e)
{
Console.WriteLine("Ошибка: " + e.Message);
}
Console.WriteLine("Для перехода к главному меню нажмите [Esc], для повтора - любую клавишу...");
Num = Console.ReadKey(true).KeyChar;
}
while ((int)Num != 27);
break;
}
// значения на выходе
case '3':
{
Console.Clear();
tr.Calc();
Console.WriteLine("Значение RS-триггера на выходе Q = " + tr.GetOut().ToString());
Console.WriteLine("Значение RS-триггера на инверсном выходе Q = " + tr.GetOutNOT().ToString());
Console.WriteLine("\nДля продолжения нажмите любую клавишу...");
Console.ReadKey(true);
break;
}
}
} while (Key != '4');
}
public static void Func_3()
{
char Key;
do
{
Console.Clear();
Console.WriteLine("Класс \"Регистр\".");
Console.WriteLine("\t1. Установить значения на входах Регистра.");
Console.WriteLine("\t2. Опросить заданный вход Регистра");
Console.WriteLine("\t3. Вычислить значения на выходе Регистра.");
Console.WriteLine("\t4. Вернуть в главное меню.");
Key = Console.ReadKey(true).KeyChar;
switch (Key)
{
case '1':
{
Console.Clear();
Console.WriteLine("Установление значения на входе 8 RS-триггеров.");
Console.WriteLine("Введите 16 цифр (логические 1 или 0) каждая из которых будет означать значение на входе. Лишние символы не учитываются");
String tmp;
bool[] tmp2 = new bool[16];
try
{
bool f = false;
tmp = Console.ReadLine();
Convert.ToInt32(tmp);
for (int i = 0; i < 16; 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("Ошибка при установлении значений на входе.");
}
catch (Exception e)
{
Console.WriteLine("Ошибка: " + e.Message);
}
Console.WriteLine("Для продолжения нажмите любую клавишу...");
Console.ReadKey(true);
break;
}
case '2':
{
Console.Clear();
char Num;
bool Error, Value;
Console.WriteLine("Опрос заданного выхода регистра");
do
{
Console.Write("\r\nВведите номер выхода регистра (от 0 до 7)\n");
String aa = Console.ReadLine();
if (aa.Length > 1)
Console.WriteLine("\nТриггер с таким номером не существует.");
else
try
{
int a = Convert.ToInt32(aa);
Value = Reg.GetOut(a, out Error); //вызов метода класса Регистр (определяем значение выхода)
if (!Error) //error = false - ошибки нет
Console.WriteLine("\nЗначение у выбранного триггера на выходе Q = " + Value.ToString());
else
Console.WriteLine("\nТриггер с таким номером не существует.");
}
catch (Exception e)
{
Console.WriteLine("Ошибка: " + e.Message);
}
Console.WriteLine("Для перехода к главному меню нажмите [Esc], для повтора - любую клавишу...");
Num = Console.ReadKey(true).KeyChar;
} while ((int)Num != 27);
break;
}
case '3':
{
Console.Clear();
Console.WriteLine("Значение регистра = "+ Reg.Calc());
Console.WriteLine("Для продолжения нажмите любую клавишу...");
Console.ReadKey(true);
break;
}
}
} while (Key != '4');
}
}
}