Аппроксимация данных с помощью частичных сумм тригонометрического ряда Фурье

Определение сущности аппроксимации — научного метода, состоящего в замене одних объектов другими. Рассмотрение внешнего вида интерфейса. Разработка листинга программы. Ознакомление с примером вызова программы. Характеристика результатов тестирования.

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

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

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

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

МИНОБРНАУКИ РОССИИ

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

"Московский государственный технический университет радиотехники, электроники и автоматики"

МГТУ МИРЭА

Факультет радиотехнических и телекоммуникационных систем

Кафедра “Радиосистем передачи информации”

Курсовая работа по дисциплине: «Информатика»

Тема курсовой работы: «Аппроксимация данных с помощью частичных сумм тригонометрического ряда Фурье»

Студент группы РРБ-1-13

Буянов А.С.

Руководитель курсовой работы

доцент, к.т.н. Петрова Н.Я.

Москва 2014

Содержание

1. Теоритическое введение

2. Постановка задачи

3. Функции

4. Интерфейс

5. Главная исполняющая функция

6. Листинг программы в C++

7. Пример вызова программы

8. Тесты

Список использованной литературы

1. Теоретическое введение

Аппроксимация -- научный метод, состоящий в замене одних объектов другими, в том или ином смысле близкими к исходным, но более простыми.

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

Ряд Фурье может быть представлен для функции обозначенной на интервале от - до ,а может на -l до l.Период T=2*l

Ряд Фурье представляет собой функцию (f), зависящую от переменной (x),приближённое значение которой можно вычислить, вычислив ряд Фурье.

Где a0, an, bn - коэффициенты ряда Фурье

Для того, чтобы между f(x) и рядом Фурье можно было поставить знак равенства, вместо знака приближенного равенства, необходимо доказать сходимость полученного ряда к функции, посредством Теоремы Дирихле.

2. Постановка задачи

Произвести аппроксимацию заданной функции с помощью тригонометрического ряда Фурье.

Исходные данные:

В данной работе используется функция, состоящая из трёх простых функций (три прямые)

Рис.1. Исходный график

3. Функции

Данная работа выполнена в двух частях:

· Первая часть - интерфейс, созданый в среде MatLab через которые Пользователь задаёт нужные значения, для процесса аппроксимации, а также может получить визуальное представление о изначальной и конечной функции.

· Вторая часть - главный исполняющий .ехе файл, написанный и скомпилированный в среде Visual Studio C++, в котором идет расчет координат конечной аппроксимированой функции.

4. Интерфейс

m-Функция launch- основная m-функция интерфейса. Она вызывается из командной строки MATLAB.

Пример вызова

>>launch

(предварительно нужно выбрать путь к данной m-функции)

В основном окне программы расположены следующие элементы интерфейса:

· Краткое руководство к эксплуатации.

· Окно графопостроителя.

· Краткое описание задействованных переменных.

· Поля для ввода элементов.

· Кнопка очистки окна графопостроителя.

· Кнопка построения изначального графика функции.

· Кнопка построения аппроксимированного графика функции.

· Кнопка для проверки успешного считывания данных из полей ввода.

· Кнопка для проверки успешного создания координат аппроксимированной функции.

Внешний вид интерфейса

Рис.2. Внешний вид интерфейс

Исходный код функции launch

Функция launch не имеет ни входных ни выходных параметров. Она создает окно интерфейса. Содержит подфункции : graph, read, clearaxes, mlchec, cppchec.Эти подфункции обеспечивают работу всех составляющих интерфейса.

function launch

global haxes h_k h_n h_z h_c

%----------------------------график-----------------------------

hfig=figure('NumberTitle','off','name','Approx',...

'position',[100,100,700,500]);

haxes=axes('Units','pixels','position',[50 100 300 300]);

%----------------------------подписи----------------------------

uicontrol(hfig,'style','text','string','k=',...

'position',[45 10 25 25],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','n=',...

'position',[125 10 25 25],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','z=',...

'position',[205 10 25 25],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','k-какую частичную сумму вычислить и пострить',...

'position',[470 200 100 60],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','n-сколько разбиений,для вычисления интеграла',...

'position',[470 300 100 60],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','z-на сколько частей делить отрезок [2;11]',...

'position',[470 400 100 60],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','Инструкция:',...

'position',[95 470 500 25],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','text','string','1)ввести значения n и k. 2)нажать на "график". 2)нажать на "запустить р-ту в с++" ',...

