Система замовлень страв у ресторані (C#)

Інформація про навчальний заклад

ВУЗ:
Національний авіаційний університет
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2012
Тип роботи:
Курсова робота
Предмет:
Об’єктно-орієнтоване програмування

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти та науки України Національний авіаційний університет Курсова робота З дисципліни «Об’єктно-орієнтоване програмування» На тему «Система замовлень страв у ресторані (C#)» Зміст Спрощені вимоги до програмного забезпечення……………………….3 Особливості роботи………………………………………………………4 Клас «Індгридієнт»…………………………………………………………….4 Методи класу «Інгредієнт»……………………………………………...4 Клас «Список інгредієнтів»…………………………………………………..5 Методи класу «Списку інгредієнтів»…………………………………….6 Клас «Страва»………………………………………………………………7 Методи класу «Страва»……………………………………………………8 Клас «Список страв»……………………………………………………….9 Методи класу списук страв………………………………………………..9 Клас «Замовлення»…………………………………………………………11 Методи класу «Замовлення»………………………………………………11 Клас «Список замовлень»…………………………………………………12 Методи классу «Список замовлень»……………………………………..13 Класу «Меню програми»………….……………………………………..13 Класс «Основна програма»……………………………………..13 Команди та меню……………………………………………………..28 Діаграми класів та об’єктів……………………………………………….31 Використана література…………………………………………………..33 Система замовляння страв в ресторані Спрощені вимоги до програмного забезпечення Функціональні вимоги: Управління інгредієнтами Можливість додавати інгредієнт Можливість видаляти інгредієнт (у випадку що він не входить до складу якоїсь страви) Можливість змінити інгредієнт Можливість переглянути перелік всіх інгредієнтів Управління стравами Можливість додавати страву Можливість видаляти страву Можливість змінювати страву Можливість додавати та видаляти інгредієнти страви Можливість змінювати назву страви Можливість змінювати ціну страви Можливість змінювати час приготування страви Можливість переглянути інформацію про конкретну страву Управління замовленнями Можливість додати замовлення Можливість видалити замовлення Можливість змінити замовлення змінити кількість страв змінити загальну вартість змінити номер столика даного замовлення Можливість переглянути інформацію про замовлення Нефункціональні вимоги: Вимоги до зовнішнього інтерфейсу Зовнішній інтерфейс користувача має бути командним Застосування має бути консольним Дані повинні зберігатись у файлах після виходу з програми. Система має забезпечити правильність введених даних Логічна структура даних Інформаційний об'єкт страва Елемент даних Тип Опис Коментар  Назва Текст Назва страви -  Інгредієнти Структура даних типу лист Перелік інгредієнтів конкретної страви -  Ціна Дробове число Ціна конкретної страви -  Час Дробове число Час приготування конкретної страви -   Інформаційний об'єкт замовлення Елемент даних Тип Опис Коментар  Страви Структура даних типу лист Перелік страв у конкретному -  Загальна вартість Ціле число Загальна вартість конкретного замовлення -  Номер столика Ціле число Номер столика, на який повинні принести конкретне замовлення -   Особливості роботи У головному меню користувачу пропонується ввести команду серед команд запропонованного списку. Команда зчитується за допомогою змінної string. Далі введена команда передається у файл основної програми й там виконується перевірка на вихід з програми. Після цього перевіряється введена команда і виводиться пункт меню, обраної команди. Якщо введена команда не співпадає з жодної з листу доступних , то буде виведено повідомлення про помилку та програма запропонує ввести команду ще раз. У програмі використовується шість класів з об’єктами даних основних класів один клас із описом та використання консольного меню та файл основної програми у якій виконується ввід та вивід інформації в файл. Клас Інридієнта – “Ingredient” Перший це клас “Ingredient”. Цей клас містить у собі інформацію про інгредієнт. Складові класу «Інгредієнт» - лише два поля: назви інгредієнта та надання умови інгредієнтові; а також методи редагування назви інгредієнта , виведення назви інгредієнта на екран, конструктор за умовчанням та конструктор з параметрами Тіло класу «Інгредієнт» class Ingredient { private string name; //inredient name public void correct_name(string _name)//function that correct name of ingredient public Ingredient() { } //constructor without parameters ~Ingredient() { } public Ingredient(string _name)//constructor with parameters public bool pr_TrueFalse = true; //delete ingredient qualification public bool get_pr_TrueFalse() //function take delete ingredient qualification public void show_ingredient()//show ingredient function } Методи классу «Інгридієнт» Метод відображення інгредієнта (а саме - назви), без параметрів. Метод просто виводить на екран інформацію що є в об’єкті за допомогою Console.WriteLine(); public void show_ingredient() { System.Console.Write(" " + name+ "\n"); } Конструктор з параметрами: Користувач вводить через консоль назву інгредієнта, яка запам’ятовується і надалі використовується. public Ingredient(string _name) { name = _name; } Метод зміни назви інгредієнта: Користувач вводить через консоль назву інгредієнта, яка запам’ятовується замість старої і надалі використовується. public void correct_name(string _name) { name = _name; } Метод умови інгредієнту: Умові інгредієнта на початку надається значення true, (але якщо інгредієнт буде використовуватись у певній страві, то метод умови, яка надає умови false і надалі інгредієнт не можна видалити). public bool get_pr_TrueFalse() { return pr_TrueFalse; } Клас «Список інгредієнтів» - “IngredientList” Другий це клас «Список інгредієнтів». Цей клас містить у собі інформацію про інгредієнти та методі роботи зі списком інгредієнтів. Поле класу – список інгредієнтів типу List. Конструктор без параметрів та деструктор. Методи цього класу: метод занесення інгредієнту до списку, метод видалення інгредієнту зі списку, метод розрахунку кількості інгредієнтів у списку, метод зміни назви інгредієнту списку,метод виведення на екран списку інгредієнтів, метод редагування списку інгредієнтів, метод «взяття інгредієнту» зі списку за номером, Тіло класу «Список інгредієнтів : class IngredientList { private List<Ingredient> Ingredient_list = new List<Ingredient>();//create ingredient list public IngredientList(){}//constructor without parameters ~IngredientList() { }//destructor public void add_ingredient(Ingredient temp)//function that add ingredient into the list public void remove_ingredient(int n)//function that delete ingredient from the list public Ingredient get_ingredient(int n)//function get ingredients that we have in list public void change_name(int n, string temp_name)//function change ingredient name that we public int get_count_ingredients()//function get ingredients count into the list public void show_all_ingredientslist()//function show all ingredients into the list public void change(int n, int c, int temp_i, Ingredient temp_ing, string temp_str) } Методи класу Список інгредієнтів – “IngredientList” Метод додає інгредієнт до списку через стандартний метод колекції Add. public void add_ingredient(Ingredient temp) { Ingredient_list.Add(temp); } Метод видаляє інгредієнт зі списку через стандартний метод колекції Remove. Для того щоб видалити користувач вводить номер інгредієнту зі списку. Програма декрементує введене значення(тому що нумерація списку у програмі починається із 0, а не з 1, як показано користувачу); далі програма перевіряє на умову входження інгредієнту до страви і якщо інгредієнт входить до певної страви, то видається повідомлення, що інгредієнт використовується і його не можна видалити. public void remove_ingredient(int n) { n--; if (Ingredient_list[n].get_pr_TrueFalse()==true) { Ingredient_list.Remove(Ingredient_list[n]); } else { System.Console.WriteLine("Этот ингредиент используется"); } } Метод виведення списку інгредієнтів реалізується через цикл, метод класу «Інгредієнт» та виводить інформацію на екран за допомогою System.Console.Write() public void show_all_ingredientslist() { for (int k = 0; k < Ingredient_list.Count; k++) { System.Console.Write("[" + System.Convert.ToString(k + 1) + "]"); Ingredient_list[k].show_ingredient(); } System.Console.WriteLine(); } Метод зміни назви інгредієнту реалізуються через метод класу «Інгредієнт». Користувач вводить номер інгредієнту, назву якого він хочу змінити та нову назву. Введений номер декрементується через властивості списку. public void change_name(int n, string temp_name) { n--; Ingredient_list[n].correct_name(temp_name); } Метод розрахунку кількості інгредієнтів у списку реалізується через стандартний метод колекції Count. public int get_count_ingredients() { return Ingredient_list.Count; } Метод редагування списку інгредієнтів функціоную на основі вищеописанних методів та оператору switch – case. Користувач обирає, що саме він хоче змінити у списку(видалити, додати, редагувати назву елементу чи повернутись до попередньго меню), вводить необхідну команду серед запропонованих на консолі (у разі некоректного вводу програма просить ввести команду серед запропонованих). public void change(int n, int c, int temp_i, Ingredient temp_ing, string temp_str) { switch (c) { case 1: Ingredient_list.Add(temp_ing); break; case 2: { n--; if (Ingredient_list[n].get_pr_TrueFalse() == true) Ingredient_list.Remove(Ingredient_list[n]); else System.Console.WriteLine("Этот ингредиент используется"); } break; case 3: Ingredient_list[n-1].correct_name(temp_str); break; } } Клас Страва – “Dish” Клас «Страва» містить у собі інформацію про страву, А саме такі поля: назва страви; ціна страви; час приготування страви; та список інгредієнтів, які входять до страви; Такі методи: метод введення інгредієнту до списку інгредієнтів, що використовуються у страві; метод видалення інгредієнтів з цього списку; метод підрахунку кількості інгредієнтів, що входять до страви; метод виведення списку інгредієнтів, що входять до страви; метод виведення інформації про страву на екран; метод зміни назви страви; метод зміни ціни на страву; метод зміни часу приготування страви, метод виведення на екран тільки назви страви. Тіло класу «Страва»: class Dish { private string name; //dish name private double cost; // dish cost private double time;//time for preparing dish private List<Ingredient> dish_ingredients = new List<Ingredient>();//ingredients list for preparing dish public Dish(){} //constructor without parameters ~Dish() { }//destructor public void show_dish(int n_d) //function that show info about dish public void add_ingredient_to_dish(Ingredient temp)//function that add ingredient into the dish ingredient list public void remove_ingredient_from_dish(Ingredient temp)//function that remove ingredient from the dish ingredient list public Dish(string _name, double _cost, double _time)//constructor with parameters public int count_ingredients_in_dish()//function that get count ingredients in dish ingredients list public void show_ingredients_in_dish()//function that show ingredients in the dish public void change_dish_name(string _name)//function that change dish name public void change_dish_cost(double _cost)//function that change dish cost public void change_dish_time(double _time)//function that change time for dish preparing public void show_info_dish()//function that show all info about dish public void show_namedish()//function that show dish name } Методи класу Страва – “Dish” У класі «страва» такі методи: метод введення інгредієнту до списку інгредієнтів, що використовуються у страві; метод видалення інгредієнтів з цього списку; метод підрахунку кількості інгредієнтів, що входять до страви; метод виведення списку інгредієнтів, що входять до страви; метод виведення інформації про страву на екран; метод зміни назви страви; метод зміни ціни на страву; метод зміни часу приготування страви; метод виведення на екран тільки назви страви. Методи введення до списку інгредієнтів, що використовуються у страві, їх підрахунок та видалення з нього виконуються через стандартні операції колекції Add та Remove, Count. public void add_ingredient_to_dish(Ingredient temp)//function that add ingredient into the dish ingredient list { dish_ingredients.Add(temp); temp.pr_TrueFalse = false; } public void remove_ingredient_from_dish(Ingredient temp)//function that remove ingredient from the dish ingredient list { dish_ingredients.Remove(temp); temp.pr_TrueFalse = true; } public int count_ingredients_in_dish()//function that get count ingredients in dish ingredients list { return dish_ingredients.Count(); } Метод виведення інформації про страву виконується через цикл та оператори System.Console.Write. public void show_info_dish()//function that show all info about dish { System.Console.WriteLine("Название блюда: "+name); System.Console.WriteLine("Цена блюда: "+cost); System.Console.WriteLine("Время приготовления блюда: "+time); System.Console.WriteLine("Ингредиенты: "); for (int k = 0; k < dish_ingredients.Count; k++) { System.Console.Write("(( " + (k + 1) + " )) "); dish_ingredients[k].show_ingredient(); } } Аналогічно виводиться список інгредієнтів, що входят до страви. public void show_ingredients_in_dish() { for (int i = 0; i <= dish_ingredients.Count; i++) { System.Console.Write("(( " + System.Convert.ToString(i + 1) + " )) "); System.Console.Write(dish_ingredients[i]); } } Метод виведення назви страви здійснюється через оператор System.Console.WriteLine. public void show_namedish() { System.Console.Write("\n" + name); } Метод зміни назви, ціни, та часу приготування страви здійснюється аналогічно із зміною назви інгредієнта у класі «Інгредієнт». public void change_dish_name(string _name)//function that change dish name { name = _name; } public void change_dish_cost(double _cost)//function that change dish cost { cost = _cost; } public void change_dish_time(double _time)//function that change time for dish preparing { time = _time; } Клас Список страв – “DishList” Четвертий клас - «Список страв». Цей клас містить у собі інформацію про страви та методі роботи зі списком страв. Поле класу – список страв типу List. Методи цього класу: метод занесення страви до списку, метод видалення страви зі списку, метод розрахунку кількості страв у списку, метод зміни назви страви списку ,метод виведення на екран списку страв, метод редагування списку страв. Тіло класу «Список страв»: class DishList { private List<Dish> Dish_list = new List<Dish>();//create dish list public DishList() { } //constructor without parameters ~DishList() { } //destructor public Dish get_dish(int nd)//function get dish from dish list by it number public int get_dish_count() // procedure get dish count in dish list public void show_dish_fromList(int n)//function show dish info by number in list public void show_allDishes_inList()//function show all dishes in list and their info public void add_dish_inList(Dish temp) // function add dish in dish list public void remove_dish_inList(int nd) // function remove dish from dish list public void change_DishList(int n, int c, int yt, string temp_str, double temp_dou, Ingredient temp_ingred) // function change dish list } Методи класу Список страв – “DishList” Метод додає страву до списку через стандартну операцію колекції Add. public void add_dish_inList(Dish temp) { Dish_list.Add(temp); } Метод видаляє страву зі списку через стандартний метод колекції Remove. public void remove_dish_inList(int nd) { Dish_list.Remove(Dish_list[nd - 1]); } Метод виведення списку страв реалізується через цикл, метод класу «Інгредієнт» та виводить інформацію на екран за допомогою System.Console.Write() public void show_allDishes_inList() { for (int k = 0; k < Dish_list.Count; k++) { System.Console.Write("[" + (k + 1) + "]"); Dish_list[k].show_info_dish(); } } Метод виводу інформації про страву через номер, реалізується методом описаним в класі «Страва». Номер введений користувачем декрементується. public void show_dish_fromList(int n) { Dish_list[n-1].show_info_dish(); } Метод розрахунку кількості страв у списку реалізується через стандартний метод колекції Count. public int get_dish_count() { return Dish_list.Count(); } Метод редагування списку страв функціоную на основі вищеописанних методів данного классу та оператору switch – case. По суті, він реалізован так само, як аналогічний метод у классі «Список інгредієнтів». Так само, користувач обирає, що саме він хоче змінити у списку(видалити, додати, редагувати назву елементу чи повернутись до попередньго меню), вводить необхідну команду серед запропонованих на консолі (у разі некоректного вводу програма просить ввести команду серед запропонованих). public void change_DishList(int n, int c, int yt, string temp_str, double temp_dou, Ingredient temp_ingred) { n--; switch (c) { case 1: Dish_list[n].change_dish_name(temp_str); break; case 2: Dish_list[n].change_dish_cost(temp_dou); break; case 3: Dish_list[n].change_dish_time(temp_dou); break; case 4: if (yt == 1) Dish_list[n].add_ingredient_to_dish(temp_ingred); if (yt == 2) Dish_list[n].remove_ingredient_from_dish(temp_ingred); break; } } Клас Замовлення – “Order” Клас «Страва» містить у собі поля: номер столику, на який записано замовлення; ціна замовлення; список страв замовлення; Такі методи: метод введення страви до списку страв, що замовилися; метод видалення страви з цього списку; метод підрахунку кількості страв, що входять до замовлення; метод виведення списку страв, що входять до замовлення; метод виведення інформації про замовлення на екран; метод зміни ціни на страву; метод зміни столику на який зареєстровано замовлення. Тіло класу «Замовлення»: class Order { int TableNumber;//table number in order double OrderCost;//order cost private List<Dish> OrderDishes = new List<Dish>();//dish list in order public Order() { }//constructor without parameters; ~Order() { }//destructor public Order(int tableNum, double ordercost) //constructor without parameters; public void add_dish_inOrder(Dish temp)//function that add dish into order dish list public void remove_dish_fromOrder(Dish temp)//function remove dish from order dish list public void change_tablenum_inOrder(int temp)//function change table number in order public void change_cost_Order(double temp)//function change order cost public void show_all_Order_info() } Методи класу «замовлення» У класі «страва» такі методи: метод введення страви до списку страв, що замовилися; метод видалення страви з цього списку; метод виведення списку страв, що входять до замовлення; метод виведення інформації про замовлення на екран; метод зміни ціни на страву; метод зміни столику на який зареєстровано замовлення. Методи введення до списку страв, що замовились, та видалення страв з замовлення виконуються через стандартні операції колекції Add та Remove. public void add_dish_inOrder(Dish temp) { OrderDishes.Add(temp); } public void remove_dish_fromOrder(Dish temp) { OrderDishes.Remove(temp); } Метод виведення інформації про замовлення виконується через оператори System.Console.Write та цикл. public void show_all_Order_info() { System.Console.WriteLine(+TableNumber); System.Console.WriteLine(+OrderCost); System.Console.WriteLine(); for (int i = 0; i < OrderDishes.Count; i++) { System.Console.Write("(( " + (i + 1) + " )) "); OrderDishes[i].show_namedish(); } System.Console.WriteLine(); } Метод зміни номеру столику, ціни замовлення здійснюється аналогічно до попередніх классів («Індгредієнт», «Страва»). public void remove_dish_fromOrder(Dish temp) { OrderDishes.Remove(temp); } public void change_tablenum_inOrder(int temp) { TableNumber = temp; } public void change_cost_Order(double temp) { OrderCost = temp; } Клас Список замовлень – “OrderList” Шостий клас - «Список замовлень». Цей клас містить у собі інформацію про замовлення та методі роботи зі списком замовлень. Поле класу – список замовлень типу List. Методи цього класу: метод занесення замовлення до списку; метод видалення замовлення зі списку; метод розрахунку кількості загальної кількості замовлень; метод зміни замовлення; метод виведення на екран списку замовлень; метод виведення інформації про окреме замовлення. Тіло класу «Список страв»: class OrderList { private List<Order> Order_list = new List<Order>();//order list(base) public OrderList() { }//constructor without parameters ~OrderList() { }//destructor public void add_order_inList(Order temp)//function add order into the order list(base) public void remove_order_fromList(int n)//function remove order from the order list(base) public void change_orderList(int n, int c, int yt, double temp_dou, int temp_int, Dish temp_dish)//function that change order list public int get_orders_count() // function get orders count in orders list public void show_orderInfo(int n) // function that show info about order by order number at the list public void show_all_orders_inList()// function that show info about order by order number at the list } Методи класу Список замовлень – “OrderList” Методи додавання, підрахунок та видалення замовлення зі списку через стандартні операції колекції Add, Remove, Count. public void add_order_inList(Order temp) { Order_list.Add(temp); } public void remove_order_fromList(int n) { Order_list.Remove(Order_list[n-1]); } public int get_orders_count() { return Order_list.Count; } Метод виведення списку замовлень реалізується через цикл, метод класу «Інгредієнт» та виводить інформацію на екран за допомогою System.Console.Write() public void show_all_orders_inList() { for (int i = 0; i < Order_list.Count; i++) { System.Console.Write("(" + (i + 1) + ")"); Order_list[i].show_all_Order_info(); } } Метод виводу інформації про замовлення через номер, реалізується методом описаним в класі «Замовлення». Номер введений користувачем декрементується. public void show_orderInfo(int n) { n--; Order_list[n].show_all_Order_info(); } Метод редагування списку замовлення функціонує на основі вищеописанних методів данного классу та оператору switch – case. По суті, він реалізован так само, як аналогічний метод у классі «Список інгредієнтів», та «Список страв». Так само, користувач обирає, що саме він хоче змінити у списку(видалити, додати, редагувати назву елементу чи повернутись до попередньго меню), вводить необхідну команду серед запропонованих на консолі (у разі некоректного вводу програма просить ввести команду серед запропонованих). public void change_orderList(int n, int c, int yt, double temp_dou, int temp_int, Dish temp_dish) { n--; switch(c) { case 1: Order_list[n].change_tablenum_inOrder(temp_int); break; case 2: Order_list[n].change_cost_Order(temp_dou); break; case 3: if (yt == 1) Order_list[n].add_dish_inOrder(temp_dish); if (yt == 2) Order_list[n].remove_dish_fromOrder(temp_dish); break; } } Клас Меню Програми – “MenuConsole” Класс «Меню Програми» складається з одного єдиного метода Menu. Описувати окремого його не має ніякого сенсу. За допомогою операторів if-else, while, switch-case та зчитування даних які ввів користувач на консоль, в Меню програми редагуються/видаляються/добавляються дані по ресторану. Перевірка на правильність вводу даних користувачем та правильність вводу команд здійснюється оператором try-catch. Класс функціонує на основі шести попередніх класах та їх методів. class MenuConsole { public void Menu() { string menu = ""; #region first_menu while (menu != "0") { System.Console.Clear(); System.Console.WriteLine("[1] Управление ингридиентами"); System.Console.WriteLine("[2] Управление блюдами"); System.Console.WriteLine("[3] Управление заказами"); System.Console.WriteLine("[0] Выход"); bool flag_0 = false; string a = ""; do { try { flag_0 = true; a = System.Console.ReadLine(); int k = Convert.ToInt32(a); if (k < 0 || k > 3) { throw new Exception(); } } catch (Exception) { flag_0 = false; a = ""; System.Console.WriteLine("Пожалуйста введите пункт от 0 до 3"); } } while (flag_0 == false); #endregion //WORK WITH INGREDIENTS #region ingredients_menu if (a == "1") { menu = ""; while (menu != "00") { a = ""; System.Console.Clear(); System.Console.WriteLine("[1] Добавить ингридиент"); System.Console.WriteLine("[2] Удалить ингридиент"); System.Console.WriteLine("[3] Изменить ингридиент"); System.Console.WriteLine("[4] Просмотреть все ингридиенты"); System.Console.WriteLine("[0] Назад"); bool flag_0_1 = false; do { try { flag_0_1 = true; a = System.Console.ReadLine(); int k = Convert.ToInt32(a); if (k < 0 || k > 4) { throw new Exception(); } } catch (Exception) { flag_0_1 = false; a = ""; System.Console.WriteLine("Пожалуйста введите пункт от 0 до 4"); } } while (flag_0_1 == false); #endregion #region add_ingredient if (a == "1") { //menu = "000"; System.Console.Clear(); string ingredient_name; System.Console.Write("Название добавляемого ингредиента - "); ingredient_name = System.Console.ReadLine(); Ingredient temp = new Ingredient(ingredient_name); list_base_ingredient.add_ingredient(temp); System.Console.WriteLine("Ингредиент добавлен"); System.Console.ReadKey(); } #endregion #region dell_ingredient if (a == "2") { System.Console.Clear(); list_base_ingredient.show_all_ingredientslist(); int n; string str; System.Console.WriteLine("Введите номер ингредиента в списке, который хотите удалить"); bool flag_0_12 = false; do { try { flag_0_12 = true; str = System.Console.ReadLine(); n = System.Convert.ToInt32(str); if (n < 1 || n > list_base_ingredient.get_count_ingredients()) { throw new Exception(); } } catch (Exception) { flag_0_12 = false; n = 1; System.Console.WriteLine("Введите номер ингредиента из списка выше"); } } while (flag_0_12 == false); list_
Антиботан аватар за замовчуванням

06.02.2014 01:02-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!