Моделирование движения бесконечной цепи тел, связанных между собой пружинами

Осуществление выбора JavaScript библиотек для создания программы. Создание приложения с использованием одного из фреймворков, позволяющей визуально представить колебание n-тел, связанных пружинами, при изменении начального положения одного из тел.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 11.01.2020
Размер файла 93,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Санкт-Петербургский государственный политехнический университет

Институт Прикладной математики и механики

Кафедра Прикладной математики

Курсовой проект

МОДЕЛИРОВАНИЕ ДВИЖЕНИЯ БЕСКОНЕЧНОЙ ЦЕПИ ТЕЛ, СВЯЗАННЫХ МЕЖДУ СОБОЙ ПРУЖИНАМИ

П. Д. Киселев

Руководитель проекта: Панченко А.Ю.

Санкт-Петербург 2014

Оглавление

  • Введение
  • 1. Значение и выбор фреймворка
    • 1.1 Что такое библиотеки JavaScript
    • 1.2 Выбор JS фреймворка
  • 2. Создание приложения
  • 2.1 Начало работы с проектом и JavaScript
  • 2.2 Написание кода
    • 2.3 Итог работы
  • Заключение
  • Литература

Введение

программа javascript фреймворк приложение

Целью данной курсовой работы является создание приложения с использованием одного из существующий JS-фреймворков. В процессе выполнения курсовой работы необходимо решить следующие задачи:.

· Выбрать одну из JavaScript библиотек для создания программы

· Создать приложение с использованием одного из фреймворков, позволяющую визуально представить колебание n-тел, связанных пружинами, при изменении начального положения одного из тел.

В первой главе приведено определение JavaScript библиотек, немного истории создания. Выбирается один из этих фреймворков для создания клиентского приложения.

Во второй главе описывается то, как создается это приложение с примерами кодов страниц.

1. Значение и выбор фреймворка

1.1 Что такое библиотеки JavaScript

Библиотека JavaScript -- сборник классов и/или функций на языке JavaScript.

Язык JavaScript, изначально разработанный Netscape (а затем развиваемый Mozilla), долгое время использовался в сети на многих сайтах, но широкую популярность получил с приходом Веб 2.0 -- периода развития компьютерных систем, в котором JavaScript совместно с различными диалектами XML стал активно использоваться в разработке пользовательских интерфейсов как веб-приложений, так и настольных приложений. JavaScript в связке с CSS используется для создания динамических сайтов, более доступных, чем основанные на Flash альтернативы.

С увеличением популярности JavaScript, простота создания динамических элементов пользовательского интерфейса стала играть ключевую роль в веб-разработке. Этим обусловлен лавинообразный характер появления различных библиотек JavaScript, таких как Ext и Dojo. С другой стороны, одним из последствий войны браузеров стала разница в реализации объектной модели документа и это обусловило необходимость затрачивать дополнительные усилия для реализации корректной работы различных браузеров. Данное обстоятельство обусловило появление библиотек JavaScript, предоставляющих кроссбраузерный интерфейс к методам DOM, таких как Prototype, script.aculo.us или jQuery.

Удобство использования библиотек JavaScript привело к тому, что Microsoft, Yahoo! и другие крупные ИТ-компании разрабатывают свои собственные основанные на JavaScript библиотеки элементов пользовательского интерфейса, встраиваемые в веб-приложения, разрабатываемые этими компаниями.

Практически все библиотеки JavaScript выпускаются под лицензиями копицентр и копилефт, чтобы обеспечить свободное от лицензионных отчислений разработку, использование и модификацию.

Более того, некоторые библиотеки JavaScript позволяют упростить взаимодействие JavaScript с другими языками, такими как CSS, PHP, Ruby и Java. Это позволяет упростить запуск приложений JavaScript с приложениями, написанными на других языках программирования.

1.2 Выбор Js фреймворка

jQuery -- библиотека JavaScript, фокусирующаяся на взаимодействии JavaScript и HTML. Библиотека jQuery помогает легко получать доступ к любому элементу DOM, обращаться к атрибутам и содержимому элементов DOM, манипулировать ими. Также библиотека jQuery предоставляет удобный API для работы с AJAX.

Основные возможности jQuery:

