Структура представления данных

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

Кузнецкий институт информационных и управленческих технологий

(филиал Пензенского государственного университета)

Кафедра ЕН и ТД

КУРСОВАя работа

 

                 по дисциплине «Компьютерные технологии»

Пояснительная записка

 

Разработал: ст.гр.12кн1

Романов И.

Принял: ст. пр. кафедры ЕН и ТД

Валлиулова Н.А.

 

Кузнецк 2013


 

 

СОДЕРЖАНИЕ

Введение…………………………………………………………………..3

Основная часть……………………………………………………………4

1. Постановка задачи……………………………………………………..4

2. Математическая модель задачи………………………………………5

3. Структура представления данных……………………………………7

4. Программная реализация……………………………………………..8

4.1 Схема и описание алгоритма………………………………...…...8

4.2 Язык (среда) программирования…………………………………10

4.3 Структура программы (проекта)………………………………....11

4.3.1. Функциональное назначение      процедур…………………..11

4.3.2. Описание процедур………………………………………...12

4.4. Интерфейс программы…………………………………………….13

5. Анализ результатов (тестирование программы)…………………….14

Заключение……………………………………………………………….15

Список литературы………………………………………………………16

Приложения………………………………………………………………17

Приложение А (листинг программы)

Unit 1………………………………………………………………..17

Unit 2………………………………………………………………..18

Unit 3………………………………………………………………..19

Unit 4………………………………………………………………..24

Приложение Б (результаты тестирования)………………………………29


Введение

 

В последнее время резко возрос интерес к программированию. Это свя­зано с развитием и внедрением в повседневную жизнь информационно-коммуникационных технологий. Если человек имеет дело с компьютером, то рано или поздно у него возникает желание, а иногда и необходимость, программировать.

В среде программирования Delphi простота и удобство сочетаются с мощью и гибкостью. Она обеспечивает визуальное проектирование пользовательского интерфейса, имеет развитый объектно-ориентированный язык Object Pascal (позже переименованный в Delphi) и уникальные по своей простоте и мощи средства доступа к базам данных. Язык Delphi по возможностям значительно превзошел язык Basic и даже в чем-то язык C++, но при этом он оказался весьма надежным и легким в изучении (особенно в сравнении с языком C++). В результате, среда Delphi позволила программистам легко создавать собственные компоненты и строить из них профессиональные программы.

Среда Delphi стала, по сути, лучшим средством программирования для операционной системы Windows.


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

 

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

 

Задача:

Какой вид имеют годографы радиус-вектора скорости и ускорения в следующих случаях:

а) тело движется поступательно с постоянной скоростью; с ускорением;

б) материальная точка движется по окружности с постоянной скоростью; с ускорением.

Поскольку построение функции зависит от некоторых параметров, в программе должна предусматриваться возможность задания этих параметров пользователем.


Математическая модель задачи

 

А) Для поступательного движения имеются следующие формулы:

1) движение с постоянной скоростью

2) движение с постоянным ускорением

Б) Для движения по окружности:

1) движение с постоянной скоростью

2) движение с постоянным ускорением

 

В ходе решения задачи были построены графики зависимости по данным формулам в программе MathCad.

А) График 1

 

График 2

 


Структура представления данных

 

При написании программы использовались следующие данные:

1) переменные:

f (x), f2(x) – функции зависимости скорости и ускорения;

V, V0, R – параметры функций;

leftGr, topGr, rightGr, bottomGr – координаты области построения графика;

x, xmin, xmax, stepx – х, его максимально и минимальное значения и шаг;

kx, ky – коэффициенты пересчета в графические координаты;

xGr, yGr, xOrd, yAbs – координаты точек графика;

n – число точек графика.

 

3) типы данных:

Integer(, real.

 

 


Программная реализация

4.1 Схема и описание алгоритма

Алгоритм исполнения программы

1. Вывод на экран начальных условий задачи;

2. выбор пользователем одного из двух исходных вариантов;

3. ввод параметров, необходимых для построения графика;

4. построение графика.

 

 

 


4.2 Язык (среда) программирования

 

Для создания программы при выполнении данной курсовой работы была выбрана среда программирования Delphi. Это среда быстрой разработки, вкоторой в качестве языка программирования используется язык Delphi. Язык Delphi - строго типизированный объектно-ориентированный язык, в основе которого лежит хорошо знакомый программистам Object Pascal.

 

Итак, Delphi — это среда для визуального проектирования Windows приложений. Основным преимуществом Delphi является его среда программирования с визуальным конструктором программ. Эта среда позволяет эффективно программировать под MS Windows, не отвлекаясь на выяснение всех деталей Win API, а работать над логикой программы. В Delphi нет необходимости программировать стандартные элементы управления Windows, такие как строка редактирования, кнопки и диалоговые окна: все это уже есть в виде готовых шаблонов компонентов.

 

Преимущества Delphi:

- быстрота разработки приложения;

- удобный интерфейс;

- высокая производительность разработанного приложения;

- низкие требования разработанного приложения к ресурсам компьютера;

- наращиваемость за счет встраивания новых компонент и инструментов в среду Delphi;

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

и др.
4.3 Структура программы

4.3.1 Функциональное назначение процедур

В программе использовались процедуры для:

1) перехода с одной формы на другую;

