Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмизация. Технология разработки программного обеспечения. Учебно-методическое пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
Организация данных
Имя поля
Тип
Ширина/дес. знаки
Параметр/Условие проверки
Min
Max
a_def N 5/2
a_max N 5/2
b_def N 4/2
b_max N 4/2
q_sum_def
N
7
Суммарный недоотпуск газа
Имя поля
Тип
Ширина/дес. знаки
Параметр/Условие проверки
Коэффициент a
CONFIG.a_min < a < CONFIG.a_max
Коэффициент b
CONFIG.b_min < b < CONFIG.b_max
Имя поля
Тип
Ширина/дес. знаки
Параметр/Условие проверки
Filename C 5
Код варианта/Уникальность; допустимые символы
Comment C 70
Наименование
Структура организации данных представлена на рис. 30. Все файлы данных имеют одинаковый формат DBF. Структура файлов представлена в табл 2–6.
В корневой папке приложения находятся 3 файла CONFIG.DBF, SPR_PRED.DBF, VARIANT.DBF и 2 папки с именами EDIT и PROJECT.
Значения параметров, принимаемые по умолчанию, и их допустимые диапазоны изменения хранятся в файле CONFIG.DBF (см. табл. 2). Справочная база предприятий хранится в файле
SPR_PRED.DBF (см. табл. 3). Список вариантов расчета хранится в файле VARIANT.DBF (см. табл. 4). Информация из этих файлов доступна в течение всего сеанса работы.
В папке PROJECT находятся папки, содержащие файлы вариантов расчета и пустые прото­типы файлов c именами PRD.DBF (см. табл. 5) и OID.DBF (см. табл. 6). Название папки пред­ставляет собой код, который вводит пользователь (см. рис. 21). В каждой папке находятся 2 файла: <код>PRD.DBF и <код> OID.DBF: первый предназначен для хранения исходной информации и результатов расчета по предприятиям (см. табл. 5), второй — для хранения общих данных (см. табл. 6). Имена файлов формируются автоматически, префикс имени файлов совпадает с именем папки.
Папка EDIT является папкой, в которую при выборе пользователем варианта расчета авто­матически переносятся файлы из папки варианта. Префикс файлов заменяется на ttttt. Прило­жение всегда работает с копией файлов. После выбора нового варианта, при окончании сеанса работы измененные данные и результаты расчета автоматически сохраняются в исходной папке варианта.
Таблица 2
Структура файла CONFIG.DBF
Коэффициент a
a_min < a_def < a_max;
a_min N 5/2
b_min N 4/2
q_sum_max q_sum_min
naim_pred C 50 Название предприятия/Уникальность
a N 5/2
b N 4/2
N N
7 7
Структура файла SPR_PRED.DBF
Структура файла VARIANT.DBF
q_sum_min < q_sum_def < q_sum_max;
a_min < a_max
Коэффициент b
b_min < b_def < b_max;
b_min < b_max
q_sum_min < q_sum_max
0,00 99,99
1,01 9,99
0 9999999
Таблица 3
Таблица 4
21
Таблица 5
Имя поля
Тип
Ширина/дес.знаки
Параметр/Условие проверки
naim_pred C 50
Название предприятия/Уникальность
a N 5/2
Коэффициент a
b N 4/2
Коэффициент b
q N 10/1
Недоотпуск газа
y N 10/1
Ущерб, наносимый предприятию
Имя поля
Тип
Ширина/дес. знаки
Примечание
Суммарный недоотпуск
q_sum _min<q_sum< q_sum_max
y_sum N 10/1
Суммарный ущерб
Структура файла tttttPRE.DBF
Таблица 6
Структура файла tttttOID.DBF
q_sum N 10/1
Классы
При разработке приложения рекомендуется создать библиотеку классов объектов и экранных форм. Для рассматриваемого приложения необходимы классы, обеспечивающие:
ввод числовых данных и проверку значений на попадание в допустимую область изме-
нения параметра;
ввод символьных данных и проверку уникальности введенного значения;
выбор данных из списков и проверку уникальности выбора;
экранную форму, включающую объект типа PageFrame и обеспечивающую ввод и
проверку значений, принимаемых по умолчанию, и диапазонов изменения параметров;
экранную форму, включающую объект типа Grid и обеспечивающую ввод информации
в таблицу. Заголовок таблицы может содержать объединенные заголовки столбцов. Заголовки столбцов могут быть многострочными. Боковик таблицы может включать несколько столбцов и фиксироваться;
экранную форму, включающую кнопки и обеспечивающую выполнение подключенных
процедур.
Сложность разработки классов с требуемыми функциональными возможностями зависит от языка программирования. Во многие современные инструментарии, используемые при разработке программных приложений, встроены Class Designer и Form Designer, которые позволяют существенно облегчить и ускорить процесс разработки приложения.
В прил. 3 и 4 представлено описание реальных тепловых сетей, участки которых заданы парой названий объектов, ограничивающих их. Для упрощения решения задач, определенных темами 1–15, необходимо перевести имена объектов в номера. Это можно сделать в 2 этапа: на первом этапе пронумеровать все объекты, на втором — для каждого участка для объектов, его ограничивающих, найти их имена в списке объектов и заменить соответствующими номерами. В среде Excel это можно сделать с помощью функции ПОИСКПОЗ. Результат перехода от имен объектов к номерам для сети (см. прил. 4) представлен на рис. 30.
При выполнении курсовых проектов по темам 1–10 используется матрица смежности, построенная по представленной в прил. 3–4 информации. Напомним, что матрицей смежности M является матрица, каждая строка и столбец которой соответствуют вершине графа. Если вершина I и вершина J связаны ребром, то элемент матрицы mij = 1. В среде Excel матрицу M можно сформировать, используя функции ЕСЛИ, ЕНД, ПОИСКПОЗ, СЦЕПИТЬ, предвари­тельно образовав пары «Начало-Конец» (рис. 30 — последний столбец, функция СЦЕПИТЬ). На рис. 31 представлена матрица смежности, построенная по данным рис. 30.

