КАТЕГОРИИ: Архитектура-(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) |
Пахамович В.И., Бодюков Е.В., Павлов В.В.
ComEl.cs Trigger.cs Registr.cs Element.cs Program.cs Fird using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Second { class Program { public static List<ComEl> CM = new List<ComEl>(); public static List<Trigger> TR = new List<Trigger>(); public static List<Registr> RG = new List<Registr>();
static void Main(string[] args) { RG.Add(new Registr()); RG.Add(new Registr()); RG.Add(new Registr()); TR.Add(new Trigger()); TR.Add(new Trigger()); TR.Add(new Trigger()); CM.Add(new ComEl(6)); 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[CM[0].QtyInP]; try { for (int i = 0; i < CM[0].QtyInP; i++) if (buf[i] == '0') tmp[i] = false; else tmp[i] = true; if (CM[0].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 до " + (CM[0].QtyInP - 1).ToString() + "):"); String In = Console.ReadLine(); if (In.Length > 1) Console.WriteLine("Неверная разрядность числа!"); else try { int a = Convert.ToInt32(In); Value = CM[0].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("Значение на выходе элемента(" + CM[0].NameP + "): " + CM[0].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;
switch (Key) { case '1': { Console.Clear(); Console.WriteLine("Введите значение на входах в формате ХХ (0 - false, 1 - true;), \nпервый Х - значение на входе установки, второй Х - значение на входе сброса:"); string buf; bool[] tmp2 = new bool[TR[0].QtyInP]; try { buf = Console.ReadLine(); for (int i = 0; i < TR[0].QtyInP; i++) if (buf[i] == '0') tmp2[i] = false; else tmp2[i] = true;
if (TR[0].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 = TR[0].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(); TR[0].Calculate(); Console.WriteLine("Значение на прямом выходе:" + TR[0].GetOut().ToString()); Console.WriteLine("Значение на инверсном выходе:" + TR[0].GetNOut().ToString()); Console.ReadKey(); break; } case '4': { Console.Clear(); Console.WriteLine("Введите значение на входе первого триггера в формате ХХ (0 - false, 1 - true;), \nпервый Х - значение на входе установки, второй Х - значение на входе сброса:"); string buf; bool[] tmp2 = new bool[TR[1].QtyInP]; try { buf = Console.ReadLine(); for (int i = 0; i < TR[1].QtyInP; i++) if (buf[i] == '0') tmp2[i] = false; else if (buf[i] == '1') tmp2[i] = true;
if (TR[1].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(); } TR[1].Calculate(); Console.WriteLine("Значение на выходе первого триггера:" + TR[1].GetOut());
// Второй триггер Console.WriteLine("Введите значение на входе второго триггера в формате ХХ (0 - false, 1 - true;), \nпервый Х - значение на входе установки, второй Х - значение на входе сброса:"); try { buf = Console.ReadLine(); for (int i = 0; i < TR[2].QtyInP; i++) if (buf[i] == '0') tmp2[i] = false; else if (buf[i] == '1') tmp2[i] = true;
if (TR[2].SetValue(tmp2)) { Console.WriteLine("Значения на входах успешно установленны!"); } else { Console.WriteLine("Ошибка! Значения на входах не установленны!"); Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); } }//end try catch (Exception e) { Console.WriteLine("Ошибка! " + e.Message); Console.WriteLine("Для продолжения нажмите любую клавишу..."); Console.ReadKey(); } TR[2].Calculate(); Console.WriteLine("Значение на выходе второго триггера: " + TR[2].GetOut());
switch (TR[1].CompareTo(TR[2])) { case 0: Console.WriteLine("\nЗначения на выходе равны"); break; case 1: Console.WriteLine("\nЗначения на выходе первого триггера больше чем у второго!"); break; case -1: Console.WriteLine("\nЗначения на выходе первого триггера меньше чем у второго!"); break; } 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[0].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[0].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[0].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 ((RG[1].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; }
RG[1].Result(); Console.WriteLine("Значение второго регистра = " + RG[1].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 ((RG[2].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; }
RG[2].Result(); Console.WriteLine("Значение второго регистра = " + RG[2].Result());
switch (RG[1].CompareTo(RG[2])) { case 0: Console.WriteLine("\nЗначения на выходе равны"); break; case 1: Console.WriteLine("\nЗначения на выходе первого регистра больше чем у второго"); break; case -1: Console.WriteLine("\nЗначения на выходе первого регистра меньше чем у второго"); break; } 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: IComparable { 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) { return false; }
// Если параметр не может быть приведен к типу Element возвращаем ложь. Element p = obj as Element; if ((System.Object)p == null) { return false; } return (Name == p.Name) && (QtyIn == p.QtyIn) && (QtyOut == p.QtyOut); }
//метод hashCode у одинаковых объектов должен быть одинаковым: public override int GetHashCode() { return Name.GetHashCode() ^ QtyIn.GetHashCode() ^ QtyOut.GetHashCode(); }
//реализация интерфейса IComparable public virtual int CompareTo(object obj) { Element temp = (Element)obj; // сравниваем по числу входов if (this.QtyIn > temp.QtyIn) return 1; if (this.QtyIn < temp.QtyIn) return -1; return 0; }
//переопределение операторов сравнения public static bool operator ==(Element a, Element b) { return a.Equals(b); // возращает либо тру либо фалсе }
public static bool operator!=(Element a, Element b) { return!a.Equals(b); }
public static bool operator <(Element a, Element b) { return (a.CompareTo(b) < 0); }
public static bool operator >(Element a, Element b) { return (a.CompareTo(b) > 0); }
public static bool operator <=(Element a, Element b) { return (a.CompareTo(b) <= 0); }
public static bool operator >=(Element a, Element b) { return (a.CompareTo(b) >= 0); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Second { class Registr:IComparable {
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; } return (Input == p.Input) && (Qt == p.Qt) && (Reg == p.Reg); }
//метод hashCode у одинаковых объектов должен быть одинаковым: public override int GetHashCode() { return Input.GetHashCode() ^ Reg.GetHashCode() ^ Qt.GetHashCode(); }
//реализация интерфейса IComparable public virtual int CompareTo(object obj) { Registr temp = (Registr)obj; // сравниваем по выходному значению for (int i = 0; i < this.Reg.Length; i++) { if (Convert.ToInt16(this.Reg[i].GetOut()) > Convert.ToInt16(temp.Reg[i].GetOut())) return 1; if (Convert.ToInt16(this.Reg[i].GetOut()) < Convert.ToInt16(temp.Reg[i].GetOut())) return -1; } return 0; }
public static bool operator ==(Registr a, Registr b) { return a.Equals(b); }
public static bool operator!=(Registr a, Registr b) { return!a.Equals(b); }
public static bool operator <(Registr a, Registr b) { return (a.CompareTo(b) < 0); }
public static bool operator >(Registr a, Registr b) { return (a.CompareTo(b) > 0); }
public static bool operator <=(Registr a, Registr b) { return (a.CompareTo(b) <= 0); }
public static bool operator >=(Registr a, Registr b) { return (a.CompareTo(b) >= 0); } } }
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]; // 0 - вход утсановки (S) // 1 - вход сброса (R) 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) { Trigger p = obj as Trigger; if ((object)p == null) { return false; } return base.Equals(obj) && (Input == p.Input) && (Out == p.Out) && (NOut == p.NOut); }
public override int GetHashCode() { return base.GetHashCode() ^ Input.GetHashCode() ^ Out.GetHashCode() ^ NOut.GetHashCode(); }
//реализация интерфейса IComparable public override int CompareTo(object obj) { Trigger temp = (Trigger)obj; // сравниваем по значению выхода if (Convert.ToInt16(this.Out) > Convert.ToInt16(temp.Out)) return 1; if (Convert.ToInt16(this.Out) < Convert.ToInt16(temp.Out)) return -1; return 0; }
public static bool operator ==(Trigger a, Trigger b) { return a.Equals(b); }
public static bool operator!=(Trigger a, Trigger b) { return!a.Equals(b); }
public static bool operator <(Trigger a, Trigger b) { return (a.CompareTo(b) < 0); }
public static bool operator >(Trigger a, Trigger b) { return (a.CompareTo(b) > 0); }
public static bool operator <=(Trigger a, Trigger b) { return (a.CompareTo(b) <= 0); }
public static bool operator >=(Trigger a, Trigger b) { return (a.CompareTo(b) >= 0); }
} } 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(System.Object obj) { // если параметр не может быть приведен к CombElem false: ComEl p = obj as ComEl; if ((object)p == null) { return false; } return base.Equals(obj) && (Inputs == p.Inputs); }
//метод hashCode у одинаковых объектов должен быть одинаковым: public override int GetHashCode() { return base.GetHashCode() ^ Inputs.GetHashCode(); }
//реализация интерфейса IComparable public override int CompareTo(object obj) { ComEl temp = (ComEl)obj; // сравниваем по числу входов if (this.Inputs.Length > temp.Inputs.Length) return 1; if (this.Inputs.Length > temp.Inputs.Length) return -1; return 0; }
public static bool operator ==(ComEl a, ComEl b) { return a.Equals(b); }
public static bool operator!=(ComEl a, ComEl b) { return!a.Equals(b); }
public static bool operator <(ComEl a, ComEl b) { return (a.CompareTo(b) < 0); }
public static bool operator >(ComEl a, ComEl b) { return (a.CompareTo(b) > 0); }
public static bool operator <=(ComEl a, ComEl b) { return (a.CompareTo(b) <= 0); }
public static bool operator >=(ComEl a, ComEl b) { return (a.CompareTo(b) >= 0); }
} }
ЭКРАННЫЕ ФОРМЫ Приложение Б (обязательное)
Рисунок Б.1 – Главное меню приложения
Рисунок Б.2 – Ввод входных значений элемента
Рисунок Б.3 – Вывод значения заданного входа элемента
Рисунок Б.4 – Вывод значения на выходе элемента
Рисунок Б.5 – Ввод входных значений триггера
Рисунок Б.6 – Вывод значения заданного входа триггера
Рисунок Б.7 – Вывод значения на выходах триггера
Рисунок Б.8 – Ввод входных значений регистра
Рисунок Б.9 – Вывод значения заданного выхода регистра
Рисунок Б.10 –Вывод значения на выходах регистра
ПАМЯТКА по дисциплине «ФИЗИЧЕСКАЯ КУЛЬТУРА» для студентов 1-4 курсов (основное отделение)
Дата добавления: 2017-02-01; Просмотров: 63; Нарушение авторских прав?; Мы поможем в написании вашей работы! |