3) определения действий программы в зависимости от выбора пользователя;

4) обработки данных, введенных в поле редактирования с клавиатуры;

5) обработки исключительных случаев;

6) построения графика.

 

Описание процедур

1) Процедура перехода с одной формы на другую.

При нажатии на кнопку «Далее», осуществляется переход между формами: начальная скрывается с помощью отключения ее видимости (Form1.Visible:=False), а вторая – выводится на экран (Form2.Show).

 

2) Определение действий программы в зависимости от выбора пользователя.

В программе необходимо предусмотреть выбор одного из двух исходных условий(тело движется поступательно или материальная точка движется по окружност). Для этого имеются элементы RadioButton, с помощью которых и осуществляется выбор, влияющий на дальнейшие действия программы (см. Приложение А, Unit2)

 

3) Обработка данных, введенных в поле редактирования с клавиатуры.

Для построения графика необходимы параметры, вводимые пользователем с клавиатуры в поле ввода. Данные значения параметров присваиваются различным переменным, которые затем будут использованы в функции построения графика. (см. Приложение А, Unit3, Unit4)

 

4) Процедура обработки исключительных случаев.

В программе необходимо учесть исключительные случаи, например, когда поле ввода параметра осталось пустым, а следовательно построение графика невозможно. В таком случае программа показывает сообщение: «Необходимо ввести значение» (см. Приложение А, Unit3, Unit4; Приложение Б, Рисунок3).

 

6) Построение графика

Построение графика включает следующие этапы:

-очистка холста перед началом построения;

-определение минимального и максимального значения х;

- определение области построения графика;

- определение коэффициентов пересчета в графические координаты;

- построение и разметка оси Х;

- построение оси Y;

- определение параметров графика (цвет, толщина линии);

- построение первой точки графика;

- построение остальных точек и соединение их линией.


Интерфейс программы

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

1) Формы.
Формы – основные визуальные компоненты проекта, но которых располагаются все остальные элементы.

 

2) Метки.
Метки представляют собой элементы, расположенные на форме и содержащие текст (условия задачи, пояснения и т.п.)

 

3) Кнопки.
С помощью кнопок осуществляются различные действия – построение графика, переход между формами.

 

4) Радиокнопки.
С помощью радиокнопок осуществляется выбор одного из трех вариантов начальных условий задачи.

 

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

 

6) Холсты.
Данные элементы необходимы для построения графиков функций.


Тестирование программы

 

После запуска программы открывается первая форма с титульным листом, содержащим информацию о работе (Приложение Б, Рисунок 1).

На данной форме имеется кнопка «Далее», после нажатия которой становится видимой форма №2 (Приложение Б, Рисунок 2).

 

На второй форме расположены элементы Label (в которых описываются условия задачи), радиокнопки (от выбора одной из которых зависят дальнейшие действия программы), кнопки «Далее» и «Назад». Для продолжения работы необходимо выбрать одну из радиокнопок и нажать «Далее». После этого программа, в зависимости от выбранного пункта, отображает одну из форм для построения конечного графика.

 

На данных формах имеются поля ввода параметров, кнопки «Равномерно» и «Равноускоренно» (для построения графиков равномерного и равноускоренного движения), кнопка «Назад» (для возврата на форму, где осуществляется выбор исходной зависимости) и кнопка «Выход». При вводе всех необходимых параметров, после нажатия кнопки «Равномерно» или «Равноускоренно», программа строит соответствующий график. Если же значение параметра не введено, то выводится сообщение: «Необходимо ввести значение» (Приложение Б, Рисунок 3).
Заключение

 

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

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

 

1. В.Фаронов - язык программирования Delphi

2. Н.Б.Культин - Основы программирования в Delphi

3. newdelphi.net

4. cyberforum.ru


Приложения

Приложение А (листинг программы)

 

 

unit Unit1;

 

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm1 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form1: TForm1;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

Form1.Visible:=False;

Form2.Visible:=True;

end;

end.

 

 

