Студопедия

КАТЕГОРИИ:


Архитектура-(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; Просмотров: 84; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.448 сек.