'position',[95 455 500 25],'backgroundcolor',[.8 0.8 0.8]);

%----------------------------поля ввода-------------------------

h_k=uicontrol(hfig,'style','edit','position',[65 10 40 25],...

'backgroundcolor',[1 1 1],'horizontalalignment','left','enable','on');

h_n=uicontrol(hfig,'style','edit','position',[150 10 40 25],...

'backgroundcolor',[1 1 1],'horizontalalignment','left','enable','on');

h_z=uicontrol(hfig,'style','edit','position',[235 10 40 25],...

'backgroundcolor',[1 1 1],'horizontalalignment','left','enable','on');

%----------------------------кнопки-----------------------------

uicontrol(hfig,'style','pushbutton','string','график',...

'position',[400 80 120 25],'callback','graph');

uicontrol(hfig,'style','pushbutton','string','запустить р-ту в с++',...

'position',[550 80 120 25],'callback','read');

uicontrol(hfig,'style','text','string',...

'Рис.1 График функций',...

'position',[50 40 300 35],'backgroundcolor',[.8 0.8 0.8]);

uicontrol(hfig,'style','pushbutton','string','открыть cpp.txt',...

'position',[400 43 120 25],'callback','cppchec');

uicontrol(hfig,'style','pushbutton','string','открыть ML.txt',...

'position',[550 43 120 25],'callback','mlchec');

h_c=uicontrol(hfig,'Style','pushbutton','Position',[320 10 45 30],'String', 'очистить','Callback','clearaxes' );

end

Исходный код подфункции graph

Подфункция graph не имеет ни входных, ни выходных параметров. Она предназначена для вызова интерфейсом, чтобы выводить график исходной функции и отправлять значения k,n,z в программу С++,для вычисления координат аппроксимированной функции.

function graph

global h_k h_n h_z

hold on;

x=[2,5,8,11];

y=[0,2,2,0];

plot(x,y,'-m');

k=str2double(get(h_k,'string'));

n=str2double(get(h_n,'string'));

z=str2double(get(h_z,'string'));

m=[k,n,z];

f=fopen('CPP.txt','wt');

fprintf(f,'%u\n',m);

fclose(f);

hold off;

grid on;

end

Исходный код подфункции read

Подфункция read не имеет ни входных, ни выходных параметров. Она предназначена для вызова интерфейсом, чтобы запустить .exe файл, в котором идет вычисление координат аппроксимированной функции, считывать .txt файл с этими координатами и строить по ним график в окне графопостроителя.

function read

!E:\MIREA\VisualStudio\Kypc\Debug\Kypc.exe

[f,or]=fopen('ML.txt', 'rt');

if (isempty(or))

mas=' ';

while ~feof(f)

line=fgetl(f);

mas=char(mas,line);

end

fclose(f);

else

disp(or);

end

mas=str2num(mas);

x=mas(:,1);

y=mas(:,2);

plot(x,y);

grid on;

xlim([2,11]);

end

Исходный код подфункции clearaxes

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

function clearaxes

global haxes

hold on;

axes(haxes); cla;

hold off;

Исходный код подфункции cppchec

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

function cppchec

!E:\MIREA\VisualStudio\Kypc\Kypc\Cpp.txt

Исходный код подфункции mlchec

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

function cppchec

!E:\MIREA\VisualStudio\Kypc\Kypc\Cpp.txt

5. Главная исполняющая функция

Функция main является основной функцией исполнительной части. Она не имеет ни входных, ни выходных параметров.Cодержит подфункции double fun(double x),

void furie(int m, int k), double find_koef0(double(*f)(double), int m),

double find_koef1(double(*f)(double), int k, int m),

double find_koef2(double(*f)(double), int k, int m) . Эти подфункции обеспечивают работу главной функции main.

В функции main происходит

· Считывание данных, введённые пользователем в интерфейсе.

· Запуск аппарата аппроксимации, основанный на принципе рядa Фурье.

Исходный код функции main

void main(void)

{

double ya, bn, ao, an;

ifstream file1;

file1.open("CPP.txt");

if (!file1)

{

cout << "error" << endl;

}

file1 >> k;

file1 >> m;

file1 >> z;

file1.close();

h = (double)l / (double)m;

furie(m, k);

}

Исходный код подфункции fun

