Практическая обработка множества данных, представляющих собой массив указателей на записи
практическая обработка множества
данных, представляющих собой массив указателей на записи
СОДЕРЖАНИЕ
Введение
.Описание программы
1.1 Описание
главной программы и перечень модулей
.2 Модуль
menumod.tpu
.3 Модуль
RabotaND.tpu
.4 Модуль
RabotaDR.tpu
2.Проверка работы программы
2.1 Создание
нового набора данных
.2 Добавление
новых элементов в конец НД
.3 Просмотр
всех элементов НД
.4 Поиск
элемента по номеру
.5 Переход
к работе с другим НД
.6 Создание
нового НД из всех элементов с заданным значением ключевого поля.
2.7
Сохранение всех элементов в другом НД
Заключение
Список использованных источников
Приложение А
Введение
Целью данной курсовой работы является
практическая обработка множества данных, представляющих собой массив указателей
на записи.
В программе необходимо реализовать следующие
запросы к заданному множеству данных:
1
Создание
НД.
2
Добавление
новых элементов в конец НД.
3
Просмотр
всех элементов НД.
4
Поиск
элемента по номеру (позиционирование текущего элемента).
5
Переход
к работе с другим НД.
Дополнительно, в соответствии с моим вариантом
(18 вариант), необходимо выполнить реализацию следующих запросов:
6
Создание
нового НД из всех элементов с заданным значением ключевого поля.
7
Сохранение
всех элементов в другом НД.
Множество данных должно представлять собой
информацию о марках телевизорах:
8
название
(string);
9
размер
по диагонали (integer);
10
средняя
стоимость (real);
11
тип:
цветной, черно-белый, переносной (перечислимый тип).
В работе должны быть соблюдены следующие условия
и ограничения:
12
Главную
процедуру программы с реализацией простейшего меню следует определить в
отдельном модуле.
13
Процедуры,
реализующие запросы, должны быть размещены в одном или более модулях.
14
Глобальные
данные: Спецификация файла. Никаких других глобальных переменных использовать
нельзя.
15
Вместе
с меню на экране должно быть отображено:
·
номер
текущего элемента;
·
содержимое
текущего элемента.
16
На
экран выводить элементы в виде таблицы (один элемент - одна строка таблицы).
17
Если
после выполнения запроса изменяется хотя бы один элемент, то заканчивать запрос
выводом всего множества элементов.
18
Тестами
к заданиям служат 2 НД с правдоподобной информацией.
Описание программы
1.1 Описание главной программы
и перечень модулей
Программа состоит из трех модулей и главной
программы. Все подпрограммы, которые выполняют необходимые запросы по работе с
НД, находятся в трех модулях (MenuMod, RabotaND, RabotaDR).
В начале работы программы мы указываем набор
данных, с которым будем работать. Затем на экране отображается вертикальное
меню. В этом меню будут указаны все запросы, которые пользователь может
выполнить с набором данных. При выборе пункта меню «Выход» работа программы
будет закончена. Вместе с меню на экране отображается номер текущего элемента и
его содержимое.
В главной программе также происходит заполнение
массива пунктов меню значениями.
Код главной
программы:
Uses Crt, MenuMod, RabotaND,
RabotaDR;
;
{Ввод имени файла}
{Инициализация переменной для
обозначения текущего элемента}
{Заполнение массива пунктов меню
значениями}
{Вывод на экран текущих НД
и элемента}_Tek(FileName, tek);
{Вывод
меню}_Meny(mas,2,2,punkt);
{Выполнение процедур в
зависимости от выбраного пункта}punkt of
: {Создание нового НД и его
просмотр}
2: {Добавление новых
элементов в конец НД и его просмотр}
3: {Просмотр всех
элементов НД}
4: {Поиск элемента}
5: {Переход к работе с
другим НД и просмотр его содержимого}
: {Создание нового НД из всех
элементов с заданным значением ключе-вого поля.}
7: {Cохранение всех
элементов в другом НД}
Sohr_v_nov(FileName);;
{Цикл выполняется до того,
как будет нажат ESC}answ=#27;.
1.2 Модуль menumod.tpu
Данный модуль содержит подпрограмму, которая
прорисовывает на экран вертикальное меню для выполнения запросов пользователя.
Для навигации в данном меню используются клавиши «вверх», «вниз», «enter» и
«esc» на клавиатуре.
Описательная часть данного модуля:
Unit menumod;crt;Massiv=array [1..25] of string;
var mas:massiv;
В данном модуле тип Massiv это массив пунктов меню,
а переменная, принадлежащая этому типу, является пунктом меню.
В модуле есть одна процедура:
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
Х
и у - Переменные для позиционирования левого верхнего угла окна, в котором
будет выводиться меню.
2
Х1
и У1 - Переменные для позиционирования правого нижнего угла окна, в котором
будет выводиться меню.
3
К
- Количество пунктов меню.
4
Otv -
переменная в которой находиться код нажатой клавиши.
5
Pred -
Предыдущий для выбранного пункта меню
6
Max_dlin
- Длина самой большой строки.
Процедура передает в главную программу переменную
punkt.
procedure My_Meny;x=1;
y=1;
k=7;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;
{Прорисовка поля меню в исход-ный
цвет}
{Подсветка следующего выбранного поля
меню} False
{end Repeat}
end;.
1.3 Модуль RabotaND.tpu
Этот модуль содержит пять процедур для работы с
набором данных.
Заголовок и описательная часть данного модуля
представлены ниже:
unit RabotaND;menumod;
{Спецификация файла}
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;
В модуле описана спецификация файла и следующие
переменные:
1
File1, Filekl,
Filenov - Переменные
файлового типа
2
FileName,
Filenamekluch, filenamenov,
FilenamenovND - Переменные,
содержащие имена файлов.
3
TVzap -
Переменная типа запись
4
N - Переменная,
которая используется для обозначения текущего элемента из НД.
Процедуры, которые содержатся в модуле:
{Процедура для вывода текущего
элемента}Vivod_Tek (var Filename:string; n:integer);
{Процедура создания нового набора
данных}Sozdat_ND (var Filename:string; var n:integer);
{Процедура добавление элемента в конец набора
данных}Dobavit_ND (var Filename:string; var n:integer);
{Процедура для просмотра содержимого набора
данных}Prosmotr_ND (var Filename:string; var n:integer);
{Процедура для поиска элемента по введеному
номеру}Poisk_Elem_ND (var Filename:string; var n:integer);
Процедура, которая создает новый набор данных:
Sozdat_ND;i,kol:integer;
{Ввод имени нового набора данных}
{Связывание файловой переменной с НД на диске}
{Открытие файла для записи}
{Ввод количества записей(kol)}i:=1 to kol do
{Ввод данных}
{Запись одной записи в НД}(File1,TVzap);;
{Закрытие файла}
{Изменение имени файла};
{end procedure Sozdat_ND}
В процедуру из главной программы передается
только имя старого набора данных. В главную программу из процедуры передается
имя нового набора данных и номер текущего элемента.
В процедуре создается и открывается для записи
новый набор данных, затем в него вводится заданое количество записей. После
создания НД он закрывается, а текущим элементом становится последний введенный
элемент.
Процедура добавление элемента в конец набора
данных:
Dobavit_ND;:=n+1;
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Поиск конца файла}
{Цикл для записи данных, который будет
выполнятся пока пользователь не введет «No»}Otv2 <> 'No' do
{Ввод данных}
{Запись одной записи в НД}(File1,TVzap);
{Запрос на окончание заполнения} ('Продолжить
заполнение?(Yes\No)');(Otv2);;
{Присвоение номера текущего элемента}:=numb;
{Закрытие файла} ;
{end procedure Dobavit_ND}
В процедуру из главной программы передается имя
набора данных. В главную программу из процедуры передается номер текущего
элемента.
В процедуре происходит открытие набора данных,
затем нахождение его конца стандартной процедурой seek, после чего происходит
запись элементов в конец НД. После каждого записанного элемента выводится
запрос на окончание записи.
Процедура для просмотра содержимого набора
данных:
Prosmotr_ND;
{Связывание файловой переменной с НД на
диске}(File1, Filename);
{Открытие файла для чтения}(File1);
{Вывод имени текущего набора данных}
{Вывод шапки таблицы}
{Пока не закончится файл -- вывод элементов в
таблицу}not eof(File1) do
{чтение одной записи из файла} (File1,TVzap);
{Выбор строки в зависимости от значения
перечислимого типа}TVzap.tipTelevizor of:k:=' Цветной';_bel:k:='
Черно-белый';:k:=' Переносной';;
{Вывод содержимого записи} ('║',
numb:5,'║');(TVzap.nazvanie:18,'║');(TVzap.razmer:8,'║');(TVzap.sr_stoimist:16:1,'║');(k,'║');
{Вывод нижней границы таблицы}
{Присвоениею текущему номер последнего
показанного элемента};
{Закрытие файла}(file1);;
В процедуру из главной программы передается имя
набора данных. В главную программу из процедуры передается номер текущего
элемента. После открытия набора данных процедура выводит его имя, затем шапку
таблицы. Следуюющие действия выполняются в цикле, котороый будет выполнятся
пока не закончится данный набор данных. В зависимости от значения переменной перечислимого
типа в поле tipTelevizor оператором case просиходит присвоение переменной К
определнного значения (цветной, черно-белый или переносной). После чего
просиходит вывод элементов на экран. В конце переменной, содержащей номер
текущего элемента, присваивается значение последнего элемента и набор данных
закрывается.
Процедура для поиска элемента по введеному
номеру
Poisk_Elem_ND;
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Запрос на ввод номера нужной записи}('Введите номер
нужной записи');(n);
{Поиск нужной записи}(File1,n-1);
{Чтение записи из файла}(File1,TVzap);
{Присвоение переменной К значения в зависимости
от значениея переменной перечислимого типа}
{Вывод шапки таблицы}
{Вывод элемента}
{Вывод нижней границы таблицы}
{Закрытие файла}
{Присовение нужного номера текущему
элементу}:=n+1;;
{end procedure Poisk_Elem_ND}
Эта процедура обрабатывает запрос пользователя
на поиск элемента в НД по его порядковому номеру и выводит информацию о данном
элементе. В процедуру из главной программы передается имя набора данных. В
главную программу из процедуры передается номер текущего элемента. После
открытия набора данных процедура запращивает номер элемента, который следует
найти. Затем процедурой seek(File1,n-1)
в файле находится нужная запись. Эта запись выводится как единственный элемент
таблицы и текущему значению присваивается номер элемента, который искали, плюс
один. После вывода файл закрывается.
Процедура для вывода текущего элемента:
procedure Vivod_Tek;
{Присвоение выводимому номеру номер
текущего элемента}
numb:=n;
{Связывание файловой переменной с НД
на диске}
{Открытие файла для чтения}
{Поиск нужной записи}
seek(File1,numb-1);
{Чтение записи из файла}
{Присвоение переменной К значения в
зависимости от значениея переменной перечислимого типа}
{Вывод шапки таблицы}
{Вывод элемента}
{Вывод нижней границы таблицы}
{Закрытие файла}(file1);;
В процедуру из главной программы передается имя
набора данных и номер текущего элемента. Поиск и вывод элемента происходит так
же, как в процедуре для поиска элемента по введеному номеру procedure
Poisk_Elem_ND.
1.4
Модуль RabotaDR.tpu
Этот модуль содержит три процедуры, в которых
происходи обращение или переход к работе с другим набором данных
Заголовок и описательная часть данного модуля
представлены ниже:
RabotaDR;RabotaND;
Этот модуль требует подключения описанного ранее
модуля RabotaND,
так как в нем описано большенство переменных, которые используются в модуле RabotaDR.
Никаких собственных переменных в модуле RabotaDR
не описано.
В данному модуле находятся следующие процедуры:
{Процедура для перехода к друому
НД}Perehod_Drug_ND (var Filename:string;);
{Процедура создания нового НД из всех элементов
с заданным значением ключе-вого поля}Sozdat_ND_kl (var Filename:string; var n:integer);
{Процедура сохраниения всех элементов в другом
НД}Sohr_v_nov (var Filename:string; var n:integer);
Процедура для перехода к друому НД:
Perehod_Drug_ND;DifFilename:string;
{Вывод имени текущего набора данных} ('Ваш
текущий набор данных - ', Filename);
{Запрос на вывод нового адреса НД}('Введите путь
к необходимому набору данных');(DifFilename);
{Замена имени старого набора данных на имя
нового набора}:=DifFilename;
{Вывод имени текущего набора данных}('Ваш новый
набор данных - ', filename);;
{end procedure Perehod_Drug_ND;}
Эта процедура позволяет переходить от одного
набора данных ко второму. В процедуру из главной программы передается имя
набора данных. В процедуре описана переменная, содержащие имя файла, к которому
будет производиться переход. Сперва выводится имя текущего набора данных. Затем
появляется запрос на ввод нового имени. После чего переменой со старым именем
присваивается значение нового имени. Эта переменная, уже с новым именем,
передается обратно в основную программу.
Процедура создания нового НД из всех элементов с
заданным значением ключевого поля:
Sozdat_ND_kl;
{Запрос ключевого поля}z: Tip;_tipa: byte;
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Запрос на ввод имени файла, который будут
сохранены элементы с заданым ключевым полем }
{Связывание второй файловой переменной со вторым
НД на диске}
{Открытие второго файла для записи}
{Запрос на значение ключевого поля}
{Выбор значения перечислимого типа в зависимости
от выбранного пользователем типа}vibor_tipa of
: z:=cvet;
: z:=gherno_bel;
: z:=perenosn;;
{Пока не достигнут конец файла, поиск} not
eof(file1) do
{Чтение одной записи}(File1,TVzap);
{Если содержимое ключевого поля
совпадает с нужным}TVzap.TipTelevizor = z then
{Запись записи в новый файл}(Filekl,
TVzap);;
{Закрытие файлов}
{Изменение имени файла, с которым будет
продолжаться работа}:=filenamekluch;;
В процедуру из главной программы передается имя
набора данных, из которого мы будем записывать элементы. В
процедуре описаны следующие переменные:
1
Z
- переменная перечислимого типа для выбора ключевого поля.
2
vibor_tipa
- для выполнения запроса о значении ключевого поля.
Процедура запрашивает имя нового набора данных,
в который будут записаны элементы с выбранным значением ключевого поля. Потом
просходит выбор нужного значения ключевого поля. Затем в цикле выполняется
считываение одной записи из первого файла, и, если значение ее ключевого поля
соответсвует нужному, этот элемент записывается в новый файл. После достижения
конца файла, оба файла закрываются.
Процедура сохраниения всех элементов в другом
НД:
Sohr_v_nov;
{Запрос ключевого поля}
{Связывание файловой переменной с НД на диске}
{Открытие файла для чтения}
{Запрос имени второго НД}
{Связывание файловой переменной со вторым НД на диске}
{Открытие второго файла}
{Переход в конец второго
файла}(Filenov,filesize(Filenov));
{Пока недостигнут конец файла}not eof(file1) do
{Чтение из первого файла}
{Запись во второй файл};
{Закрытие двух файлов}:=1;;
Данная процедура обеспечивает сохранение всех
элементов текущего набора данных в другом. В процедуру из главной программы
передается имя набора данных, из которого будет производиться сохранение.
Процедура запрашивает имя файла, в который будет производиться запись,
устанавливает указатель в его конце. Далее одна запись читается из первого
файла и записывается во второй. Когда достигается конец первого файла, цикл
заканчивается, и оба файла закрываются.
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 Поиск элемента по номеру
Выберем пункт меню «Поиск элемента по номеру» и
нажмем клавишу <Enter>.
Введём номер элемента для поиска. Допустим, мы ввели номер «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
Сохранение всех элементов в другом НД
Рисунок 17 - Запрос на имя нового файла
На рисунках 18 и 19 изображены два исходных
файла, а на рисунке 20 мы можем видеть файл после копирования в него другого.
Рисунок 18 - Первый набор данных
Рисунок 19 - Второй набор данных
Рисунок 20 - Результат выполнения запроса
«Сохранение всех элементов в другом НД»
Заключение
программа данное множество
В результате разработки курсовой работы, была
создана программа для работы с набором данных. Эта программа может создать НД в
виде записей и напрямую записать их в файл. Также с помощью программы можно
просматривать уже созданные наборы данных. Реализован поиск элемента в файле по
его номеру и добавление элементов в конец уже созданного НД. Возможен переход
от работы с одним НД к другому и копирование содержимого одного файла в другой.
Также, в соответствии с индивидуальным заданием, возможно создание нового НД из
всех элементов с заданным значением ключевого поля.
Все условия и ограничения, описанные в задачах и
целях данной курсовой работы, были соблюдены. Как было установлено во второй
главе, вся работа с НД выполняется корректно.
Список использованных
источников
1.Зуев
Е.А. Программирование на языке Turbo Pascal 6.0,7.0,/ Е.А. Зуев//
М.:Веста,Радио и связь, 1993. - 376с.
.Введение
в программирование [Текст]
: учеб. пособие для вузов по направлению и специальности “Асои”
[Текст] / Л.В. Шапоров
[и
др.]; под ред. И.В. Фленов. -
М. : Высшая школа, 2005. - 601 с.
.Свободная
энциклопедия ВикипедиЯ [Электронный ресурс]. - 2011. - Режим доступа: http://ru.wikipedia.org.
- Дата доступа: 15.05.2011.
Приложение
А
ПОЛНЫЙ КОД ПРОГРАММНОГО КОМПЛЕКСА
Листинг основной программы:
Uses Crt, MenuMod, RabotaND, RabotaDR;
;
{Ввод имени файла}('Введите путь к файлу:
');(Filename);
{Инициализация переменной для обозначения
текущего элемента}:=2;
{Заполнение массива пунктов меню
значениями}[1]:='1:Создать новый НД';[2]:='2:Добавить новые элементы в конец
НД';[3]:='3:Просмотреть все элементы НД';[4]:='4:Поиск элемента по номеру
';[5]:='5:Перейти к работе с другим НД';[6]:='6:Создание нового НД из всех
элементов с заданным значением ключе-вого поля.';[7]:='7:Cохранение всех
элементов в другом НД';;
{Вывод на экран текущих НД и
элемента}(14);(1, 9);('Текущий НД - ',Filename);(1,12);('Номер текущего
элемента - ',n-1);(1,13);('Содержание текущего элемента:');(1,14);
tek:=n-1;
Vivod_Tek(FileName, tek);(2,2);
{Вывод меню}_Meny(mas,punkt);
textcolor (LightCyan);
{Выполнение процедур в зависимости от
выбраного пункта}punkt of
: {Создание нового НД и его просмотр}
begin
Sozdat_ND (FileName, n);
Prosmotr_ND (FileName, n);
end;
: {Добавление новых элементов в конец НД и его
просмотр}
begin
Dobavit_ND (FileName, n);
Prosmotr_ND (FileName, n);
end;
: {Просмотр всех элементов НД}
Prosmotr_ND (FileName, n);
: {Поиск элемента}
Poisk_Elem_ND (FileName, n);
: {Переход к работе с другим НД и просмотр его
содержимого}
begin
Perehod_Drug_ND (FileName);
Prosmotr_ND (FileName, n);
end;
: {Создание нового НД из всех элементов с
заданным значением ключе-вого поля.}
begin
Sozdat_ND_kl (FileName, n);
Prosmotr_ND (FileName, n);
end;
: {Cохранение всех элементов в другом НД}
Sohr_v_nov(FileName, n);;('Для
возврата нажмите Enter, для выхода нажмите Esc');
answ:=Readkey;
{Цикл выполняется до того, как будет
нажат ESC}answ=#27;.
Листинг модуля
menumod:
menumod;
crt;
Massiv=array [1..7] of
string;mas:massiv;
My_Meny(Mas:Massiv; var
punkt:byte);
My_Meny;x=1;=1;
k=7;i,pred,Max_dlin:integer;:char;,y1:byte;
{Инициализация переменных}
; pred:=0; max_dlin:=0;
{Определенние максимальной длины
строки}i:=1 to k dolength(Mas[i])>max_dlin then max_dlin:=length(Mas[i]);
{end if}
{end for}
{Дополнение всех строк до
максимальной}i:=1 to k dolength(Mas[i])<>max_dlin do Mas[i]:=Mas[i]+' ';
{end while}
{end for}
{Расчет координат X1 и
Y1}:=max_dlin+x+3;:=k+y+3;
{Прорисовка меню}(x,y,x1,y1);I:=1 to
k do(x,i);(Mas[i]);;
{end for}:=1;(x,1);(DarkGray);(0);
{Подсветка первого поля
меню}(Blue);(15);(Mas[1]);:=punkt;:=Readkey;Otv=#0 then Otv:=Readkey;
{end If}
{Реакция на нажатие
клавиш}Otv of
{Нажатие клавиши esc}
#27:begin
punkt:=0;(0);
{Нажатие клавиши enter}
#13: begin(1, 1, 80,
25);(black);(10);;;;
{Нажатие клавиши
вниз}
#80: If punkt<k then
punkt:=punkt+1punkt:=1;
{end If}
{Нажатие клавиши
ввверх}
#72: If punkt>1 then
punkt:=punkt-1punkt:=k;
{end If};
{Прорисовка поля меню в
исход-ный цвет}(x,pred);(DarkGray);(yellow);(Mas[pred]);
{Подсветка следующего
выбранного поля меню} (x,punkt);(Blue);(15);(Mas[punkt]);False
{end Repeat};.
Листинг модуля
RabotaND:
unit RabotaND;
menumod;
{Спецификация файла}
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;
{Процедура для
вывода текущего элемента}Vivod_Tek (var Filename:string; n:integer);
{Процедура создания
нового набора данных}Sozdat_ND (var Filename:string; var n:integer);
{Процедура
добавление элемента в конец набора данных}Dobavit_ND (var Filename:string; var
n:integer);
{Процедура для
просмотра содержимого набора данных}Prosmotr_ND (var Filename:string; var
n:integer);
{Процедура для
поиска элемента по введеному номеру}Poisk_Elem_ND (var Filename:string; var
n:integer);
Sozdat_ND;i,kol:integer;
{Ввод имени нового
набора данных}
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 procedure Sozdat_ND}
Dobavit_ND;
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('Продолжить
заполнение?(Yes\No)');
readln(Otv2);
end;
n:=numb;
{Закрытие файла}
close(File1);;
{end procedure Dobavit_ND}
Prosmotr_ND;
{Связывание файловой
переменной с НД на диске}
assign(File1, Filename);
{Открытие файла для
чтения}
reset(File1);
{Вывод имени
текущего набора данных}
writeln('Ваш набор данных: ',
Filename);
numb:=1;
{Вывод шапки
таблицы}
writeln('╔═════╦══════════════════╦════════╦════════════════╦══════════════════════╗');
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('╚═════╩══════════════════╩════════╩════════════════╩══════════════════════╝');
{Присвоениею
текущему номер последнего показанного элемента}
numb:=numb+1;
n:=numb;
end;
{Закрытие файла}
close(file1);;
Poisk_Elem_ND;
{Связывание файловой
переменной с НД на диске}
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('╔═════╦══════════════════╦════════╦════════════════╦══════════════════════╗');
writeln('║ # ║ Название ║
Размер ║ Ср.стоимость ║ Тип ║');
writeln('╠═════╬══════════════════╬════════╬════════════════╬══════════════════════╣');
{Вывод элемента}
write('║', n:5,'║');
write (TVzap.nazvanie:18,'║');
write (TVzap.razmer:8,'║');
write (TVzap.sr_stoimist:16:1,'║');
writeln (k,'║');
{Вывод нижней границы
таблицы}
writeln('╚═════╩══════════════════╩════════╩════════════════╩══════════════════════╝');
{Закрытие файла}
close(file1);
{Присовение нужного
номера текущему элементу}
N:=n+1;;
{end procedure Poisk_Elem_ND}
Vivod_Tek;
{Присвоение
выводимому номеру номер текущего элемента}
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('╔═════╦══════════════════╦════════╦════════════════╦══════════════════════╗');
writeln('║ # ║ Название ║
Размер ║ Ср.стоимость ║ Тип ║');
writeln('╠═════╬══════════════════╬════════╬════════════════╬══════════════════════╣');
{Вывод элемента}
write('║', numb:5,'║');
write (TVzap.nazvanie:18,'║');
write (TVzap.razmer:8,'║');
write (TVzap.sr_stoimist:16:1,'║');
writeln (k,'║');
{Вывод нижней
границы таблицы} ('╚═════╩══════════════════╩════════╩════════════════╩══════════════════════╝');
{Закрытие файла}(file1);;
.
Листинг модуля
RabotaDR:
unit RabotaDR;
RabotaND;
{Процедура для перехода к друому
НД}Perehod_Drug_ND (var Filename:string);
{Процедура создания нового НД из
всех элементов с заданным значением ключе-вого поля}Sozdat_ND_kl (var
Filename:string; var n:integer);
{Процедура сохраниения всех
элементов в другом НД}Sohr_v_nov (var Filename:string; var n:integer);
Perehod_Drug_ND;DifFilename:string;
{Вывод имени текущего набора
данных}('Ваш старый набор данных: ', Filename);
{Запрос на вывод нового адреса
НД}('Введите название нового НД ');(DifFilename);
{Замена имени старого набора данных
на имя нового набора}:=DifFilename;
{Вывод имени текущего набора
данных}('Ваш новый набор данных: ', filename);:=1;;
{end procedure Perehod_Drug_ND;}
Sozdat_ND_kl;
{Запрос ключевого поля}z: Tip;_tipa:
byte;
{Связывание файловой переменной с НД
на диске}(File1, Filename);
{Открытие файла для чтения}(File1);
{Запрос на ввод имени файла, который
будут сохранены элементы с заданым ключевым полем }('Введите имя файла, в
которой будут сохранены элементы с заданым ключевым полем : ');(filenamekluch);
{Связывание файловой переменной с НД
на диске}(Filekl, filenamekluch);
{Открытие файла для записи}(Filekl);
{Запрос на значение ключевого
поля}('Выбирите тип телевизора (1: Цветной; 2: Черно-белый; 3:
Переносной;)');(vibor_tipa);
{Выбор значения перечислимого типа в
зависимости от выбранного пользователем типа}vibor_tipa of
: z:=cvet;
: z:=gherno_bel;
3: z:=perenosn;;
{Пока не достигнут конец файла,
поиск} not eof(file1) do
{Чтение одной записи}(File1,TVzap);
{Если содержимое ключевого
поля совпадает с нужным}TVzap.TipTelevizor = z then
{Запись записи в новый
файл}(Filekl, TVzap);;
{Закрытие файлов}
(file1);(filekl);:=filenamekluch;:=1;;
Sohr_v_nov;
{Запрос ключевого поля}
{Связывание файловой переменной с НД
на диске}(File1, Filename);
{Открытие файла для
чтения}(File1);('Ваш текущий НД -- ', Filename);
{Запрос имени второго НД}('Введите
имя НД, в который нужно произвести копирование : ');(filenamenov);
{Связывание файловой переменной со
вторым НД на диске}(File2, filenamenov);
{Открытие второго файла}(File2);
{Переход в конец второго
файла}(File2,filesize(File2));
{Пока недостигнут конец файла}not
eof(file1) do
{Чтение из первого
файла}(File1,TVzap);
{Запись во второй
файл}(File2,TVzap);;
{Закрытие двух файлов}(file1);(File2);:=2;:=filenamenov;;.