РЕКОМЕНДАЦИИ ПО РЕАЛИЗАЦИИ АЛГОРИТМОВ

22
Номер
Название объекта
Номер объекта
Номер
конца
1
ЦТП-109-п
1
УТ-101-п
УТ-102-п
28
30
28-30
2
ЦТП-109-о
2
УТ-102-п
УТ-103-п
30
34
30-34
3
Гараж-о
3
УТ-103-п
УТ-104-п
34
36
34-36
4
Гараж-п
4
УТ-104-п
Роддом-п
36
14
36-14
5
Дезкам-о
5
УТ-105-п
Пищеблок-п
40
12
40-12
6
Дезкам-п
6
УТ-105-п
СК-106-п
40
16
40-16
7
Лаборат-о
7
УТ-104-п
УТ-104ф-п
36
38
36-38
8
Лаборат-п
8
УТ-104ф-п
УТ-105-п
38
40
38-40
9
Леч корп-о
9
ЦТП-109-п
УТ-101-п
1
28
1-28
10
Леч корп-п
10
УТ-103-п
УТ-103/1-п
34
32
34-32
11
Пищеблок-о
11
УТ-103/1-п
Лаборат-п
32 8 32-8
12
Пищеблок-п
12
УТ-103/1-п
Гараж-п
32 4 32-4
13
Роддом-о
13
УТ-101-п
Дезкам-п
28 6 28-6
14
Роддом-п
14
СК-106-п
ТК-107-п
16
20
16-20
15
СК-106-о
15
ТК-107-п
Леч корп-п
20
10
20-10
16
СК-106-п
16
ТК-107-п
ТК-108-п
20
22
20-22
17
Терапия-о
17
ТК-108-п
ТК-108ф-п
22
24
22-24
18
Терапия-п
18
ТК-108ф-п
ТК-109-п
24
26
24-26
19
ТК-107-о
19
ТК-109-п
Терапия-п
26
18
26-18
20
ТК-107-п
20
УТ-101-о
УТ-102-о
27
29
27-29
21
ТК-108-о
21
УТ-102-о
УТ-103-о
29
33
29-33
22
ТК-108-п
22
УТ-103-о
УТ-104-о
33
35
33-35
23
ТК-108ф-о
23
УТ-104-о
Роддом
35
13
35-13
24
ТК-108ф-п
24
УТ-105-о
Пищеблок
39
11
39-11
25
ТК-109-о
25
УТ-105-о
СК-106-о
39
15
39-15
26
ТК-109-п
26
УТ-104-о
УТ-104ф
35
37
35-37
27
УТ-101-о
27
УТ-104ф
УТ-105-о
37
39
37-39
28
УТ-101-п
28
ЦТП-109-о
УТ-101-о
2
27
2-27
29
УТ-102-о
29
УТ-103-о
УТ-103/1-о
33
31
33-31
30
УТ-102-п
30
УТ-103/1-о
Лаборат
31 7 31-7
31
УТ-103/1-о
31
УТ-103/1-о
Гараж
31 3 31-3
32
УТ-103/1-п
32
УТ-101-о
Дезкам
27 5 27-5
33
УТ-103-о
33
СК-106-о
ТК-107-о
15
19
15-19
34
УТ-103-п
34
ТК-107-о
Леч корп
19 9 19-9
35
УТ-104-о
35
ТК-107-о
ТК-108-о
19
21
19-21
36
УТ-104-п
36
ТК-108-о
ТК-108ф
21
23
21-23
37
УТ-104ф-о
37
ТК-108ф
ТК-109-о
23
25
23-25
38
УТ-104ф-п
38
ТК-109-о
Терапия
25
17
25-17
39
УТ-105-о
39
Дезкам-п
Дезкам
6 5 6-5
40
УТ-105-п
40
Гараж-п
Гараж
4 3 4-3
41
Лаборат-п
Лаборат
8 7 8-7
42
Роддом-п
Роддом
14
13
14-13
43
Пищеблок-п
Пищеблок
12
11
12-11
44
Леч корп-п
Леч корп
10 9 10-9
45
Терапия-п
Терапия
18
17
18-17
объекта
Название
объекта
Номер
участка
начала
участка
конца
участка
начала
участка
конца
участка
начала
номер
Рис. 30. Пример перехода от имен объектов к их номерам
23
Рис. 31. Пример матрицы смежности, построенной по данным рис. 30
Ниже приводятся алгоритмы, которые рекомендуется использовать при выполнении курсовых проектов (темы 11–15) [2; 4].
Тема 11. Анализ связности неориентированного графа (поиск в ширину)
Результатом работы приложения являются массивы mark_node и mark_link, элементы которых содержат номер подграфа, к которому принадлежат вершина и ребро.
При маркировке вершин графа (массив mark_node) предлагается использовать следующий принцип:
0 — связность вершины не определена;
I — вершина принадлежит подграфу I.
При маркировке ребер графа (массив mark_link) предлагается использовать следующий принцип:
0 — принадлежность ребра не определена;
I — ребро принадлежит подграфу I.
Алгоритм состоит из следующих шагов:
1. Обнулить массивы mark_node и mark_link.
2. I_subgraph = 1.
3. Положить количество немаркированных вершин в графе count_notmark_nodes равным
количеству вершин в графе count_nodes.
4. Повторять, пока count_notmark_nodes > 0:
4.1. Определить количество немаркированных вершин в графе count_notmark_nodes.
4.2. Найти первую немаркированную вершину (mark_node(i_node) = 0).
4.3. mark_node (i_node) = I_subgraph.
24
4.4. Count_mark_nodes = 1.
4.5. Повторять пока Count_mark_nodes > 0:
4.5.1. Count_mark_nodes = 0.
4.5.2. Для каждого немаркированного ребра выполнить:
4.5.2.1. Найти ребро, у которого маркировка вершины начала или конца равна I_subgraph.
4.5.2.2. Маркировать смежный узел.
4.5.2.3. Маркировать ребро.
4.5.2.4. Count_mark_nodes = Count_mark_nodes + 1.
4.6. Определить количество немаркированных вершин в графе count_notmark_nodes.
4.7. Если count_notmark_nodes > 0, то I_subgraph = I_subgraph + 1.
Тема 12. Выявление объектов, подключенных к источнику
Результатом работы приложения является массив mark_node, элементы которого содержат номер источника, с которым связана вершина. Маркер «0» соответствует случаю, когда вершина не связана ни с одним источником.
При маркировке вершин графа (массив mark_node) предлагается использовать следующий принцип:
0 — связность вершины с источником не определена;
I — вершина связана с источником I.
При маркировке ребер графа (массив mark_link) предлагается использовать следующий принцип:
0 — принадлежность ребра не определена;
I — ребро принадлежит подграфу, в который входит источник I.
Алгоритм состоит из следующих шагов:
1. Обнулить массивы mark_node и mark_link.
2. Для каждого источника I_source = 1, count_source выполнить:
2.1. mark_node (i_source) = I_source.
2.2. Count_mark_nodes = 1.
2.3. Повторять, пока Count_mark_nodes > 0:
2.3.1. Count_mark_nodes = 0.
2.3.2. Для каждого немаркированного ребра:
2.3.2.1. Найти ребро, у которого маркировка вершины начала или конца равна I_source.
2.3.2.2. Маркировать смежный узел.
2.3.2.3. Маркировать ребро.
2.3.2.4. Count_mark_nodes = Count_mark_nodes + 1.
Тема 13. Выявление ненагруженных тупиковых ответвлений в сети
Под ненагруженным тупиковым ответвлением понимается подграф, не имеющий циклов, для каждой вершины которого нагрузка равна 0. Результатом работы приложения является массив mark_node, элементы которого содержат номер источника, с которым связана вершина. Маркер «0» соответствует случаю, когда вершина не связана ни с одним источником. Отри­цательный маркер «–I» соответствует случаю, когда вершина связана с источником I и при­надлежит тупиковому ответвлению. Вершина является ненагруженным тупиком, если ее валентность равна 1, нагрузка равна 0 и она не является источником.
Решение задачи состоит из двух этапов: на первом этапе необходимо найти множество вершин, связанных с источником (см. тему 12); на втором — множество вершин, связанных с источником, разбить на 2 подмножества — вершины, принадлежащие тупиковому ответв­лению и не принадлежащие ему.
25
Алгоритм для второго этапа — выявление ненагруженных тупиковых ответвлений:
а б в г
1. Вычислить валентность всех вершин графа.
2. Count_mark_links = 1.
3. Повторять, пока Count_mark_links > 0:
3.1. Count_mark_links = 0.
3.2. Для каждого немаркированного ребра выполнить:
3.2.1. Если одна из вершин, инцидентных ребру, является тупиком, то:
3.2.1.1. Изменить знак у маркера тупиковой вершины.
3.2.1.2. Валентность вершин, инцидентных ребру, уменьшить на 1.
3.2.1.3. Ребро маркировать.
3.2.1.4. Count_mark_links = Count_mark_links + 1.
Тема 14. Эквивалентирование нагруженных тупиковых ответвлений
Процесс эквивалентирования нагруженных тупиковых ответвлений начинается с терми­нальных узлов. В результате определяются расходы на всех ребрах и нагрузка корневой вершины, которая увеличивается на суммарную нагрузку всех вершин, вошедших в тупиковое ответвление (рис. 32). Индексы всех вершин и ребер, вошедших в нагруженные тупиковые ответвления, равны 1.
При известном давлении в корневой вершине можно найти давления во всех вершинах, принадлежащих тупиковому ответвлению (обратный ход).
Рис. 32. Последовательность эквивалентирования нагруженных тупиковых ответвлений:
aисходное состояние; б — перенос нагрузки в вершины 3 и 4; отсекаемые вершины — 1 и 2;
в перенос нагрузки в вершину 4; отсекаемая вершина 3;
гперенос нагрузки в вершину S; отсекаемая вершина 4
Алгоритмы прямого и обратного ходов
Прямой ходскручивание нагруженных тупиковых ответвлений.
1. Вычислить валентность всех вершин.
2. Count_mark_links = 1.
3. Повторять, пока Count_mark_links > 0:
3.1. Count_mark_links = 0.
3.2. Для каждого немаркированного ребра j (i; k) выполнить:
26
3.2.1. Если валентность одной из инцидентных ребру вершин равна 1 и она не
.Gxkj=
.GGG
kii
+=
.Gxij−=
.GGG
ikk
=
P P H Sx x
i k j jj j

