регистрация / вход

Техническое задание на создание автоматизированных систем

Построение эффективного алгоритма, главными свойствами которого являются детерминированность, массовость, результативность. Применение метода структурного программирования: разделение задачи на относительно независимые части и выполнение отладки частей.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

1 ТЕХНИЧЕСКОЕ ЗАДАНИЕ

1.1 Назначение разработки

1.2 Требование к программе

1.3 Стадии этапы разработки

2 ОПИСАНИЕ ПРОГРАММЫ

2.1 Функциональное назначение

2.2 Описание логической структуры

2.3 Входные и выходные данные

3 ИНСТРУКЦИЯ ПО ЭКСПЛУАТАЦИИ

3.1 Назначение программы

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

3.3 Описание контрольного примера

ЗАКЛЮЧЕНИЕ

БИБЛИОГРАФИЧЕСКИЙ СПИСОК


ВВЕДЕНИЕ

Процесс подготовки и решения задач на ЭВМ состоит из нескольких этапов:

- постановка задачи;

- разработка математической модели;

- разработка алгоритма;

- написание программы;

- тестирование и отладка.

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

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

Представленная программа реализована на языке программирования Borland Pascal версии 7.0.

Язык Borland Pascal 7.0 - это один из самых мощных языков для ЭВМ типа IBM PC/AT, работающий в среде операционной системы DOS, сочетающий в себе как мощность низкоуровневых языков программирования, так и структурированность с надежностью, присущих языкам высокого уровня.

Для реализации данного алгоритма был выбран язык программирования - TURBO PASCAL.

Файл с текстом программы (KURSPRO.PAS) имеет размер, равный 8,9Kb. Исполняемый файл (KURS.EXE) имеет размер 26,3Kb.


1 ТЕХНИЧЕСКОЕ ЗАДАНИЕ

1.1 Назначение разработки

Тема курсовой работы – решение прикладных задач.

Цель курсовой работы – создать программу, работающую в четырех режимах:

-простейшая обработка массива;

-операции над матрицами;

-транспонирование матриц;

-обработка файлов данных.

Функциональное назначение программы определяется выбранным режимом.

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

1. Задать массив, состоящий из nнеотрицательных чисел. Найти в нем индекс элемента, для которого сумма элементов, стоящих до него, наименее отличается от суммы элементов, стоящих после него.

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

3. Назовем допустимым преобразованием матрицы перестановку двух строк или двух столбцов. Дана действительная квадратная матрица порядка n. С помощью допустимых преобразований добиться того, чтобы один из элементов матрицы, обладающий наименьшим значением, располагался в левом нижнем углу матрицы.

4. Вывести и сохранить в файле данные следующей структуры: ФИО водителя, номер и марка автомашины (5-7 марок), дата техосмотра. Организовать просмотр исходных данных и вывести список владельцев и автомашин определенной марки (по запросу), отсортированных по возрастанию номеров (метод пузырька), с указанием номера машины и даты техосмотра. Ввод и вывод данных организовать в виде таблиц. Отладку программы производить на примере файла, состоящего не менее чем из 15 записей.

1.2 Требование к программе

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

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

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

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

Применение языка Паскаль значительно подняло "планку" надёжности разрабатываемых программ за счёт требования к описанию используемых в программе переменных, проверки согласованности программы при компиляции без её выполнения..

Для создания и использования программы необходимы следующие минимальные технические требования: Windows 98, процессор с частотой 1ГГц, видеокарта 32Мб, 256Мб ОЗУ, FDD, 50Мб свободного места на жестком диске, клавиатура, мышь, монитор с разрешением 800х600.

Входными данными для 1-ого режима будут являются размерность одномерного массива (n<=100)и сам одномерный массив.

Выходные данные будут представлены в виде целого числа, равному индексу элемента удовлетворяющего условие.

Входными данными для 2-ого режима будут являться размерность двумерного массива (n<=10) исам двумерный массив (размерности n×n).Выходные данные будут представлены в виде вещественного числа, равного сумме элементов, находящихся на линиях параллельной главной диагонали матрицы.

Входными данными для 3-его режима будут являться размерность двумерного массива (n<=10)и сам массив (размерности n×n). Выходные данные будут представлены в виде двумерного массива, полученного с помощью допустимых преобразований, в котором минимальный элемент будет расположен в левом нижнем углу.

Входные данные для 4-его режима будут представлены в виде таблицы, содержащей сведения о водителях. Таблица состоит из таких полей как: «№», «ФИО», «Номер авто», «Марка», «Дата техосмотра». Выходные данные будут представлять список сведений о водителях, с указанием ФИО, номера авто, марки, даты техосмотра, отсортированный по возрастаниюпо полю «Марка» методом пузырька.

