Министерство образования и науки Российской Федерации
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра экономической информатики
Курсовая работа
по дисциплине «Алгоритмические языки программирования»
Выполнил
студент Пономарёв Д.С.
факультет ВиЗО ФБ
группа 412
Преподаватель:
Анисимов В.А.
Новосибирск 2010
Содержание
ВВЕДЕНИЕ
1. ОПИСАНИЕ ПРОГРАММЫ
2. РУКОВОДСТВО ОПЕРАТОРА
3. ТЕКСТ ПРОГРАММЫ «УЧЕБНАЯ БАЗА ДАННЫХ» НА ИСХОДНОМ ЯЗЫКЕ
ЗАКЛЮЧЕНИЕ
Введение
В данном программном документе приведено описание программы «Учебная база данных», предназначенной для формирования базы данных «Ученики», которая состоит из записей, содержащих следующие поля: «Имя», «Фамилия», «Год рождения», «пол», «вес», «рост». Заложенные в программу функциональные возможности позволяют решать следующие задачи:
· добавление новых записей в базу;
· редактирование занесенных данных;
· удаление записей;
· сортировка данных по различным критериям.
Целью данной курсовой работы является создание базы данных и применение основных действий с базой данных.
описание программа ученик база данных
1. Описание программы
1.1 ОБЩИЕ СВЕДЕНИЯ
1.1.1 Обозначение и наименование программы
Программа «Учебная база данных», имеет следующие атрибуты:
· Наименование исполняемого файла - TEST.EXE
· Размер исполняемого файла - 14 288 байт
1.1.2 Программное обеспечение, необходимое для функционирования программы
Программа должна выполняться под управлением операционной системы DOS 6.0 или более новых версий DOS или Windows
1.1.3 Языки программирования, на которых написана программа
Исходным языком программирования для «Учебной базы данных» является Pascal.
Среда разработки, компилятор – BorlandTurboPascal 7.0
1.2 ФУНКЦИОНАЛЬНОЕ НАЗНАЧЕНИЕ
1.2.1 Классы решаемых задач
Программа предназначена для решения элементарных задач обработки данных, таких, как редактирование и сортировка, а также сохранения данных на диск для возможной последующей обработки или просмотра.
1.2.2 Назначение программы
Используя программу «Учебная база данных» пользователь может добавлять данные об учениках, редактировать или удалять уже имеющуюся информацию, а также сортировать сведения об учениках по росту или весу.
1.3. ОПИСАНИЕ ЛОГИЧЕСКОЙ СТРУКТУРЫ
1.3.1 Алгоритм программы
1.3.1.1 Блок-схема процедуры «
add»
1.3.1.2 Блок-схемапроцедуры «edit»
1.3.1.3. Блок-схема процедуры «
del
»
1.3.1.4 Блок-схема процедуры «sort»
1.3.1.5 Блок-схема программы
1.3.2 Используемые методы
В описываемой программе используется пузырьковый метод сортировки файла.
1.3.3 Структура программы с описанием функций составных частей и связи между ними
Отдельные функции программы оформлены в виде процедур:
· процедура добавления записи в файл;
· процедура редактирования записи;
· процедура удаления записи;
· процедура сортировки файла данных
все перечисленные выше процедуры вызываются при выборе соответствующего пункта меню, реализованного в основной части программы.
1.3.4 Связи программы с другими программами
В программе «Учебная база данных» не используются связи с другими программами.
1.4 ИСПОЛЬЗУЕМЫЕ ТЕХНИЧЕСКИЕ СРЕДСТВА
В состав используемых технических средств входит: IBM PC совместимый с процессором 80386 и выше, ОЗУ не менее 32 Мбайт, 16 МБ видеопамяти, наличие свободного места на жестком диске 10 Мбайт. Для работы в диалоговом режиме используется экран дисплея, клавиатура. Для поддержки графического режима необходим адаптер EGA (VGA).
1.5 ВЫЗОВ И ЗАГРУЗКА
Загрузка и запуск программы осуществляется способами, детальные сведения о которых изложены в Руководстве пользователя операционной системы.
1.6 ВХОДНЫЕ ДАННЫЕ
Входными данными для программы является файл «data.txt», хранящийся в каталоге запуска программы. Это типизированный файл, содержащий записи об учениках.
1.7 ВЫХОДНЫЕ ДАННЫЕ
Выходными данными является выводимая на экран текстовая информация в процессе работы программы (результаты сортировки и редактирования, сообщения об ошибках), а также типизированный файл «data.txt», хранящийся в каталоге запуска программы. В этот файл записываются все изменяемые данные об учениках.
2. Руководство оператора
2.1 Назначение программы
2.1.1Функциональное назначение программы
Используя программу «Учебная база данных» пользователь может добавлять данные об учениках, редактировать или удалять уже имеющуюся информацию, а также сортировать сведения об учениках по росту или весу.
2.1.2 Эксплуатационное назначение программы
Программа предназначена для решения элементарных задач обработки данных, таких, как редактирование и сортировка, а также сохранения данных на диск для возможной последующей обработки или просмотра.
2.1.3 Состав функций
2.1.3.1 Функция добавления записи в файл
Данная функция позволяет пользователю добавлять новые данные об учениках в уже существующую базу данных.
2.1.3.2 Функция редактирования записи
Эта функция позволяет пользователю вносить изменения в уже существующие данные об учениках, давая возможность редактировать все имеющиеся поля данных.
2.1.3.3 Функция удаления записи
Функция удаления дает возможность пользователю удалять ставшие ненужными или ошибочно занесенные в базу данные.
2.1.3.4 Функция сортировки данных
Данная функция предоставляет пользователю сортировать имеющиеся в базе данные выбирая критерии сортировки: по росту или по весу.
2.2 Условия выполнения программы
2.2.1 Минимальный состав аппаратных средств
Минимальный состав используемых технических (аппаратных) средств:
• IBM PC совместимый с процессором 80386 и выше
• ОЗУ более 32 Мбайт
• адаптер EGA (VGA)
• наличие свободного места на жестком диске более 10 Мбайт.
2.2.2 Минимальный состав программных средств
Программа должна выполняться под управлением операционной системы DOS 6.0 или более новых версий DOS или Windows.
2.2.3 Требования к персоналу (пользователю)
Конечный пользователь программы (оператор) должен обладать практическими навыками
работы с графическим пользовательским интерфейсом операционной системы.
2.3 Выполнение программы
2.3.1 Загрузка и запуск программы
Загрузка и запуск программы «Учебная база данных» осуществляется способами, детальные сведения о которых изложены в Руководстве пользователя операционной системы.
2.3.2 Выполнение программы
После запуска программы появляется окно программы, содержащее главное меню программы (рис. 1)
Рисунок
1
Для продолжения работы требуется ввести цифру, соответствующую нужному пункту меню.
2.3.2.1 Выполнение функции добавления записи
Для добавления данных нужно ввести цифру «1» в окне программы указанном на рисунке 1, после чего нажать клавишу «Enter». Далее окно программы примет следующий вид (рис. 2).
Рисунок
2
В ответ на запрос программы пользователь должен ввести запрашиваемые данные, завершая ввод информации нажатием клавиши «Enter». Последовательно вводя данные, которые запрашивает программа, пользователь увидит следующее окно программы (рис. 3).
Рисунок
3
Для продолжения работы и возврата в главное меню (рис. 1) от пользователя требуется нажать на любую клавишу.
2.3.2.2 Выполнение функции редактирования записи
Для добавления данных нужно ввести цифру «2» в окне программы указанном на рисунке 1, после чего нажать клавишу «Enter». Далее окно программы примет следующий вид (рис. 4).
Рисунок
4
Для редактирования показанной на экране записи пользователю нужно нажать на клавишу «Enter». Для возврата в главное меню программы следует нажать на клавишу «Escape», а для перехода к следующей записи — любую клавишу, отличную от «Escape» и «Enter».
После нажатия пользователем клавиши «Enter» окно программы примет следующий вид (рис. 5).
Рисунок
5
Для редактирования какого-либо из перечисленных полей пользователю нужно ввести соответствующую цифру, указанную перед названием этого поля в показанном списке и нажать клавишу «Enter». После этого окно программы будет выглядеть следующим образом (рис. 6)
Рисунок
6
На экране появится текущее значение редактируемого поля и запрос на ввод нового значения. После того как пользователь введет новое значение и нажмет «Enter» окно программы снова примет вид, показанный на рисунке 4.
2.3.2.3 Выполнение функций удаления записи
Для удаления записи нужно ввести цифру «3» в окне программы указанном на рисунке 1, после чего нажать клавишу «Enter». Далее окно программы примет следующий вид (рис. 7).
Рисунок
7
Для удаления записи, данные о которой показываются в окне программы, пользователю требуется нажать клавишу «Enter».
После этого программа удалит текущую запись и на экране отобразятся данные о следующей записи.
Для возврата в главное меню программы нужно нажать клавишу «Escape».
2.3.2.4 Выполнение функций сортировки данных
Для сортировки данных нужно ввести цифру «4» в окне программы указанном на рисунке 1, после чего нажать клавишу «Enter». Далее окно программы примет следующий вид (рис. 8).
Рисунок
8
В данном окне следует выбрать критерий сортировки данных и ввести соответствующую цифру, после чего нажать клавишу «Enter». Программа выведет отсортированный список на экран (рис. 9)
Рисунок
9
Выход в главное меню осуществится после нажатия любой клавиши.
2.3.3 Завершение работы программы
Для завершения работы и выхода из программы необходимо в главном меню программы (рис. 1) ввести цифру «0» и нажать клавишу «Enter». После этого программа закончит работу и выгрузится из оперативной памяти ПК.
2.4 Сообщения оператору
2.4.1 Сообщение «Некорректный ввод данных»
Программа при добавлении или редактировании записи выдает сообщение об ошибке, показанное на рисунке 10.
Рисунок
10
ПРИЧИНА. Данное сообщение появляется, когда пользователь вводит для обозначения пола ученика значения, отличные от букв «м» и «ж».
ДЕЙСТВИЯ ПРОГРАММЫ. Программа не заносит ошибочные данные и повторно запрашивает у пользователя указать пол ученика, используя строчную русскую букву «м» для обозначения мужского пола или строчную русскую букву «ж» для обозначения женского.
ДЕЙСТВИЯ ОПЕРАТОРА. Убедиться в том, что вводятся именно русские строчные буквы «м» или «ж», при необходимости сменить раскладку клавиатуры на русскоязычную.
3. Текст программы «Учебная база данных» на исходном языке
usescrt;
typepupil=record{переменная типа запись для хранения данных об ученике}
fam, name: string[30]; {фамилия, имя}
pol: boolean; {пол, мужской = true}
data, ves, rost: integer; {год рождения, вес, рост}
end;
var p: pupil;
f: file of pupil; {файл записей об учениках}
knc: boolean; {флаг окончания программы}
v: integer; {переменная для хранения выбора пункта меню}
procedureadd; {процедура добавления новой записи в файл}
var u: pupil;
s: string;
n: integer;
pl, ok :boolean;
c: char;
begin
clrscr; {очистка экрана}
writeln('---Добавление записи---'); {вывод информационных надписей на экран}
writeln('Введите фамилию ученика');
readln(s) {считывание введенной пользователем информации}
u.fam := s; {занесение введенной пользователем фамилии ученика в переменную типа запись}
w
readln(s);
u.name := s;
writeln('Укажите пол ученика, если мужской - введите букву "м", если женский - "ж"');
readln(c);
if (c = 'м') or (c = 'ж') thenok := trueelseok := false; {проверка корректности введенных данным о поле ученика}
whilenotokdo {выполняем до тех пор, пока пол не будет верно указан}
begin
writeln('Некорректный ввод данных');
writeln('Вводите строчные русские буквы!');
writeln('Укажите пол ученика, если мужской - введите букву "м", если женский - "ж"');
readln(c);
if (c = 'м') or (c = 'ж') then ok := true else ok := false;
end;
if c = 'м' then pl := true else pl := false;
u.pol := pl;
writeln('Введите год рождения ученика');
readln(n);
u.data := n;
writeln('Введите вес ученика');
readln(n);
u.ves := n;
writeln('Введите рост ученика');
readln(n);
u.rost := n;
reset(f); {открываем файл для чтения}
seek(f, filesize(f)); {устанавливаем указатель на последнюю запись файла}
write(f,u); {дописываем в конец файла запись об ученике}
close(f); {закрываем файл}
writeln('Запись добавлена, нажмите любую клавишу для продолжения');
repeatuntilkeypressed; {ждем, пока не нажата какая-нибудь клавиша}
c := readkey;
end;
procedureedit; {процедура редактирования записи в файле}
var u: pupil;
s: string;
n, i, k: integer;
pl, ok, next: boolean;
c: char;
begin
reset(f); {открываемфайлдлячтения}
k := 0; {устанавливаем начальное значение счетчика}
whilek < filesize(f) do {выполняем пока счетчик меньше количества записей в файле}
begin
seek(f,k); {ищем запись с номером, совпадающим со счетчиком}
clrscr; {очищаем экран}
writeln('---Редактирование записи---');
writeln('Фамилия':15, 'Имя':15, 'Пол':10, 'Год рождения':17, 'Вес':6, 'Рост':6);{выводим заголовки для полей записи}
read(f, u);{считываем запись из файла}
ifu.polthens := 'Мужской' elses := 'Женский'; {переводим логическое обозачение пола в строку}
writeln(u.fam:15, u.name:15, s:10, u.data:17, u.ves:6, u.rost:6);{выводим данные из записи}
writeln;
writeln('Enter - редактирование текущей записи, Esc - выход в меню');
writeln('любая другая клавиша - переход к следующей записи');
repeatuntilkeypressed;{ждем, пока не нажата какая-нибудь клавиша}
c := readkey;
iford(c) = 27 thenexit; {если нажата клавиша ESC, то выходим из процедуры}
next := true;
iford(c) = 13 then {если нажата клавиша Enter, то выполняем следующее}
begin
writeln;
writeln('Выберите поле для редактирования');{выводим информацию о выборе поля для редактирования}
writeln('1 - Фамилия');
writeln('2 - Имя');
writeln('3 - Пол');
writeln('4 - Год рождения');
writeln('5 - Вес');
writeln('6 - Рост');
writeln('0 - Отмена редактирования и переход к следующей записи');
readln(i); {считываем выбор пользователя}
caseiof{в зависимости от выбора пользователя выполняем}
1: begin {если пользователь ввел "1", то редактируем фамилию}
writeln('Старое значение поля "Фамилия" - ', u.fam); {выводим на экран фамилию, указанную в записи}
write('Введите новое значение: '); {выводим запрос для ввода измененной фамилии}
readln(s); {считываем введенное пользователем значение}
u.fam := s; {заносим значение введенное пользователем в запись}
seek(f,k); {ищем запись с номером счетчика в файле}
write(f,u); {записываем измененную запись в файл}
next := false; {устанавливаем признак того, что на следующую запись после редактирования переходить не нужно}
end;
2: begin {если пользователь ввел "2", то редактируем имя}
writeln('Старое значение поля "Имя" - ', u.name);
write('Введите новое значение: ');
readln(s);
u.name := s;
seek(f,k);
write(f,u);
next := false;
end;
3: begin {если пользователь ввел "3", то редактируем пол}
ifu.polthens := 'Мужской' elses := 'Женский'; {переводим логическое обозачение пола в строку}
writeln('Старое значение поля "Пол" - ', s);
writeln('Введите новое значение');
writeln('Укажите пол ученика, если мужской - введите букву "м", если женский - "ж"');
readln(c);
if (c = 'м') or(c = 'ж') thenok := trueelseok := false; {если пользователь ввел некорректное значение обозначения пола, то устанавливаем ложное значение логического переключателя}
whilenotokdo{пока логический переключатель не будет равен истине выполняем цикл}
begin
writeln('Некорректный ввод данных'); {выводим сообщение об ошибке}
writeln('Вводите строчные русские буквы!');
writeln('Укажите пол ученика, если мужской - введите букву "м", если женский - "ж"');
readln(c); {считываем новое введенное пользователем значение}
if (c = 'м') or (c = 'ж') then ok := true else ok := false;
end;
ifc = 'м' thenpl := trueelsepl := false; {переводим символьное обозначение пола в логическое}
u.pol := pl; {заносим логическое значение пола в запись}
seek(f,k); {ищем запись с номером счетчика в файле}
write(f,u); {записываем измененную запись в файл}
next := false; {устанавливаем признак того, что на следующую запись после редактирования переходить не нужно}
end;
4: begin {если пользователь ввел "4", то редактируем год рождения}
writeln('Старое значение поля "Год рождения" - ', u.data);
write('Введите новое значение: ');
readln(n);
u.data := n;
seek(f,k);
write(f,u);
next := false;
end;
5: begin {если пользователь ввел "5", то редактируем вес}
writeln('Старое значение поля "Вес" - ', u.ves);
write('Введите новое значение: ');
readln(n);
u.ves := n;
seek(f,k);
write(f,u);
next := false;
end;
6: begin {если пользователь ввел "6", то редактируем рост}
writeln('Старое значение поля "Рост" - ', u.rost);
write('Введите новое значение: ');
readln(n);
u.rost := n;
seek(f,k);
write(f,u);
next := false;
end;
0: next := true;{если пользователь ввел "0", то устанавливем признак того, что нужно перейти на следующую запись в файле}
end;{case i of}
end; {if ord(c) = 13 then}
ifnexttheninc(k); {если установлен признак перехода, то увеличиваем значение счетчика}
end; {while k <= filesize(f)}
writeln('Вся база данных просмотрена, для возврата в меню нажмите любую клавишу'); {выводим информацию на экран}
repeatuntilkeypressed; {ждем, пока не нажата какая-нибудь клавиша}
close(f);
end;
procedure del; {процедураудалениязаписи}
var u: pupil;
i, k: integer;
next: boolean;
c: char;
s: string;
begin
reset(f); {открываем файл для чтения}
k := 0; {устанавливаем начальное значение счетчика}
whilek < filesize(f) do{выполняем пока счетчик меньше количества записей в файле}
begin
seek(f,k); {ищем запись с номером, совпадающим со счетчиком}
clrscr; {очищаем экран}
writeln('---Удаление записи---');
writeln('Фамилия':15, 'Имя':15, 'Пол':10, 'Год рождения':17, 'Вес':6, 'Рост':6);{выводим заголовки для полей записи}
read(f, u); {считываем запись из файла}
ifu.polthens := 'Мужской' elses := 'Женский'; {переводим логическое обозачение пола в строку}
writeln(u.fam:15, u.name:15, s:10, u.data:17, u.ves:6, u.rost:6); {выводим данные из записи}
writeln;
writeln('Enter - удаление текущей записи, Esc - выход в меню');
writeln('любая другая клавиша - переход к следующей записи');
repeatuntilkeypressed; {ждем, пока не нажата какая-нибудь клавиша}
c := readkey;
iford(c) = 27 thenexit; {если нажата клавиша ESC, то выходим из процедуры}
next := true; {устанавливем признак того, что нужно перейти на следующую запись в файле}
iford(c) = 13 then {если нажата клавиша Enter, то выполняем следующее}
begin
fori := ktofilesize(f) - 2 do {от текущей записи до предпоследней записи файла выполняем}
begin
seek(f, i+1); {ищем следующую за текущей запись в файле}
read(f, u); {считываем найденную запись}
seek(f, i); {ищем текущую запись}
write(f, u); {записываем на её место считанную ранее последующую запись}
end;
ifk = filesize(f) - 1 thenclrscr; {если значение счетчика равно последней записи, то очищаем экран}
seek(f, filesize(f) - 1); {ищем последнюю запись в файле}
truncate(f); {отсекаем часть файла, начиная с текущей записи}
next := false; {устанавливаем признак того, что на следующую запись переходить не нужно}
end; {iford(c) = 13}
ifnexttheninc(k); {если установлен признак перехода, то увеличиваем значение счетчика}
end; {while k < filesize(f) do}
writeln('Вся база данных просмотрена, для возврата в меню нажмите любую клавишу');
repeatuntilkeypressed;{ждем, пока не нажата какая-нибудь клавиша}
close(f);
end;
procedure sort; {процедурасортировкифайла}
var u1, u2: pupil;
i, j, sort_type, p1, p2: integer;
s: string;
c: char;
begin
clrscr; {очищаем экран}
reset(f);{открываем файл для чтения}
writeln('---Сортировка данных---');
writeln('Выберите критерий сортировки');{выводим информацию о выборе критерия сортировки}
writeln('1 - сортировка по росту');
writeln('2 - сортировка по весу');
readln(sort_type);{считываем выбор пользователя}
forj := 1 tofilesize(f) do {начинаем пузырьковую сортировку}
fori := 0 tofilesize(f) - 2 do {количество повторений цикла на 1 меньше размера файла}
begin
seek(f, i); {ищем i-ю запись в файле}
read(f, u1); {считываем найденную запись из файла}
seek(f, i + 1); {ищем следующую за i-й запись в файле}
read(f, u2); {считываем найденную запись из файла}
ifsort_type = 1 then {в зависимости от выбранного критерия сортировки устанавливаем значения переменных, которые будем сравнивать}
begin
p1 := u1.rost; {выбрана сортировка по росту, устанавливаем в переменные значения из поля рост}
p2 := u2.rost;
end
else
begin
p1 := u1.ves; {выбрана сортировка по весу, устанавливаем в переменные значения из поля вес}
p2 := u2.ves;
end;
ifp1 > p2 then {сравниваем между собой значения переменных по которым идет сортировка. в случае, если первое больше второго, то меняем местами записи в файле}
begin
seek(f, i + 1);
write(f, u1);
seek(f, i);
write(f, u2);
end;
end;
clrscr; {очищаем экран}
writeln('---Список учеников, занесенных в базу данных---');
ifsort_type = 1 thenwriteln('сортировка по росту') elsewriteln('сортировка по весу'); {в зависимости от выбранного вида сортировки выводим заголовок}
writeln('Фамилия':15, 'Имя':15, 'Пол':10, 'Год рождения':17, 'Вес':6, 'Рост':6);{выводим заголовки для полей записи}
fori := 0 tofilesize(f) - 1 do {повторяем цикл столько раз, сколько записей содержится в файле}
begin
seek(f, i); {ищем i-ю запись в файле}
read(f, u1);{считываем найденную запись из файла}
ifu1.polthens := 'Мужской' elses := 'Женский'; {переводим логическое обозачение пола в строку}
writeln(u1.fam:15, u1.name:15, s:10, u1.data:17, u1.ves:6, u1.rost:6);{выводим данные из записи}
end;
writeln('Для выхода в главное меню нажмите любую клавишу');
repeatuntilkeypressed;{ждем, пока не нажата какая-нибудь клавиша}
c := readkey;
close(f);
end;
begin
clrscr; {очищаем экран}
assign(f, 'data.txt'); {связываем имя файла данных с файловой переменной}
knc := false; {устанавливаем признак окончания программы в ложное значение}
repeat {повторяем, пока признак окончания программы не станет истинным}
writeln('---База данных "Ученики"---'); {выводим наименование программы и меню}
writeln('Выберите действия:');
writeln('1 - Добавление данных в базу');
writeln('2 - Редактирование данных');
writeln('3 - Удаление записей');
writeln('4 - Сортировка');
writeln('0 - Завершение работы');
write('Ваш выбор: ');
readln(v); {считываем выбор пользователя}
casevof{в зависимости от выбора пользователя выполняем}
1: add; {если пользователь ввел "1", то вызываем процедуру добавления записи}
2: edit; {если пользователь ввел "2", то вызываем процедуру редактирования записи}
3: del; {если пользователь ввел "3", то вызываем процедуру удаления записи}
4: sort; {если пользователь ввел "4", то вызываем процедуру сортировки файла} 0: knc := true; {если пользователь ввел "0", то устанавливаем признак окончания программы в значение истина}
end;
clrscr;{очищаем экран}
until knc;
end.
заключение
В представленном программном документе, в разделе «Назначение программы» указаны сведения о назначении программы и информация, достаточная для понимания функций программы и ее эксплуатации.
В разделе «Условия выполнения программы» указаны условия, необходимые для выполнения программы (минимальный состав аппаратных и программных средств и т.п.).
В данном программном документе, в разделе «Выполнение программы» указана последовательность действий оператора, обеспечивающих загрузку, запуск, выполнение и завершение программы, приведено описание функций, формата и возможных вариантов команд, с помощью которых оператор осуществляет загрузку и управляет выполнением программы, а также ответы программы на эти команды.
В разделе «Сообщения оператору» приведены тексты сообщений, выдаваемых в ходе выполнения программы, описание их содержания и соответствующие действия оператора (действия оператора в случае сбоя и т.п.).
Документация подготовлена согласно ГОСТ 7.32-2001 «Система стандартов по информации, библиотечному и издательскому делу. Отчет о научно-исследовательской работе. Структура и правила оформления», ГОСТ ЕСПД 19.402-78 «Описание программы».