Добавил:
Eatmore
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:написанные программы / задание №6 — 3 / lab_6
.pas Program Books_for_you;
uses crt;
{/* ‚ аЁ в 2
‘®бв ўЁвм Їа®Ја ¬¬г, Є®в®а п ᮤҐа¦Ёв ⥪гйго Ёд®а¬ жЁо ® ЄЁЈ е ў ЎЁЎ«Ё®вҐЄҐ.
‘ўҐ¤ҐЁп ® ЄЁЈ е ᮤҐа¦ в:
- Ќ®¬Ґа “„Љ
- ” ¬Ё«Ёо Ё ЁЁжЁ «л Ђўв®а
- Ќ §ў ЁҐ
- Ј®¤ Ё§¤ Ёп
- Є®««ЁзҐбвў® нЄ§Ґ¬Ї«па®ў ¤ ®© ЄЁЈЁ ў ЎЁЎ«Ё®вҐЄҐ
Џа®Ја ¬¬ ¤®«¦ ®ЎҐбЇҐзЁў вм:
- Ќ з «м®Ґ д®а¬Ёа®ў ЁҐ ¤ ле ® ўбҐе ЄЁЈ е ў ЎЁЎ«Ё®вҐЄҐ ў ўЁ¤Ґ
¤ў®Ёз®Ј® ¤ҐаҐў
- „®Ў ў«ҐЁҐ ¤ ле ® ЄЁЈ е, ў®ўм Ї®бвгЇ ойЁе ў ЎЁЎ«Ёв®вҐЄг.
- “¤ «ҐЁҐ ¤ ле ® ўбЇЁблў Ґ¬ле ЄЁЈ е
- Џ® § Їа®бг ўл¤ овбп ᢥ¤ҐҐЁп ® «ЁзЁЁ ЄЁЈ ў ЎЁЎ«Ё®вҐЄҐ, ЄЇ®а冷зҐлҐ Ї®
Ј®¤ ¬ Ё§¤ Ёп
*/}
{/* Џа®Ја ¬¬ пў«пҐвбп Ј«п¤л¬ ЇаҐ¤бвў«ҐЁҐ¬, в®Ј® зв® бЇ®б®ЎҐ 祫®ўҐЄ
* Ґб«Ё ҐЈ® ўҐ¦«Ёў® Ї®Їа®бЁвм :)
* ‘®§¤ ¤«п ¤Ґ¬®бва жЁЁ ЁбЇ®«м§®ў Ёп ¤Ё ¬ЁзҐбЄЁе бвагЄвга
* (Є®ЄаҐв®, ЎЁ а®Ј® ¤ҐаҐў ).
*/}
{/* ЋЇаҐ¤Ґ«ҐЁҐ ўбпзҐбЄЁ© ЇҐаҐ¬Ґле Ё вЁЇ®ў г¦ле ¤«п а Ў®вл.
*/}
type p_book = ^one_book;
one_book = record
ydk_number : word;
autor_name : string;
book_name : string;
year : word;
numbers : byte;
right : p_book;
left : p_book;
end;
var root : p_book;
exit_code : boolean;
book_name : string;
year : word;
{/* Џа®жҐ¤га add_book ўбв ў«пҐв ў ¤ҐаҐў® ®ўл© 㧥«, ў Є зҐб⢥ Ї а ¬Ґва®ў
* ЇҐаҐ¤ Ґвбп Є®аҐм ¤ҐаҐў Ё Ёд ¤«п "§ Ї®¬Ё Ёп". ‚ Є зҐб⢥ Є«оз
* ЁбЇ®«м§гҐвбп Ј®¤ Ё§¤ ⥫мбвў ЄЁЈЁ Ё ҐҐ §ў ЁҐ.
*/}
procedure add_book(var root : p_book; ydk_number : word; autor_name : string; book_name : string; year : word; numbers : byte);
var node : p_book;
a : ^pointer;
begin
a := @root;
node := a^;
while (node <> NIL) do
begin
if (node^.year = year) and (node^.book_name = book_name) then
begin
inc(node^.numbers, numbers); exit;
end
else if (node^.year = year) and (node^.book_name > book_name) then a := @(node^.left)
else if (node^.year = year) and (node^.book_name < book_name) then a := @(node^.right)
else if (node^.year < year) then a := @(node^.right)
else if (node^.year > year) then a := @(node^.left);
node := a^;
end;
getmem(a^, sizeof(one_book));
node := a^;
node^.book_name := book_name; node^.ydk_number := ydk_number;
node^.autor_name := autor_name; node^.book_name := book_name;
node^.year := year; node^.numbers := numbers;
node^.left := NIL; node^.right := NIL;
{ writeln('The book is added');}
end;
{/* Џа®жҐ¤га delete_book, г¤ «пҐв 㧥« Ё§ ¤ҐаҐў , ў Є зҐб⢥ Ї а ¬Ґва®ў
* ЇҐаҐ¤ Ґвбп Є®аҐм ¤ҐаҐў Ё Ёд ЁбЇ®«м§гҐ¬ п ¤«п Є«оз .
*/}
procedure delete_book(var root : p_book; book_name : string; year : word);
var node, nodeb, nodec : p_book;
a, b, c : ^pointer;
label next;
begin
a := @root;
node := a^;
while 1=1 do
begin
if (node = NIL) then
begin
write('Њг¦ЁЄ (Ё«Ё „ҐўгиЄ :), Ґ «гзиҐ «Ё ⥡Ґ Ї®©вЁ ЇЁўЄ ');
write('ўлЇЁвм, ¬®¦Ґв ўбЇ®¬Ёим Ёдг ® ЄЁЈЁ, Є®в®а п');
writeln('⥡Ґ Ґ Ї®а ўЁ« бм?');
goto next;
end
else if (node^.year = year) and (node^.book_name = book_name) then
break
else if (node^.year = year) and (node^.book_name > book_name) then a := @(node^.left)
else if (node^.year = year) and (node^.book_name < book_name) then a := @(node^.right)
else if (node^.year < year) then a := @(node^.right)
else if (node^.year > year) then a := @(node^.left);
node := a^;
end;
if (node^.right = NIL) then
begin
a^ := node^.left;
end
else
begin
b := @(node^.right);
nodeb := b^;
if (nodeb^.left = NIL) then
begin
nodeb^.left := node^.left;
a^ := nodeb;
end
else
begin
c := @(nodeb^.left);
nodec := c^;
while (nodec^.left <> NIL) do
begin
b^ := c^;
nodeb := b^;
c := @(nodeb^.left);
nodec := nodeb^.left;
end;
nodeb^.left := nodec^.right;
nodec^.left := node^.left;
nodec^.left := node^.right;
a^ := c^;
end
end;
freemem(node, sizeof(one_book));
next:
readkey;
end;
{/* Џа®жҐ¤га destroy_all, г¤ «пҐв ¤ҐаҐў®, ў Є зҐб⢥ Ї а ¬Ґва®ў
* ЇҐаҐ¤ Ґвбп Є®аҐм ¤ҐаҐў .
*/}
procedure destroy_all(var root : p_book);
begin
if (root <> NIL) then
begin
destroy_all(root^.left);
destroy_all(root^.right);
freemem(root, sizeof(one_book));
end;
end;
{/* Џа®жҐ¤га show_all, Їа®е®¤Ёв ўбҐ г§«л ¤ҐаҐў Ё Ї®Є §лў Ґв Ёдг.
* €бЇ®«м§гҐвбп ¬Ґв®¤ гЇ®а冷祮Ј® ४габЁў®Ј® Їа®е®¦¤ҐЁп.
*/}
procedure show_all(root : p_book);
begin
if (root <> NIL) then
begin
show_all(root^.left);
writeln(root^.ydk_number:10, ' |', root^.autor_name:19, ' |', root^.book_name:19, ' |',
root^.year:7, ' |', root^.numbers:9);
show_all(root^.right);
end;
end;
{/* Џа®жҐ¤га init_base, бзЁвлў Ґв Ёдг Ё§ д ©« .
* €бЇ®«м§гҐвбп ®Ўлзл© вҐЄбв®ўл© д ©«, в Є зв® Ґб«Ё Ґбвм ¦Ґ« ЁҐ
* Ё Ї®§¬®¦®бвм в® Ї®¦ «г©бв бў®аЈ м⥠зв® Ёвм ¤агЈ®Ґ.
* Note: г дгЄжЁЁ Ґбвм Ў®«ми®© Ґ¤®бв в®Є ® г¤ «пҐв Ў §г Ї®б«Ґ Їа®з⥨п.
* в Є зв® ў б«гз Ґ ҐЄ®аҐЄв®Ј® § ўҐаиҐЁп Їа®Ја ¬¬л Ў § Ўг¤Ґв "Ї@е@а@з@@".
* „ Їа®бвпв ¬Ґп ўбҐ «о¤Ё Їа®зЁв ўиЁҐ нв® б«®ў®. ;-)
*/}
procedure init_base(var root : p_book);
var var_file : text;
var ydk_number : word;
autor_name : string;
book_name : string;
year : word;
numbers : byte;
begin
assign (var_file, 'c:\LANGUA~1\TP7\1\data.dat');
{$I-}
reset(var_file);
if (ioresult <> 0) then rewrite(var_file)
else
while (not eof(var_file)) do
begin
readln(var_file, ydk_number); readln(var_file, autor_name);
readln(var_file, book_name); readln(var_file, year);
readln(var_file, numbers);
add_book(root, ydk_number, autor_name, book_name, year, numbers);
end;
{$I+}
rewrite(var_file);
close (var_file);
end;
{/* Џа®жҐ¤га rewrite_base, § ЇЁблў Ґв Ёдг ў д ©«.
* €бЇ®«м§гҐвбп ®Ўлзл© вҐЄбв®ўл© д ©«, в Є зв® Ґб«Ё Ґбвм ¦Ґ« ЁҐ
* Ё ў®§¬®¦®бвм, в® Ї®¦ «г©бв бў®аЈ м⥠зв® Ёвм ¤агЈ®Ґ.
*/}
procedure rewrite_base(var root : p_book);
var var_file : text;
begin
if (root <> NIL) then
begin
assign(var_file, 'c:\LANGUA~1\TP7\1\data.dat');
append(var_file);
writeln(var_file, root^.ydk_number); writeln(var_file, root^.autor_name);
writeln(var_file, root^.book_name); writeln(var_file, root^.year);
writeln(var_file, root^.numbers);
close (var_file);
rewrite_base(root^.left);
rewrite_base(root^.right);
end;
end;
{/* Џа®жҐ¤га new_book, ᮧ¤ ¤«п ¤®Ў ў«ҐЁп ®ў®© ЄЁЈЁ б Є« ўл
*/}
procedure new_book(var root : p_book);
var ydk_number : word;
autor_name : string;
book_name : string;
year : word;
numbers : byte;
begin
writeln; writeln;
writeln('Press any keys ASAP!');
readln(ydk_number); readln(autor_name); readln(book_name); readln(year);
readln(numbers);
add_book(root, ydk_number, autor_name, book_name, year, numbers);
end;
{/* Main function
* „г¬ о вгв Є®¬¬Ґвб Ґ 㦥.
*/}
begin
clrscr;
init_base(root);
exit_code := FALSE;
repeat
clrscr;
writeln('Main menu:');
writeln('1. Add new book in base');
writeln('2. Delete book from the base');
writeln('3. Show all books');
writeln('4. Exit');
writeln;
case readkey of
'1': new_book(root);
'2': begin
writeln('Please type Book Name and Year of book you want to delete');
readln(book_name, year);
delete_book(root, book_name, year);
end;
'3': begin
writeln('YDK Number | Autor Name | Book Name | Year | Quantity');
writeln('-----------+--------------------+--------------------+--------+----------');
show_all(root);
readkey;
end;
'4': exit_code := TRUE;
end;
until exit_code;
rewrite_base(root);
destroy_all(root);
end.
uses crt;
{/* ‚ аЁ в 2
‘®бв ўЁвм Їа®Ја ¬¬г, Є®в®а п ᮤҐа¦Ёв ⥪гйго Ёд®а¬ жЁо ® ЄЁЈ е ў ЎЁЎ«Ё®вҐЄҐ.
‘ўҐ¤ҐЁп ® ЄЁЈ е ᮤҐа¦ в:
- Ќ®¬Ґа “„Љ
- ” ¬Ё«Ёо Ё ЁЁжЁ «л Ђўв®а
- Ќ §ў ЁҐ
- Ј®¤ Ё§¤ Ёп
- Є®««ЁзҐбвў® нЄ§Ґ¬Ї«па®ў ¤ ®© ЄЁЈЁ ў ЎЁЎ«Ё®вҐЄҐ
Џа®Ја ¬¬ ¤®«¦ ®ЎҐбЇҐзЁў вм:
- Ќ з «м®Ґ д®а¬Ёа®ў ЁҐ ¤ ле ® ўбҐе ЄЁЈ е ў ЎЁЎ«Ё®вҐЄҐ ў ўЁ¤Ґ
¤ў®Ёз®Ј® ¤ҐаҐў
- „®Ў ў«ҐЁҐ ¤ ле ® ЄЁЈ е, ў®ўм Ї®бвгЇ ойЁе ў ЎЁЎ«Ёв®вҐЄг.
- “¤ «ҐЁҐ ¤ ле ® ўбЇЁблў Ґ¬ле ЄЁЈ е
- Џ® § Їа®бг ўл¤ овбп ᢥ¤ҐҐЁп ® «ЁзЁЁ ЄЁЈ ў ЎЁЎ«Ё®вҐЄҐ, ЄЇ®а冷зҐлҐ Ї®
Ј®¤ ¬ Ё§¤ Ёп
*/}
{/* Џа®Ја ¬¬ пў«пҐвбп Ј«п¤л¬ ЇаҐ¤бвў«ҐЁҐ¬, в®Ј® зв® бЇ®б®ЎҐ 祫®ўҐЄ
* Ґб«Ё ҐЈ® ўҐ¦«Ёў® Ї®Їа®бЁвм :)
* ‘®§¤ ¤«п ¤Ґ¬®бва жЁЁ ЁбЇ®«м§®ў Ёп ¤Ё ¬ЁзҐбЄЁе бвагЄвга
* (Є®ЄаҐв®, ЎЁ а®Ј® ¤ҐаҐў ).
*/}
{/* ЋЇаҐ¤Ґ«ҐЁҐ ўбпзҐбЄЁ© ЇҐаҐ¬Ґле Ё вЁЇ®ў г¦ле ¤«п а Ў®вл.
*/}
type p_book = ^one_book;
one_book = record
ydk_number : word;
autor_name : string;
book_name : string;
year : word;
numbers : byte;
right : p_book;
left : p_book;
end;
var root : p_book;
exit_code : boolean;
book_name : string;
year : word;
{/* Џа®жҐ¤га add_book ўбв ў«пҐв ў ¤ҐаҐў® ®ўл© 㧥«, ў Є зҐб⢥ Ї а ¬Ґва®ў
* ЇҐаҐ¤ Ґвбп Є®аҐм ¤ҐаҐў Ё Ёд ¤«п "§ Ї®¬Ё Ёп". ‚ Є зҐб⢥ Є«оз
* ЁбЇ®«м§гҐвбп Ј®¤ Ё§¤ ⥫мбвў ЄЁЈЁ Ё ҐҐ §ў ЁҐ.
*/}
procedure add_book(var root : p_book; ydk_number : word; autor_name : string; book_name : string; year : word; numbers : byte);
var node : p_book;
a : ^pointer;
begin
a := @root;
node := a^;
while (node <> NIL) do
begin
if (node^.year = year) and (node^.book_name = book_name) then
begin
inc(node^.numbers, numbers); exit;
end
else if (node^.year = year) and (node^.book_name > book_name) then a := @(node^.left)
else if (node^.year = year) and (node^.book_name < book_name) then a := @(node^.right)
else if (node^.year < year) then a := @(node^.right)
else if (node^.year > year) then a := @(node^.left);
node := a^;
end;
getmem(a^, sizeof(one_book));
node := a^;
node^.book_name := book_name; node^.ydk_number := ydk_number;
node^.autor_name := autor_name; node^.book_name := book_name;
node^.year := year; node^.numbers := numbers;
node^.left := NIL; node^.right := NIL;
{ writeln('The book is added');}
end;
{/* Џа®жҐ¤га delete_book, г¤ «пҐв 㧥« Ё§ ¤ҐаҐў , ў Є зҐб⢥ Ї а ¬Ґва®ў
* ЇҐаҐ¤ Ґвбп Є®аҐм ¤ҐаҐў Ё Ёд ЁбЇ®«м§гҐ¬ п ¤«п Є«оз .
*/}
procedure delete_book(var root : p_book; book_name : string; year : word);
var node, nodeb, nodec : p_book;
a, b, c : ^pointer;
label next;
begin
a := @root;
node := a^;
while 1=1 do
begin
if (node = NIL) then
begin
write('Њг¦ЁЄ (Ё«Ё „ҐўгиЄ :), Ґ «гзиҐ «Ё ⥡Ґ Ї®©вЁ ЇЁўЄ ');
write('ўлЇЁвм, ¬®¦Ґв ўбЇ®¬Ёим Ёдг ® ЄЁЈЁ, Є®в®а п');
writeln('⥡Ґ Ґ Ї®а ўЁ« бм?');
goto next;
end
else if (node^.year = year) and (node^.book_name = book_name) then
break
else if (node^.year = year) and (node^.book_name > book_name) then a := @(node^.left)
else if (node^.year = year) and (node^.book_name < book_name) then a := @(node^.right)
else if (node^.year < year) then a := @(node^.right)
else if (node^.year > year) then a := @(node^.left);
node := a^;
end;
if (node^.right = NIL) then
begin
a^ := node^.left;
end
else
begin
b := @(node^.right);
nodeb := b^;
if (nodeb^.left = NIL) then
begin
nodeb^.left := node^.left;
a^ := nodeb;
end
else
begin
c := @(nodeb^.left);
nodec := c^;
while (nodec^.left <> NIL) do
begin
b^ := c^;
nodeb := b^;
c := @(nodeb^.left);
nodec := nodeb^.left;
end;
nodeb^.left := nodec^.right;
nodec^.left := node^.left;
nodec^.left := node^.right;
a^ := c^;
end
end;
freemem(node, sizeof(one_book));
next:
readkey;
end;
{/* Џа®жҐ¤га destroy_all, г¤ «пҐв ¤ҐаҐў®, ў Є зҐб⢥ Ї а ¬Ґва®ў
* ЇҐаҐ¤ Ґвбп Є®аҐм ¤ҐаҐў .
*/}
procedure destroy_all(var root : p_book);
begin
if (root <> NIL) then
begin
destroy_all(root^.left);
destroy_all(root^.right);
freemem(root, sizeof(one_book));
end;
end;
{/* Џа®жҐ¤га show_all, Їа®е®¤Ёв ўбҐ г§«л ¤ҐаҐў Ё Ї®Є §лў Ґв Ёдг.
* €бЇ®«м§гҐвбп ¬Ґв®¤ гЇ®а冷祮Ј® ४габЁў®Ј® Їа®е®¦¤ҐЁп.
*/}
procedure show_all(root : p_book);
begin
if (root <> NIL) then
begin
show_all(root^.left);
writeln(root^.ydk_number:10, ' |', root^.autor_name:19, ' |', root^.book_name:19, ' |',
root^.year:7, ' |', root^.numbers:9);
show_all(root^.right);
end;
end;
{/* Џа®жҐ¤га init_base, бзЁвлў Ґв Ёдг Ё§ д ©« .
* €бЇ®«м§гҐвбп ®Ўлзл© вҐЄбв®ўл© д ©«, в Є зв® Ґб«Ё Ґбвм ¦Ґ« ЁҐ
* Ё Ї®§¬®¦®бвм в® Ї®¦ «г©бв бў®аЈ м⥠зв® Ёвм ¤агЈ®Ґ.
* Note: г дгЄжЁЁ Ґбвм Ў®«ми®© Ґ¤®бв в®Є ® г¤ «пҐв Ў §г Ї®б«Ґ Їа®з⥨п.
* в Є зв® ў б«гз Ґ ҐЄ®аҐЄв®Ј® § ўҐаиҐЁп Їа®Ја ¬¬л Ў § Ўг¤Ґв "Ї@е@а@з@@".
* „ Їа®бвпв ¬Ґп ўбҐ «о¤Ё Їа®зЁв ўиЁҐ нв® б«®ў®. ;-)
*/}
procedure init_base(var root : p_book);
var var_file : text;
var ydk_number : word;
autor_name : string;
book_name : string;
year : word;
numbers : byte;
begin
assign (var_file, 'c:\LANGUA~1\TP7\1\data.dat');
{$I-}
reset(var_file);
if (ioresult <> 0) then rewrite(var_file)
else
while (not eof(var_file)) do
begin
readln(var_file, ydk_number); readln(var_file, autor_name);
readln(var_file, book_name); readln(var_file, year);
readln(var_file, numbers);
add_book(root, ydk_number, autor_name, book_name, year, numbers);
end;
{$I+}
rewrite(var_file);
close (var_file);
end;
{/* Џа®жҐ¤га rewrite_base, § ЇЁблў Ґв Ёдг ў д ©«.
* €бЇ®«м§гҐвбп ®Ўлзл© вҐЄбв®ўл© д ©«, в Є зв® Ґб«Ё Ґбвм ¦Ґ« ЁҐ
* Ё ў®§¬®¦®бвм, в® Ї®¦ «г©бв бў®аЈ м⥠зв® Ёвм ¤агЈ®Ґ.
*/}
procedure rewrite_base(var root : p_book);
var var_file : text;
begin
if (root <> NIL) then
begin
assign(var_file, 'c:\LANGUA~1\TP7\1\data.dat');
append(var_file);
writeln(var_file, root^.ydk_number); writeln(var_file, root^.autor_name);
writeln(var_file, root^.book_name); writeln(var_file, root^.year);
writeln(var_file, root^.numbers);
close (var_file);
rewrite_base(root^.left);
rewrite_base(root^.right);
end;
end;
{/* Џа®жҐ¤га new_book, ᮧ¤ ¤«п ¤®Ў ў«ҐЁп ®ў®© ЄЁЈЁ б Є« ўл
*/}
procedure new_book(var root : p_book);
var ydk_number : word;
autor_name : string;
book_name : string;
year : word;
numbers : byte;
begin
writeln; writeln;
writeln('Press any keys ASAP!');
readln(ydk_number); readln(autor_name); readln(book_name); readln(year);
readln(numbers);
add_book(root, ydk_number, autor_name, book_name, year, numbers);
end;
{/* Main function
* „г¬ о вгв Є®¬¬Ґвб Ґ 㦥.
*/}
begin
clrscr;
init_base(root);
exit_code := FALSE;
repeat
clrscr;
writeln('Main menu:');
writeln('1. Add new book in base');
writeln('2. Delete book from the base');
writeln('3. Show all books');
writeln('4. Exit');
writeln;
case readkey of
'1': new_book(root);
'2': begin
writeln('Please type Book Name and Year of book you want to delete');
readln(book_name, year);
delete_book(root, book_name, year);
end;
'3': begin
writeln('YDK Number | Autor Name | Book Name | Year | Quantity');
writeln('-----------+--------------------+--------------------+--------+----------');
show_all(root);
readkey;
end;
'4': exit_code := TRUE;
end;
until exit_code;
rewrite_base(root);
destroy_all(root);
end.