1.3 Стадии этапы разработки

Курсовая работа должна быть выполнена в несколько этапов в соответствии с графиком:

1 неделя - постановка задачи;

2 неделя - разработка технического задания;

3 неделя - составление эскизного проекта;

4 - 5 недели - техническое проектирование;

4 - алгоритмизация задачи;

5 - разработка структуры программы, входных и выходных данных;

6 - 13 недели - рабочее проектирование;

6 - 8 - программирование задачи;

9 - 12 - отладка программы;

13 - испытание программы;

14 неделя - разработка программной документации;

15 неделя - оформление пояснительной записки;

16 неделя - защита курсовой работы.


2 ОПИСАНИЕ ПРОГРАММЫ

2.1 Функциональное назначение

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

Эта программа предусматривает работу в четырех режимах.

В рамках 1 режима выводится индекс элемента,для которого сумма элементов, стоящих до него, наименее отличается от суммы элементов, стоящих после него.

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

В рамках 3 режима формируется матрица, полученная при помощи допустимых преобразований (перестановкой двух строк или двух столбцов), в которой минимальный элемент расположен в левом нижнем углу.

В рамках 4 режима можно записать данные в файл и на их основе получить список водителей, с ФИО, с номерами автомобилей и датой техосмотра, с заданным пользователем маркой автомобиля, который отсортирован по возрастанию по критерию «номер авто» методом пузырька.

Для программы существуют функциональные ограничения:

-в 1-ом режиме размерность массива должна быть <=100;

-во 2-ом режиме размерность массива должна быть <=10;

-в 3-ем режиме размерность массива должна быть <=10;

-в 4-ом режиме количество водителей должно быть <=17;

2.2 Описание логической структуры

Основная программа работает в трех режимах. Схема основной программы представлена на рисунке 1.

Рисунок 1 – Схема основной программы

В 1 режиме выводится индекс элемента,для которого сумма элементов, стоящих до него, наименее отличается от суммы элементов, стоящих после него. Схема подпрограммы представлена на рисунке 2.


Рисунок 2 – Схема подпрограммы (rezh1)

Продолжение рисунка 2

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

Схема подпрограммы представлена на рисунке 3.


Рисунок 3 – Схема подпрограммы (rezh2)


Продолжение рисунка 3

В 3-ем режиме формируется матрица, полученная при помощи допустимых преобразований (перестановкой двух строк или двух столбцов), в которой минимальный элемент расположен в левом нижнем углу.

Схема подпрограммы представлена на рисунке 4.


Рисунок 4 – Схема подпрограммы (rezh3)

Продолжение рисунка 4(1)


Продолжение рисунка 4(2)

В 4 режиме необходимо организовать ввод данных, записать их в файл, вывести данные в виде таблицы и обработать их,используя такие стандартные операции, как сортировка и выборка данных. В результате будет получен список, отсортированный по возрастанию по данному полю методом пузырька. Условие выборки задается пользователем. Схема подпрограммы представлена на рисунке 5.


Рисунок 5 – Схема подпрограммы, осуществляющей обработку файлов данных (rejim4)


Продолжение рисунка 5(1)


Продолжение рисунка 5(2)


Продолжение рисунка 5(3)

Текст основной программы приведен в приложении 1.

2.3 Входные и выходные данные

Определим для каждой из подпрограмм входные и выходные данные.

Входными данными для 1-ого режима являются размерность одномерного массива (n<=100)и сам одномерный массив.

Выходные данные будут представлены в виде целого числа, равному индексу элемента удовлетворяющего условие.

Входными данными для 2-ого режима являются размерность двумерного массива (n<=10) исам двумерный массив (размерности n×n).Выходные данные будут представлены в виде вещественного числа, равного сумме элементов, находящихся на линиях параллельной главной диагонали матрицы.

Входными данными для 3-его режима являются размерность двумерного массива (n<=10)и сам массив (размерности n×n). Выходные данные будут представлены в виде двумерного массива, полученного с помощью допустимых преобразований, в котором минимальный элемент будет расположен в левом нижнем углу.

Входные данные для 4 – его режима представлены в виде таблицы, содержащей сведения о водителях. Таблица состоит из таких полей как: «№», «ФИО», «Номер авто», «Марка», «Дата техосмотра». Выходные данные будут представлять список сведений о водителях, с указанием ФИО, номера авто, марки, даты техосмотра, отсортированный по возрастаниюпо полю «Марка» методом пузырька.