unit Unit2;

 

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm2 = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

RadioButton1: TRadioButton;

RadioButton2: TRadioButton;

Button1: TButton;

Button2: TButton;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form2: TForm2;

implementation

uses Unit1, Unit3, Unit4;

{$R *.dfm}

procedure TForm2.Button1Click(Sender: TObject);

begin

Form2.Visible:=False;

Form1.Visible:=True;

end;

 

procedure TForm2.Button2Click(Sender: TObject);

begin

begin if RadioButton1.Checked=true then begin Form2.Visible:=False; Form3.Show; end; end;

begin if RadioButton2.Checked=true then begin Form2.Visible:=False; Form4.Show; end; end;

end;

end.

 

 

unit Unit3;

 

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm3 = class(TForm)

Label2: TLabel;

Button1: TButton;

Label3: TLabel;

Edit1: TEdit;

Label4: TLabel;

Edit2: TEdit;

Button2: TButton;

Button3: TButton;

Button4: TButton;

Label1: TLabel;

Edit3: TEdit;

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure edit1KeyPress(Sender: TObject; var Key: Char);

procedure edit2KeyPress(Sender: TObject; var Key: Char);

procedure edit3KeyPress(Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

 

var

Form3: TForm3;

Edti1, Edti2, Edti3: TEdit;

implementation

uses Unit2;

{$R *.dfm}

function f1(x:real):real;

var V: Real;

begin

v:=StrToFloat(Form3.Edit1.text);

f1:=v*x;

end;

function f2(x2:real):real;

var v0, a: real;

begin

v0:=StrToFloat(Form3.Edit2.text);

a:=StrToFloat(Form3.Edit3.text);

f2:=v0*x2+(a*x2*x2)/2;

end;

procedure TForm3.edit1KeyPress(Sender: TObject; var Key: Char);

begin

case Key of'0'..'9', chr(8):;

else key:=chr(0);

end;

end;

procedure TForm3.edit2KeyPress(Sender: TObject; var Key: Char);

begin

case Key of '0'..'9', chr(8):;

else key:=chr(0);

end;

end;

procedure TForm3.edit3KeyPress(Sender: TObject; var Key: Char);

begin

case Key of '0'..'9', chr(8):;

else key:=chr(0);

end;

end;

procedure TForm3.Button3Click(Sender: TObject);

begin

form3.Visible:=False;

form2.Visible:=True;

end;

procedure TForm3.Button4Click(Sender: TObject);

begin

Application.Terminate;

end;

procedure TForm3.Button1Click(Sender: TObject);

var

leftGr, topGr, rightGr, bottomGr: integer;

x, xmin, xmax, stepx: real;

kx, ky: real;

xGr, yGr, xOrd, yAbs: integer;

n: integer;

begin

if edit1.text='' then MessageDlg('Необходимо ввести значение V', mtWarning, [mbOK], 0)

else

begin

canvas.fillrect(canvas.cliprect);

xmin:=-10;

xmax:=10;

stepx:=0.5;

with ClientRect do

begin

Canvas.Pen.Style:= psSolid;

leftGr:=left+150;

topGr:=top+150;

rightGr:=Right-150;

bottomGr:=bottom-50;

 

kx:=(rightGr-leftGr)/(xmax-xmin);

ky:=(bottomGr-topGr)/200.0;

xOrd:=(leftGr+rightGr) div 2;

yAbs:=(topGr+bottomGr) div 2;

Canvas.Pen.Color:= clBLACK;

Canvas.Brush.Color:= Form3.Color;

 

Canvas.MoveTo(leftGr, yAbs);

Canvas.LineTo(rightGr, yAbs);

 

x:=xmin;

n:=Round((xmax-xmin)/2);

while n>=0 do

begin

xGr:=xOrd+Round(x*kx);

Canvas.MoveTo(xGr, yAbs-5);

Canvas.LineTo(xGr, yAbs+5);

Canvas.TextOut(xGr, yAbs+10, FloatToStr(x));

x:=x+2;

n:=n-1;

end;

Canvas.MoveTo(xOrd, topGr);

Canvas.LineTo(xOrd, bottomGr);

Canvas.Pen.Color:=clBlue;

Canvas.Pen.Width:=3;

 

xGr:=xOrd+Round(xmin*kx);

yGr:=yAbs-Round(f1(xmin)*ky);

Canvas.MoveTo(xGr,yGr);

 

x:=xmin+stepx;

n:=Round((xmax-xmin)/stepx)-1;

while n>=0 do

begin

if (x<-0.5) or (x>-0.4) then

begin

xGr:=xOrd+Round(x*kx);

yGr:=yAbs-Round(f1(x)*ky);

Canvas.LineTo(xGr,yGr);

end;

x:=x+stepx;

n:=n-1;

end;

end;

end;

end;

procedure TForm3.Button2Click(Sender: TObject);

var

leftGr2, topGr2, rightGr2, bottomGr2: integer;

x2, xmin2, xmax2, stepx2: real;

kx2, ky2: real;

xGr2, yGr2, xOrd2, yAbs2: integer;

n2: integer;

begin

if edit2.text='' then MessageDlg('Необходимо ввести все значения', mtWarning, [mbOK], 0)

else

if edit3.text='' then MessageDlg('Необходимо ввести все значения', mtWarning, [mbOK], 0)

else

begin

canvas.fillrect(canvas.cliprect);

xmin2:=-10;

xmax2:=10;

stepx2:=0.5;

with ClientRect do

begin

Canvas.Pen.Style:= psSolid;

leftGr2:=left+150;

topGr2:=top+150;

rightGr2:=Right-150;

bottomGr2:=bottom-50;

 

kx2:=(rightGr2-leftGr2)/(xmax2-xmin2);

ky2:=(bottomGr2-topGr2)/200.0;

xOrd2:=(leftGr2+rightGr2) div 2;

yAbs2:=(topGr2+bottomGr2) div 2;

Canvas.Pen.Color:= clBLACK;

Canvas.Brush.Color:= Form3.Color;

 

Canvas.MoveTo(leftGr2, yAbs2);

Canvas.LineTo(rightGr2, yAbs2);

 

x2:=xmin2;

n2:=Round((xmax2-xmin2)/2);

while n2>=0 do

begin

xGr2:=xOrd2+Round(x2*kx2);

Canvas.MoveTo(xGr2, yAbs2-5);

Canvas.LineTo(xGr2, yAbs2+5);

Canvas.TextOut(xGr2, yAbs2+10, FloatToStr(x2));

x2:=x2+2;

n2:=n2-1;

end;

Canvas.MoveTo(xOrd2, topGr2);

Canvas.LineTo(xOrd2, bottomGr2);

Canvas.Pen.Color:=clBlue;

Canvas.Pen.Width:=3;

 

xGr2:=xOrd2+Round(xmin2*kx2);

yGr2:=yAbs2-Round(f2(xmin2)*ky2);

Canvas.MoveTo(xGr2,yGr2);

 

x2:=xmin2+stepx2;

n2:=Round((xmax2-xmin2)/stepx2)-1;

while n2>=0 do

begin

if (x2<-0.5) or (x2>-0.4) then

begin

xGr2:=xOrd2+Round(x2*kx2);

yGr2:=yAbs2-Round(f2(x2)*ky2);

Canvas.LineTo(xGr2,yGr2);

end;

x2:=x2+stepx2;

n2:=n2-1;

end;

end;

end;

end;

end.

 

 

unit Unit4;

 

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm4 = class(TForm)

Label2: TLabel;

Button1: TButton;

Label3: TLabel;

Edit1: TEdit;

Button2: TButton;

Label1: TLabel;

Edit2: TEdit;

Button3: TButton;

Button4: TButton;

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure edit1KeyPress(Sender: TObject; var Key: Char);

procedure edit2KeyPress(Sender: TObject; var Key: Char);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form4: TForm4;

 

implementation

uses Unit2;

{$R *.dfm}

function f1(x:real):real;

var V: Real;

begin

v:=StrToFloat(Form4.Edit1.text);

f1:=v*x;

end;

function f2(x2:real):real;

var R: real;

begin

R:=StrToFloat(Form4.Edit2.text);

f2:=x2*x2/r;

end;

procedure TForm4.edit1KeyPress(Sender: TObject; var Key: Char);

begin

case Key of '0'..'9', chr(8):;

else key:=chr(0);

end;

end;

procedure TForm4.edit2KeyPress(Sender: TObject; var Key: Char);

begin

case Key of '0'..'9', chr(8):;

else key:=chr(0);

end;

end;

procedure TForm4.Button3Click(Sender: TObject);

begin

form4.Visible:=False;

form2.Visible:=True;

end;

procedure TForm4.Button4Click(Sender: TObject);

begin

Application.Terminate;

end;

procedure TForm4.Button1Click(Sender: TObject);

var

leftGr, topGr, rightGr, bottomGr: integer;

x, xmin, xmax, stepx: real;

kx, ky: real;

xGr, yGr, xOrd, yAbs: integer;

n: integer;

begin

if edit1.text='' then MessageDlg('Необходимо ввести значение V', mtWarning, [mbOK], 0)

else

begin

canvas.fillrect(canvas.cliprect);

xmin:=-10;

xmax:=10;

stepx:=0.5;

with ClientRect do

begin

Canvas.Pen.Style:= psSolid;

leftGr:=left+150;

topGr:=top+150;

rightGr:=Right-150;

bottomGr:=bottom-50;

 

kx:=(rightGr-leftGr)/(xmax-xmin);

ky:=(bottomGr-topGr)/200.0;

xOrd:=(leftGr+rightGr) div 2;

yAbs:=(topGr+bottomGr) div 2;

Canvas.Pen.Color:= clBLACK;

Canvas.Brush.Color:= Form4.Color;

 

Canvas.MoveTo(leftGr, yAbs);

Canvas.LineTo(rightGr, yAbs);

 

x:=xmin;

n:=Round((xmax-xmin)/2);

while n>=0 do

begin

xGr:=xOrd+Round(x*kx);

Canvas.MoveTo(xGr, yAbs-5);

Canvas.LineTo(xGr, yAbs+5);

Canvas.TextOut(xGr, yAbs+10, FloatToStr(x));

x:=x+2;

n:=n-1;

end;

Canvas.MoveTo(xOrd, topGr);

Canvas.LineTo(xOrd, bottomGr);

Canvas.Pen.Color:=clBlue;

Canvas.Pen.Width:=3;

 

xGr:=xOrd+Round(xmin*kx);

yGr:=yAbs-Round(f1(xmin)*ky);

Canvas.MoveTo(xGr,yGr);

 

x:=xmin+stepx;

n:=Round((xmax-xmin)/stepx)-1;

while n>=0 do

begin

if (x<-0.5) or (x>-0.4) then

begin

xGr:=xOrd+Round(x*kx);

yGr:=yAbs-Round(f1(x)*ky);

Canvas.LineTo(xGr,yGr);

end;

x:=x+stepx;

n:=n-1;

end;

 

end;

end;

end;

 

procedure TForm4.Button2Click(Sender: TObject);

var

leftGr2, topGr2, rightGr2, bottomGr2: integer;

x2, xmin2, xmax2, stepx2: real;

kx2, ky2: real;

xGr2, yGr2, xOrd2, yAbs2: integer;

n2: integer;

begin

if edit2.text='' then MessageDlg('Необходимо ввести все значения', mtWarning, [mbOK], 0)

else

begin

canvas.fillrect(canvas.cliprect);

xmin2:=-10;

xmax2:=10;

stepx2:=0.5;

with ClientRect do

begin

Canvas.Pen.Style:= psSolid;

leftGr2:=left+150;

topGr2:=top+150;

rightGr2:=Right-150;

bottomGr2:=bottom-50;

 

kx2:=(rightGr2-leftGr2)/(xmax2-xmin2);

ky2:=(bottomGr2-topGr2)/200.0;

xOrd2:=(leftGr2+rightGr2) div 2;

yAbs2:=(topGr2+bottomGr2) div 2;

Canvas.Pen.Color:= clBLACK;

Canvas.Brush.Color:= Form4.Color;

 

Canvas.MoveTo(leftGr2, yAbs2);

Canvas.LineTo(rightGr2, yAbs2);

 

x2:=xmin2;

n2:=Round((xmax2-xmin2)/2);

while n2>=0 do

begin

xGr2:=xOrd2+Round(x2*kx2);

Canvas.MoveTo(xGr2, yAbs2-5);

Canvas.LineTo(xGr2, yAbs2+5);

Canvas.TextOut(xGr2, yAbs2+10, FloatToStr(x2));

x2:=x2+2;

n2:=n2-1;

end;

Canvas.MoveTo(xOrd2, topGr2);

Canvas.LineTo(xOrd2, bottomGr2);

Canvas.Pen.Color:=clBlue;

Canvas.Pen.Width:=3;

 

xGr2:=xOrd2+Round(xmin2*kx2);

yGr2:=yAbs2-Round(f2(xmin2)*ky2);

Canvas.MoveTo(xGr2,yGr2);

 

x2:=xmin2+stepx2;

n2:=Round((xmax2-xmin2)/stepx2)-1;

while n2>=0 do

begin

if (x2<-0.5) or (x2>-0.4) then

begin

xGr2:=xOrd2+Round(x2*kx2);

yGr2:=yAbs2-Round(f2(x2)*ky2);

Canvas.LineTo(xGr2,yGr2);

end;

x2:=x2+stepx2;

n2:=n2-1;

end;

end;

end;

end;

end.


Дата добавления: 2018-02-18; просмотров: 673; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!