· Движок кроссбраузерных CSS-селекторов ;

· Переход по дереву DOM;

· События;

· Визуальные эффекты;

· AJAX-дополнения;

· JavaScript-плагины.

jQuery - очень простой, быстрый, широко распространенный. Выгоден для малых и средних проектов. Хорошая документация и много сторонних примеров в сети. Последнее и послужило для меня причиной выбрать именно эту библиотеку.

2. Создание приложения

2.1 Начало работы с проектом и JavaScript

Итак, выбрав необходимый нам фреймворк, встала задача: как написать код (тема была уже определена, т.к. требовалась моделирование движения n-тел связанных между собой пружинами).

Программа должна включать в себя следующие опции:

1) Корректное отображение исследуемого объекта, с плавной анимацией ;

2) Запуск движения системы (изменение начального положения одного из n тел)

3) Возможность отображать взаимное колебание всех тел (их взаимодействие)

2.2 Написание кода

Для начала создадим стартовую страницу index.html на которую и будем выводить наш фрейм для моделирования, также слайдеры для изменения массы тел и жесткости каждой из пружин.

<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title></title>

<link href="http://fonts.googleapis.com/css?family=Karla:400,700" rel="stylesheet" />

<link href="css/default.css" rel="stylesheet" type="text/css" media="all" />

<link href="css/fonts.css" rel="stylesheet" type="text/css" media="all" />

<link href="css/jquery-ui.css" rel="stylesheet" type="text/css" media="all" />

<script src="http://cdnjs.cloudflare.com/ajax/libs/ocanvas/2.6.0/ocanvas.min.js"></script>

<script type="text/javascript" src="js/jquery.min.js"></script>

<script type="text/javascript" src="js/jquery.flot.axislabels.js"></script>

<script type="text/javascript" src="js/jquery-ui.min.js"></script>

<script type="text/javascript" src="js/flot/jquery.flot.js"></script>

<script type="text/javascript" src="js/ocanvas.min.js"></script>

<script type="text/javascript" src="js/TM.js"></script>

<script type="text/javascript" src="js/MainMech.js"></script>

</head>

<body>

<canvas id="canvasMech" width="700" height="100" style="border:5px solid #00AABB; float: left;"></canvas>

<script type="text/javascript">MainMech(document.getElementById('canvasMech'));</script>

<!--слайдеры-->

<div style="margin-left:20px; margin-top:20px; margin-bottom:20px; float:left;">

<div id="input_slider_m" style="width:300px; float:left"></div>

<label for="input_m" style="margin-left:20px; float:left">m = </label>

<input onKeyUp="onMPress(event);" type="text" id="input_m" style="margin-left:20px; float:left; border:1; color:#00AABB; font-weight:bold;">

<br><br>

<div id="input_slider_C1" style="width:300px; float:left"></div>

<label for="input_C1" style="margin-left:20px; float:left">C1 = </label>

<input onKeyUp="onC1Press(event);" type="text" id="input_C1" style="margin-left:20px; float:left; border:1; color:#00AABB; font-weight:bold;">

<br><br>

<div id="input_slider_C2" style="width:300px; float:left"></div>

<label for="input_C2" style="margin-left:20px; float:left">C2 = </label>

<input onKeyUp="onC2Press(event);" type="text" id="input_C2" style="margin-left:20px; float:left; border:1; color:#00AABB; font-weight:bold;">

<br><br>

<div id="input_slider_C3" style="width:300px; float:left"></div>

<label for="input_C3" style="margin-left:20px; float:left">C3 = </label>

<input onKeyUp="onC3Press(event);" type="text" id="input_C3" style="margin-left:20px; float:left; border:1; color:#00AABB; font-weight:bold;">

<br><br>

<div id="input_slider_B" style="width:300px; float:left"></div>

<label for="input_B" style="margin-left:20px; float:left">B = </label>

<input onKeyUp="onBPress(event);" type="text" id="input_B" style="margin-left:20px; float:left; border:1; color:#00AABB; font-weight:bold;">

<br><br>

</div></body></html>