3 ИНСТРУКЦИЯ ПО ЭКСПЛУАТАЦИИ

3.1 Назначение программы

Разработанная программа позволяет проводить различные операции над массивами и обрабатывать файлы данных.

Основная программа работает в 4-х режимах.

В рамках 1-ого режима выводится индекс элемента,для которого сумма элементов, стоящих до него, наименее отличается от суммы элементов, стоящих после него.

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

В рамках 3-его режима формируется матрица, полученная при помощи допустимых преобразований (перестановкой двух строк или двух столбцов), в которой минимальный элемент расположен в левом нижнем углу.

В рамках 4-ого режима можно записать данные в файл и на их основе получить список водителей, с ФИО, с номерами автомобилей и датой техосмотра, с заданным пользователем маркой автомобиля, который отсортирован по возрастанию по критерию «номер авто» методом пузырька.

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

Для запуска основной программы необходимо запустить файл KURSPRO.exe. После запуска программы появится окно, содержащее запрос на выбор одного из четырех режимов (рисунок 6).


Рисунок 6 –Пункты главного меню основной программы

Для простейшей обработки массива необходимо выбрать 1-ый режим (рисунок 7).

Рисунок 7. Выбор 1-го режима.

После выбора 1-го режима появится окно (рисунок 8), в котором необходимо ввести размерность одномерного массива.


Рисунок 8. Режим 1.

После ввода размерности необходимо ввести элементы массива (рисунок 9).

Рисунок 9. Ввод элементов массива.

После завершения ввода элементов массива программа выдает результат (Рисунок 10).


Рисунок 10. Вывод результата.

Для возврата в главное меню программы необходимо нажать клавишу «Enter». Аналогичным образом выбирается 2-ой режим. Появится окно, представленное на рисунке 11.

Рисунок 11. Стартовое окно режима 2.

После ввода размерности квадратичной матрицы необходимоввести ее элементы (Рисунок 12).


По окончании ввода элементов матрицы нужно нажать клавишу «Enter»для вывода результата (Рисунок 13).

После возврата в главное меню и выбора режима 3 появится окно, аналогичное стартовому окну режима 2 (Рисунок 11). Ввод размерности и элементов осуществляется также как и в режиме 2. После завершения ввода элементов программа выдает результат (Рисунок 14).


Рисунок 14. Результат выполнения режима 3.

Для выхода из программы в главном меню необходимо ввести «0»

(Рисунок 15).

Рисунок 15. Выход из программы.

3.3 Описание контрольного примера

В качестве контрольного примера рассмотрим принцип работы режима 4. Для запуска программы необходимо загрузить файл KURSPRO.exe. Появится окно с главным меню основной программы, в котором выберем режим 4 (рисунок 15).

Рисунок 16. Выбор режима 4.

После выбора появится окно, в котором предлагается ввести число водителей (Рисунок 17).

Рисунок 17. Ввод числа водителей.

Далее появляется окно в котором необходимо заполнитьтаблицу (Рисунок 18).

Рисунок 18. Таблица ввода данных о водителях.

После заполнения всей полей 1-ой строки появляется новая строка таблицы, и т.д. (Рисунок 19), количество строк будет равно введенному количеству водителей (Рисунок 20).

Рисунок 19. Таблица ввода данных о водителях.


Рисунок 20. Таблица ввода данных о водителях.

После завершения ввода данных о водителях предлагается ввести марку автомобиля, по которой будет выполняться сортировка по номеру автомобиля (Рисунок 21).

Рисунок 21. Ввод марки автомобиля.

После нажатия клавиши «Enter»программа выдаст список автомобилей выбранной марки отсортированных по возрастанию номеров автомобилей (Рисунок 22).

Рисунок 22. Вывод результата режима 4.

Для перехода в основное меню необходимо нажать клавишу «Enter».


ЗАКЛЮЧЕНИЕ

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

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

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

Третий режим позволяет получить матрицу, полученную при помощи допустимых преобразований (перестановкой двух строк или двух столбцов), в которой минимальный элемент расположен в левом нижнем углу.

Четвертый режим предусматривает создание файла данных, а также модификацию и обработку данных. В рамках этого же режима можно осуществить выборку данных и их сортировку по возрастанию.

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

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


БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1. ГОСТ 19.701-90. ЕСПД. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения.

2. ГОСТ 19.102-77. ЕСПД. Стадии разработки.

3. ГОСТ 34.602-89. ЕСПД. Информационная технология. Техническое задание на создание автоматизированных систем.

4. ГОСТ 19.402-78. ЕСПД. Описание программы.

