Информатика_всем
.pdf9. Записной тип данных. СУБД |
225 |
Аналогично можно написать процедуру вывода элементов массива записей. Здесь стоит обратить внимание на использование оператора присоединения with объект do к пространству имен массива Base[i]. Это дает возможность обращаться к полям записи напрямую, минуя префикс “Base[i].”. Блок-схема этой процедуры представлена на (Рисунок 9.2) б).
{процедура вывода базы на экран} procedure OutBase(const Base:TBaseMass;
const NumOfRec:byte); var i,j: byte;
begin writeLn;
if NumOfRec <> 0 then begin
writeLn('База данных содержит следующие сведения:');
for j:=1 to 79 do write('-'); writeLn;
writeLn('N п/п':6,'| ','реестр. N |':11, 'Название |':12,'Адрес.Улица |':17, 'Дом |':7,'Торг. Профиль |':15, 'Площадь |':9);
for j:=1 to 79 do write('='); writeLn;
for i:=1 to NumOfRec do with Base[i] do
begin
write(i:5,' |'); write(ReestrNumber:10,' |'); write(ShopName:10,' |'); write(Adress.Street:15,' |'); write(Adress.NumberOfBld:5,' |'); write(SaleProfile:13,' |'); writeLn(Area:7,' |');
for j:=1 to 79 do write('-');
writeLn;
end; end
else
writeLn('БД пуста'); end;
Ниже представлена процедура, выдающая по запросу все магазины определенного профиля, площадь которых больше чем среднее арифметическое площадей всех магазинов данного профиля. Вначале идет подсчет среднего арифметического площадей магазинов удовлетворяющих
9. Записной тип данных. СУБД |
227 |
Шаг 1-2 (стр. XXX) Вывод записей удовл. запросу
SrA := SrA / k
Вывод SrA
Вывод заголовка |
|
|
таблицы |
|
|
i := 1 , NumOfRec |
Начало |
|
|
||
|
действия |
|
L |
пространства |
|
имен Base[ i ] |
||
Вывод i |
|
|
|
L := |
|
Вывод ReestrNumber |
(SaleProfile = |
|
NeedSaleProfile) |
||
|
||
|
and (Area ≥ SrA) |
|
Вывод ShopName |
|
|
Вывод Adress.Street |
|
|
Вывод |
|
|
Adress.NumberOfBld |
|
|
Вывод |
|
|
SaleProfile |
|
|
Вывод Area |
|
|
|
Окончание |
|
|
действия |
|
|
пространства |
|
|
имен Base[ i ] |
Рисунок 9.4 Детализация вывода к процедуре запроса
{Процедура обработки запроса к БД (поиск всех магазинов опр. профиля с площадью выше среднего)}
procedure RequestToBase(const Base:TBaseMass;
228 |
9.2 Концепция БД |
const NumOfRec: byte); var i,j,k: byte;
NeedSaleProfile: string[10]; SrA: real;
begin
if NumOfRec <> 0 then begin
writeLn;
writeLn('Обработка запроса: Все магазины
с площадью >= ср. арифметического');
writeLn;
write('Введите профиль магазина:'); readln (NeedSaleProfile);
SrA:= 0; k:=0;
for i:= 1 to NumOfRec do with Base[i] do
begin
If SaleProfile = NeedSaleProfile then begin
k:= k + 1;
SrA:= SrA + Area; end;
end;
if k<>0 then begin
SrA := SrA / k; writeLn('SrA = ', SrA:6:2);
writeLn('Вот результат запроса:'); for j:=1 to 79 do
write('-'); writeLn;
writeLn('N п/п':6,'| ','реестр. N |':11, 'Название |':12,'Адрес.Улица |':17, 'Дом |':7,'Торг. Профиль |':15,
'Площадь |':9); for j:=1 to 79 do write('='); writeLn;
for i:=1 to NumOfRec do with Base[i] do
if (SaleProfile = NeedSaleProfile) and (Area >= SrA) then
begin
write(i:5,' |'); write(ReestrNumber:10,' |'); write(ShopName:10,' |'); write(Adress.Street:15,' |');
9. Записной тип данных. СУБД |
229 |
write(Adress.NumberOfBld:5,' |'); write(SaleProfile:13,' |'); writeLn(Area:7,' |');
for j:=1 to 79 do write('-');
writeLn;
end;
end else
WriteLn('В базе нет магазинов профиля ', NeedSaleProfile);
end else
WriteLn('База данных пуста'); end;
Процедура вывода главного меню программы представлена реализацией оператора case, при помощи которого происходит выбор нужного действия. При вводе той или иной цифры происходит вызов соответствующей процедуры. Практически весь код процедуры помещен в цикл. Выход из этого цикла происходит после ввода цифры 4.
{процедура выводящая главное меню программы} procedure MainMenu;
var PunktOfMenu: byte; Base: TBaseMass; NumOfRec : byte;
begin
NumOfRec := 0; repeat
writeLn;
writeLn('Выберите нужное действие:'); writeLn('1 - Ввод новой БД'); writeLn('2 - Вывод БД');
writeLn('3 - Запрос к БД'); writeLn('4 - Выход'); write('Ваш выбор:'); readLn(PunktOfMenu);
case PunktOfMenu of
1:InputNewBase(Base, NumOfRec);
2:OutBase(Base, NumOfRec);
3:RequestToBase(Base, NumOfRec); else
if PunktOfMenu<>4 then
writeLn('Введите корректный пункт меню');
end; {конец case} until PunktOfMenu = 4 ;
end;
232 9.3 Пример программы реализующей файлы записей
Без подробных комментариев, напишем программу, которая является одним из решений описанной задачи. Решение, конечно, не самое оптимальное и не самое красивое. Просто цель у приведенного алгоритма и кода на языке Pascal состоит в демонстрации принципиальной возможности осуществить выполнение задания средствами компонентных файлов.
Здесь мы используем функциональное меню, которое активно взаимодействует с человеком работающим с нашей базой. Реализация интерфейса «Пользователь-СУБД» зависит от конкретной ситуации, от возможностей операционной системы и от типа среды разработки. Поскольку реализация велась для Turbo Pascal 7.0, то и взаимодействие происходит в режиме доступном для TP 7.0, т.е. либо в MS DOS, либо в режиме эмуляции MS DOS в ОС Windows. Основной особенностью написанной ниже программы является активное использование средств стандартной библиотеки CRT для работы с экраном. Потому гарантии того, что приведенный код будет работать без доработок в иной, отличной от TP 7.0 среде, нет. Все комментарии к программе выполнены в тексте в фигурных скобках («{…}») согласно синтаксису языка Turbo Pascal 7.0. Блок-схемы для получившейся программы показаны на рисунках 8.7–8.17.
|
9. Записной тип данных. СУБД |
|
233 |
||
|
Начало |
|
|
|
|
|
assign(F, ‘data.db’) |
|
|
|
|
|
TitulnyList |
|
|
|
|
|
TitulnyList |
|
|
|
|
|
D:= Menu (X, Y) |
|
|
|
|
|
D |
|
|
|
|
1 |
2 |
3 |
4 |
5 |
6 |
VV (F) |
AddRecords(F) |
CorrectRecords(F) |
|
||
|
PrintBase(F) |
DeleteRecords(F) |
|
Z0(F) |
|
|
D = ND |
|
|
|
|
|
Конец |
|
|
|
|
|
Рисунок 9.7 Основная программа |
|