=+−
 
P P H Sx x
k i j jj j

=−−
 
является источником, то:
3.2.1.1. Валентность обеих вершин уменьшить на 1.
3.2.1.2. Ребро маркировать.
3.2.1.3. Присвоить индексу вершины I значение 1.
3.2.1.4. Count_mark_links = Count_mark_links + 1.
3.2.1.5. Если отсекаемая вершина конец ребра (k), то:
3.2.1.5.1. Присвоить значению расхода значение нагрузки отсекаемой
вершины
3.2.1.5.2. Увеличить значение нагрузки смежной вершины на значение нагрузки отсекаемой вершины:
3.2.1.6. Если отсекаемая вершина — начало ребра (i), то:
3.2.1.6.1. Присвоить значению расхода инверсное значение нагрузки отсекаемой вершины
3.2.1.6.2. Уменьшить значение нагрузки смежной вершины на значение нагрузки отсекаемой вершины:
Обратный ход — раскручивание свернутых нагруженных тупиковых ответвлений.
1. Count_mark_links = 1.
2. Повторять, пока Count_mark_links > 0:
2.1. Count_mark_links = 0.
2.2. Для каждого немаркированного ребра j (i; k), принадлежащего тупиковому ответ­влению, выполнить:
2.2.1. Если индекс одной из инцидентных ребру вершин равен 1 и она не марки- рована, то:
2.2.1.1. Вычислить давление в смежной вершине:
по формуле
,
если индекс узла k равен 1; по формуле
,
если индекс узла i равен 1.
2.2.1.2. Маркировать смежную вершину.
2.2.1.3. Присвоить индексу ребра значение 1.
2.2.1.4. Count_mark_links = Count_mark_links + 1.
Тема 15. Эквивалентирование участков сети
Графы, моделирующие расчетные схемы гидравлических сетей, могут содержать большое количество последовательных и параллельных участков. Эквивалентирование таких участков позволяет существенно уменьшить размерность решаемой системы уравнений.
Последовательные ребра — ребра, инцидентные одной и той же вершине, которая не имеет нагрузки и степень которой равна 2. При замене двух последовательных ребер одним (рис. 33, a, б) на единицу уменьшается количество вершин и добавляется одно новое ребро. Гидравлическое сопротивление нового ребра равно сумме сопротивлений замененных ребер.
27
Параллельными называются ребра, у которых совпадают пары инцидентных им вершин.
12
.S SS
new j j
= +
а б
в г
Порядок перечисления вершин в паре не имеет значения. При замене двух параллельных ребер одним не меняется количество вершин и добавляется новое ребро, гидравлическая проводимость которого равна сумме проводимостей замененных ребер, соединяющих те же концевые вершины (рис. 33, в, г).
Процесс эквивалентирования ребер графа начинается с поиска и эквивалентирования по­следовательных ребер, затем происходит поиск и эквивалентирование параллельных ребер, затем снова поиск последовательных ребер, затем параллельных, и так до тех пор, пока не останется последовательных и параллельных ребер.
Рис. 33. Эквивалентирование ребер сети:
aбпоследовательное соединение; вгпараллельное соединение;
a, в — исходное состояние; б—г — результат эквивалентирования
Обратный ход состоит в присвоении значений расходов дочерних ребер значениям расходов родительских ребер (последовательные ребра) и в вычислении значений расходов родительских ребер (параллельные ребра).
Описание алгоритмов
Прямой ход
1. Вычислить валентность всех вершин.
2. Определить количество вершин без нагрузки, валентность которых равна 2 (number_serial).
3. Определить количество параллельных ребер (number_parallel).
4. Количество ребер new = nl.
5. Повторять, пока есть последовательные и параллельные ребра (number_serial + number_parallel > 0):
5.1. Если есть последовательные ребра (number_serial > 0), то
5.1.1. Для каждой немаркированной вершины i, валентность которой равна 2 и у которой отсутствует нагрузка:
5.1.1.1. Найти 2 немаркированных ребра j1 (i; k1) и j2 (i; k2), инцидентных вершине i.
5.1.1.2. Маркировать найденные ребра j1 и j2.
5.1.1.3. Маркировать вершину i.
5.1.1.4. Создать новое ребро new = new + 1 (k1; k2).
5.1.1.5. Вычислить гидравлическое сопротивление ребра new по формуле
28
5.1.1.6. Вычислить гидравлическую проводимость ребра new по формуле
1
2
R
new
S
new
=
1
R RR
new j j
= +
1
S
new
R
new
=
x
j
P
j
R
j
∆=
1
j
1
xx
jj
=
1
xx
jj
= −
11
xR P
jj j
=
11
x RP
j jj
=−∆
1
1
1
x
j
P
j
R
j
∆=
.
5.1.1.7. Сохранить номер ребра new как дочерний для ребер j1 и j2.
5.1.2. Определить количество параллельных ребер (number_parallel).
5.2. Если есть параллельные ребра (number_parallel > 0), то
5.2.1. Для каждого немаркированного ребра j (i; k):
5.2.1.1. Найти параллельное ему немаркированное ребро j1 (i; k).
5.2.1.2. Маркировать найденные ребра j и j1.
5.2.1.3. Создать новое ребро new = new + 1 (i; k).
5.2.1.4. Вычислить гидравлическую проводимость ребра new по формуле .
5.2.1.5. Вычислить гидравлическое сопротивление ребра new по формуле
.
5.2.1.6. Сохранить отрицательный номер ребра new как дочерний для ребер j и j1.
5.2.2. Определить количество вершин.
Обратный ход
1. Для каждого маркированного ребра j, включая новые, начиная с большего номера с
шагом –1:
1.1. Найти вершины (i; k), инцидентные ребру j.
1.2. Вычислить
.
1.3. Для каждого немаркированного ребра
, начиная с 1 до j:
1.3.1. Найти вершины (i1; k1), инцидентные ребру j1.
1.3.2. Найти родительское ребро (по совпадению номера дочернего ребра j1 c номером j).
1.3.3. Если номер дочернего ребра больше 0 (т.е. последовательное соединение), то вычислить расходы на родительских ребрах:
1.3.3.1. Если i = i1 или k = k1
.
1.3.3.2. Если i = k1 или k = i1
.
1.3.4. Если номер дочернего ребра меньше 0 (т.е. параллельное соединение), то
1.3.4.1. Если i = i1 или k = k1
.
1.3.4.2. Если i = k1 или k = i1
.
1.3.5. Вычислить .
1.3.6. Маркировать ребро.
29