5. ГОСТ 19.509-79. ЕСПД. Руководство программиста.

6. ГОСТ 19.505-79. ЕСПД. Руководство оператора.

7. Моргун А. Н. Программирование на языке Паскаль (Pascal). Основы обработки структур данных, Москва: «Диалектика», 2005.

8. Алексеев Е.Р., Чеснокова О.В. Турбо Паскаль 7.0, Москва: NTpress, 2007.

9. Попов В.Б. Turbo Pascal для школьников, Москва: "Финансы и статистика", 2002г.

10. Меняев М.Ф. Информатика, Москва: Омега-Л, 2003г.

11. Фаронов В.В. Turbo Pascal 7.0. начальный курс, Москва: Нолидж, 2001г.


Приложение 1.

program kurspro;

uses crt;

var w:integer;

procedure rezh1;

const lim=100;

var b:array [1..lim] of real;

n,q,z,x,i,ind,k,l:integer; min,s,p,v:real;

begin

clrscr;

writeln('Режим 1');

writeln;

writeln('Введите размерность массива, n:');

writeln;

read(n);

writeln;

writeln('Введите элементы массива (только неотрицательные элементы):');

writeln;

{Ввод элементов массива}

gotoXY(whereX+7,whereY);

q:=whereX;

z:=whereY;

x:=1;

for i:=1 to n do

begin

if i=10 then

begin

z:=z+2;

x:=1;

end;

gotoXY(q*x,z);

read(b[i]);

x:=x+1;

end;

writeln;

min:=32000;

for i:=2 to n do

begin

s:=0;

p:=0;

for k:=i-1 downto 1 do

p:=p+b[k];

for l:=i+1 to n do

s:=s+b[l];

v:=abs(s-p);

if v<min then

begin

min:=v;

ind:=i;

end;

end;

writeln('Индекс элемента, удовлетворяющего условие: ',ind);

writeln;

writeln('Для возврата в главноe меню нажмите "ENTER" ');

readln;

readln

end;

procedure rezh2;

const lim=10;

var a:array [1..lim, 1..lim] of real;

q,z,i,j,n:integer; s,p:real;

begin

clrscr;

writeln('Режим 2');

writeln;

writeln('Введите размерность квадратичной матрицы, n: ');

readln(n);

writeln('Введите элементы матрицы (размерности ',n,'x',n,'): ');

gotoXY(wherex+10,whereY);

q:=whereX;

z:=whereY;

for i:=1 to n do begin

for j:=1 to n do begin

gotoXY(q*j,z+i*2);

read(a[i,j]);

s:=s+a[i,j];

if i=j then

p:=p+a[i,j];

end;

end;

writeln;

writeln;

writeln('Суммаэлементовравна:',s-p:5:2);

writeln;

writeln('Для возврата в главноe меню нажмите "ENTER" ');

writeln;

writeln;

readln;

readln;

end;

procedure rezh3;

const lim=10;

var a:array [1..lim,1..lim] of real;

n,i,j,x,y,k,l:integer; min,c:real;

begin

clrscr;

writeln('Режим 3');

writeln;

min:=32000;

writeln('Введите размерность квадратичной матрицы, n: ');

read(n);

writeln;

{Vvod elementov matrici}

writeln('Введитеэлементыматрицы (размерности ',n,'x',n,') :');

gotoXY(whereX+10,whereY);

x:=whereX;

y:=whereY;

for i:=1 to n do

for j:=1 to n do

begin

gotoXY(x*j,i*2+y);

read(a[i,j]);

if a[i,j]<min

then

begin

min:=a[i,j];

k:=i;

l:=j;

end;

end;

writeln;

if k<n then

begin

for j:=1 to n do

begin

{smena strok}

c:=a[k,j];

a[k,j]:=a[n,j];

a[n,j]:=c;

end;

end;

if l>1 then

begin

for i:=1 to n do

begin

{smena stolbcov}

c:=a[i,l];

a[i,l]:=a[i,1];

a[i,1]:=c;

end;

end;

{Vivod konechnoj matrici}

writeln;

writeln('Конечнаяматрица:');

gotoXY(whereX+10,whereY);

x:=whereX;

y:=whereY;

for i:=1 to n do

begin

if y+i*2<=25 then

begin

for j:=1 to n do

begin

gotoxy(x*j,y+i*2);

write(a[i,j]:3:2);

end;

end

else

begin

writeln;

for j:=1 to n do

begin

gotoxy(x*j,25);

write(a[i,j]:3:2);

end;

end;

writeln;

end;

writeln;

writeln('Для возврата в главноe меню нажмите "ENTER" ');

