Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Лабораторна робота №4. Розробка проектів, що реалізують циклічні обчислювальні процесиСодержание книги
Поиск на нашем сайте
Мета: Навчитись використовувати засоби VB для розробки проектів, що реалізують циклічні обчислювальні процеси. Циклічні обчислювальні процеси
Циклічним обчислювальним процесом називають обчислювальний процес, в якому певна послідовність дій повторюється скінченну кількість разів. Впорядковану послідовність дій, що повторюються, називають циклом. Перелік дій циклу називають тілом циклу. Для організації циклічного обчислювального процесу необхідно задати початкове значення параметра циклу, закон його зміни та умову виходу із повторень. Часто реалізація циклічного обчислювального процесу вимагає розрахунку числа повторень циклу. Розглянемо приклади.
Приклад 1. Необхідно обчислити і надрукувати квадрати чисел натурального ряду: 1, 2, 3,..., 100 (одержати ряд 1, 4, 9,..., 10000). Алгоритм розв’язування задачі має вигляд: 1. Змінній Число присвоїмо значення 0. 2. Збільшимо її значення на одиницю і результат знову присвоїмо змінній Число. 3. Піднесемо нове значення до квадрату. 4. Надрукуємо результат. Багаторазово (100 разів) повторимо виконання пунктів 2..4.
Приклад 2. Нехай маємо пачкуаркушів із списками студентів усіх груп факультету. Необхідно визначити, скільки в середньому студентів навчається в одній групі. Очевидно, що для цього необхідно просумувати кількість студентів усіх груп і отриману суму поділити на кількість груп. Можна запропонувати такий алгоритм розв’язування цієї задачі: Нехай значенням змінної Номер буде номер групи. 1. Змінним Номер та Сума присвоїмо значення 0. 2. Збільшимо значення змінної Номер на одиницю і присвоїмо змінній Номер це нове значення. 3. Візьмемо черговий листок із списком студентів групи. Додамо до значення змінної Сума число, що дорівнює кількості студентів цієї групи, і присвоїмо їй отримане значення. 4. 2-е і 3-е розпорядження будемо повторювати доти, поки не закінчаться аркуші в пачці. 5. Остаточне значення змінної Сума розділимо на остаточне значення змінної Номер. 6. Надрукуємо результат – середнє число студентів в одній групі.
В прикладі 2 число повторюваних пунктів всього два. Але алгоритм складніший від попереднього, тому що заздалегідь не встановлено число повторень – воно дорівнює числу аркушів із списками груп, які попередньо не перераховані. Якщо доручити виконання цього алгоритму комп'ютеру, він самостійно порахує, скільки було аркушів у пачці – це і буде число груп (остаточне значення змінної Номер). Головна відмінність цих прикладів полягає в тому, що в першому випадку число повторень заздалегідь відоме (100). В другому випадку число повторень залежить від умови, записаної в 4-му пункті алгоритму. Ці підходи не є такими вже складними, але використання великої кількості операторів присвоювання – рутинна процедура. Застосування операторів циклу дозволяє значно скоротити обсяг програми. Програмування циклів з лічильником
Для організації циклічних обчислювальних процесів, в яких кількість повторень відома наперед, використовують оператор циклу For... Next. Він має таку структуру:
Тут < Ім’яЗмінної> – лічильник циклу, для якого задають його початкове значення, крок зміни і кінцеве значення. За допомогою лічильника програма відстежує, скільки разів виконалось тіло циклу (кількість повторень). Параметр < ПочатковеЗначення > вказує значення, яке присвоюється лічильнику перед першим виконанням циклу. Цикл виконується доти, поки значення лічильника не перевищить кінцевого значення < КінцевеЗначення >, вказаного після ключового слова To. Після кожного виконання циклу значення лічильника змінюється на величину < Крок >, вказану за ключовим словом Step. За його відсутності (за замовчуванням) кроком циклу приймається одиниця. Ключове слово Next означає кінець тіла циклу. <ПослідовністьОператорів (Тіло циклу)>– це та частина програми, число повторень якої визначається законом зміни значень лічильника. При виконанні оператора циклу з лічильником насамперед цикл перевіряється на несуперечність. Якщо кінцеве значення лічильника більше початкового, то крок циклу повинен бути додатним. Якщо кінцеве значення лічильника менше початкового, то крок буде від’ємним. Якщо буде виявлено суперечність, робота циклу буде негайно припинена і почнуть виконуватися оператори, записані за оператором циклу. В лічильнику циклу залишиться його початкове значення. Якщо ж суперечності не буде виявлено, то оператори тіла циклу будуть виконані при початковому значенні лічильника. Потім значення лічильника буде змінено на величину кроку. Після цього (у випадку циклу з додатнім кроком) буде зроблена перевірка, чи не перевищує значення лічильника кінцевого значення. Якщо це так, робота оператора циклу буде припинена. Якщо ні, то оператори тіла циклу будуть виконані при новому значенні лічильника, після чого воно буде знову змінено на величину кроку і т.д. Аналогічно дії виконуюються і при від’ємному значенні кроку зміни лічильника циклу. В цій лабораторній роботі буде продемонстровано виведення результатів обчислень безпосередньо у форму за допомогою методу Print, що має наступний синтаксис:
[<Ім’я об’єкту>.] Print [<список виведення>]
Одноразовим викликом методу Print можна вивести декілька значень елементів із списку виведення. В цьому випадку їх необхідно відокремити або крапкою, або крапкою з комою. Якщо елементи відокремлюються комою, то кожен наступний елемент виводиться з початку наступного стовпчика (ширина кожного стовпчика дорівнює 14 символам), а якщо крапкою з комою, то елементи виводяться через пропуск. Кожен наступний метод Print здійснює виведення інформації з нового рядка. Якщо попередній метод Print завершився крапкою чи крапкою з комою, то наступний метод Print продовжить виведення в поточному рядку. Коли потрібно здійснити перехід на новий рядок, застосовується метод Print без параметрів. У методі Print для виведення значення із заданої позиції поточного рядка використовують функцію Tab (<номер позиції>), а для виведення заданої кількості пропусків − функцію Spc (<кількість>). Для виведення інформації у потрібному форматі використовується функція Format (<вираз>, <формат>). Другим параметром найчастіше служать символи, які наведені в таблиці 4.1. Таблиця 4.1 Параметри функції Format
Приклад 3. Розглянемо програму, яка реалізує циклічний алгоритм виведення чисел від 0 до 100 з кроком 20 з використанням оператора циклу з лічильником:
Private Sub Command1_Click() For i=0 to 100 Step 20 ’ Перший рядок циклу Print i Next і ’ Останній рядок циклу End Sub
Тут змінна i –лічильник циклу, 0 і 100 – початкове і кінцеве значення лічильника, 20 – крок, а послідовність операторів складається тільки з одного оператора: Print i – виведення значення лічильника на екранну форму. Результатом роботи даної програми буде стовпчик чисел: 0, 20, 40, 60, 80 і 100. Після закінчення роботи циклу значення лічильника буде рівним 120. Це число перевищує кінцеве значення лічильника. Приклад 4. Роботу циклу з лічильником можна продемонструвати і на прикладі програми, за допомогою якої відображаються графічні елементи, що повторюються, наприклад, пронумеровані прямокутники (рис.4.1).
Рис. 4.1. Результат роботи програми виведення графічних об’єктів
Програмний код може мати вигляд:
Private Sub Command1_Click() Cls Scale (0, 4) - (40, -4) For i = 0 to 10 Line(3 + i * 3, 1) – (1 + i * 3, 3), vbBlack, B Print i + 1 Next i End Sub
Цикл з лічильником зручно використовувати для побудови графіка функції. Графік функції y=f(x) будується на довільному відрізку осі абсцис на основі точок, коли для кожного значення аргументу x з цього відрізка комп’ютер може легко знайти значення функції у і розмістити на площині креслення точку з координатами (x,y). Якщо точок буде достатньо багато, то вони зливатимуться в суцільну лінію – графік функції. Приклад 5. На рис.4.2 показано екранну форму з розміщеним на ній графічним вікном. В ньому за допомогою методів Pset і Line з використанням циклу з лічильником побудований графік функції у= ах2+ bx+ с (а = 1, b = –2, с = –3). Код програми має вигляд:
Private Sub Command1_Click() Picture1.Scale (-3, 5)-(5, -5)
’ Побудова осі абсцис Picture1.Line (-3, 0)-(5, 0), vbCyan For i = -3 To 4 Picture1.PSet (i, 0), vbCyan Picture1.Print i Next i
’ Побудова осі ординат Picture1.Line (0, -5)-(0, 5), vbCyan For i = -4 To 5 Picture1.PSet (0, i), vbCyan Picture1.Print i Next i
’ Побудова графіка For x = -2 To 4 Step 0.01 y = x ^ 2 - 2 * x - 3 Picture1.PSet (x, y), vbGreen Next x End Sub
Рис. 4.2. Побудова графіка функції
Оператори циклу з умовою
Як було відмічено раніше, оператор циклу виду For...Next застосовуєтьсяувипадках, коли кількість повторень тіла циклу відома. Для програмування циклічних процесів із заздалегідь невідомим числом повторень використовують різні форми оператора циклу з умовою. Оператор циклу з умовою – це багаторядковий оператор, перший рядок якого починається з ключового слова Do (виконати), а останній – з ключового слова Loop (цикл). Нехай, наприклад, в задачі прикладу 1 (ст. 58) потрібно не тільки знаходити квадрати натуральних чисел від 1 до 100, але й додавати їх. Результат на кожному кроці циклу будемо присвоювати змінній Сума типу Integer. Чи обчислиться сума всіх 100 доданків? При встановленому числі повторень, рівному 100, на одному із кроків циклу виникне помилка, викликана спробою присвоїти змінній Сума значення, що перевищує число 32767, яке є максимальним значенням змінної типу Integer. Ця спроба викличе появу на екрані попередження, зображеного на рис. 4.3. Чи можна уникнути такої ситуації? Один із способів полягає у використанні операторів циклу з умовою. Чотири можливих варіанти використання таких операторів циклу наведено в таблиці 4.1.
Рис. 4.3. Повідомлення про помилку Overflow
Розглянемо більш детально роботу циклів з умовою. При використанні конструкції типу While тіло циклувиконується (випадок 1) або повторюється виконання тіла циклу (випадок 3), якщо значення < ЛогічнийВираз> дорівнює True (Істинне). В іншому випадку відбувається завершення циклу. При використанні конструкції типу Until тіло циклувиконується (випадок 2) або повторюється виконання тіла циклу (випадок 4), якщо значення < ЛогічнийВираз> дорівнює False (Хибне). В іншому випадку цикл завершується. Таблиця 4.1 Оператори циклу з умовою
Якщо умова записана після Loop While(Until) (випадки 3 і 4), тіло циклу виконуватиметься хоча б один раз. Якщо ж умова записана після Do While(Until) (випадки 1 і 2), то тіло циклу може і не виконатись жодного разу Очевидно, що завжди можна замінити умову While умовою Until і навпаки, використавши логічне заперечення логічного виразу. При програмуванні коду інколи виникає ситуація, коли необхідно перервати виконання циклу до його повного завершення. Це можна зробити за допомогою команди Exit. Ця команда завершує виконання циклу і передає управління наступній за циклом конструкції. Синтаксис цього оператора всередині циклу For: Exit For, авсередині циклу Do – Exit Do. Приклад 6. Умова X > 100 Or Time > 600 завершення циклу рівнозначна умові Not (X> 100 Or Time > 600) продовження циклу або X<= 100 And Time<= 600. Приклад 7. Розглянемо наступну задачу. Петро Петрович купив мішок цукру масою 50 кг і вирішив кожного разу брати з цього мішка десяту частину його вмісту доти, поки в мішку залишиться менше 30 кг цукру. Один з варіантів програмного коду, що визначає номер звертання Петра Петровича до мішка і масу цукру, що залишається в мішку, може бути таким:
Private Sub Command1_Click() Dim Маса As Single, i As integer Маса =5 0: i=0 Print “Номер:”, “Залишок:” Do ’ Перший рядок циклу i = i + 1 Маса= Маса- Маса / 10 Print i, Маса Loop Until Маса<30 ’ Останній рядок циклу End Sub
Очевидно, що замість Until Maca < 30 можна написати: У випадку, якщо початкова маса цукру буде не 50, а 25 кг, то результатом виконання програмного коду буде:
Незважаючи на те, що маса цукру менше 30 кг, Петро Петрович одного разу все-таки відсипле собі 2.5 кг цукру. Щоб програма працювала коректно, потрібно записати таку конструкцію оператора циклу: Do Until Маса < 30... Loop В цьому випадку результат роботи програми матиме вигляд:
Приклад 8. Розглянемо програмний код задачі обчислення суми квадратів натуральних чисел від 1 до 100 до тих пір, поки ця сума буде меншою від деякого заданого числа.
’ Максимальне значення змінної типу Integer Const Max As Integer=32767
Private Sub Command1_Click() Dim i As Integer, Sum As Integer i=0: Sum=0 Do ‘ Перший рядок циклу i=i+1 Sum=Sum+i^2 ’ Останній рядок циклу Loop While Sum < Max – i^2 Print “i:”, “Sum:” Print i, Sum End Sub
Обчислення суми буде продовжуватися до тих пір, поки значення змінної Sum не досягне встановленого нами значення. Програмування циклічних обчислювальних процесів неможливе без організації вікон для введення інформації, що можна зробити за допомогою функції InputBox. Функція InputBox забезпечує формування вікна для введення інформації з відображенням його заголовка і запрошенням користувача до введення інформації. Функція виклику вікна InputBox має наступний синтаксис з відповідними іменованими аргументами: InputBox (<повідомлення> [,<заголовок вікна>] [,<текст за замовчуванням>] [,<Хпоз>][,<Yпоз>] [,<файл підказки>] [,<контекст>]) <повідомлення>– визначає текст, що відображається в діалоговому вікні як запрошення; <заголовок вікна>– текст заголовка діалогового вікна; якщо цей параметр не вказано, то відображається назва додатка; <текст за замовчуванням> – визначає значення, що відображається в рядку введення; <Хпоз>, <Yпоз> – параметри, що вказують координати верхнього лівого кута вікна; за замовчуванням вікно відображається посередині екрана; <файл підказки>, <контекст>–два необов’язкові параметри, що дають змогу відкривати певні файли довідкової системи.
Приклад 9. Розглянемо програмний код з використанням функції InputBox для формування вікна введення: Private Sub Command1_Click() Dim strPWD As String strPWD = InputBox (“Введіть пароль”, _ “Перевірка доступу”, “*****”) End Sub Результатом роботи програми буде вікно введення (рис. 4.5):
Рис. 4.5. Діалогове вікно
Завдання для виконання лабораторної роботи № 4 І. Завантажити середовище Visual Basic для створення нового проекту.
ІІ.Розглянути зразки форм та програмних кодів: а) задачі табулювання функції , 2.6 <=x<= 8.8, ∆x= 0.2, з використанням оператора FOR…NEXT. У поданих зразках табулювання функцій (рис. 4.6, 4.7, 4.8, 4.9, 4.10) результати виводяться у багаторядкове поле редагування. Для цього властивості MultiLine потрібно задати значення True - дозвіл об’єкту працювати більш ніж з одним рядком, а властивості ScrollBars необхідно задати значення 2 - Vertical – наявність вертикальної смуги прокручування.
Рис. 4.6. Зразок №1 розташування об’єктів на формі
Private Sub Command1_Click() Dim newline, space As String Dim x, xp, xk, dx As Single xp = Val(Text1.Text) xk = Val(Text2.Text) dx = Val(Text3.Text) newline = Chr(13) + Chr(10) space = Chr(9) Text4.Text = " x" + space + " y" + newline For x = xp To xk Step dx y = x ^ 2 + 10 Text4.Text = Text4.Text + Str(Format$(x, "0.000")) _ + space + Str(Format$(y, "0.0000")) + newline Next End Sub
б) , x>= 2.6, n= 8, ∆x= 0.1
Рис. 4.7. Зразок №2 розташування об’єктів на формі Private Sub Command1_Click() Dim newline, space As String Dim n, i As Integer xp = Val(Text1.Text) n = Val(Text2.Text) dx = Val(Text3.Text) newline = Chr(13) + Chr(10) space = Chr(9) Text4.Text = " x" + space + " y" + newline For i = 1 To n x = xp + (i - 1) * dx y = x ^ 2 + 10 Text4.Text = Text4.Text + Str(Format$(x, "0.000")) _ + space + Str(Format$(y, "0.0000")) + newline Next i End Sub
в) задачі табулювання функції з використанням оператора DO WHILE…LOOP
Рис. 4.8. Зразок №3 розташування об’єктів на формі Private Sub Command1_Click() Dim newline, space As String xp = Val(Text1.Text) xk = Val(Text2.Text) dx = Val(Text3.Text) newline = Chr(13) + Chr(10) space = Chr(9) Text4.Text = " x" + space + " y" + newline x = xp Do While x <= xk y = Exp(x) + 10 Text4.Text = Text4.Text + Str(Format$(x, "0.000")) _ + space + Str(Format$(y, "0.0000")) + newline x = x + dx Loop End Sub
г) задачі обчислення добутку
Рис. 4.9. Зразок №4 розташування об’єктів на формі Private Sub Command1_Click() mp = Val(Text1.Text) mk = Val(Text2.Text) p = 1 For m = mp To mk p = p * m ^ 2 Next m Text3.Text = Str(p) End Sub
д)задачі обчислення суми
Рис. 4.10. Зразок №5 розташування об’єктів на формі
Private Sub Command1_Click() ip = Val(Text1.Text) ik = Val(Text2.Text) s = 0 For i = ip To ik s = s + i ^ 2 Next i Text3.Text = Str(s) End Sub ІІІ. Використовуючи подані вище зразки форм та програмних кодів, розробити форми із заголовком “Циклічні процеси”, виконавши модифікацію форми та коду обробки події для командної кнопки для виконання наступних завдань:
ІV. Кожний із проектів зберегти в окремій папці Lab4_z1, Lab4_z2, Lab4_z3, Lab4_z4. Продемонструвати створені проекти викладачеві. Записати отримані результати.
V. Розглянути зразки форми (рис. 4.11, 4.12) та програмного коду задачі обчислення приросту жителів кожного з N населених пунктів на кінець року, якщо відомо кількість народжених та кількість померлих в населеному пункті на кінець поточного року:
Рис. 4.11. Зразок №6 використання вікон функції InputBox для введення даних
Рис. 4.12. Зразок №7 форми з результатами задачі
Програмний код задачі можна записати таким чином:
Private Sub Command1_Click() Const N% = 3 Dim Nazva As String * 10 For i% = 1 To 50 Print "_"; Next i% Print "Населений", "Кількість", "Кількість", "Приріст" Print "пункт", "народжених", "померлих", "населення" For i% = 1 To 50 Print "_"; Next i% For i% = 1 To N% Title$ = "Населений пункт" Prt$ = "Назва " & i% & "-го населеного пункту" Nazva = InputBox(Prt$, Title$) Title$ = "Кількість народжених" Prt$ = "К-ть народжених в " & i% & "-му населеному пункті" nar = Val(InputBox(Prt$, Title$)) Title$ = "Кількість померлих" Prt$ = "К-ть померлих в " & i% & "-му населеному пункті" pom = Val(InputBox(Prt$, Title$)) r = nar - pom Print Format(Nazva, "##########"), nar, pom, r Next i% For i% = 1 To 50 Print "_"; Next i% End Sub
VІ. Використовуючи наведені вище зразки, виконати модифікацію форми та коду обробки події для командної кнопки відповідно до свого варіанту для розв’язування наступних задач:
1. Обчислити вартість товару та вартість товару із врахуванням торгової надбавки кожного з N видів товару, якщо задано ціну одиниці товару (грн.), кількість товару (шт.) та торгову надбавку (%) кожного виду товару.
2. Обчислити для кожного з N клієнтів залишок на банківському рахунку після проведення банківської операції, якщо відомо залишок на рахунку до операції, надходження та зняття коштів з рахунку кожного клієнта.
3. Обчислити для кожного з N об’єктів суму оплати виконаних будівельних робіт, якщо відомо відсоток виконання запланованого осягу робіт та загальна вартість будівельного проекту кожного об’єкта.
4. Обчислити для кожної з N груп відсоток студентів, що склали іспити, якщо відомо загальну кількість студентів групи; кількість студентів, що склали іспити без задовільних оцінок; кількість студентів, що склали іспити із задовільними оцінками в кожній групі.
5. Обчислити для кожної з N груп відсоток студентів, що не склали іспити, якщо відомо загальну кількість студентів; кількість студентів, що склали іспити без задовільних оцінок; кількість студентів, що склали іспити із задовільними оцінками в кожній групі.
6. Обчислити кількість жителів кожного з N населених пунктів на кінець року, якщо відомо кількість жителів на початку року, кількість прибулих, вибулих, народжених та померлих кожного населеного пункту.
7. Обчислити рівень виконання навчального навантаження (у відсотках) кожним з N вчителів школи, якщо відомо заплановану та фактично виконану кількість годин кожного вчителя.
8. Обчислити вартість товару кожного з N видів, якщо задано ціну одиниці товару та кількість товару кожного виду.
9. Обчислити вартість товару та вартість товару із врахуванням торгової знижки кожного з N видів товару, якщо задано ціну одиниці товару (грн.), кількість товару (шт.) та торгова знижка (%) кожного виду товару.
10. Обчислити суму оплати комунальних послуг кожного з N об’єктів, якщо задано місячну вартість комунальних послуг та кількість місяців, за які потрібно провести розрахунок для кожного об’єкта.
11. Обчислити урожайність (ц/га) зернових кожного з N фермерських господарств, якщо задано площу посівів (га) та валовий збір (т) кожного фермерського господарства.
12. Обчислити для кожного з N об’єктів суму оплати за водопостачання за звітний період, якщо задано вартість 1 м3 води та початкові і поточні покази лічильника кожного об’єкта. 13. Обчислити для кожного з N клієнтів суму оплати за електроенергію за звітний період, якщо задано вартість 1 кВт-год та початкові і поточні покази лічильника кожного клієнта.
14. Обчислити для кожного з N клієнтів вартість пального (грн), якщо задано ціну 1 л (грн) та витрати пального (л) кожним клієнтом.
15. Обчислити для кожного з N об’єктів суму оплати за опалення, якщо задано вартість опалення 1 м2 та опалювальна площа кожного об’єкта. VІІ. Зберегти проект у папці Lab4_z5. Продемонструвати створений проект викладачеві. Записати отримані результати.
VІІІ. Захистити виконану роботу.
Контрольні запитання 1. Дайте визначення циклу. 2. Що необхідно знати для організації циклу? 3. Синтаксис оператора FOR…NEXT та його використанняу Visual Basic. 4. Дати визначення ”початкового значення”, ”кінцевого значення”, ”кроку” параметра циклу. 5. Синтаксис операторів DO WHILE…LOOP та DO…LOOP WHILE і їх використання у Visual Basic. 6. Синтаксис операторів DO UNTIL…LOOP та DO…LOOP UNTIL і їх використання у Visual Basic. 7. Вкажіть відмінності між циклом з умовою і циклом з параметром. 8. Призначення команди EXIT. 9. Метод Print, його синтаксис та використання. 10. Функція Tab та її застосування. 11. Функція Spc та її застосування. 12. Функція Format, її синтанксис та застосування.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-08-12; просмотров: 403; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.198.148 (0.009 с.) |