СОСТАВ И ОБЪЕМ ПОЯСНИТЕЛЬНОЙ ЗАПИСКИ К КУРСОВОМУ ПРОЕКТУ

Курсовой проект должен содержать пояснительную записку, объем которой определяется
достаточностью проработки поставленной задачи.
Примерный план пояснительной записки отражает процесс разработки приложения. Он
может быть следующим:
Назначение разрабатываемого приложения.
Постановка задачи.
Математическая модель.
Метод решения.
Алгоритм решения.
Структура приложения.
Инструкция пользователя.
Пример использования приложения.
Литература.
Приложения (листинги модулей).

ОФОРМЛЕНИЕ ПОЯСНИТЕЛЬНОЙ ЗАПИСКИ

При написании текста пояснительной записки рекомендуется пользоваться положениями,
изложенными в [5; 6].
Текст пояснительной записки курсового проекта выполняют с использованием компьютера на одной стороне листа белой бумаги, формата А4, шрифт Times New Roman 14-го размера, межстрочный интервал — 1,5.
Номер страницы проставляют в правом углу нижней части листа, страницы текстового материала следует нумеровать арабскими цифрами, соблюдая сквозную нумерацию по всему документу. Титульный лист текстового документа (прил. 1) включается в общую нумерацию страниц. Номер страницы на титульном листе не проставляется.
Расстояние от края бумаги до границ текста следует оставлять:
в начале строк 30 мм; в конце строк 10 мм;
от верхней или нижней строки текста до верхнего или нижнего края бумаги 20 мм.
Размер абзацного отступа должен быть одинаковым по всему тексту и равным 12,5 мм.
Разделы должны иметь порядковые номера в пределах всей пояснительной записки, обо­значенные арабскими цифрами. Подразделы должны иметь нумерацию в пределах каждого раздела. Номера подразделов состоят из номера раздела и подраздела, разделенных точкой. В конце номера подраздела точка не ставится. Нумерация пунктов должна состоять из номера раздела, подраздела и пункта, разделенных точкой.
Заголовок разделов, подразделов и пунктов следует печатать с абзацного отступа, с про­писной буквы, без точки в конце, не подчеркивая. Заголовки структурных элементов распо­лагают симметрично тексту и отделяют от текста интервалом в одну строку.
Расстояние между заголовком и текстом должно быть равно трем интервалам, между заго­ловками раздела и подраздела — двум интервалам.
Ссылки на использованные литературные источники должны нумероваться арабскими цифрами по порядку появления в записке и помещаться в квадратные скобки.
30
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]