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

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

}

}

}