|
1.3.5 Вимоги до програмної документації
Попередній склад програмної документації встановлений відповідно до ДСТУ 3008-95 та Єдиній системі програмної документації. Нижче перерахований список програмних документів і їх зміст:
- структурна схема системи;
- текст програми – запис програми з необхідними поясненнями і коментарями;
- опис програми – відомості про логічну і фізичну модель, відомості про функціонування програми;
- програма і методика випробувань – вимоги, що підлягають перевірці при випробуванні програми, також порядок і методи контролю;
- технічне завдання – цей документ;
- записка пояснення – схема алгоритму, загальний опис алгоритму або функціонування програми, а також обґрунтування ухвалених технічних і техніко-економічних рішень;
- експлуатаційні документи – інструкції адміністратору, менеджеру і перевізнику.
1.3.6 Техніко-економічні показники
Економічний розрахунок показує, що розробка та використання ПК є економічно виправданою і доцільною. Про це свідчать наступні цифри:
- поточні витрати при впровадженні підсистеми проектування складуть грн;
- економічний ефект складає грн;
- термін окупності капіталовкладень в ПК складе 1 рік і 7 місяців.
1.3.7 Стадії і етапи розробки
Основні стадії і етапи розробки представлені в таблиці 1.1.
Таблиця 1.1 – Стадії і етапи розробки
Стадії розробки | Етапи робіт | Зміст робіт |
Технічне завдання 11.05.15 – 17.05.15 | Обґрунтування необхідності розробки програми | Програма «Социологические исследования» призначена автоматизації процесу проведення соціологічних досліджень. Дана програма дозволяє легко і зручно створювати опитування на найрізноманітніші теми, обирати та проходити опитування та переглядати статистику кожного з них. Це досягається завдяки простому та зрозумілому інтерфейсу програми, через який користувач може створювати опитування з довільним число запитань, кожне з яких може містити від 2 до 6 варіантів відповіді, потім може обрати опитування, які вже створені іншими користувачами на дати на них відповіді, після чого може обрати будь-яке з опитувань та переглянути його статистику. |
Науково-дослідні роботи | ||
Розробка і затвердження технічного завдання | ||
Ескізний проект 18.05.15 – 24.05.15 | Розробка ескізного проекту | В якості вхідних даних виступають назва опитування, запитання, що безпосередньо складають опитування, та варіанти відповіді, які, в свою чергу, є складовими елементами кожного запитання |
Затвердження ескізного проекту | ||
Технічний проект 25.05.15 – 31.05.15 | Розробка технічного проекту | Для форми представлення вхідних і вихідних даних були створені модулі, за допомогою яких створюються, проходяться та переглядаються опитування |
Затвердження технічного проекту |
Продовження таблиці 1.1
Робочий проект 01.06.15 – 07.06.15 | Розробка програми | У ході розробки даного програмного продукту були проведений ряд тестувань, в ході якого були знайдені помилки в роботі системи. Після усунення цих помилок був проведений повторний тест, який не виявив жодних помилок | |
Розробка програмної документації | |||
Випробування програми | |||
Впровадження 08.06.15 – 10.06.15 | Підготовка і передача програми | Для надання інформації щодо користування програмою «Социологические исследования» було створено керівництво користувача | |
1.3.8 Порядок контролю і приймання
Контроль здійснюється кінцевими користувачами системи, підключеними на етапі тестування системи.
Прийом комплексу здійснюється після його повної установки і настройки під конкретних користувачів і короткого курсу по навчанню користувачів.
Після закінчення розробки системи повинні бути проведені наступні види випробувань: тестування на захист від некоректного введення; тестування на повноту обміну інформацією між різними додатками.
1.4 Розробка засобів моделювання програмного продукту
1.4.1 Розробка логічної моделі
1.4.1.1 Діаграма прецедентів
Діаграма прецедентів (Use case diagram, діаграма варіантів використання) у UML – діаграма, що відображає відносини між акторами і прецедентами і є складовою частиною моделі прецедентів, що дозволяє описати систему на концептуальному рівні.
Прецедент – можливість модельованої системи (частина її функціональності), завдяки якій користувач може отримати конкретний, вимірний і потрібний йому результат. Прецедент відповідає окремому сервісу системи, визначає один з варіантів її використання та описує типовий спосіб взаємодії користувача з системою. Варіанти використання зазвичай застосовуються для специфікації зовнішніх вимог до системи.
Основне призначення діаграми – опис функціональності і поведінки, що дозволяє замовнику, кінцевому користувачеві і розробнику спільно обговорювати проектовану або існуючу систему.
На рисунку 1.4 показана діаграма прецедентів програми «Социологические исследования».
Рисунок 1.4 – Діаграма прецедентів програми «Социологические исследования»
На цій діаграмі показаний актор – користувач – та його можливі дії. Для початку роботи користувач повинен запустити програму. Після цього користувач може або перейти до створення опитувань, або вибрати опитування для проходження, або перейти до перегляду статистики. Якщо користувач вибере створення опитування, то йому треба буде задати назву опитування та додати запитання, до кожного з яких треба додавати варіанти відповіді. Якщо користувач вибере проходження опитувань, то він зможе переглядати запитання та надавати на них відповіді. Якщо користувач вибере перегляд статистики, то він зможе переглядати запитання, кількість відповідей на кожне з них та процентну частку кожного варіанту відповіді.
1.4.1.2 Діаграма класів
Центральне місце в ООАП займає розробка логічної моделі системи у вигляді діаграми класів. Діаграма класів (classdiagram) служить для представлення статичної структури моделі системи в термінології класів об'єктно-орієнтованого програмування. Діаграма класів може відбивати, зокрема, різні взаємозв'язки між окремими сутностями предметної області, такими як об'єкти і підсистеми, а також описує їхню внутрішню структуру і типи відносин. На даній діаграмі не вказується інформація про тимчасові аспектах функціонування системи. З цієї точки зору діаграма класів є подальшим розвитком концептуальної моделі проектованої системи.
Діаграма класів являє собою деякий граф, вершинами якого є елементи типу «класифікатор», які пов'язані різними типами структурних відносин. Слід зауважити, що діаграма класів може також містити інтерфейси, пакети, відносини і навіть окремі екземпляри, такі як об'єкти та зв'язку. Коли говорять про даній діаграмі, мають на увазі статичну структурну модель проектованої системи. Тому діаграму класів прийнято вважати графічним представленому таких структурних взаємозв'язків логічної моделі системи, які не залежать або інваріантні від часу.
Діаграма класів складається з безлічі елементів, які в сукупності відображають декларативні знання про предметну область. Ці знання інтерпретуються в базових поняттях мови UML, таких як класи, інтерфейси і відносини між ними та їх складовими компонентами. При цьому окремі компоненти цієї діаграми можуть утворювати пакети для представлення більш загальної моделі системи. Якщо діаграма класів є частиною деякого пакету, то її компоненти повинні відповідати елементам цього пакета, включаючи можливі посилання на елементи з інших пакетів.
У загальному випадку пакет статичної структурної моделі може бути представлений у вигляді однієї або декількох діаграм класів. Декомпозиція деякого уявлення на окремі діаграми виконується з метою зручності та графічної візуалізації структурних взаємозв'язків предметної області. При цьому компоненти діаграми відповідають елементам статичної семантичної моделі. Модель системи, у свою чергу, повинна бути узгоджена з внутрішньою структурою класів, яка описується на мові UML.
На рисунку 1.5 зображена діаграма класів програми «Социологические исследования».
Рисунок 1.5 – Діаграма класів програми «Социологические исследования»
На цій діаграмі показані зв'язку інформаційної системи з класами і операціями програми «Социологические исследования».
Клас «Опитування» є опитуванням, що створюється в програмі. Цей клас має такі атрибути, як «Назва», «Запитання» та «Кількість запитань».
Клас «Запитання» є запитанням, що включено до опитування. Цей клас має такі атрибути, як «Назва опитування», «Заголовок», «Варіанти відповіді» та «Кількість варіантів відповіді».
Класи «Статистика» є статистикою проведених опитувань. Цей клас має такі атрибути, як «Назва опитування», «Запитання» та «Обрана відповідь».
Всі класи програми мають спільний набір операцій, до якого входять операції «Введення даних», «Виведення даних», «Обробка даних» та «Збереження даних».
1.4.1.3 Діаграма послідовності
Діаграма послідовності (Sequence diagram) – діаграма, на якій показані взаємодії об'єктів, впорядковані за часом їх прояву. Використовується в мові UML.
Основними елементами діаграми послідовності є позначення об'єктів (прямокутники), вертикальні лінії (Life line), що відображають протягом часу при діяльності об'єкта, і стрілки, що показують виконання дій об'єктами. На даній діаграмі об'єкти розташовуються зліва направо. Її недоліком є те, що вона займає багато місця.
На рисунку 1.6 показана діаграма послідовності програми «Социологические исследования».
Рисунок 1.6 – Діаграма послідовності програми «Социологические исследования»
На даній діаграмі показано, що для початку роботи з програмою, користувачеві необхідно запустити програму.
Далі користувачеві необхідно обрати, яку операцію необхідно виконати.
Для того, щоб працювати з певним опитуванням, користувач повинен його обрати, потім ввести дані, після цього ці дані опрацюються програмою та збережуться до файлу опитування.
Для роботи із запитаннями, що містяться в конкретному опитуванні, користувачеві необхідно обрати це опитування, потім при перегляді запитання ввести дані, після чого вони будуть відправлені на опрацювання програмою, після чого запитання буде збережено до файлу опитування.
Для роботи зі статистикою користувач повинен обрати опитування, після чого з файлу, в якому воно міститься, будуть зчитані дані для формування статистики, програма їх опрацює та поверне результат у вигляді лінійних діаграм на екран.
1.4.1 Опис мови (середовища) програмування
1.4.1.1 Загальні відомості мови C#
C# (вимовляється Сі-шарп) – об'єктно-орієнтована мова програмування з безпечною системою типізації для платформи.NET. Розроблена Андерсом Гейлсбергом, Скотом Вілтамутом та Пітером Гольде під егідою Microsoft Research (при фірмі Microsoft).
Синтаксис C# близький до С++ і Java. Мова має строгу статичну типізацію, підтримує поліморфізм, перевантаження операторів, вказівники на функції-члени класів, атрибути, події, властивості, винятки, коментарі у форматі XML. Перейнявши багато що від своїх попередників – мов С++, Delphi, Модула і Smalltalk – С#, спираючись на практику їхнього використання, виключає деякі моделі, що зарекомендували себе як проблематичні при розробці програмних систем, наприклад множинне спадкування класів (на відміну від C++).
C# є дуже близьким родичем мови програмування Java. Мова Java була створена компанією Sun Microsystems, коли глобальний розвиток інтернету поставив задачу роззосереджених обчислень. Взявши за основу популярну мову C++, Java виключила з неї потенційно небезпечні речі (типу вказівників без контролю виходу за межі). Для роззосереджених обчислень була створена концепція віртуальної машини та машинно-незалежного байт-коду, свого роду посередника між вихідним текстом програм і апаратними інструкціями комп'ютера чи іншого інтелектуального пристрою.
Нововведенням C# стала можливість легшої взаємодії, порівняно з мовами-попередниками, з кодом програм, написаних на інших мовах, що є важливим при створенні великих проектів. Якщо програми на різних мовах виконуються на платформі.NET,.NET бере на себе клопіт щодо сумісності програм (тобто типів даних, за кінцевим рахунком).
Станом на сьогодні C# визначено флагманською мовою корпорації Microsoft, бо вона найповніше використовує нові можливості.NET. Решта мов програмування, хоч і підтримуються, але визнані такими, що мають спадкові прогалини щодо використання.NET.
C# розроблялась як мова програмування прикладного рівня для CLR і тому вона залежить, перш за все, від можливостей самої CLR. Це стосується, перш за все, системи типів C#. Присутність або відсутність тих або інших виразних особливостей мови диктується тим, чи може конкретна мовна особливість бути трансльована у відповідні конструкції CLR.
Проект C# був початий в грудні 1998 і отримав кодову назву COOL (C-style Object Oriented Language). Версія 1.0 була анонсована разом з платформою.NET у червні 2000 року, тоді ж з’явилася і перша загальнодоступна бета-версія; C# 1.0 остаточно вийшов разом з Microsoft Visual Studio.NET у лютому 2002 року.
1.4.2.2 Елементи мови C#
Клас – це обумовлений користувачем тип даних. Клас можна уявити собі як креслення, за яким організовуються його члени. На відміну від класу об'єктом називається конкретний примірник певного класу, з допомогою якого зазвичай проводяться певні дії в програмі.
В С# змінна будь-якого класу – це посилання на об’єкт в пам'яті, але не сам об’єкт. При створенні змінної будь-якого класу використовується конструктор класу. Конструктор класу являє собою метод з ім’ям, що збігається з назвою класу, і не повертає ніякого значення. У класі можуть бути визначені кілька конструкторів, які беруть різну кількість параметрів. Якщо в класі явно не визначено конструктор, то компілятор автоматично створює конструктор за замовчуванням без параметрів, в якому дані класу отримують значення за замовчуванням. Конструктор за замовчуванням без параметрів може бути також явно визначений у класі.
Всі типи в С# поділяються на дві основні різновиди: структурні типи (value-based) і посилальні типи (reference-based). До структурних типів відносяться всі числові типи даних (int, float та ін.), а також перерахування (enum) і структури (struct). Пам’ять для структурних типів виділяється зі стека. При присвоєнні змінній одного структурного типу іншого типу змінної відбувається побітне копіювання значення першої змінної у другу змінну. Для створення змінних структурного типу оператор new не використовується (за винятком виклику конструктора з параметрами для структур). До посилальних типів відносяться класи (class) і інтерфейси (interface).
Пам’ять для посилальних типів виділяється з «керованої купи». При присвоєнні змінної одного посилального іншого типу змінної створюється ще одне посилання, що вказує на ту ж область пам’яті, що й перша змінна. Для створення змінних посилального типу використовується оператор new.
В С# всі типи даних (як структурні, так і посилальні) є похідними від класу Object. Клас Object визначає загальну поліморфічну поведінку для всіх типів даних.
Перелік вбудованих типів мови C# і відповідних їм системних типів.NET:
- byte (Byte) – ціле в діапазоні від 0 до 255;
- short (Int16) – ціле в діапазоні від -32768 до 32767;
- int (Int32) – ціле в діапазоні від -2 147 483 648 до 2 147 483 647;
- long (Int64) – ціле в діапазоні від -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807;
- char (Char) – один 16-бітовий символ Unicode;
- string (String) – рядок необмеженого розміру символів Unicode;
- float (Single) – число з плаваючою точкою від 10(-45) до 10(38);double (Double) – число з плаваючою точкою від 10(-324) до 10(308);
- bool (Boolean) – логічне значення true або false;
- object (Object) – все, що завгодно.
Для оголошення константи використовується ключове слово const.
Цикл з лічильником визначається наступним чином: for (ініціалізація лічильника; умова; зміна лічильника) тіло циклу. Цикл з лічильником припиняється в тому випадку, коли умова стає хибною.
Цикл з передумовою записується наступним чином: while(умова) тіло циклу. Цикл з передумовою припиняється в тому випадку, коли умова стає хибною.
Цикл з постумовою записується наступним чином: do тіло циклу while(умова). Цикл з постумовою припиняється в тому випадку, коли умова стає хибною.
Цикл з масивом записується наступним чином: foreach(елемент масиву in масив) тіло циклу. Цикл з масивом припиняється в тому випадку, коли буде закінчено перебір всіх елементів масиву.
У всіх циклах можна застосовувати оператори break і continue.
Для перевірки умови використовується наступна конструкція: if (умова) умова вірно else умова false
Для множинною перевірки значення змінної використовується наступна конструкція: switch(змінна){case значення 1: код для значення 1 break; case значення 2: код для значення 2 break; default:код для значення за умовчанням}.
Масив – це набір елементів одного типу, доступ до яких здійснюється за допомогою числового індексу. В С# масиви можуть бути простими або багатовимірними. Масиви оголошуються шляхом приміщення квадратних дужках після вказівки типу даних для елементів цього масиву. Синтаксис оголошення масиву: тип[] масив=new тип[кількість елементів]; або тип[] масив; масив=new тип[кількість елементів]. Елементи масиву можуть бути ініціалізовані при оголошенні: тип[] масив={значення, значення,...}.
Для доступу до елемента масиву після його імені в квадратних дужках вказується індекс елемента. Індексація елементів масиву завжди починається з 0. Необхідно звернути увагу на те, що будь-який масив є похідним класом від класу Array. В наслідок цього будь-який масив в C# успадковує велику кількість корисних методів обробки елементів масиву.
Для поліпшення структурування програмного коду в C# використовуються простори імен. Для оголошення простору імен використовується наступна конструкція: namespace і’мя{визначення типів}.
У подальшому для звернення до типу, оголошеного в просторі імен, використовується конструкція імя-тип. Простори імен можуть бути вкладеними. Для підключення класів з будь-якого простору імен використовується конструкція using ім’я. Якщо підключено простір імен, то можна посилатися на тип і без вказівки простору імен.
2 СПЕЦІАЛЬНА ЧАСТИНА
2.1 Структура програмного продукту
«Социологические исследования» – це програма, яка була розроблена як зручний додаток для проведення соціологічних досліджень.
Програма «Социологические исследования» дозволяє користувачеві за допомогою зручного та зрозумілого інтерфейсу легко та швидко створювати соціологічні опитування на будь-які теми, відслідковувати статистику відповідей на те чи інше запитання, переглядати список опитувань, які наявні в папці програми та проходити будь-яке з них.
При завантаженні програми користувач бачить перед собою форму, показану на рисунку 2.1. На цій формі користувач може обрати необхідну йому функцію, після чого відкриється спеціально розроблена форма – майстер, що забезпечує її роботу.
Рисунок 2.1 – Головна форма програми «Социологические исследования»
Майстер створення опитувань надає змогу користувачеві задавати ім’я опитування, під яким його потім буде легко знайти для подальших маніпуляцій. Після задання назви опитування майстер переключається в режим додавання запитань. Користувач може створити довільну кількість запитань, від одного до безкінечності. До кожного запитання є можливість додати від 2 до 6 варіантів відповіді. Після створення запитання користувач повинен його зберегти, потім може додати ще одне запитання або закрити майстер створення опитувань.
Майстер проходження опитувань слугує для безпосередньо проходження опитувань. Користувач має змогу обрати зі списку доступних опитувань йому необхідно, після чого майстер відкриває. Майстер послідовно переключає користувача між запитаннями, на кожне з яких він відповідає кліком на певний варіант відповіді. В ході відповідей поточні результати записуються у тимчасовий файл. Після проходження користувач буде сповіщений про закінчення запитань, а результат проходження запишеться до файлу опитування, таким чином додаючи результати конкретної людини до загальної статистики.
Майстер перегляду статистики надає змогу переглянути загальні результати опитувань, зібрані з багатьох респондентів. Кожен користувач може обрати зі списку опитувань те, яке цікавить, після чого відкриється вікно, в якому є можливість перегляду статистики по кожному запитанні в опитуванні. В цьому вікні відображається загальна кількість опитаних, кількість відповідей на конкретний варіант відповіді у конкретному запитанні та лінійна діаграма для зображення статистики у процентному співвідношенні.
Для кожного майстру, що представлений у програмі та головної форми передбачені ситуації випадкового виходу, тому кожного разу при виході користувач попереджається відповідним повідомленням, в якому повинен підтвердити свій вибір.
Дана розробка має за мету полегшити проведення соціологічних досліджень, зекономити на фінансових та людських ресурсах, які можуть бути задіяні, спростити процес аналізу результатів проведених опитувань.
Основна структура програмного продукту представлена на рисунку 2.2.
Ключові переваги програми «Социологические исследования»:
- відкритість платформи для використання;
- простота інтерфейсу користувача;
- висока швидкість проведення опитувань;
- обробка великих об’ємів даних за малий проміжок часу;
- реєстрація результатів та формування на їх основі статистики в режимі реального часу;
- висока деталізація відображення результатів опитувань.
Загальні обмеження:
- 5 мб вільного місця на диску;
- від 256 Мб оперативної пам’яті;
- відео-карта з підтримкою DirectX 9 і 64 Мб графічної пам'яті;
- монітор, з розширенням не менш 800х600;
- клавіатура, миша;
- операційні система Windows 7 і вище;
- Microsoft.Net Framework 4.5;
- Microsoft Visual C++ Redistributable.
Рисунок 2.2 – Структура програмного продукту
2.2 Структура і функціональне призначення модулів програмного продукту
Програма «Социологические исследования» складається з декількох модулів, які показані на рисунку 2.3.
Головний модуль програми – модуль «Main». Цей модуль описує головну форму програми, яке є в той же час і головним меню програми. В цьому модулі описуються зв’язки між головною та іншими формами програми. Через цю форму, завдяки компоненту меню, викликаються інші форми програми – майстри, що призначені для виконання своїх функцій (створення опитувань, вибір та проходження опитувань, перегляд статистики). Виклик кожної форми відбувається натиском миші на певний пункт меню, що знаходиться угорі форми.
Код процедури виклику форми з майстром створення опитувань показаний на рисунку 2.4.
Код процедури виклику форми з майстром проходження опитувань представлено на рисунку 2.5.
Код процедури виклику форми з майстром перегляду статистики представлено на рисунку 2.6.
Рисунок 2.3 – Модулі програми «Социологические исследования»
private void исследованиеToolStripMenuItem_Click(object sender, EventArgs e)
{
InterviewCreator ic = new InterviewCreator();
ic.ShowDialog();
}
Рисунок 2.4 – Процедура виклику майстра створення опитувань
private void пройтиОпросToolStripMenuItem_Click(object sender, EventArgs e)
{
InterviewExplorer ie = new InterviewExplorer();
ie.ShowDialog();
}
Рисунок 2.5 – Процедура виклику майстра проходження опитувань
private void просмотретьСтатистикуОпросаToolStripMenuItem_Click(object sender, EventArgs e)
{
Stats st = new Stats();
st.ShowDialog();
}
Рисунок 2.6 – Процедура виклику майстра перегляду статистики
Код процедури, яка закриває головну форму програми, представлено на рисунку 2.7.
private void выходToolStripMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}
Рисунок 2.7 – Процедура закриття головної форми програми
Код процедури, яка викликає діалогове вікно, в якому користувач підтверджує або скасовує вихід з програми, представлено на рисунку 2.8.
private void Main_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show("Закрыть приложение?", "Выход из приложения", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.No)
{
e.Cancel = true;
}
}
Рисунок 2.8 – Процедура підтвердження виходу з програми
Модуль InterviewCreator описує форму, яка призначена для створення опитувань. Після виклику форми на екран виводиться поле для вводу тексту, в яке користувачу необхідно ввести назву опитування. Після введення назви та підтвердження на формі з’являються компоненти для створення запитань. В поле, що знаходиться угорі форми, користувач вводить заголовок запитання. Під цим полем знаходиться випадаючий список, від вибраного значення якого залежить кількість генерованих полів для введення варіантів відповіді. Після заповнення всіх полів та після натиску на кнопку збереження даних, запитання зберігається до файлу опитування. Після того, як користувач завершить додавання запитань та натисне кнопку закриття майстра, дані у файлі опитування зашифруються ключем для запобігання несанкціонованого доступу до цього файлу та викривлення даних.
Процедуру завантаження форми InterviewCreator зображено на рисунку 2.9.
private void InterviewCreator_Load(object sender, EventArgs e)
{Step = 0;button3.Visible = false;
comboBox1.Visible = false;
comboBox1.SelectedIndex = 0;
label2.Visible = false; }
Рисунок 2.9 – Процедура завантаження форми InterviewCreato
Процедура зміни кількості варіантів відповіді представлено на рисунку 2.10.
private void comboBox1_SelectedIndexChanged (object sender, EventArgs e) {if (Step > 0) {for (Iteration = 0; Iteration < PreviousIndex + 2; Iteration++) {this.Controls.Remove (Questions[Iteration]);Questions[Iteration].Dispose(); this.Controls.Remove(Descriptions[Iteration]);
Descriptions[Iteration].Dispose();}}
if (Step > 0) {for (Iteration = 0; Iteration < comboBox1.SelectedIndex + 2; Iteration++)
{ Questions[Iteration] = new TextBox();
Questions[Iteration].Width = 380; Questions[Iteration].Height = 30; Questions[Iteration].Location = new Point(190, 50 * Iteration + 135); Questions[Iteration].Name = "Textbox " + Iteration.ToString(); this.Controls.Add(Questions[Iteration]); Descriptions[Iteration] = new Label();
Дата добавления: 2015-10-21; просмотров: 19 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |