Лабораторная работа № 5 : Динамические структуры данных
Задача: "Библиотека"
Составьте программу, которая содержит текущую информацию о книгах в библиотеке.
Сведения о книгах включают:
номер УДК;
фамилию и инициалы автора;
название;
год издания;
количество экземпляров данной книги в библиотеке.
Программа должна обеспечивать:
начальное формирование данных обо всех книгах в библиотеке в виде списка;
добавление данных о книгах, вновь поступающих в библиотеку;
удаление данных о списываемых книгах;
вывод по запросу сведений о наличии книг библиотеке.
Решение:
Pascal:
uses crt;
type
TPoint = ^TNode;
TNode = Record
Nomer : Integer;
Fam : String;
Naz : String;
God : Integer;
Kol : Integer;
Next : TPoint;
end;
var
SN : TPoint; {Ukazatel na nachalo spiska}
i : integer;
ss : String;
procedure AddOld(Nom,Kol:integer);
var
s : TPoint;
Begin
s:=sn;
while s<>nil do
begin
if(s^.Nomer=Nom)then
begin
inc(s^.Kol,Kol);
break;
end;
s:=s^.next;
end;
End;
procedure Del(Nom,Kol:integer);
var
s,sd : TPoint;
Begin
s:=sn;
if((s^.Nomer=Nom)and(s<>nil))then
begin
s^.Kol:=s^.Kol-Kol;
if s^.Kol<1 then
begin
sd:=s;
sn:=s^.Next;
Dispose(sd);
end;
exit;
end;
while s^.Next<>nil do
begin
if(s^.Next^.Nomer=Nom)then
begin
s^.Next^.Kol:=s^.Next^.Kol-Kol;
if s^.Next^.Kol<1 then
begin
sd:=s^.Next;
s^.Next:=s^.Next^.Next;
Dispose(sd);
end;
break;
end;
s:=s^.next;
end;
End;
procedure AddNew(Nom:integer;Fam,Naz:String;God,Kol:integer);
var
s : TPoint;
Begin
if sn=nil then
begin
new(sn);
sn^.Nomer:=Nom;
sn^.Fam:=Fam;
sn^.Naz:=Naz;
sn^.God:=God;
sn^.Kol:=Kol;
end
else
begin
s:=sn;
while s^.next<>nil do
s:=s^.next;
new(s^.next);
s^.Next^.Nomer:=Nom;
s^.Next^.Fam:=Fam;
s^.Next^.Naz:=Naz;
s^.Next^.God:=God;
s^.Next^.Kol:=Kol;
end;
End;
procedure allBooks;
var
s : TPoint;
Begin
s:=sn;
while s<>nil do
begin
Writeln(#186+' ',s^.Nomer:5,' '+#186+' ',s^.Fam:24,' '+#186+' ',s^.Naz:24
,' '+#186+' ',s^.god:5,' '+#186+' ',s^.kol:5,' '+#186);
s:=s^.Next;
end;
End;
procedure ViewBook(Nom:integer;Fam,Naz:String;God,Kol:integer);
var
s : TPoint;
Begin
s:=sn;
while s<>nil do
begin
if (((Nom=-1)or(Nom=s^.Nomer))
and ((god=-1)or(god=s^.god))
and ((kol=-1)or(kol=s^.kol))
and ((Fam='')or(Fam=s^.Fam))
and ((Naz='')or(Naz=s^.Naz))) then
Writeln(#186+' ',s^.Nomer:5,' '+#186+' ',s^.Fam:24,' '+#186+' ',s^.Naz:24
,' '+#186+' ',s^.god:5,' '+#186+' ',s^.kol:5,' '+#186);
s:=s^.Next;
end;
End;
var
Nomer,God,Kol : Integer;
Fam,Naz: string;
Begin
randomize;
for i:=0 to 10 do
begin
str(i,ss);
addnew(i,'Family'+ss,'Book'+ss,random(50)+1960,i);
end;
ss:='';
repeat
clrscr;
writeln('1 - View all books');
writeln('2 - Add new books');
writeln('3 - Add old books');
writeln('4 - Del books');
writeln('5 - Request books');
writeln('x - Exit');
readln(ss);
clrscr;
if(ss='1') then
begin
allBooks;
readln;
end;
if(ss='2') then
begin
Writeln('Nomer:');
Readln(Nomer);
Writeln('Family:');
Readln(Fam);
Writeln('Name of book:');
Readln(Naz);
Writeln('Year:');
Readln(God);
Writeln('Number:');
Readln(Kol);
AddNew(Nomer,Fam,Naz,God,Kol);
end;
if(ss='3') then
begin
Writeln('Nomer:');
Readln(Nomer);
Writeln('Number:');
Readln(Kol);
AddOld(Nomer,Kol);
end;
if(ss='4') then
begin
Writeln('Nomer:');
Readln(Nomer);
Writeln('Number:');
Readln(Kol);
Del(Nomer,Kol);
end;
if(ss='5') then
begin
Writeln('Nomer(-1 = all):');
Readln(Nomer);
Writeln('Family(Empty = all):');
Readln(Fam);
Writeln('Name of book(Empty = all):');
Readln(Naz);
Writeln('Year(-1 = all):');
Readln(God);
Writeln('Number(-1 = all):');
Readln(Kol);
ViewBook(Nomer,Fam,Naz,God,Kol);
end;
until ss='x';
End.