Подфункция double fun(double x) имеет входной параметр «x» и выходной параметр «y». Она предназначена для вызова главной функцией main для того, чтобы в соответствии от значения параметра «x», выбирать соответствующую для него функцию y(x).

Параметр «x»: типа «double», является аргументом для функции y(x).

Параметр «y»: типа «double», является значение функции (x).

double fun(double x)

{

double y;

if (x >= 2 & x <= 5)

y = (2 / 3)*x - (4 / 3);

else if (x > 5 & x <= 8)

y = 2;

else if (x > 8 & x <= 11)

y = -(2 / 3)*x + (22 / 3);

else y = 0;

return y;

}

Исходный код подфункции furie

Подфункция void furie(int m, int k) имеет входные параметры «m» и «k». Она предназначена для вызова главной функцией main для того, чтобы производить расчет значений ряда Фурье и записывать их вместе с соответствующими значениями «x» в файл, который считывается интерфейсом.

Параметр «m»: типа «int», является числом, определяющим количество разбиений при подсчете интегралов .

Параметр «k»: типа «int», является числом, определяющим номер частичной суммы (гармоники), которая будет подлежать выводу в окне графопостроителя

void furie(int m, int k)

{

double ya;

ofstream file2;

file2.open("ML.txt");

x = 0;

for (int p = 0; p<=z; p++)

{

ya = find_koef0(fun, m) / 2;

for (int j = 1; j <= k; j++)

ya += (find_koef1(fun, j, m))*cos(j*pi*x / l) + (find_koef2(fun, j, m))*sin(j*pi*x / l);

file2 << x << " " << ya << endl;

x += 2 * l / z;

}

file2.close();

}

Исходный код подфункции find_koef1

Подфункция double find_koef1(double(*f)(double), int k, int m)имеет входные параметры «(*f)(double) », «m» и «k» и выходной «Ia» параметры. Она предназначена для вызова подфункцией furie для того, чтобы производить расчет коэффициента Фурье «аn».

Параметр «m»: типа «int», является числом, определяющим количество разбиений при подсчете интегралов .

Параметр «k»: типа «int», является числом, определяющим номер частичной суммы(гармоники), которая будет подлежать выводу в окне графопостроителя

Параметр «double(*f)(double) »: типа «double», является указателем на функцию y(x) по которой идет дальнейший расчет в зависимости от значения «x».

Параметр «Ia»: типа «double», является коэффициентом ряда Фурье «аn».

double find_koef1(double(*f)(double), int k, int m)