readln;

readln

end;


procedure rezh4;

type vod=record

num:integer;

fi,mark,date:string;

end;

var avto: array [1..17] of vod;

box:vod;

kol,i,x,y,kof,kl,ch:integer;

vma:string;

zap: file of vod;

begin

clrscr;

assign(zap,'zap.txt');

rewrite(zap);

writeln('Режим 4');

writeln;

writeln('Введите количество водителей:');

read(kol);

clrscr;

writeln('Введите данные о водителях');

writeln;

writeln(' ----------------------------------------------------------------------');

writeln(' | № | ФИО водителя | Номер авто | Марка |Дата техосмотра|');

writeln(' ----------------------------------------------------------------------');

{Ввод}

for i:=1 to kol do

begin

if i<10 then

begin

writeln(' | ',i,' | | | | |');

writeln(' ----------------------------------------------------------------------');

x:=whereX;

y:=whereY;

gotoXY(8,4+i*2);

if i=1 then

readln(avto[i].fi);

readln(avto[i].fi);

gotoXY(27,4+i*2);

readln(avto[i].num);

gotoXY(43,4+i*2);

readln(avto[i].mark);

gotoXY(56,4+i*2);

readln(avto[i].date);

end

else

begin

writeln(' | ',i,' | | | | |');

writeln(' ----------------------------------------------------------------------');

x:=whereX;

y:=whereY;

gotoXY(8,5+9*2);

readln(avto[i].fi);

gotoXY(27,5+9*2);

readln(avto[i].num);

gotoXY(43,5+9*2);

readln(avto[i].mark);

gotoXY(56,5+9*2);

readln(avto[i].date);

end;

write(zap,avto[i]);

gotoXY(x,y);

end;

close(zap);

assign(zap,'zap.txt');

reset(zap);

writeln('Введите марку, по которой необходимо выполнить сортировку');

read(vma);

{Отсев ненужных марок}

kof:=1;

ch:=0;

for i:=1 to kol do

begin

read(zap,avto[i]);

if avto[i].mark=vma then

begin

avto[kof]:=avto[i];

kof:=kof+1;

ch:=ch+1;

end;

end;

{Сортировка}

repeat

kl:=0;

for i:=1 to ch-1 do

begin

if avto[i].num>avto[i+1].num then

begin

box:=avto[i+1];

avto[i+1]:=avto[i];

avto[i]:=box;

kl:=1

end;

end;

until kl=0;

{Вывод}

clrscr;

writeln('Отсортированный список:');

writeln;

writeln(' ----------------------------------------------------------------------');

writeln(' | № | ФИО водителя | Номер авто | Марка |Дата техосмотра|');

writeln(' ----------------------------------------------------------------------');

for i:=1 to ch do

begin

if i<10 then

begin

writeln(' | ',i,' | | | | |');

writeln(' ----------------------------------------------------------------------');

x:=whereX;

y:=whereY;

gotoXY(8,4+i*2);

writeln(avto[i].fi);

gotoXY(27,4+i*2);

writeln(avto[i].num);

gotoXY(43,4+i*2);

writeln(avto[i].mark);

gotoXY(56,4+i*2);

writeln(avto[i].date);

end

else

begin

writeln(' | ',i,' | | | | |');

writeln(' ----------------------------------------------------------------------');

x:=whereX;

y:=whereY;

gotoXY(8,5+9*2);

writeln(avto[i].fi);

gotoXY(27,5+9*2);

writeln(avto[i].num);

gotoXY(43,5+9*2);

writeln(avto[i].mark);

gotoXY(56,5+9*2);

writeln(avto[i].date);

if i=11 then

begin

readln;

readln;

end;

end;

gotoXY(x,y);

end;

close(zap);

writeln;

writeln('Длявозвратавглавноe менюнажмите "ENTER"');

readln;

readln

end;

begin {Основнаяпрограмма}

repeat

clrscr;

writeln('Главноеменю');

writeln;

writeln('Для выбора необходимого режима режима введите:');

writeln;

writeln('"1" - Простейшая обработка массива');

writeln('"2" - Операции над матрицами');

writeln('"3" - Транспонирование матриц');

writeln('"4" - Обработка файлов данных');

writeln('"0" - Выход из программы');

writeln;

read(w);

case w of

1: rezh1;

2: rezh2;

3: rezh3;

4: rezh4;

end;

until w=0;

end.

ОТКРЫТЬ САМ ДОКУМЕНТ В НОВОМ ОКНЕ

ДОБАВИТЬ КОММЕНТАРИЙ  [можно без регистрации]

Ваше имя:

Комментарий