Практическая обработка множества данных, представляющих собой массив указателей на записи
Эта процедура позволяет переходить от одного набора данных ко второму. В процедуру из главной программы передается имя набора данных. В процедуре описана переменная, содержащие имя файла, к которому будет производиться переход. Сперва выводится имя текущего набора данных. Затем появляется запрос на ввод нового имени. После чего переменой со старым именем присваивается значение нового имени. Эта… Читать ещё >
Практическая обработка множества данных, представляющих собой массив указателей на записи (реферат, курсовая, диплом, контрольная)
практическая обработка множества данных, представляющих собой массив указателей на записи
- Введение
- 1.Описание программы
- 1.1 Описание главной программы и перечень модулей
- 1.2 Модуль menumod. tpu
- 1.3 Модуль RabotaND. tpu
- 1.4 Модуль RabotaDR. tpu
- 2.Проверка работы программы
- 2.1 Создание нового набора данных
- 2.2 Добавление новых элементов в конец НД
- 2.3 Просмотр всех элементов НД
- 2.4 Поиск элемента по номеру
- 2.5 Переход к работе с другим НД
- 2.6 Создание нового НД из всех элементов с заданным значением ключевого поля.
- 2.7 Сохранение всех элементов в другом НД
- Заключение
- Список использованных источников
- Приложение А
- Введение
- Целью данной курсовой работы является практическая обработка множества данных, представляющих собой массив указателей на записи.
- В программе необходимо реализовать следующие запросы к заданному множеству данных:
Создание НД.
Добавление новых элементов в конец НД.
Просмотр всех элементов НД.
Поиск элемента по номеру (позиционирование текущего элемента).
Переход к работе с другим НД.
Дополнительно, в соответствии с моим вариантом (18 вариант), необходимо выполнить реализацию следующих запросов:
Создание нового НД из всех элементов с заданным значением ключевого поля.
Сохранение всех элементов в другом НД.
Множество данных должно представлять собой информацию о марках телевизорах:
название (string);
размер по диагонали (integer);
средняя стоимость (real);
тип: цветной, черно-белый, переносной (перечислимый тип).
В работе должны быть соблюдены следующие условия и ограничения:
Главную процедуру программы с реализацией простейшего меню следует определить в отдельном модуле.
Процедуры, реализующие запросы, должны быть размещены в одном или более модулях.
Глобальные данные: Спецификация файла. Никаких других глобальных переменных использовать нельзя.
Вместе с меню на экране должно быть отображено:
номер текущего элемента;
содержимое текущего элемента.
На экран выводить элементы в виде таблицы (один элемент — одна строка таблицы).
Если после выполнения запроса изменяется хотя бы один элемент, то заканчивать запрос выводом всего множества элементов.
Тестами к заданиям служат 2 НД с правдоподобной информацией.
Описание программы
1.1 Описание главной программы и перечень модулей
Программа состоит из трех модулей и главной программы. Все подпрограммы, которые выполняют необходимые запросы по работе с НД, находятся в трех модулях (MenuMod, RabotaND, RabotaDR).
В начале работы программы мы указываем набор данных, с которым будем работать. Затем на экране отображается вертикальное меню. В этом меню будут указаны все запросы, которые пользователь может выполнить с набором данных. При выборе пункта меню «Выход» работа программы будет закончена. Вместе с меню на экране отображается номер текущего элемента и его содержимое.
В главной программе также происходит заполнение массива пунктов меню значениями.
Код главной программы:
Uses Crt, MenuMod, RabotaND, RabotaDR;
begin
clrscr;
{Ввод имени файла}
{Инициализация переменной для обозначения текущего элемента}
{Заполнение массива пунктов меню значениями}
repeat
{Вывод на экран текущих НД и элемента}
Vivod_Tek (FileName, tek);
{Вывод меню}
My_Meny (mas, 2,2,punkt);
{Выполнение процедур в зависимости от выбраного пункта}
case punkt of
1: {Создание нового НД и его просмотр}
2: {Добавление новых элементов в конец НД и его просмотр}
3: {Просмотр всех элементов НД}
4: {Поиск элемента}
5: {Переход к работе с другим НД и просмотр его содержимого}
6: {Создание нового НД из всех элементов с заданным значением ключе-вого поля.}
7: {Cохранение всех элементов в другом НД}
Sohr_v_nov (FileName);
end;
{Цикл выполняется до того, как будет нажат ESC}
until answ=#27;
end.
1.2 Модуль menumod. tpu
Данный модуль содержит подпрограмму, которая прорисовывает на экран вертикальное меню для выполнения запросов пользователя. Для навигации в данном меню используются клавиши «вверх», «вниз», «enter» и «esc» на клавиатуре.
Описательная часть данного модуля:
Unit menumod;
interface
uses crt;
type Massiv=array [1.25] of string;
var mas: massiv;
В данном модуле тип Massiv это массив пунктов меню, а переменная, принадлежащая этому типу, является пунктом меню.
В модуле есть одна процедура:
procedure My_Meny (Mas:Massiv; var punkt: byte);
В процедуру из главной программы передаются массив пунктов меню, состоящий из следующих значений:
Mas[1]: ='1:Создать новый НД';
Mas[2]: ='2:Добавить новые элементы в конец НД';
Mas[3]: ='3:Просмотреть все элементы НД';
Mas[4]: ='4:Поиск элемента по номеру ';
Mas[5]: ='5:Перейти к работе с другим НД';
Mas[6]: ='6:Создание нового НД из всех элементов с заданным значением ключе-вого поля.';
Mas[7]: ='7:Cохранение всех элементов в другом НД';
Из процедуры в главную программу передается значение переменной punkt, в соответсвии с которой выбирается один из пунктов оператора CASE и соответственно происходит выполнение определенных процедур в главной программе.
В процедуре описаны следующие переменные и константы:
Х и у — Переменные для позиционирования левого верхнего угла окна, в котором будет выводиться меню.
Х1 и У1 — Переменные для позиционирования правого нижнего угла окна, в котором будет выводиться меню.
К — Количество пунктов меню.
Otv — переменная в которой находиться код нажатой клавиши.
Pred — Предыдущий для выбранного пункта меню
Max_dlin — Длина самой большой строки.
Процедура передает в главную программу переменную punkt.
procedure My_Meny;
const x=1;
y=1;
k=7;
var i, pred, Max_dlin:integer;
otv:char;
x1,y1:byte;
Сначала все строки сравниваются и находится самая длинная строка. После этого строки дополняются до этой длины путем добавления пробелов. Затем вычисляются координаты правого нижнего угла окна, которое затем и прорисовывается процедурой window из стандартного модуля Crt. После в созданное окно выводится массив пунктов меню и подсвечивается первая позиция. Далее в цикле происходит считывание кода нажатой клавиши и в соответствии с кодом происходит присвоение переменной punkt определенного значения, а затем подсветка выбранного пункта.
begin
{Инициализация переменных}
{Определенние максимальной длины строки}
{Дополнение всех строк до максимальной}
{Расчет координат X1 и Y1}
{Прорисовка меню}
window (x, y, x1,y1);
For I:=1 to k do
begin
GotoXY (x, i);
Write (Mas[i]);
end;
{end for}
punkt:=1;
GotoXY (x, 1);
{Подсветка первого поля меню}
Write (Mas[1]);
Repeat
Otv:=Readkey;
If Otv=#0 then Otv:=Readkey;
{end If}
{Реакция на нажатие клавиш}
Case Otv of
#27: {Нажатие клавиши esc}
{Выход}
#13: {Нажатие клавиши enter}
{Прорисовка нормального окна и выход из процедуры}
#80: {Нажатие клавиши вниз}
{Если был выбран последний пункт меню, то происходит переход на первый пункт, иначе перемещается вниз}
#72: {Нажатие клавиши ввверх}
{Если был выбран не первый пункт, то поднимаемся вверх, иначе перемещаемся на последний пункт}
end;
{Прорисовка поля меню в исход-ный цвет}
{Подсветка следующего выбранного поля меню}
until False
{end Repeat}
end;
end.
1.3 Модуль RabotaND. tpu
Этот модуль содержит пять процедур для работы с набором данных.
Заголовок и описательная часть данного модуля представлены ниже:
unit RabotaND;
interface
uses menumod;
type
{Спецификация файла}
Tip=(cvet, gherno_bel, perenosn);
Televizor=record
nazvanie:string;
razmer:integer;
sr_stoimist:real;
TipTelevizor:Tip;
end;
var
File1, Filekl, Filenov: File of Televizor;
FileName, Filenamekluch, filenamenov, FilenamenovND: string;
TVzap:Televizor;
n:integer;
otv1, punkt, Otv, tek, numb: byte;
otv2, k: string;
answ:char;
В модуле описана спецификация файла и следующие переменные:
File1, Filekl, Filenov — Переменные файлового типа
FileName, Filenamekluch, filenamenov, FilenamenovND — Переменные, содержащие имена файлов.
TVzap — Переменная типа запись
N — Переменная, которая используется для обозначения текущего элемента из НД.
Процедуры, которые содержатся в модуле:
{Процедура для вывода текущего элемента}
procedure Vivod_Tek (var Filename: string; n: integer);
{Процедура создания нового набора данных}
procedure Sozdat_ND (var Filename: string; var n: integer);
{Процедура добавление элемента в конец набора данных}
procedure Dobavit_ND (var Filename: string; var n: integer);
{Процедура для просмотра содержимого набора данных}
procedure Prosmotr_ND (var Filename: string; var n: integer);
{Процедура для поиска элемента по введеному номеру}
procedure Poisk_Elem_ND (var Filename: string; var n: integer);
Процедура, которая создает новый набор данных:
procedure Sozdat_ND;
var i, kol: integer;
begin
{Ввод имени нового набора данных}
{Связывание файловой переменной с НД на диске}
{Открытие файла для записи}
{Ввод количества записей (kol)}
for i:=1 to kol do
begin
{Ввод данных}
{Запись одной записи в НД}
write (File1,TVzap);
end;
{Закрытие файла}
{Изменение имени файла}
end;
{end procedure Sozdat_ND}
В процедуру из главной программы передается только имя старого набора данных. В главную программу из процедуры передается имя нового набора данных и номер текущего элемента.
В процедуре создается и открывается для записи новый набор данных, затем в него вводится заданое количество записей. После создания НД он закрывается, а текущим элементом становится последний введенный элемент.
Процедура добавление элемента в конец набора данных:
procedure Dobavit_ND;
begin
numb:=n+1;
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Поиск конца файла}
{Цикл для записи данных, который будет выполнятся пока пользователь не введет «No"}
while Otv2 <> 'No' do
begin
{Ввод данных}
{Запись одной записи в НД}
write (File1,TVzap);
{Запрос на окончание заполнения}
writeln ('Продолжить заполнение?(YesNo)');
readln (Otv2);
end;
{Присвоение номера текущего элемента}
n:=numb;
{Закрытие файла}
end;
{end procedure Dobavit_ND}
В процедуру из главной программы передается имя набора данных. В главную программу из процедуры передается номер текущего элемента.
В процедуре происходит открытие набора данных, затем нахождение его конца стандартной процедурой seek, после чего происходит запись элементов в конец НД. После каждого записанного элемента выводится запрос на окончание записи.
Процедура для просмотра содержимого набора данных:
procedure Prosmotr_ND;
begin
{Связывание файловой переменной с НД на диске}
assign (File1, Filename);
{Открытие файла для чтения}
reset (File1);
{Вывод имени текущего набора данных}
{Вывод шапки таблицы}
{Пока не закончится файл — вывод элементов в таблицу}
while not eof (File1) do
begin
{чтение одной записи из файла}
Read (File1,TVzap);
{Выбор строки в зависимости от значения перечислимого типа}
case TVzap. tipTelevizor of
cvet:k:=' Цветной';
gherno_bel:k:=' Черно-белый';
perenosn:k:=' Переносной';
end;
{Вывод содержимого записи}
write ('¦', numb:5,'¦');
write (TVzap.nazvanie:18,'¦');
write (TVzap.razmer:8,'¦');
write (TVzap.sr_stoimist:16:1,'¦');
writeln (k,'¦');
{Вывод нижней границы таблицы}
{Присвоениею текущему номер последнего показанного элемента}
end;
{Закрытие файла}
close (file1);
end;
В процедуру из главной программы передается имя набора данных. В главную программу из процедуры передается номер текущего элемента. После открытия набора данных процедура выводит его имя, затем шапку таблицы. Следуюющие действия выполняются в цикле, котороый будет выполнятся пока не закончится данный набор данных. В зависимости от значения переменной перечислимого типа в поле tipTelevizor оператором case просиходит присвоение переменной К определнного значения (цветной, черно-белый или переносной). После чего просиходит вывод элементов на экран. В конце переменной, содержащей номер текущего элемента, присваивается значение последнего элемента и набор данных закрывается.
Процедура для поиска элемента по введеному номеру
procedure Poisk_Elem_ND;
begin
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Запрос на ввод номера нужной записи}
writeln ('Введите номер нужной записи');
readln (n);
{Поиск нужной записи}
seek (File1,n-1);
{Чтение записи из файла}
read (File1,TVzap);
{Присвоение переменной К значения в зависимости от значениея переменной перечислимого типа}
{Вывод шапки таблицы}
{Вывод элемента}
{Вывод нижней границы таблицы}
{Закрытие файла}
{Присовение нужного номера текущему элементу}
N:=n+1;
end;
{end procedure Poisk_Elem_ND}
Эта процедура обрабатывает запрос пользователя на поиск элемента в НД по его порядковому номеру и выводит информацию о данном элементе. В процедуру из главной программы передается имя набора данных. В главную программу из процедуры передается номер текущего элемента. После открытия набора данных процедура запращивает номер элемента, который следует найти. Затем процедурой seek (File1,n-1) в файле находится нужная запись. Эта запись выводится как единственный элемент таблицы и текущему значению присваивается номер элемента, который искали, плюс один. После вывода файл закрывается.
Процедура для вывода текущего элемента:
procedure Vivod_Tek;
begin
{Присвоение выводимому номеру номер текущего элемента}
numb:=n;
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Поиск нужной записи}
seek (File1,numb-1);
{Чтение записи из файла}
{Присвоение переменной К значения в зависимости от значениея переменной перечислимого типа}
{Вывод шапки таблицы}
{Вывод элемента}
{Вывод нижней границы таблицы}
{Закрытие файла}
close (file1);
end;
В процедуру из главной программы передается имя набора данных и номер текущего элемента. Поиск и вывод элемента происходит так же, как в процедуре для поиска элемента по введеному номеру procedure Poisk_Elem_ND.
1.4 Модуль RabotaDR. tpu
Этот модуль содержит три процедуры, в которых происходи обращение или переход к работе с другим набором данных
Заголовок и описательная часть данного модуля представлены ниже:
unit RabotaDR;
interface
uses RabotaND;
Этот модуль требует подключения описанного ранее модуля RabotaND, так как в нем описано большенство переменных, которые используются в модуле RabotaDR. Никаких собственных переменных в модуле RabotaDR не описано.
В данному модуле находятся следующие процедуры:
{Процедура для перехода к друому НД}
procedure Perehod_Drug_ND (var Filename: string;);
{Процедура создания нового НД из всех элементов с заданным значением ключе-вого поля}
procedure Sozdat_ND_kl (var Filename: string; var n: integer);
{Процедура сохраниения всех элементов в другом НД}
procedure Sohr_v_nov (var Filename: string; var n: integer);
Процедура для перехода к друому НД:
procedure Perehod_Drug_ND;
var DifFilename: string;
begin
{Вывод имени текущего набора данных}
writeln ('Ваш текущий набор данных — ', Filename);
{Запрос на вывод нового адреса НД}
writeln ('Введите путь к необходимому набору данных');
readln (DifFilename);
{Замена имени старого набора данных на имя нового набора}
Filename:=DifFilename;
{Вывод имени текущего набора данных}
writeln ('Ваш новый набор данных — ', filename);
end;
{end procedure Perehod_Drug_ND;}
Эта процедура позволяет переходить от одного набора данных ко второму. В процедуру из главной программы передается имя набора данных. В процедуре описана переменная, содержащие имя файла, к которому будет производиться переход. Сперва выводится имя текущего набора данных. Затем появляется запрос на ввод нового имени. После чего переменой со старым именем присваивается значение нового имени. Эта переменная, уже с новым именем, передается обратно в основную программу.
Процедура создания нового НД из всех элементов с заданным значением ключевого поля:
procedure Sozdat_ND_kl;
{Запрос ключевого поля}
var z: Tip;
vibor_tipa: byte;
begin
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Запрос на ввод имени файла, который будут сохранены элементы с заданым ключевым полем }
{Связывание второй файловой переменной со вторым НД на диске}
{Открытие второго файла для записи}
{Запрос на значение ключевого поля}
{Выбор значения перечислимого типа в зависимости от выбранного пользователем типа}
case vibor_tipa of
1: z:=cvet;
2: z:=gherno_bel;
3: z:=perenosn;
end;
{Пока не достигнут конец файла, поиск}
while not eof (file1) do
begin
{Чтение одной записи}
read (File1,TVzap);
{Если содержимое ключевого поля совпадает с нужным}
if TVzap. TipTelevizor = z then
{Запись записи в новый файл}
Write (Filekl, TVzap);
end;
{Закрытие файлов}
{Изменение имени файла, с которым будет продолжаться работа}
Filename:=filenamekluch;
end;
В процедуру из главной программы передается имя набора данных, из которого мы будем записывать элементы. В процедуре описаны следующие переменные:
Z — переменная перечислимого типа для выбора ключевого поля.
vibor_tipa — для выполнения запроса о значении ключевого поля.
Процедура запрашивает имя нового набора данных, в который будут записаны элементы с выбранным значением ключевого поля. Потом просходит выбор нужного значения ключевого поля. Затем в цикле выполняется считываение одной записи из первого файла, и, если значение ее ключевого поля соответсвует нужному, этот элемент записывается в новый файл. После достижения конца файла, оба файла закрываются.
Процедура сохраниения всех элементов в другом НД:
procedure Sohr_v_nov;
{Запрос ключевого поля}
begin
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Запрос имени второго НД}
{Связывание файловой переменной со вторым НД на диске}
{Открытие второго файла}
{Переход в конец второго файла}
seek (Filenov, filesize (Filenov));
{Пока недостигнут конец файла}
while not eof (file1) do
begin
{Чтение из первого файла}
{Запись во второй файл}
end;
{Закрытие двух файлов}
N:=1;
end;
Данная процедура обеспечивает сохранение всех элементов текущего набора данных в другом. В процедуру из главной программы передается имя набора данных, из которого будет производиться сохранение. Процедура запрашивает имя файла, в который будет производиться запись, устанавливает указатель в его конце. Далее одна запись читается из первого файла и записывается во второй. Когда достигается конец первого файла, цикл заканчивается, и оба файла закрываются.
2 Проверка работы программы
2.1 Создание нового набора данных
После запуска программы следует ввести имя файла, с которым будет производиться работа. Это представлено на рисунке 1.
Рисунок 1 — Ввод пути к файлу После того, как мы ввели имя файла на экране появиться вертикальное меню с запросами. Также там выводится имя текущего НД, а так же информацию о номере текущего элемента и его содержимом. Это всё изображено на рисунке 2.
Рисунок 2 — Первоначальный запуск Выберем пункт меню «Создать новый НД» и нажмем клавишу «Enter». Теперь нам следует ввести имя нового файла и количество записей, которое мы планируем в него занести. Это изображено на рисунке 3.
Рисунок 3 — Ввод имени нового файла и количества записей Затем мы по очереди вводим все записи. Процесс представлен на рисунке 4
Рисунок 4 — Исходное состояние НД После того, как мы ввели последний элемент, программа автоматически выводит содержимое только что созданного файла в виде таблицы, которую мы можем видеть на рисунке 5.
Рисунок 5 — Вывод содержимого файла
Для того, чтобы вернуться к основному меню, следует нажать клавишу Enter.
2.2 Добавление новых элементов в конец НД
В меню выберем пункт «Добавить новый элемент в конец НД» и нажмем клавишу «Enter». Для примера, введем название телевизора «Philips 32», размер телевизора «32», среднюю стоимость «560», а тип телевизора выберем «цветной», введя для этого цифру 2 и нажав «Enter». Результат ввода предоставлен на рисунке 6.
Рисунок 6 — Процесс добавления элемента в конец НД Элемент будет внесен в список на последнее место и на экран будет выведен уже обновленный НД. Результат изображён на рисунке 7.
Рисунок 7 — Результат выполнения запроса «Добавление нового элемента в конец НД»
После того, как мы вернемся обратно в меню, мы можем увидеть, что теперь на экране в качестве текущего выводится тот элемент, который мы только что ввели. Это изображено на рисунке 8
Рисунок 8 — Меню после запроса Для возврата к основному меню, следует нажать клавишу Enter.
2.3 Просмотр всех элементов НД
Для того, чтобы просмотреть все элементы НД, следует выбрать в меню пункт «Просмотреть все элементы НД» и нажать клавишу «Enter». После этого на экран будет выведено имя текущего НД и его содержимое виде таблицы. Вывод всех элементов набора данных «D:2ND.dat» представлен на рисунке 9.
Рисунок 9 — Просмотр всех элементов НД
2.4 Поиск элемента по номеру
Выберем пункт меню «Поиск элемента по номеру» и нажмем клавишу. Введём номер элемента для поиска. Допустим, мы ввели номер «3». В результате на экран будет выведена информация о 3-ем элементе. Результат изображён на рисунке 10.
Рисунок 10 — Ввод номера элемента для поиска На рисунке 11 изображено состояние главного меню после запроса. Мы можем видеть, что текущим элементом стал тот, который мы искали.
Рисунок 11 — Меню после запроса
2.5 Переход к работе с другим НД
Изначально мы работали с НД «D:2ND.dat». Допустим, мы хотим перейти к работе с НД «D:1ND.dat». Для этого выберем пункт меню «Перейти к работе с другим НД» и нажмем клавишу «Enter». Программа вывела имя текущего набора данных и нам надо ввести имя нового набора данных, Результат изображён на рисунке 12.
Рисунок 12 — Ввод имени нового НД
После этого происходит переход к новому НД и сразу автоматически выводится его содержимое. Это изображено на рисунке 13
Рисунок 13 — Содержимое НД, к которому был произведен переход
2.6 Создание нового НД из всех элементов с заданным значением ключевого поля
Выберем пункт меню «Создание нового НД из всех элементов с заданным значением ключевого поля» и нажмем клавишу «Enter». На экране будет предложено выбрать значение ключевого поля. Можно выбрать один из трех типов телевизоров: Цветной, Черно-белый и Переносной. Например, нам нужно создать новый файл, в котором будут храниться записи только о цветных телевизорах. Поэтому мы сначала введем имя нового файла, а затем выберем «1».
Рисунок 14 — Создание файла, в котором будут сохранены элементы с заданным значеним ключевого поля Для сравнения, на рисунке 15 изображено содержание начального набора данных.
После того, как мы выберем значение ключевого поля и нажмем «Enter», мы можем увидеть содержимое нового файла, в который скопированы записи с заданным значением ключевого поля. Это изображено на рисунке 16
Рисунок 15 — Исходный НД Рисунок 16 — Созданный НД
2.7 Сохранение всех элементов в другом НД
Выберем пункт меню «Сохранение всех элементов в другом НД» и нажмем клавишу «Enter». Программа запросит имя НД, в который следует скопировать текущий. Это изображено на рисунке 17
Рисунок 17 — Запрос на имя нового файла На рисунках 18 и 19 изображены два исходных файла, а на рисунке 20 мы можем видеть файл после копирования в него другого.
Рисунок 18 — Первый набор данных Рисунок 19 — Второй набор данных Рисунок 20 — Результат выполнения запроса «Сохранение всех элементов в другом НД»
Заключение
программа данное множество В результате разработки курсовой работы, была создана программа для работы с набором данных. Эта программа может создать НД в виде записей и напрямую записать их в файл. Также с помощью программы можно просматривать уже созданные наборы данных. Реализован поиск элемента в файле по его номеру и добавление элементов в конец уже созданного НД. Возможен переход от работы с одним НД к другому и копирование содержимого одного файла в другой. Также, в соответствии с индивидуальным заданием, возможно создание нового НД из всех элементов с заданным значением ключевого поля.
Все условия и ограничения, описанные в задачах и целях данной курсовой работы, были соблюдены. Как было установлено во второй главе, вся работа с НД выполняется корректно.
Список использованных источников
1.Зуев Е. А. Программирование на языке Turbo Pascal 6.0,7.0,/ Е.А. Зуев// М.:Веста, Радио и связь, 1993. — 376с.
2.
Введение
в программирование [Текст]: учеб. пособие для вузов по направлению и специальности «Асои» [Текст] / Л. В. Шапоров [и др.]; под ред. И. В. Фленов. — М.: Высшая школа, 2005. — 601 с.
3.Свободная энциклопедия ВикипедиЯ [Электронный ресурс]. — 2011. — Режим доступа: http://ru.wikipedia.org. — Дата доступа: 15.05.2011.
Приложение А
ПОЛНЫЙ КОД ПРОГРАММНОГО КОМПЛЕКСА
Листинг основной программы:
Uses Crt, MenuMod, RabotaND, RabotaDR;
begin
clrscr;
{Ввод имени файла}
write ('Введите путь к файлу: ');
readln (Filename);
{Инициализация переменной для обозначения текущего элемента}
N:=2;
{Заполнение массива пунктов меню значениями}
Mas[1]: ='1:Создать новый НД';
Mas[2]: ='2:Добавить новые элементы в конец НД';
Mas[3]: ='3:Просмотреть все элементы НД';
Mas[4]: ='4:Поиск элемента по номеру ';
Mas[5]: ='5:Перейти к работе с другим НД';
Mas[6]: ='6:Создание нового НД из всех элементов с заданным значением ключе-вого поля.';
Mas[7]: ='7:Cохранение всех элементов в другом НД';
repeat
clrscr;
{Вывод на экран текущих НД и элемента}
textcolor (14);
gotoxy (1, 9);
writeln ('Текущий НД — ', Filename);
gotoxy (1,12);
writeln ('Номер текущего элемента — ', n-1);
gotoxy (1,13);
writeln ('Содержание текущего элемента:');
gotoxy (1,14);
tek:=n-1;
Vivod_Tek (FileName, tek);
gotoxy (2,2);
{Вывод меню}
My_Meny (mas, punkt);
textcolor (LightCyan);
{Выполнение процедур в зависимости от выбраного пункта}
case punkt of
1: {Создание нового НД и его просмотр}
begin
Sozdat_ND (FileName, n);
Prosmotr_ND (FileName, n);
end;
2: {Добавление новых элементов в конец НД и его просмотр}
begin
Dobavit_ND (FileName, n);
Prosmotr_ND (FileName, n);
end;
3: {Просмотр всех элементов НД}
Prosmotr_ND (FileName, n);
4: {Поиск элемента}
Poisk_Elem_ND (FileName, n);
5: {Переход к работе с другим НД и просмотр его содержимого}
begin
Perehod_Drug_ND (FileName);
Prosmotr_ND (FileName, n);
end;
6: {Создание нового НД из всех элементов с заданным значением ключе-вого поля.}
begin
Sozdat_ND_kl (FileName, n);
Prosmotr_ND (FileName, n);
end;
7: {Cохранение всех элементов в другом НД}
Sohr_v_nov (FileName, n);
end;
writeln ('Для возврата нажмите Enter, для выхода нажмите Esc');
answ:=Readkey;
{Цикл выполняется до того, как будет нажат ESC}
until answ=#27;
end.
Листинг модуля menumod:
unit menumod;
interface
uses crt;
type Massiv=array [1.7] of string;
var mas: massiv;
procedure My_Meny (Mas:Massiv; var punkt: byte);
implementation
procedure My_Meny;
const x=1;
y=1;
k=7;
var i, pred, Max_dlin:integer;
otv:char;
x1,y1:byte;
begin
{Инициализация переменных}
; pred:=0; max_dlin:=0;
{Определенние максимальной длины строки}
for i:=1 to k do
if length (Mas[i])>max_dlin then max_dlin:=length (Mas[i]);
{end if}
{end for}
{Дополнение всех строк до максимальной}
for i:=1 to k do
while length (Mas[i])<>max_dlin do Mas[i]: =Mas[i]+' ';
{end while}
{end for}
{Расчет координат X1 и Y1}
x1:=max_dlin+x+3;
y1:=k+y+3;
{Прорисовка меню}
window (x, y, x1,y1);
For I:=1 to k do
begin
GotoXY (x, i);
Write (Mas[i]);
end;
{end for}
punkt:=1;
GotoXY (x, 1);
Textbackground (DarkGray);
textcolor (0);
{Подсветка первого поля меню}
Textbackground (Blue);
Textcolor (15);
Write (Mas[1]);
Repeat
pred:=punkt;
Otv:=Readkey;
If Otv=#0 then Otv:=Readkey;
{end If}
{Реакция на нажатие клавиш}
Case Otv of
{Нажатие клавиши esc}
#27:begin
punkt:=0;
Halt (0)
end;
{Нажатие клавиши enter}
#13: begin
window (1, 1, 80, 25);
Textbackground (black);
Textcolor (10);
clrscr;
Exit;
end;
{Нажатие клавиши вниз}
#80: If punkt
else punkt:=1;
{end If}
{Нажатие клавиши ввверх}
#72: If punkt>1 then punkt:=punkt-1
else punkt:=k;
{end If}
end;
{Прорисовка поля меню в исход-ный цвет}
GotoXY (x, pred);
Textbackground (DarkGray);
Textcolor (yellow);
Write (Mas[pred]);
{Подсветка следующего выбранного поля меню}
GotoXY (x, punkt);
Textbackground (Blue);
Textcolor (15);
Write (Mas[punkt]);
until False
{end Repeat}
end;
end.
Листинг модуля RabotaND:
unit RabotaND;
interface
uses menumod;
type
{Спецификация файла}
Tip=(cvet, gherno_bel, perenosn);
Televizor=record
nazvanie:string;
razmer:integer;
sr_stoimist:real;
TipTelevizor:Tip;
end;
var
File1, Filekl, File2: File of Televizor;
FileName, Filenamekluch, filenamenov, FilenamenovND: string;
TVzap:Televizor;
n:integer;
otv1, punkt, Otv, tek, numb: byte;
otv2, k: string;
answ:char;
{Процедура для вывода текущего элемента}
procedure Vivod_Tek (var Filename: string; n: integer);
{Процедура создания нового набора данных}
procedure Sozdat_ND (var Filename: string; var n: integer);
{Процедура добавление элемента в конец набора данных}
procedure Dobavit_ND (var Filename: string; var n: integer);
{Процедура для просмотра содержимого набора данных}
procedure Prosmotr_ND (var Filename: string; var n: integer);
{Процедура для поиска элемента по введеному номеру}
procedure Poisk_Elem_ND (var Filename: string; var n: integer);
implementation
procedure Sozdat_ND;
var i, kol: integer;
begin
{Ввод имени нового набора данных}
writeln ('Введите имя нового набора данных: ');
readln (FilenamenovND);
{Связывание файловой переменной с НД на диске}
assign (File1, FilenamenovND);
{Открытие файла для записи}
rewrite (File1);
{Ввод количества записей}
write ('Количество записей: ');
readln (kol);
numb:=1;
for i:=1 to kol do
begin
{Ввод данных}
write ('Название телевизора: ');
readln (TVzap.nazvanie);
write ('Размер телевизора: ');
readln (TVzap.razmer);
write ('Средняя стоимость: ');
readln (TVzap.sr_stoimist);
write ('Тип телевизора (1: Цветной; 2: Черно-белый; 3: Переносной): ');
readln (otv1);
case otv1 of
1:TVzap.TipTelevizor:=cvet;
2:TVzap.TipTelevizor:=gherno_bel;
3:TVzap.TipTelevizor:=perenosn;
end;
numb:=numb+1;
n:=numb;
{Запись одной записи в НД}
write (File1,TVzap);
end;
{Закрытие файла}
close (File1);
{Изменение имени файла}
Filename:=FilenamenovND;
end;
{end procedure Sozdat_ND}
procedure Dobavit_ND;
begin
numb:=n+1;
{Связывание файловой переменной с НД на диске}
assign (File1, Filename);
{Открытие файла для чтения}
reset (File1);
{Поиск конца файла}
seek (File1,filesize (File1));
while Otv2 <> 'No' do
begin
{Ввод данных}
write ('Название телевизора: ');
readln (TVzap.nazvanie);
write ('Размер телевизора: ');
readln (TVzap.razmer);
write ('Средняя стоимость: ');
readln (TVzap.sr_stoimist);
write ('Тип телевизора (1: Цветной; 2: Черно-белый; 3: Переносной);');
readln (otv1);
case otv1 of
1:TVzap.TipTelevizor:=cvet;
2:TVzap.TipTelevizor:=gherno_bel;
3:TVzap.TipTelevizor:=perenosn;
end;
numb:=numb+1;
{Запись одной записи в НД}
write (File1,TVzap);
writeln ('Продолжить заполнение?(YesNo)');
readln (Otv2);
end;
n:=numb;
{Закрытие файла}
close (File1);
end;
{end procedure Dobavit_ND}
procedure Prosmotr_ND;
begin
{Связывание файловой переменной с НД на диске}
assign (File1, Filename);
{Открытие файла для чтения}
reset (File1);
{Вывод имени текущего набора данных}
writeln ('Ваш набор данных: ', Filename);
numb:=1;
{Вывод шапки таблицы}
writeln ('г=====T==================T========T================T======================');
writeln ('¦ # ¦ Название ¦ Размер ¦ Ср. стоимость ¦ Тип ¦');
writeln ('¦=====+==================+========+================+======================¦');
{Пока не закончится файл — вывод элементов в таблицу}
while not eof (File1) do
begin
{чтение одной записи из файла}
Read (File1,TVzap);
{Выбор строки в зависимости от значения перечислимого типа}
case TVzap. tipTelevizor of
cvet:k:=' Цветной';
gherno_bel:k:=' Черно-белый';
perenosn:k:=' Переносной';
end;
{Вывод содержимого записи}
write ('¦', numb:5,'¦');
write (TVzap.nazvanie:18,'¦');
write (TVzap.razmer:8,'¦');
write (TVzap.sr_stoimist:16:1,'¦');
writeln (k,'¦');
writeln ('L=====¦==================¦========¦================¦======================-');
{Присвоениею текущему номер последнего показанного элемента}
numb:=numb+1;
n:=numb;
end;
{Закрытие файла}
close (file1);
end;
procedure Poisk_Elem_ND;
begin
{Связывание файловой переменной с НД на диске}
assign (File1, Filename);
{Открытие файла для чтения}
reset (File1);
{Запрос на ввод номера нужной записи}
writeln ('Введите номер нужной записи');
readln (n);
{Поиск нужной записи}
seek (File1,n-1);
{Чтение записи из файла}
read (File1,TVzap);
{Присвоение переменной К значения в зависимости от значениея переменной перечислимого типа}
case TVzap. tipTelevizor of
cvet:k:=' Цветной';
gherno_bel:k:=' Черно-белый';
perenosn:k:=' Переносной';
end;
{Вывод шапки таблицы}
writeln ('г=====T==================T========T================T======================');
writeln ('¦ # ¦ Название ¦ Размер ¦ Ср. стоимость ¦ Тип ¦');
writeln ('¦=====+==================+========+================+======================¦');
{Вывод элемента}
write ('¦', n:5,'¦');
write (TVzap.nazvanie:18,'¦');
write (TVzap.razmer:8,'¦');
write (TVzap.sr_stoimist:16:1,'¦');
writeln (k,'¦');
{Вывод нижней границы таблицы}
writeln ('L=====¦==================¦========¦================¦======================-');
{Закрытие файла}
close (file1);
{Присовение нужного номера текущему элементу}
N:=n+1;
end;
{end procedure Poisk_Elem_ND}
procedure Vivod_Tek;
begin
{Присвоение выводимому номеру номер текущего элемента}
numb:=n;
{Связывание файловой переменной с НД на диске}
assign (File1, Filename);
{Открытие файла для чтения}
reset (File1);
{Поиск нужной записи}
seek (File1,numb-1);
{Чтение записи из файла}
read (File1,TVzap);
{Присвоение переменной К значения в зависимости от значениея переменной перечислимого типа}
case TVzap. tipTelevizor of
cvet:k:=' Цветной';
gherno_bel:k:=' Черно-белый';
perenosn:k:=' Переносной';
end;
{Вывод шапки таблицы}
writeln ('г=====T==================T========T================T======================');
writeln ('¦ # ¦ Название ¦ Размер ¦ Ср. стоимость ¦ Тип ¦');
writeln ('¦=====+==================+========+================+======================¦');
{Вывод элемента}
write ('¦', numb:5,'¦');
write (TVzap.nazvanie:18,'¦');
write (TVzap.razmer:8,'¦');
write (TVzap.sr_stoimist:16:1,'¦');
writeln (k,'¦');
{Вывод нижней границы таблицы}
writeln ('L=====¦==================¦========¦================¦======================-');
{Закрытие файла}
close (file1);
end;
end.
Листинг модуля RabotaDR:
unit RabotaDR;
interface
uses RabotaND;
{Процедура для перехода к друому НД}
procedure Perehod_Drug_ND (var Filename: string);
{Процедура создания нового НД из всех элементов с заданным значением ключе-вого поля}
procedure Sozdat_ND_kl (var Filename: string; var n: integer);
{Процедура сохраниения всех элементов в другом НД}
procedure Sohr_v_nov (var Filename: string; var n: integer);
implementation
procedure Perehod_Drug_ND;
var DifFilename: string;
begin
{Вывод имени текущего набора данных}
writeln ('Ваш старый набор данных: ', Filename);
{Запрос на вывод нового адреса НД}
writeln ('Введите название нового НД ');
readln (DifFilename);
{Замена имени старого набора данных на имя нового набора}
Filename:=DifFilename;
{Вывод имени текущего набора данных}
writeln ('Ваш новый набор данных: ', filename);
N:=1;
end;
{end procedure Perehod_Drug_ND;}
procedure Sozdat_ND_kl;
{Запрос ключевого поля}
var z: Tip;
vibor_tipa: byte;
begin
{Связывание файловой переменной с НД на диске}
assign (File1, Filename);
{Открытие файла для чтения}
reset (File1);
{Запрос на ввод имени файла, который будут сохранены элементы с заданым ключевым полем }
writeln ('Введите имя файла, в которой будут сохранены элементы с заданым ключевым полем: ');
readln (filenamekluch);
{Связывание файловой переменной с НД на диске}
assign (Filekl, filenamekluch);
{Открытие файла для записи}
rewrite (Filekl);
{Запрос на значение ключевого поля}
writeln ('Выбирите тип телевизора (1: Цветной; 2: Черно-белый; 3: Переносной;)');
readln (vibor_tipa);
{Выбор значения перечислимого типа в зависимости от выбранного пользователем типа}
case vibor_tipa of
1: z:=cvet;
2: z:=gherno_bel;
3: z:=perenosn;
end;
{Пока не достигнут конец файла, поиск}
while not eof (file1) do
begin
{Чтение одной записи}
read (File1,TVzap);
{Если содержимое ключевого поля совпадает с нужным}
if TVzap. TipTelevizor = z then
{Запись записи в новый файл}
Write (Filekl, TVzap);
end;
{Закрытие файлов}
close (file1);
close (filekl);
Filename:=filenamekluch;
N:=1;
end;
procedure Sohr_v_nov;
{Запрос ключевого поля}
begin
{Связывание файловой переменной с НД на диске}
assign (File1, Filename);
{Открытие файла для чтения}
reset (File1);
writeln ('Ваш текущий НД — ', Filename);
{Запрос имени второго НД}
writeln ('Введите имя НД, в который нужно произвести копирование: ');
readln (filenamenov);
{Связывание файловой переменной со вторым НД на диске}
assign (File2, filenamenov);
{Открытие второго файла}
reset (File2);
{Переход в конец второго файла}
seek (File2,filesize (File2));
{Пока недостигнут конец файла}
while not eof (file1) do
begin
{Чтение из первого файла}
read (File1,TVzap);
{Запись во второй файл}
Write (File2,TVzap);
end;
{Закрытие двух файлов}
close (file1);
close (File2);
N:=2;
Filename:=filenamenov;
end;
end.