Для того чтобы создать меню, нам нужна библиотека jQuery. Для этого зайдем на официальный сайт http://jquery.com/ и скачиваем оттуда самую последнюю версию. Скачиваем с http://ocanvas.org/ файл ocanvas.min.js и помещаем в ту же папку. Используем oCanvas для вывода анимации движения тел.

Основную часть занимает скрипт, отвечающий за моделирование движения системы.

function MainMech(canvas) {

var context = canvas.getContext("2d"); // предварительное создание плоскости

// задание физических констант

const Pi = 3.1415926; // число Пи

const m0 = 1; // масса тел

const T0 = 1; // Период колебании

const k0 = 2 * Pi / T0; // частота колебании

const C0 = m0 * k0 * k0; // жесткость пружин

const B0 = 2 * m0 * k0; // Вязкость среды

var m = 1 * m0; // масса тела «масштаб»

var C1 = 0.1 * C0; // частота колебании 1 пружины

var C2 = 0.1; // частота колебании 2 пружины

var C3 = 0.1; // частота колебании 3 пружины

var B = 0;; // вязкость среды

const fps = 50; // frames per second - число кадров в секунду (качество отображения)

const spf = 20; // steps per frame - число шагов интегрирования между кадрами (скорость расчета)

const dt = 0.001; // шаг интегрирования (качество расчета)

var steps = 0; // количество шагов интегрирования

// Выполнение программы

var TM_obj = new TM(); // создаем новый объект

this.setM = function(new_m){m = new_m * m0;}; // установка массы

this.setC1 = function(new_C1){C1 = new_C1 * C0;}; // установка частоты для 1 пружины

this.setC2 = function(new_C2){C2 = new_C2 * C0;}; // установка частоты для 2 пружины

this.setC3 = function(new_C3){C3 = new_C3 * C0;}; // установка частоты для 3 пружины

this.setB = function(new_B){B = new_B ;}; // установка вязкости среды

TM_obj.addInputSlider("#input_slider_m", "#input_m", 0.01, 10, 0.01, 1, this.setM, "onMPress");

// перенос значения массы каждого тела в строку состояния

TM_obj.addInputSlider("#input_slider_C1", "#input_C1", 0, 10, 0.01, 0.1, this.setC1, "onC1Press"); // перенос значения частоты колебания 1 пружины в строку состояния

TM_obj.addInputSlider("#input_slider_C2", "#input_C2", 0, 10, 0.01, 0.1, this.setC2, "onC2Press"); // перенос значения частоты колебания 2 пружины в строку состояния

TM_obj.addInputSlider("#input_slider_C3", "#input_C3", 0, 10, 0.01, 0.1, this.setC3, "onC3Press"); // перенос значения частоты колебания 3 пружины в строку состояния

TM_obj.addInputSlider("#input_slider_B", "#input_B", 0, 10, 0.01, 0, this.setB, "onBPress");

"); // перенос значения вязкости среды в строку состояния

var count = true; // проводить ли расчет системы

var v1 = 0, v2 = 0; // инициализация скоростей 1 и 2 тела

// создаем объект, связанный с элементом canvas, на html странице
var ocanvas = oCanvas.create({

canvas: "#canvasMech", // canvasMech - id объекта canvas на html странице

fps: fps // сколько кадров в секунду

});

var rw = 50;

var rh = 65;

var x0 = 230; // начальная координата откуда строится 2 пружина

var x02 = 430; // начальная координата откуда строится 3 пружина

var y0 = 17; // координата конца линии, составляющей пружину

// создаем 1 пружины

const coil1 = 10; // количество витков

var lines1 = []; // массив линии, составляющих пружину

for (var i = 0; i < coil1; i++ ) {

lines1[i] = ocanvas.display.line({

start: { x:0, y:65 },

end: { x:0, y:65 },

stroke: "5px black",

cap: "round"

}).add(); // рисуем линии таким образом: количество их совпадает с числом витков, назначаем координаты начала и конца линии, также она черного цвета, толщина абриса, с округленными концами

}

// аналогично рисуем вторую пружину

const coil2 = 10;

var lines2 = [];

for (var i = 0; i < coil2; i++ ) {

lines2[i] = ocanvas.display.line({

start: {x:x0, y:50},

end: {x:x0, y:50},

stroke: "5px red",

cap: "round"

}).add();

}

// Рисуем третью пружину

const coil3 = 10;

var lines3 = [];

for (var i = 0; i < coil3; i++ ) {

lines3[i] = ocanvas.display.line({

start: { x:x02, y:50},

end: { x:x02, y:50 },

stroke: "5px blue",

cap: "round"

}).add();

}

// Рисуем тело №1

var ellipse1 = ocanvas.display.ellipse({

x: x0,

y: y0+35, // координаты центра

radius: 39, // радиус тела

fill: "rgba(0, 170, 187, 1)" // цвет

}).add();

// Рисуем тело №2

var ellipse2 = ocanvas.display.ellipse({

x: x02,

y: y0+35,

radius: 39,

fill: "rgba(0, 170, 187, 1)"

}).add();

ellipse1.dragAndDrop({

changeZindex: true,

start: function () { count = false; this.fill = "rgba(0, 170, 187, 1)"; }, // отключаем расчет и делаем объект полупрозрачным

move: function () { this.y = y0+35; v1 = 0; drawSpring1(); drawSpring2();}, // запрещаем перемещение по вертикали

end: function () { count = true; this.fill = "rgba(0, 170, 187, 1)"; } // включаем расчет и убираем полупрозрачность

});

ellipse2.dragAndDrop({

changeZindex: true,

start: function () { count = false; this.fill = "rgba(0, 170, 187, 1)"; }, // отключаем расчет и делаем объект полупрозрачным

move: function () { this.y = y0+35; v2 = 0; drawSpring2(); drawSpring3();}, // запрещаем перемещение по вертикали

end: function () { count = true; this.fill = "rgba(0, 170, 187, 1)"; } // включаем расчет и убираем полупрозрачность

});

var vGraph = new TM_graph(

"#vGraph", // на html-элементе #vGraph

"steps", "x", // подписи на осях

350, // сколько шагов по оси "x" отображается

-1, 1, 0.2); // мин. значение оси Y, макс. значение оси Y, шаг по оси Y

ocanvas.bind("mousedown", function () {count = false;});

function dynamics()

{

for (var i = 1; i <= spf; i++)

{

var f1 = - C1 * (ellipse1.x - x0) - C2 * (ellipse2.x - x02) - B * v1;

// сила действующая на первый груз со стороны двух пружин

var f2 = f1 - C2 * (ellipse2.x - x02) - C3 * (ellipse2.x - x02);

// сила действующая на второй груз со стороны двух пружин

v1 += f1 / m * dt; // высчитываем скорость 1 тела

v2 += f2 / m * dt; // высчитываем скорость 2 тела

ellipse1.x += v1 * dt; // высчитываем координаты 1 тела

ellipse2.x += v2 * dt; // высчитываем координаты 2 тела

drawSpring1(); // обращаемся к функции перерисовки пружин №1

drawSpring2(); // обращаемся к функции перерисовки пружин №2

drawSpring3(); // обращаемся к функции перерисовки пружин №3

}

}

// обрисовка всех линии

function drawSpring1 ()

{

for (var i = 0; i < coil1; i++ )

{

lines1[i].start.x = (ellipse1.x + 25) / coil1 * i;

lines1[i].end.x = (ellipse1.x + 25) / coil1 * (i+1);

lines1[i].start.y = 50 + ( (i%2==0)? 1:-1) * 25;

lines1[i].end.y = 50 + ( (i%2==0)? -1: 1) * 25;

if (i==0) lines1[i].start.y = 50;

if (i==(coil1-1)) lines1[i].end.y = 50;

}

}

function drawSpring2()

{

for (var i = 0; i < coil2; i++ )

{

lines2[i].start.x = ellipse1.x + (ellipse2.x - ellipse1.x) / coil2 * i;

lines2[i].end.x = ellipse1.x + (ellipse2.x - ellipse1.x) / coil2 * (i+1);

lines2[i].start.y = 50 + ( (i%2==0)? 1:-1) * 25;

lines2[i].end.y = 50 + ( (i%2==0)? -1: 1) * 25;

if (i==0) lines2[i].start.y = 50;

if (i==(coil2-1)) lines2[i].end.y = 50;

}

}

function drawSpring3()

{

for (var i = 0; i < coil3; i++ )

{

lines3[i].start.x = ellipse2.x + (700 - ellipse2.x) / coil3 * i;

lines3[i].end.x = ellipse2.x + (700 - ellipse2.x) / coil3 * (i+1);

lines3[i].start.y = 50 + ( (i%2==0)? 1:-1) * 25;

lines3[i].end.y = 50 + ( (i%2==0)? -1: 1) * 25;

if (i==0) lines3[i].start.y = 50;

if (i==(coil3-1)) lines3[i].end.y = 50;

}

}

ocanvas.setLoop(dynamics).start(); } // функция, выполняющаяся на каждом шаге

