5. Листинг программы:
uses crt;
type ukaz=^spisok;
spisok=record
name:string[14];
lic:string[10];
os:string[10];
lang:string[6];
razrab:string[15];
rate:string[4];
next:ukaz;
end;
type uk=^derevo;
derevo=record
kat:string[12];
left,right:uk;
spisok:ukaz;
end;
var root,p:uk;
k,kategor,st,filename:string;
fl,fl2:boolean;
a,b,c,d,e,v,n:integer;
f:text;
procedure zap_spis(var temp_sp:ukaz);
begin
new(temp_sp);
with temp_sp^ do
begin
writeln(' .: Каталог ПО ПК :.');
write('Введите название ПО:');
readln(name);
write('Укажите какая лицензия:');
readln(lic);
write('Укажите какая OS поддеоживается:');
readln(os);
write('Введите яз[ru/en]:');
readln(lang);
write('Введите Разработчика:');
readln(razrab);
write('Введите рейтинг ПО:');
readln(rate);
next:=nil;
end;
end;
procedure add_spisok(var temp:uk; var temp_sp:ukaz);
begin
if temp^.spisok=nil then
temp^.spisok:=temp_sp
else
begin
temp_sp^.next:=temp^.spisok;
temp^.spisok:=temp_sp;
end;
end;
procedure prov_kat(var p:uk; var g1:ukaz; var fl:boolean; k:string);
begin
if p<>nil then
if p^.kat=k then begin
fl:=true;
g1:=p^.spisok;
while g1^.next<>nil do
g1:=g1^.next;
end
else
if k<p^.kat then prov_kat(p^.left,g1,fl,k)
else prov_kat(p^.right,g1,fl,k);
end;
procedure add_tree(var temp:uk);
var p,p1:uk;
begin
if root=nil then root:=temp
else
begin
p:=root;
while p<>nil do
begin
p1:=p;
if temp^.kat<p^.kat then p:=p^.left
else p:=p^.right;
end;
if temp^.kat<p1^.kat then p1^.left:=temp
else p1^.right:=temp;
end;
end;
procedure add(var root:uk);
var temp:uk;
g,temp_sp:ukaz;
n:integer;
begin
fl:=false;
new(temp);
with temp^ do
begin
writeln(' .: Каталог ПО ПК :.');
write('Введите категорию ПО:');
readln(kat);
spisok:=nil;
left:=nil;
right:=nil;
end;
prov_kat(root,g,fl,temp^.kat);
if fl=true then
begin
writeln('Добавить в эту категорию данные:');
writeln('1.Да');
writeln('2.Нет');
read(n);
clrscr;
while n=1 do
begin
zap_spis(temp_sp);
g^.next:=temp_sp;
g:=g^.next;
writeln('Добавить в эту категорию данные:');
writeln('1.Да');
writeln('2.Нет');
readln(n);
clrscr;
end;
end
else
begin
writeln('Добавить в эту категорию данные:');
writeln('1.Да');
writeln('2.Нет');
read(n);
while n=1 do
begin
clrscr;
zap_spis(temp_sp);
add_spisok(temp,temp_sp);
writeln('Добавить в эту категорию данные:');
writeln('1.Да');
writeln('2.Нет');
readln(n);
end;
add_tree(temp);
end;
end;
Procedure readfromfile(var root:uk);
var p,p1,temp:uk;
g,g1,temp_sp:ukaz;
k:string;
procedure poisk(var st,k:string);
var poz:integer;
begin
poz:=pos(' ',st);
k:=copy(st,1,poz-1);
delete(st,1,poz);
end;
procedure read_spisok(var temp_sp:ukaz);
begin
new(temp_sp);
poisk(st,k);
temp_sp^.name:=k;
poisk(st,k);
temp_sp^.lic:=k;
poisk(st,k);
temp_sp^.os:=k;
poisk(st,k);
temp_sp^.lang:=k;
poisk(st,k);
temp_sp^.razrab:=k;
poisk(st,k);
temp_sp^.rate:=k;
temp_sp^.next:=nil;
end;
begin
while not eof(f) do
begin
new(temp);
fl:=false;
readln(f,st);
poisk(st,k);
temp^.kat:=k;
prov_kat(root,g1,fl,k);
if fl=true then
begin
read_spisok(temp_sp);
g1^.next:=temp_sp;
end
else
begin
temp^.spisok:=nil;
temp^.left:=nil;
temp^.right:=nil;
read_spisok(temp_sp);
temp^.spisok:=temp_sp;
add_tree(temp);
end;
end;
end;
Procedure Del_tree(var p:Uk);
Begin
If p<>nil then begin
Del_tree(p^.left);
Del_tree(p^.right);
Dispose(p);
p:=nil;
End;
End;
Procedure Delete_kat(var r:Uk; kat:string);
Procedure DEL(var r:Uk; q:Uk);
Var q1:Uk;
Begin
if r^.right=nil then
begin
q^.kat:=r^.kat;
q1:=r;
r:=r^.left;
dispose(q1);
end
else DEL(r^.right,q);
End;
Var q:Uk;
Begin
if r=nil then writeln('Данной категории нету в БД!')
else
if kat<r^.kat then DELETE_kat(r^.left,kat)
else
if kat>r^.kat then DELETE_kat(r^.right,kat)
else
begin
if r^.right=nil then
begin
q:=r;
r:=r^.left;
dispose(q);
end
else
if r^.left=nil then
begin
q:=r;
r:=r^.right;
dispose(q);
end
else
DEL(r^.left,r);
end;
end;
procedure spisok_del(p:uk;kat,k:string;var fl:boolean);
var g,g1:ukaz;
Begin
if p<>nil then
if p^.kat=kategor then
begin
fl:=true;
if p^.spisok^.next=nil then Delete_kat(root,kat)
else
begin
g1:=p^.spisok;
while (g1<>nil) and (g1^.name<>k) do
begin
g:=g1;
g1:=g1^.next;
end;
if g1=nil then writeln('Данной программы нет в БД!')
else
begin
if p^.spisok=g1 then p^.spisok:=g1^.next
else
if g1^.next=nil then g^.next:=nil
else
g^.next:=g1^.next;
end;
writeln;
end;
end
else
if kategor<p^.kat then spisok_del(p^.left,kat,k,fl)
else spisok_del(p^.right,kat,k,fl);
end;
procedure poisk_kat(var p:uk);
var g:ukaz;
begin
if p<>nil then
if p^.kat=kategor then
begin
g:=p^.spisok;
fl:=false;
while g<>nil do
begin
if fl=false then
begin
write('|',p^.kat:12,'|');
fl:=true;
end
else
write('|','':12,'|');
write(g^.name:14,'|');
write(g^.lic:10,'|');
write(g^.os:10,'|');
write(g^.lang:6,'|');
write(g^.razrab:15,'|');
write(g^.rate:4,'|');
writeln;
g:=g^.next;
end;
end
else
if kategor<p^.kat then poisk_kat(p^.left)
else poisk_kat(p^.right);
end;
procedure poisk_name(var p:uk);
var g:ukaz;
begin
if p<>nil then
begin
poisk_name(p^.left);
g:=p^.spisok;
fl2:=false;
while g<>nil do
begin
if g^.name=k then
begin
fl:=true;
if fl2=false then
begin
fl2:=true;
writeln('|------------|--------------|----------|----------|------|---------------|----|');
write('|',p^.kat:12,'|')
end
else write('|','':12,'|');
write(g^.name:14,'|');
write(g^.lic:10,'|');
write(g^.os:10,'|');
write(g^.lang:6,'|');
write(g^.razrab:15,'|');
write(g^.rate:4,'|');
writeln;
end;
g:=g^.next;
end;
poisk_name(p^.right);
end;
end;
procedure poisk_lic(var p:uk);
var g:ukaz;
begin
if p<>nil then
begin
poisk_lic(p^.left);
g:=p^.spisok;
fl2:=false;
while g<>nil do
begin
if g^.lic=k then
begin
fl:=true;
if fl2=false then
begin
fl2:=true;
writeln('|------------|--------------|----------|----------|------|---------------|----|');
write('|',p^.kat:12,'|')
end
else write('|','':12,'|');
write(g^.name:14,'|');
write(g^.lic:10,'|');
write(g^.os:10,'|');
write(g^.lang:6,'|');
write(g^.razrab:15,'|');
write(g^.rate:4,'|');
writeln;
end;
g:=g^.next;
end;
poisk_lic(p^.right);
end;
end;
procedure poisk_OS(var p:uk);
var g:ukaz;
begin
if p<> nil then
begin
poisk_os(p^.left);
g:=p^.spisok;
fl2:=false;
while g<>nil do
begin
if g^.os=k then
begin
fl:=true;
if fl2=false then
begin
fl2:=true;
writeln('|------------|--------------|----------|----------|------|---------------|----|');
write('|',p^.kat:12,'|')
end
else write('|','':12,'|');
write(g^.name:14,'|');
write(g^.lic:10,'|');
write(g^.os:10,'|');
write(g^.lang:6,'|');
write(g^.razrab:15,'|');
write(g^.rate:4,'|');
writeln;
end;
g:=g^.next;
end;
poisk_os(p^.right);
end;
end;
procedure poisk_lang(p:uk);
var g:ukaz;
begin
if p<> nil then
begin
poisk_lang(p^.left);
g:=p^.spisok;
fl2:=false;
while g<>nil do
begin
if g^.lang=k then
begin
fl:=true;
if fl2=false then
begin
fl2:=true;
writeln('|------------|--------------|----------|----------|------|---------------|----|');
write('|',p^.kat:12,'|')
end
else write('|','':12,'|');
write(g^.name:14,'|');
write(g^.lic:10,'|');
write(g^.os:10,'|');
write(g^.lang:6,'|');
write(g^.razrab:15,'|');
write(g^.rate:4,'|');
writeln;
end;
g:=g^.next;
end;
poisk_lang(p^.right);
end;
end;
procedure poisk_razrab(var p:uk);
var g:ukaz;
begin
if p<> nil then
begin
poisk_razrab(p^.left);
g:=p^.spisok;
fl2:=false;
while g<>nil do
begin
if g^.razrab=k then
begin
fl:=true;
if fl2=false then
begin
fl2:=true;
writeln('|------------|--------------|----------|----------|------|---------------|----|');
write('|',p^.kat:12,'|')
end
else write('|','':12,'|');
write(g^.name:14,'|');
write(g^.lic:10,'|');
write(g^.os:10,'|');
write(g^.lang:6,'|');
write(g^.razrab:15,'|');
write(g^.rate:4,'|');
writeln;
end;
g:=g^.next;
end;
poisk_razrab(p^.right);
end;
end;
procedure poisk_rate(var p:uk);
var g:ukaz;
begin
if p<> nil then
begin
poisk_rate(p^.left);
g:=p^.spisok;
fl2:=false;
while g<>nil do
begin
if g^.rate>=k then
begin
fl:=true;
if fl2=false then
begin
fl2:=true;
writeln('|------------|--------------|----------|----------|------|---------------|----|');
write('|',p^.kat:12,'|')
end
else write('|','':12,'|');
write(g^.name:14,'|');
write(g^.lic:10,'|');
write(g^.os:10,'|');
write(g^.lang:6,'|');
write(g^.razrab:15,'|');
write(g^.rate:4,'|');
writeln;
end;
g:=g^.next;
end;
poisk_rate(p^.right);
end;
end;
procedure vivod(p:uk);
var g:ukaz;
begin
if p<>nil then
begin
vivod(p^.left);
g:=p^.spisok;
writeln('|------------|--------------|----------|----------|------|---------------|----|');
fl:=false;
while g<>nil do
begin
if fl=false then
begin
fl:=true;
write('|',p^.kat:12,'|');
end
else write('|','':12,'|');
write(g^.name:14,'|');
write(g^.lic:10,'|');
write(g^.os:10,'|');
write(g^.lang:6,'|');
write(g^.razrab:15,'|');
write(g^.rate:4,'|');
writeln;
g:=g^.next;
end;
vivod(p^.right);
end;
end;
procedure vivod_v_fail(p:uk);
var g:ukaz;
begin
if p<>nil then
begin
g:=p^.spisok;
while g<>nil do
begin
write(f,p^.kat,' ');
write(f,g^.name,' ');
write(f,g^.lic,' ');
write(f,g^.os,' ');
write(f,g^.lang,' ');
write(f,g^.razrab,' ');
write(f,g^.rate,' ');
writeln(f);
g:=g^.next;
end;
vivod_v_fail(p^.left);
vivod_v_fail(p^.right);
end;
end;
procedure menu;
begin
writeln(' .: Каталог ПО ПК :.');
writeln('Меню:');
writeln('1. Работа с файлами.');
writeln('2. Редактирование БД.');
writeln('3. Вывод БД.');
writeln('4. Поиски.');
writeln('0. Выход.');
end;
procedure podmenu;
begin
writeln(' .: Каталог ПО ПК :.');
writeln('По каким параметрам произвести поиск?');
writeln('1. По категории ПО.');
writeln('2. По названию ПО.');
writeln('3. По типу лицензии.');
writeln('4. По подерживаемым ОС.');
writeln('5. По языку.');
writeln('6. По разработчику.');
writeln('7. По рейтингу [от 1 до 99].');
writeln('0. Назад.');
end;
procedure podmenu2;
begin
writeln(' .: Каталог ПО ПК :.');
writeln('Редактирование:');
writeln('1. Добавить данные в БД.');
writeln('2. Удалить каталог ПО.');
writeln('3. Удалить програму из определенного каталога.');
writeln('4. Удалить БД.');
writeln('0. Назад.');
end;
procedure podmenu3;
begin
writeln(' .: Каталог ПО ПК :.');
writeln('Работа с файлами:');
writeln('1. Считать данные из файла.');
writeln('2. Сохранение БД в файл.');
writeln('3. Удалить файл БД.');
writeln('0. Назад.');
end;
begin
CRTWindowSize(80,40);
Window(1,1,80,40);
root:=nil;
fl:=false;
writeln(' .: Каталог ПО ПК :.');
writeln(' Добро пожаловать в программу: "Каталог ПО ПК"');
writeln;
writeln('Для перехода на главное меню нажмите Enter!');
readln;
repeat
clrscr;
menu;
readln(a);
case a of
0:begin
clrscr;
if fl=false then
begin
writeln(' .: Каталог ПО ПК :.');
writeln('Данные не были сохранены, желаете сохранить данные? ');
writeln('1. Да.');
writeln('2. Нет.');
read(v);
if v=1 then
begin
clrscr;
writeln(' .: Каталог ПО ПК :.');
writeln('Введите имя файла: ');
read(filename);
assign(f,filename+'.txt');
if fileexists(filename+'.txt') then
begin
writeln('Файл уже существует! Хотите перезаписать файл?');
writeln('1. Да.');
writeln('2. Нет.');
readln(d);
if d=1 then
begin
rewrite(f);
vivod_v_fail(root);
close(f);
writeln('Данные БД были успешно сохранены(перезаписаны) в файле: ',filename,'.txt!');
writeln;
writeln('Для завершения нажмите Enter!');
readln;
end;
end
else
begin
rewrite(f);
vivod_v_fail(root);
close(f);
writeln('Данные БД были успешно сохранены в файле: ',filename,'.txt!');
writeln('Для завершения нажмите Enter!');
readln;
end;
end;
end;
clrscr;
writeln(' .: Каталог ПО ПК :.');
writeln;
writeln(' Спасибо за использоване данного продукта.');
end;
1:begin
repeat
clrscr;
podmenu3;
readln(e);
case e of
1:begin
writeln('Введите имя файла: ');
read(filename);
assign(f,filename+'.txt');
if not fileexists(filename+'.txt') then
begin
writeln('Такого файла не существует!');
writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end
else
begin
reset(f);
readfromfile(root);
close(f);
writeln('Данные успешно считались из файла ',filename,'.txt');
writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end;
end;
2:begin
writeln('Введите имя файла: ');
read(filename);
assign(f,filename+'.txt');
if fileexists(filename+'.txt') then
begin
writeln('Файл уже существует! Хотите перезаписать файл?');
writeln('1. Да.');
writeln('2. Нет.');
readln(d);
if d=1 then
begin
rewrite(f);
fl:=true;
vivod_v_fail(root);
close(f);
writeln('Данные БД были успешно сохранены(перезаписаны) в файле: ',filename,'.txt!');
writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end;
end
else
begin
rewrite(f);
vivod_v_fail(root);
close(f);
writeln('Данные БД были успешно сохранены в файле: ',filename,'.txt!');
writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end;
end;
3:begin
writeln('Введите имя файла, которое хотите удалить:');
read(filename);
assign(f,filename+'.txt');
if not fileexists(filename+'.txt') then
begin
writeln('Такого файла: ',filename,'.txt не существует!');
writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end
else
begin
clrscr;
writeln(' .: Каталог ПО ПК :.');
writeln('Вы действительно хотите удалить файл ',filename,'.txt ?');
writeln('1. Да.');
writeln('2. Нет.');
read(n);
if n=1 then
begin
erase(f);
writeln('Файл ',filename,'.txt был успешно удален с жесткого диска!');
writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end
else
begin
writeln('Файл ',filename,'.txt НЕ удален с жесткого диска!');
writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end;
end;
end;
end;
until e=0;
end;
2:begin
repeat
clrscr;
podmenu2;
readln(c);
case c of
1:begin clrscr; fl:=false; add(root);fl:=false;end;
2:begin
fl:=false;
write('Введите категорию ПО, которую хотите удалить с БД:');
read(kategor);
Delete_kat(root,kategor);
writeln('Категория ',kategor,' была успешно удалена с БД!');
writeln;
writeln('Для возврата в меню нажмите Enter!');
fl:=false;
readln;
end;
3:begin
fl:=false;
clrscr;
writeln(' .: Каталог ПО ПК :.');
write('Введите категорию списка ПО, которую хотите удалить с БД:');
read(kategor);
write('Введите имя ПО, которую хотите удалить с БД:');
read(k);
spisok_del(root,kategor,k,fl);
if fl=false then
begin
writeln;
writeln('Такой категории нет в БД!');writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end
else
begin
writeln;
writeln('Программа ',k,' была успешно удалена с категории ',kategor,' с БД!');
writeln;
writeln('Для возврата в меню нажмите Enter!');
readln;
end;
fl:=false;
end;
4:begin
writeln('Вы дейтсвительно хотите удалить всю БД?');
writeln('1. Да.');
writeln('2. Нет.');
read(n);
if n=1 then
begin
Del_tree(root);
writeln('БД была успешна полностью удалена.');
readln;
end
else
begin
writeln('БД не удалена.');
readln;
end;
end;
end;
until c=0;
end;
3:begin
clrscr;
writeln(' .: Каталог ПО ПК :.');
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln('| Категория | Название | Лицензия | ОС | Язык | Разработчик |Рейт|');
vivod(root);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln;
writeln('Для возврата в меню нажмите Enter!');
fl:=false;
readln;
end;
4:begin
repeat
clrscr;
podmenu;
readln(b);
case b of
1: begin
clrscr;
fl:=false;
writeln(' .: Каталог ПО ПК :.');
write('Введите категорию ПО:');
read(kategor);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln('| Категория | Название | Лицензия | ОС | Язык | Разработчик |Рейт|');
writeln('|------------|--------------|----------|----------|------|---------------|----|');
poisk_kat(root);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
if fl=false then writeln('Такой категории нет в БД!' );
writeln;
writeln('Для возврата в меню нажмите Enter!');
fl:=false;
readln;
end;
2: begin
clrscr;
fl:=false;
writeln(' .: Каталог ПО ПК :.');
write('Введите название ПО:');
read(k);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln('| Категория | Название | Лицензия | ОС | Язык | Разработчик |Рейт|');
poisk_name(root);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
if fl=false then writeln('Такого ПО нет в БД!' );
writeln;
writeln('Для возврата в меню нажмите Enter!');
fl:=false;
readln;
end;
3: begin
clrscr;
fl:=false;
writeln(' .: Каталог ПО ПК :.');
write('Введите тип лицензии:');
read(k);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln('| Категория | Название | Лицензия | ОС | Язык | Разработчик |Рейт|');
poisk_lic(root);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
if fl=false then writeln('Такого типа лицензии нет в БД!' );
writeln;
writeln('Для возврата в меню нажмите Enter!'); fl:=false;
readln;
end;
4: begin
clrscr;
fl:=false;
writeln(' .: Каталог ПО ПК :.');
write('Введите ОС:');
read(k);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln('| Категория | Название | Лицензия | ОС | Язык | Разработчик |Рейт|');
poisk_os(root);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
if fl=false then writeln('Такой ОС нет в БД!' );
writeln;
writeln('Для возврата в меню нажмите Enter!');fl:=false;
readln;
end;
5: begin
clrscr;
fl:=false;
writeln(' .: Каталог ПО ПК :.');
write('Введите язык ПО[ru/en]:');
read(k);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln('| Категория | Название | Лицензия | ОС | Язык | Разработчик |Рейт|');
poisk_lang(root);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
if fl=false then writeln('Такого языка нет в БД!' );
writeln;
writeln('Для возврата в меню нажмите Enter!');fl:=false;
readln;
end;
6: begin
clrscr;
fl:=false;
writeln(' .: Каталог ПО ПК :.');
write('Введите разработчика ПО:');
read(k);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln('| Категория | Название | Лицензия | ОС | Язык | Разработчик |Рейт|');
poisk_razrab(root);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
if fl=false then writeln('Такого разработчика ПО нет в БД!' );
writeln;
writeln('Для возврата в меню нажмите Enter!');fl:=false;
readln;
end;
7: begin
clrscr;
fl:=false;
writeln(' .: Каталог ПО ПК :.');
write('Введите минимальную границу рейтинга ПО [от 1 до 99]:');
read(k);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
writeln('| Категория | Название | Лицензия | ОС | Язык | Разработчик |Рейт|');
poisk_rate(root);
writeln('|------------|--------------|----------|----------|------|---------------|----|');
if fl=false then writeln('Выше заданого рейтинга ПО нет в БД!' );
writeln;
writeln('Для возврата в меню нажмите Enter!');fl:=false;
readln;
end;
end;
until b=0
end;
end;
until a=0; end.