Лабораторная работа № 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.