ALTE DOCUMENTE |
гр.74 F№ 13022101
КОН 16116x2310q 057;УЛТАНТ
Проф. Д. АРНАУДОВ
1. ТЕОРЕТИЧНА ПОСТАНОВКА
2. АЛГОРИТМИ ЗА ТЪРСЕНЕ И ФОРМИРАНЕ НА СТРУКТУРАТА
- ОМД1 - първа част от основния масив на дескрипторите - съдържа заглавията на съответните верижни списъци от втората част както и управлява първия възлов списък за съответния дескриптор в ОМПОД .Достъпът до този файл е пряк - по код на дескриптора , като той съвпада с позицията на елемента във файла
получава се след обработка на запитването в дескрипторния речник |
n_zone_omd
n_element_omd
n_zone_ompod
a_begin
a_end
n_nodes
- НЗ1 - номер на зона в ОМД2 , в която се съдържа следващият елемент от верижния списък на съответния дескриптор
- НЕ1 - номер на елемент в съответната зона на ОМД2
- НЗ2 - номер на зона в ОМПОД , в която се съдържа възлов списък на съответния дескриптор
- НЕ2 - номер на елемент в съответната зона на ОМПОД , който се явява първи елемент на възловия списък на съответния дескриптор в съответната зона
- ОМД2 - втора част на основния масив на дескрипторите - този файл е сегментиран на зони , като съответните верижни списъци за всеки дескриптор преминават през зоните , без да се сегментират . Логическото деление на зони е необходимо за увеличаване на ефективността в режим на пакетна обработка на запитванията / търсенето в сегмент на списъка не изисква преместване на четящата глава /
n_zone_omd |
n_element_omd |
n_zone_ompod |
a_begin |
a_end |
n_nodes |
- ОМПОД - основен масив от познавателните образи на документите - този файл също е сегментиран , като всяка зона съдържа пресичащи се възлови списъци , които не са свързани със списъците от останалите зони
a_doc_d |
b_num_d |
| |
| |
| |
- a_doc_d - адрес на съответния документ или на следващ документ , съдържащ съответния дескриптор
- b_num_d - брой на дескрипторите на съответня документ или код на съответния дескриптор
Програмата предоставя възможност за промяна на размера на зоната както на ОМД2 , така и на ОМПОД , с цел оптимално взаимодействие с конкретните физически устройства .
Настоящата програма поддържа и четвърти файл , играещ ролята на дескрипторен речник . При стартиране на програмата съдържанието на файла се прехвърля в паметта , където се извършва съответната обработка по време на работа на програмата , в този случай търсенето става последователно . При изход от програмата съдържанието на файла се актуализира , в зависимост от направените промени в съответния списък от дескриптори в паметта .
2. АЛГОРИТМИ ЗА ФОРМИРАНЕ НА СТРУКТУРАТА И ТЪРСЕНЕ :
2.1 АЛГОРИТЪМ ЗА ФОРМИРАНЕ И ПОПЪЛВАНЕ НА СТРУКТУРАТА :
2/ Проверка за първи документ в стуктурата
- ако това е така новият възел се записва непосредствено след края на последния елемент на ОМПОД
- ако възелът е по-голям от оставащото място в текущата зона на ОМПОД , той се записва в началото на следващата
- ако дескрипторът не фигурира в ОМД1 , следователно нововъведеният документ е първият , съдържащ този дескриптор - в този случай се добавя нов ред в ОМД1 , сочещ към нововъведения в ОМПОД документ
- в случай , че дескрипторът фигурира в ОМД1 се проверяват всички редове за този дескриптор в ОМД1 /един ред/ и ОМД2 до намиране на ред , сочещ към текущата за въвеждане на документи зона в ОМПОД или до достигане на последния ред за съответния дескриптор /в този случай се добавя нов ред в ОМД2 , асоцииран с текущата в ОМПОД зона , като е необходимо и да се актуализира предходния ред в ОМД2 или ОМД1 така ,че той да сочи към нововъведения / , в случай ,че при претърсването на ОМД1 и ОМД2 се открие ред за съответния дескриптор , сочещ към текущата зона в ОМПОД , той се актуализира така , че полето , указващо последния елемент от възловия списък за съответния дескриптор в текущата зона да сочи към нововъведения в ОМПОД възел .Необходимо е също така и да се актуализира предходния елемент от възловия списък в ОМПОД така , че той да сочи към позицията на нововъведения възел
- ако това е така новият възел се записва непосредствено след края на последния елемент на ОМПОД
- ако възелът е по-голям от оставащото място в текущата зона на ОМПОД , той се записва в началото на следващата . По този начин като страничен ефект се получава известна вътрешна фрагментация на зоните в ОМПОД със среден обем за зона , равен на средната големина на възлите в структурата
- блок схема на процедурата за актуализиране на ОМД1 и ОМД2 - put_code_descriptor
да
не
не
не
Запис
на нов ред в
ОМД2 ,
кореспондиращ
с текущата
зона в ОМПОД
и
нововъведения
документ
;актуализиране
на
предходния
ред в ОМД2 или
ОМД1 за този
дескриптор
така ,че тий
да сочи към
нововъведения
ред в ОМД2 insert_in_omd
да
2.2 АЛГОРИТЪМ ЗА ТЪРСЕНЕ В СТРУКТУРАТА :
2/Проверка за наличието на всички дескриптори от запитването в структурата .В случай, че в запитването фигурира несъществуващ в структурата дескриптор , търсенето се прекратява и се извежда съобщение , указващо липсата на документ , отговарящ на запитването
3/Проверка за наличие на общи зони в ОМПОД , в които да са разположени възлови списъци на всички дескриптори от запитването
-В случай , че в ОМПОД не съществува обща зона за възлови списъци на всички дескриптори от запитването , търсенето се прекратява и се извежда съобщение , указващо липсата на документ ,отговарящ на запитването
-Проверката за наличие на обща зона в ОМПОД се осъществява с помощта на два последователни списъка , в чиито елементи се записва номерът на общата зона , кодът на дескриптора с най-къс възлов списък в съответната зона , началото и края на най-късия списък , както и броя на възлите в съответния возлов списък . За всеки дескриптор от запитването се повтарят следните стъпки
1. За първия дескриптор от запитването директно се попълва първият последователен списък с информация за зоните в ОМПОД , в които този дескриптор има възлов списък . Целта е за всеки следващ дескриптор да се проверява наличието на общи зони в ОМПОД с предходните дескриптори и в последователния списък да остава информация само за общите зони на всички преминали през проверката дескриптори
2. За нечетен пореден номер на дескриптор от запитването се попълва първият последователен списък като в него се записва информация за общите зони на текущия дескриптор и тези от втория списък , след което вторият списък се нулира
3. За четен дескриптор се постъпва аналогично - попълва се втория списък, след което първия се нулира
4. При попълването на последователните списъци се спазва следното правило - преди записване на елемент , сочещ към определена зона в ОМПОД се проверява наличието на елемент в другия списък , сочещ към същата зона в ОМПОД
- при отрицателен резултат елементът не са записва в списъка
- при положителен резултат от проверката , в списъка се записва информация за по-късия от двата възлови списъка в съответната зона /списъка на текущия дескриптор и този на дескриптора от другия последователен списък/
- В случай , че този списък е празен търсенето се прекратява и се извежда съобщение за липса на документ , отговарящ на запитването
- Броят на елементите в последователния списък показва и броя на ощите зони в ОМПОД , в които трябва да се извърши претърсване по най-късия възлов списък
5. За всяка обща зона се извършва претърсване с цел проверка за пълно съвпадение на дескрипторите от запитването с дескрипторите на елементите от съответния възлов списък, аналогично на това при еднозвенната структура
- претърсва се изцяло най-късият възлов списък в съответната зона на ОМПОД като при съвпадение с дескрипторите от запитването се извежда съобщение за намерен документ , отговарящ на запитването
2.2.1 БЛОК СХЕМА НА АЛГОРИТЪМА ЗА ТЪРСЕНЕ НА ДОКУМЕНТИ В СТРУКТУРАТА
get_query ,find_descriptor
Съобщение
за липса на
релевантен
документ
да
не
да
не
- Блок схема на търсенето на релевантен документ в съответната обща зона на ОМПОД / find_doc_1 / - процедурата find_doc_ompod се повтаря толкова на брой пъти , колкото са общите зони в ОМПОД лементите на последователния списък , получен от seek_joint_zones_ompod
не
не
да
3. РАЗПЕЧАТКА НА ПРОГРАМАТА :
uses crt;
const zone=20;
zone_2=20;
type
name_descriptor=string[20];
zapis=record
n_zone_omd:integer;
n_element_omd:integer;
n_zone_ompod:integer;
a_begin:integer;
a_end :integer;
n_nodes:integer;
end;
fl=file of zapis;
zapis1=record
a_doc_d:integer;
b_num_d:integer;
end;
fl1=file of zapis1;
fl2=file of name_descriptor;
query1= array[1..50] of name_descriptor;
desc1= array[1..50] of integer;
pointer=^check;
check=record
descriptor:integer;
n_zone_ompod:integer;
a_begin:integer;
a_end:integer;
n_nodes:integer;
next:pointer;
end;
point=^voc;
voc=record
d_name:name_descriptor;
next:point;
end;
var
omd_1:fl;
omd_2:fl;
ompod:fl1;
f2:fl2;
node:zapis;
node1:zapis1;
name_d:name_descriptor;
exist:boolean;
query_number:byte;
doc_not_exists:boolean;
query:query1;
desc_1:desc1;
previous:integer;
bukva:char;
code_found:integer;
new_end,new_begin:integer;
code:integer;
last_document:integer;
first_doc:boolean;
new_descriptor:boolean;
old_adress:desc1;
old:integer;
xx:integer;
code1:desc1;
start:pointer;
nach:pointer;
first_desc:integer;
count:integer;
diction:point;
procedure assign_files;
begin
assign(omd_1,'c:\tp1\work_d\omd_1.adb');
reset(omd_1);
if ioresult<>0 then
rewrite(omd_1);
assign(omd_2,'c:\tp1\work_d\omd_2.adb');
reset(omd_2);
if ioresult<>0 then
rewrite(omd_2);
assign(f2,'c:\tp1\work_d\diction_1.adb');
reset(f2);
if ioresult<>0 then
rewrite(f2);
assign(ompod,'c:\tp1\work_d\ompod.adb');
reset(ompod);
if ioresult<>0 then
rewrite(ompod);
end;
procedure insert_queue(var p1:point;desc:string);
begin
if p1=nil then
begin new(p1);
with p1^ do begin
d_name:=desc;
next:=nil;
end
end
else insert_queue(p1^.next,desc);
end;
procedure insert_in_diction_queue;
begin
reset(f2);
while not eof(f2) do
begin
read(f2,name_d);
insert_queue(diction,name_d);
end;
end;
procedure insert_in_diction_file(p1:point);
begin
reset(f2);
while p1<>nil do
begin
name_d:=p1^.d_name;
write(f2,name_d);
p1:=p1^.next;
end;
end;
procedure put_code_descriptor_queue(desc:string;var code:integer; p1:point);
var exist:boolean;
i:integer;
begin
exist:=false;
i:=0;
while (p1<>nil) and (exist=false) do
begin
i:=i+1;
if desc=p1^.d_name then
begin
exist:=true;
code:=i;
end;
p1:=p1^.next
end;
if (exist=false) then
begin
insert_queue(diction,desc);
code:=i+1;
end;
end;
function new_zone_ompod:boolean;
begin reset(ompod);
if (query_number+1)<=(zone-(filesize(ompod) mod zone)) then
new_zone_ompod:=false
else new_zone_ompod:=true;
if (filesize(ompod) mod zone)=0 then new_zone_ompod:=true;
end;
function zone_ompod:integer;
begin reset(ompod);
if new_zone_ompod=false then
begin
if (filesize(ompod) mod zone)<>0 then
zone_ompod:= (filesize(ompod) div zone)+1
else zone_ompod:= (filesize(ompod) div zone)
end
else
begin
if (filesize(ompod) mod zone)<>0 then
zone_ompod:= (filesize(ompod) div zone)+2
else zone_ompod:= (filesize(ompod) div zone)+1;
end;
end;
function ompod_position_in_zone:integer;
begin
if new_zone_ompod=false then
ompod_position_in_zone:= (filesize(ompod)+1) mod zone
else
ompod_position_in_zone:=1;
end;
function new_zone_descriptor(desc:integer):boolean;
begin
reset(omd_2);
seek(omd_1,desc-1);
read(omd_1,node);
if node.n_zone_omd=0 then
begin
if node.n_zone_ompod<>zone_ompod then new_zone_descriptor:=true
else new_zone_descriptor:=false;
end
else
begin
while node.n_zone_omd<>0 do
begin
seek(omd_2,(node.n_zone_omd-1)*zone_2+node.n_element_omd-1);
read(omd_2,node);
end;
if node.n_zone_ompod<>zone_ompod then new_zone_descriptor:=true
else new_zone_descriptor:=false;
end
end;
procedure update_ompod(z_1,position,desc:integer);
var i,k,p:integer;
begin
i:=0;
seek(ompod,(z_1-1)*zone+position-1);
read(ompod,node1);
k:=node1.b_num_d;
repeat
begin
i:=i+1;
read(ompod,node1);
end;
until (i=k) or (desc=node1.b_num_d);
with node1 do
a_doc_d:=ompod_position_in_zone;
seek(ompod,(z_1-1)*zone+position+i-1);
write(ompod,node1);
end;
procedure insert_in_omd_21(desc:integer);
var i:integer;
position:integer;
z_1:integer;
begin
i:=0;
seek(omd_1,desc-1);
read(omd_1,node);
while node.n_zone_ompod<>zone_ompod do
begin
seek(omd_2,(node.n_zone_omd-1)*zone_2+node.n_element_omd-1);
read(omd_2,node);
i:=i+1;
end;
with node do
begin
z_1:=n_zone_ompod;
position:=a_end;
n_nodes:=n_nodes+1;
a_end:=ompod_position_in_zone;
end;
update_ompod(z_1,position,desc);
if i=0 then
begin seek(omd_1,filepos(omd_1)-1);
write(omd_1,node);
end
else begin seek(omd_2,filepos(omd_2)-1);
write(omd_2,node);
end
end;
procedure insert_in_omd_2(desc:integer);
var i:integer;
begin
reset(omd_2);
i:=0;
seek(omd_1,desc-1);
read(omd_1,node);
while node.n_zone_omd<>0 do
begin
seek(omd_2,(node.n_zone_omd-1)*zone_2+node.n_element_omd-1);
read(omd_2,node);
i:=i+1;
end;
with node do
begin
if ((filesize(omd_2)+1) mod zone_2)<>0 then
n_zone_omd:=(filesize(omd_2)+1) div zone_2 +1
else n_zone_omd:=(filesize(omd_2)+1) div zone_2;
if ((filesize(omd_2)+1) mod zone_2)<>0 then
n_element_omd:= ((filesize(omd_2)+1) mod zone_2)
else n_element_omd:=zone_2;
end;
if i=0 then
begin seek(omd_1,filepos(omd_1)-1);
write(omd_1,node);
end
else begin seek(omd_2,filepos(omd_2)-1);
write(omd_2,node);
end;
seek(omd_2,filesize(omd_2));
with node do
begin
n_zone_omd:=0;
n_element_omd:=0;
n_zone_ompod:=zone_ompod;
a_begin:= ompod_position_in_zone;
a_end:= ompod_position_in_zone;
n_nodes:=1;
end;
write(omd_2,node);
end;
procedure put_code_descriptor(desc:integer);
var new_desc:boolean;
begin
reset(omd_1);
if desc>filesize(omd_1) then new_desc:=true
else new_desc:=false;
if (new_desc=false) and
((new_zone_ompod=true) or (new_zone_descriptor(desc)=true)) then
insert_in_omd_2(desc)
else
if (new_desc=false) and (new_zone_ompod=false) and
(new_zone_descriptor(desc)=false) then
insert_in_omd_21(desc);
if new_desc=true then
begin
seek(omd_1,filesize(omd_1));
with node do
begin
n_nodes:=1;
n_zone_omd:=0;
n_element_omd:=0;
n_zone_ompod:=zone_ompod;
a_begin:= ompod_position_in_zone;
a_end:= ompod_position_in_zone;
old:=a_end;
write(omd_1,node);
end;
end;
end;
procedure put_code_document;
var i,x,current:integer;
begin
reset(ompod);
last_document:=zone_ompod;
new_end:=ompod_position_in_zone;
if new_zone_ompod=false then
seek(ompod,filesize(ompod))
else seek(ompod,(zone_ompod-1)*zone+ompod_position_in_zone-1);
with node1 do
begin
a_doc_d:=code;
b_num_d:=query_number;
write(ompod,node1);
end;
current:=new_end;
for i:=1 to query_number do
begin
with node1 do
begin
a_doc_d:=0;
b_num_d:=code1[i];
write(ompod,node1);
end;
end;
end;
procedure insert_document;
var i,dn,x:integer;
begin
clrscr;
first_doc:=false;
for i:=1 to 50 do
query[i]:='';
writeln('Enter the code of the document:');
readln(code);
writeln('Enter the descrptors for this document please -');
i:=1;
repeat
begin
read(bukva);
if bukva<>',' then
begin
if bukva<>#13 then
query[i]:=query[i]+bukva
end
else
i:=i+1;
end;
until bukva=#13 ;
query_number:=i;
reset(omd_1);
reset(omd_2);
reset(ompod);
if eof(omd_1) then
begin
first_doc:=true;
for i:=1 to query_number do
begin
name_d:=query[i];
insert_queue(diction,query[i]);
code1[i]:=i;
with node do
begin
n_zone_omd:=0;
n_element_omd:=0;
n_zone_ompod:=1;
a_begin:=1;
a_end:=1;
n_nodes:=1;
write(omd_1,node);
old_adress[i]:=1;
end
end
end
else
for i:=1 to query_number do
begin
put_code_descriptor_queue(query[i],code1[i],diction);
put_code_descriptor(code1[i]);
old_adress[i]:=old;
end;
put_code_document;
end;
procedure get_query;
var i:integer;
begin
clrscr;
for i:=1 to 50 do
query[i]:='';
writeln('Enter your query please -');
i:=1;
repeat
begin
read(bukva);
if bukva<>',' then
begin
if bukva<>#13 then
query[i]:=query[i]+bukva
end
else
i:=i+1;
end;
until bukva=#13 ;
query_number:=i;
end;
procedure get_code_descriptor_queue(desc:string;var x:integer;p1:point);
var i:integer;
begin
exist:=false;
i:=0;
while (p1<>nil) and (exist=false) do
begin
i:=i+1;
if p1^.d_name=desc then
begin
exist:=true;
x:=i;
end;
p1:=p1^.next;
end;
end;
procedure free(var p:pointer);
var k:pointer;
begin
while p<> nil do
begin
k:=p;
dispose(p);
p:=k^.next;
end;
p:=nil;
end;
procedure insert_p(var p:pointer;desc:integer);
begin
if p=nil then
begin new(p);
with p^ do begin
descriptor:=desc;
n_zone_ompod:=node.n_zone_ompod;
a_begin:=node.a_begin;
a_end:=node.a_end;
n_nodes:=node.n_nodes;
next:=nil;
end
end
else insert_p(p^.next,desc);
end;
procedure input_q(var p,q:pointer;desc:integer);
begin
if q=nil then
begin new(q);
with q^ do begin
descriptor:=p^.descriptor;
n_zone_ompod:=p^.n_zone_ompod;
a_begin:=p^.a_begin;
a_end:=p^.a_end;
n_nodes:=p^.n_nodes;
q^.next:=nil;
end
end
else input_q(p,q^.next,desc);
end;
procedure search_p(var p,q:pointer;desc:integer);
begin
if p<>nil then
begin
if p^.n_zone_ompod=node.n_zone_ompod then
begin
if p^.n_nodes>node.n_nodes then
with p^ do
begin
descriptor:=desc;
n_zone_ompod:=node.n_zone_ompod;
a_begin:=node.a_begin;
a_end:=node.a_end;
n_nodes:=node.n_nodes;
end;
input_q(p,q,desc);
end
else search_p(p^.next,q,desc);
end;
end;
procedure seek_joint_zones_ompod(desc:integer);
var start_1:boolean;
begin
seek(omd_1,desc-1);
read(omd_1,node);
if (count mod 2)=0 then start_1:=true
else start_1:=false;
if desc=first_desc then
insert_p(nach,desc) else
begin
if start_1=true then
search_p(nach,start,desc)
else search_p(start,nach,desc);
end;
while node.n_zone_omd<>0 do
begin
seek(omd_2,(node.n_zone_omd-1)*zone_2+node.n_element_omd-1);
read(omd_2,node);
if desc=first_desc then
insert_p(nach,desc) else
begin
if start_1=true then
search_p(nach,start,desc)
else search_p(start,nach,desc);
end;
end;
if (count mod 2)=0 then
begin
free(nach);
nach:=nil;
end
else begin
free(start);
start:=nil;
end;
end;
function joint_zone(p,q:pointer):boolean;
begin
if (p=nil) and (q=nil) then joint_zone:=false
else joint_zone:=true;
end;
procedure find_descriptor ;
var i:byte;
x:integer;
a_min:integer;
begin
reset(omd_1);
reset(omd_2);
a_min:=maxint;
doc_not_exists:=false;
nach:=nil;
start:=nil;
for i:=1 to query_number do
begin
get_code_descriptor_queue(query[i],x,diction);
desc_1[i]:=x;
if exist=false then
begin
doc_not_exist:=true;
i:=query_number;
end;
end;
if doc_not_exist=false then
for i:=1 to query_number do
begin
if i=1 then first_desc:=desc_1[i];
count:=i;
seek_joint_zones_ompod(desc_1[i]);
if joint_zone(nach,start)=false then
begin doc_not_exist:=true;
i:=query_number;
end;
end;
end;
procedure find_next_adress(var x:integer;main_descriptor:integer;current_zone:integer);
var k:integer;
begin
k:=0;
repeat
begin
k:=k+1;
seek(ompod,previous+k-1);
read(ompod,node1);
end;
until node1.b_num_d=main_descriptor;
if node1.a_doc_d<>0 then
x:=(current_zone-1)*zone+node1.a_doc_d
else
x:=0;
end;
procedure find_doc_ompod(adress_begin,adress_end,main_descriptor,current_zone:integer);
var doc_found:boolean;
i,k,n,x:integer;
function descriptor_compare:boolean;
var i,j:integer;
ok:boolean;
begin
if query_number>n then descriptor_compare:=false
else
begin
for i:=1 to query_number do
begin
ok:=false;
for j:=1 to n do
begin
seek(ompod,previous+j-1);
read(ompod,node1);
if desc_1[i]=node1.b_num_d then ok:=true;
end;
if ok=false then
begin
descriptor_compare:=false;
i:=query_number;
end;
end;
end;
if ok=true then descriptor_compare:=true;
end;
begin
reset(ompod);
x:=1;
doc_not_exists:=true;
doc_found:=false;
previous:=adress_begin;
seek(ompod,adress_begin-1);
while ((filepos(ompod)<=adress_end) and (x<>0)) do
begin
read(ompod,node1);
k:=node1.a_doc_d;
n:=node1.b_num_d;
if descriptor_compare=true then
begin
doc_found:=true;
code_found:=k;
writeln('The code of the document you are looking for is:',code_found);
find_next_adress(x,main_descriptor,current_zone);
seek(ompod,x-1);
previous:=x;
end
else
begin
find_next_adress(x,main_descriptor,current_zone);
seek(ompod,x-1);
previous:=x;
end;
end;
if doc_found=true then doc_not_exists:=false;
end;
procedure find_doc_1(var p:pointer);
var adr_b,adr_e,main_d,z:integer;
begin
while p<>nil do
begin
adr_b:=(p^.n_zone_ompod-1)*zone + p^.a_begin;
adr_e:=(p^.n_zone_ompod-1)*zone + p^.a_end;
main_d:=p^.descriptor;
z:=p^.n_zone_ompod;
find_doc_ompod(adr_b,adr_e,main_d,z);
p:=p^.next;
end;
end;
procedure search;
begin
get_query;
find_descriptor;
if doc_not_exists=false then
if (query_number mod 2)=0 then
find_doc_1(start)
else find_doc_1(nach);
if doc_not_exists=true then
writeln('There is no such a document!');
readkey;
end;
procedure write_title;
begin clrscr;
clrscr;
gotoxy(22,10);
writeln('You can choose one of this options');
gotoxy(10,14);
write('1 - Search in the data base');
gotoxy(10,15);
write('2 - Add new document');
gotoxy(10,16);
write('3 - Exit the program');
end;
procedure menu;
var ch:byte;
exit_program:boolean;
begin
exit_program:=false;
repeat
write_title;
gotoxy(27,20);
write('Enter your choice:');
readln(ch);
case ch of
1: search;
2: insert_document;
3: exit_program:=true;
end;
until exit_program=true;
end;
begin
assign_files;
insert_in_diction_queue;
menu;
insert_in_diction_file(diction);
close(ompod);
close(f2);
close(omd_1);
end.
|