2.3 Итог работы

Результатом работы стала программа «Моделирование колебаний n тел, связанных пружинами ». В данном частном случае мы используем 2 тела.

Заключение

В ходе написания курсовой работы был прочитан и систематизирован теоретический материал по данной теме, а так же выполнены следующие поставленные во введении задачи:

· Описано что такое JS-фреймворки

· Была разработана программа с использованием фреймворка jQuery

· Программа позволяет визуально представить колебание n тел, связанных друг с другом

Пружинами. В данном случае рассмотрено 2 тела, связанных между собой 3-мя пружинами.

Программа написана таким образом, что добавить дополнительно связку груз-пружина не составляет труда.

Литература

1) http://ru.wikipedia.org/wiki/Библиотека_JavaScript

2) http://habrahabr.ru/

3) http://jqbook.net.ru/

4) http://ru.html.net/

5) Антон Шевчук. Jquery. Учебник для начинающих.: 2013. 123с.

6) Бенедетти Р., Крэнли Р. Изучаем работу с jQuery. СПб.: Питер, 2012. 528 с.

7) Бер Бибо, Иегуда Кац. jQuery. Подробное руководство по продвинутому JavaScript, 2-е издание. Пер. с англ. СПб.: Символ-Плюс, 2011. 624 с.

8) JavaScript: Подробное руководство (Definitive Guide), Давид Финнерман. Спб, 2007г.

