Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КП_информатика_1курс_УляшевИИ_100800.doc
Скачиваний:
30
Добавлен:
28.10.2018
Размер:
1.9 Mб
Скачать

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.