{

double sa = 0, Ia;

for (int i = 0; i < m; i++)

{

sa += f(x0 + h / 2 + i*h)*cos((x0+ h / 2 + i*h)*pi*k / l);

}

sa = sa / l;

Ia = sa*h;

return Ia;

Исходный код подфункции find_koef2

Подфункция double find_koef2(double(*f)(double), int k, int m)имеет входные параметры «(*f)(double) », «m» и «k» и выходной «Ib» параметры. Она предназначена для вызова подфункцией furie для того, чтобы производить расчет коэффициента ряда Фурье «bn».

Параметр «m»: типа «int», является числом, определяющим количество разбиений при подсчете интегралов .

Параметр «k»: типа «int», является числом, определяющим номер частичной суммы(гармоники), которая будет подлежать выводу в окне графопостроителя

Параметр «double(*f)(double) »: типа «double», является указателем на функцию y(x) по которой дальнейший идет расчет в зависимости от значения «x».

Параметр «Ib»: типа «double», является коэффициентом ряда Фурье «bn».

{

double sb = 0, Ib;

for (int i = 0; i < m; i++)

{

sb += f(x0 + h / 2 + i*h)*sin((x0 + h / 2 + i*h)*pi*k / l);

}

sb = sb / l;

Ib = sb*h;

return Ib;

}

Исходный код подфункции find_koef0

Подфункция double find_koef0(double(*f)(double), int k)имеет входные параметры «(*f)(double)», «k» и выходной «Io» параметры. Она предназначена для вызова подфункцией furie для того, чтобы производить расчет коэффициента ряда Фурье «ao».

Параметр «k»: типа «int», является числом, определяющим номер частичной суммы (гармоники), которая будет подлежать выводу в окне графопостроителя. интерфейс аппроксимация программа

Параметр «double(*f)(double) »: типа «double», является указателем на функцию y(x) по которой дальнейший идет расчет в зависимости от значения «x».

Параметр «Io»: типа «double», является коэффициентом ряда Фурье «ao».

double find_koef0(double(*f)(double), int m)

{

double so = 0, Io;

for (int i = 0; i < m; i++)

so += f(x0+ h / 2 + i*h);

so = so / l;

Io = so*h;

return Io;

}

6. Листинг программы в C++

#include <cmath>

#include <cstdlib>

#include <iostream>

#include <fstream>

using namespace std;

double fun(double x);

void furie(int m, int k);

double find_koef2(double(*f)(double), int k, int m);

double find_koef1(double(*f)(double), int k, int m);

double find_koef0(double(*f)(double), int m);

double pi = 3.1415926535;

double x;

double l = 12.0;

double h;

double x0 = 2.0;

int z;

int k ;

int m ;

void main(void)

{

double ya, bn, ao, an;

ifstream file1;

file1.open("CPP.txt");

if (!file1)

{

cout << "error" << endl;

}

//сейчас будет считывание данных из интерфейса

file1 >> k;

file1 >> m;

file1 >> z;

file1.close();

//конец считывание+закрытие файла.

h = (double)l / (double)m;

furie(m, k);

}

double fun(double x)

{

double y;

if (x >= 2 & x <= 5)

y = (2 / 3)*x - (4 / 3);

else if (x > 5 & x <= 8)

y = 2;

else if (x > 8 & x <= 11)

y = -(2 / 3)*x + (22 / 3);

else y = 0;

return y;

}

void furie(int m, int k)

{

double ya;

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

ofstream file2;

file2.open("ML.txt");

x = 0;

for (int p = 0; p<=z; p++)

{

ya = find_koef0(fun, m) / 2;

for (int j = 1; j <= k; j++)

ya += (find_koef1(fun, j, m))*cos(j*pi*x / l) + (find_koef2(fun, j, m))*sin(j*pi*x / l);

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

file2 << x << " " << ya << endl;

x += 2 * l / z;

}

file2.close();//закрытие файла.

}

double find_koef0(double(*f)(double), int m)

{

double so = 0, Io;

for (int i = 0; i < m; i++)

so += f(x0+ h / 2 + i*h);

so = so / l;

Io = so*h;

return Io;

}

double find_koef1(double(*f)(double), int k, int m)

{

double sa = 0, Ia;

for (int i = 0; i < m; i++)

{

sa += f(x0 + h / 2 + i*h)*cos((x0+ h / 2 + i*h)*pi*k / l);

}

sa = sa / l;

Ia = sa*h;

return Ia;

}

double find_koef2(double(*f)(double), int k, int m)

{

double sb = 0, Ib;

for (int i = 0; i < m; i++)

{

sb += f(x0 + h / 2 + i*h)*sin((x0 + h / 2 + i*h)*pi*k / l);

}

sb = sb / l;

Ib = sb*h;

return Ib;

}

7. Пример вызова программы

Примечание #1 Данная работа сделана и протестирована на

ОС Windows 8 для одного языка

Matlab 2010, version 7.11.0.584 (R2010b) 64-bit(win64)

Microsoft Visual Studio Ultimate(trial) 2013, version 12.0.31101.00 Update4

Примечание #2 нужно выбрать правильный путь.

(для ВСЕХ m-функций и текстовых файлов CPP.txt и ML.txt :\…\Kypc\Kypc\

для Kypc.exe :\…\Kypc\Debug\ Kypc.exe)

1)Открываем Matlab

Рис. 3 Открывается окно интерфейса

Рис. 4

2)Вводим значения k n z и нажимаем «график»

Рис. 5 Строится график иссходной функции

3)Нажимаем на «запустить работу в с++»

Рис. 6Строится график аппроксимированной функции

4)Нажимаем на «очистить»

Рис. 7 Очищает окно графопостроителя

5)Вводим новые значения k n z и нажимаем «график»,затем на «запустить работу в с++»

Рис. 8 Рисует новую аппроксимированную функцию

8. Tecты

Рис. 9

Рис. 10

Рис. 11

Рис. 12

Рис.13

Список использованной литературы

1. Лекционные материалы (ИТ). Лектор : Петрова Н.Я.

2. Лекционные материалы (Электротехника) :Лектор : Буянов С.И.