9) JavaScript. Библия пользователя, Фленов Иван, Спб, 2005г.

10) Javascript и DHTML, сборник рецептов, Д.Гудман, Спб, 2004г

Размещено на Allbest.ru

...

Подобные документы

  • Общее определение JavaScript-библиотеки, виды библиотек. Создание клиентского приложения с использованием одного из существующий JS-фреймворков. Значение, виды и выбор фреймворка. Выбор приложения и его тематики. Написание программного кода, итоги работы.

    курсовая работа [545,8 K], добавлен 21.12.2013

  • Общее определение и история создания JavaScript библиотек, их назначение и использование. Виды и особенности JS фреймворков. Создание клиентского приложения (каталога комплектующих компьютера), написание кода страницы с использованием фреймворка Jquery.

    курсовая работа [544,5 K], добавлен 17.12.2013

  • Случаи использования PHP фреймворка. Обзор современных фреймворков. Выбор фреймворка для разработки сайта. Поддержка баз данных и сообщества. Model View Controller архитектура. Скорость развития фреймворка. Наличие встроенных javascript-библиотек.

    курсовая работа [1,8 M], добавлен 31.05.2012

  • Сравнительная характеристика, возможности и функции языков программирования JavaScript и PHP. Основные области их использования. Разработка интерактивного Web-приложения с применением JavaScript на примере теста по теме "Программирование на языке Delphi".

    курсовая работа [19,3 K], добавлен 01.07.2014

  • Технология создания многопоточных приложений в современных системах программирования с использованием языка C# в Visual Studio.NET. Разработка алгоритма и структуры программы. Описание и особенности тестирования приложения с разным количеством потоков.

    курсовая работа [773,0 K], добавлен 14.03.2013

  • Создание web-страниц с использованием HTML. Работа с графикой в Adobe Photoshop и Flash. Создание динамических web-страниц с использованием JavaScript. Пример реализации "Эконометрической модели экономики России". Моделирование с использованием Powersim.

    презентация [478,4 K], добавлен 25.09.2013

  • Введение в интернет-технологии и компьютерное моделирование. Создание WEB страниц с использованием HTML. Создание динамических WEB страниц с использованием JavaScript. Работа с графикой в Adobe Photoshop и Flash CS. Основы компьютерного моделирования.

    презентация [223,4 K], добавлен 25.09.2013

  • Знакомство с особенностями создания WEB-страниц с использованием HTML. Общая характеристика основ компьютерного моделирования с применением Powersim и AnyLogic. Анализ способов создания динамических WEB-страниц с использованием JavaScript и PHP.

    презентация [801,7 K], добавлен 25.09.2013

  • Исследование возможностей и областей использования языка программирования JavaScript. Сравнительный анализ языков программирования JavaScript и PHP. Разработка интерактивного Web-приложения на примере теста по теме "Программирование на языке Delphi".

    практическая работа [26,0 K], добавлен 04.02.2015

  • Теоретические основы разработки Windows-приложений с использованием библиотеки MFC. Создание приложения с помощью Visual C++. Описание логической структуры приложения. Установка и запуск программы. Входные и выходные данные. Преимущество MFC библиотек.

    курсовая работа [563,2 K], добавлен 21.06.2011

  • Построение базы данных для экзаменационных ведомостей. Работа с таблицами, создание простых форм, отчетов и запросов (Query by Example). Использование информации из нескольких, связанных между собой таблиц. Запросы с использованием статистических функций.

    практическая работа [39,1 K], добавлен 24.06.2009

  • Создание web-страниц с использованием языка HTML. Работа с графикой в Adobe Photoshop и Flash CS. Создание динамических web-страниц с использованием JavaScript и PHP. Базы данных и PHP. Пример реализации "Эконометрической модели экономики России" под WEB.

    презентация [432,3 K], добавлен 25.09.2013

  • Создание Web-страниц с использованием HTML, с использованием JavaScript и PHP. Работа с графикой в Adobe Photoshop и Flash CS. Базы данных и PHP. Пример реализации "Эконометрической модели экономики России" под web. Основы компьютерного моделирования.

    презентация [4,4 M], добавлен 25.09.2013

  • Создание интерактивных веб-страниц. Что такое JavaScript. Полная интеграция с браузером. Мощные средства для создания сетевых соединений. Подключение и выполнение JavaScript. Загрузка данных без перезагрузки страницы. Объекты для работы с мультимедиа.

    лекция [16,2 K], добавлен 05.02.2012

  • История html. Гипертекст. Структура web-страницы. Переход внутри одного документа. Переход к другому документу. Правила синтаксиса. Кодирование символов. Использование символов. Управление цветом. Конструктор документов. Способы определения таблиц стилей.

    дипломная работа [911,3 K], добавлен 25.02.2005

  • Основные теги и атрибуты языка HTML. Создание web-сайта, который должен представлять собой несколько связанных между собой страниц. Рассмотрение различных значений атрибутов и тегов на страницах и в других документах. Экранные формы разработанных страниц.

    лабораторная работа [1,2 M], добавлен 16.04.2014

  • Базовый синтаксис языка сценариев JavaScript. Создание страниц, включающих в себя программы, которые взаимодействуют с пользователем, управляют браузером и динамически создают HTML-содержимое. Работа с объектами, которые инкапсулируют данные и поведение.

    лабораторная работа [58,6 K], добавлен 25.05.2016

  • Основы компьютерного моделирования с использованием Powersim и AnyLogic. Создание WEB страниц с использованием HTML. Работа с графикой в Adobe Photoshop и Flash CS. Создание динамических WEB страниц с использованием JavaScript и PHP. Базы данных и PHP.

    лекция [1,1 M], добавлен 25.09.2013

  • Изучение создания скриптов на JavaScript. Разработка программы выдачи простого предупреждения по событию Click при выборе гипертекстовой ссылки. Применение контейнера SCRIPT для размещение JavaScript-кода. Получение типа программы просмотра HTML-страниц.

    контрольная работа [21,1 K], добавлен 15.02.2010

  • Создание индивидуального сайта с использованием языка гипертекстовой разметки HTML и языка скриптов JavaScript. Программные средства, используемые при выполнении работы. Основные средства для создания сайта. Разработка CSS-файла (таблица стилей).

    лабораторная работа [31,0 K], добавлен 28.10.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.