3. Лекционные материалы(Математический анализ). Лектор : Малыгина О.А.

4. Теория с сайта mathprofi.ru

5. Теория с сайта wikipedia.org

6. http://www.butovo.com/

7. http://www.pvsm.ru/matlab

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

...

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

  • Реализация приложения, которое выполняет считывание, обработку, визуализацию и аппроксимацию экспериментальных данных полиномиальной функции. Блок схема алгоритма аппроксимации методом наименьших квадратов. Разработка интерфейса и листинга программы.

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

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

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

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

    курсовая работа [532,7 K], добавлен 20.07.2014

  • Графическая схема алгоритма выполнения программы определения запасов сырья. Решение задачи с помощью программы MS Excel. Разработка макроса для построения диаграммы. Использование интерфейса программы для работы с таблицей. Разработка базы данных.

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

  • Структурная схема получения гороскопа по дате рождения. Листинг исходных кодов программы и руководство пользователя. Ввод данных с помощью объекта класса QDateEdit. Разработка пользовательского интерфейса. Выбор стратегии тестирования и отладка программы.

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

  • Разработка и тестирование программы класса Точка. Спецификация программы. Сценарий диалога с пользователем. Разработка структур данных и алгоритмов. Таблица параметров функций программы. Текст программы на языке C++. Особенности тестирования программы.

    лабораторная работа [43,1 K], добавлен 21.07.2012

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

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

  • Обзор методов и подходов решения поставленной задачи аппроксимации логического вывода экспертной системы. Разработка и описание метода сетевого оператора для решения данной задачи. Разработка алгоритма решения. Проведение вычислительного эксперимента.

    дипломная работа [1,5 M], добавлен 23.02.2015

  • Проектирование модульной структуры программы сетевого мессенджера, назначение модуля "frmMsg". Разработка главной формы и интерфейса пользователя программы. Проектирование модуля формы "About". Разработка методики тестирования и отладка программы.

    курсовая работа [606,7 K], добавлен 19.01.2012

  • Построение функциональной и информационной моделей с использованием программ BPWin и ERWin. Описания интерфейса и элементов панели инструментов. Создание реляционной базы данных с помощью Microsoft Access. Разработка проекта федеральной целевой программы.

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

  • Особенность разработки алгоритмов для базы данных "Поэты". Анализ реализации анимации с помощью многофункциональной кроссплатформенной библиотеки SFML. Характеристика схемы алгоритма работы меню. Осуществление запуска программы через VisualStudio.

    курсовая работа [4,4 M], добавлен 10.05.2019

  • Разработка блок-схемы и программы обработки одномерного массива с доступом к элементам с помощью индексов и с помощью указателей. Словесное описание алгоритма и пользовательского интерфейса, листинг программы обработки матрицы и результат её выполнения.

    курсовая работа [391,1 K], добавлен 30.09.2013

  • Формальная схема и закон функционирования моделируемой вычислительной системы для обработки программ. Составление алгоритма моделирующей программы на языке GPSS и листинга программы для стохастической модели. Верификация программы и анализ результатов.

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

  • Математическая модель решения задачи коммивояжера. Поиск кратчайшего замкнутого пути обхода нескольких городов и возвращения в исходную точку. Описание программы и результатов ее тестирования. Основная форма программы после вывода конечных данных.

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

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

    дипломная работа [3,2 M], добавлен 22.01.2013

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

    курсовая работа [305,9 K], добавлен 03.07.2011

  • Рассмотрение теоретических аспектов создания баз данных с применением системы объектно-ориентированного программирования Delphi. Ознакомление с компонентами доступа. Разработка базы данных "Библиотека". Описание основ интерфейса созданной программы.

    курсовая работа [1004,9 K], добавлен 26.10.2014

  • Аппроксимация функции зависимости крутящего момента косозубого шестеренного пневмодвигателя К3М от числа оборотов вала в безразмерных величинах с помощью Microsoft Excel и PTC MathCad. Суть метода наименьших квадратов. Оценка точности аппроксимации.

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

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

    курсовая работа [368,9 K], добавлен 18.05.2015

  • Описание математической модели определения тока в электрической цепи с помощью решения системы алгебраических уравнений методом Гаусса. Описание и разработка блок-схемы программы. Ввод данных задачи, составление программы и анализ результатов решения.

    контрольная работа [231,8 K], добавлен 15.08.2012

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