Witam. Mam dwa problemy. Pierwszy dotyczy procedury wyswietl. W momencie kiedy do bazy zostanie dodana jedna książka procedura działa normalnie. Kiedy dodam jednak więcej niż jedną książkę program wpada w nieskończoną pętle. Drugi problem dotyczy wskaźnika. Chce aby ID książki nadawane było automatycznie z numerem o jeden większy od poprzedniego. Myślałem zrobić to w ten sposób:
procedure nadaj_id;
begin
if head^.id=0 then
begin
head^.id:=1;
end
else
begin
head^.id:=head^.id+1;
end;
end;
ale niestety nie działa. Poniżej jest program główny.
program ksiazki;
uses crt;
type
wksiazka=^ksiazka;
ksiazka=record
id:integer;
tytul:string[30];
rok:integer;
im_aut:string[20];
naz_aut:string[20];
gatunek:string[15];
ile_w_sumie:integer;
ile_wypo:integer;
next:wksiazka;
prev:wksiazka;
end;
var
tmp:wksiazka;
procedure dodaj(var head:wksiazka);
{Procedura ma za zadanie dodac nowa ksiazke do bazy danych}
var
tmp,pom:wksiazka; {Zmienna tmp sluzy do stworzenia nowego elemntu, zmienna pom do poruszania sie po liscie}
ile,i:integer; {Licznik petli for}
licznik_id:integer;
begin
clrscr;
new(tmp);
writeln('Podaj ile ksiazek chcesz dodac do biblioteki: ');
readln(ile);
for i:=1 to ile do
begin
clrscr;
writeln('Podaj tytul ksiazki: ');
readln(tmp^.tytul);
writeln;
writeln('Podaj rok wydania ksiazki: ');
readln(tmp^.rok);
writeln;
writeln('Podaj imie autora ksiazki: ');
readln(tmp^.im_aut);
writeln; {Dodawanie danych o ksiazkach do listy}
writeln('Podaj nazwisko autora ksiazki: ');
readln(tmp^.naz_aut);
writeln;
writeln('Podaj gatunek ksiazki: ');
readln(tmp^.gatunek);
writeln;
writeln('Podaj liczbe WSZYSTKICH dostepnych ksiazek: ');
readln(tmp^.ile_w_sumie);
if head=nil then
begin
tmp^.prev := nil; {Jesli lista jest pusta przypisz do pierwszego elementu}
tmp^.next := nil;
head := tmp;
end
else
if head^.tytul > tmp^.tytul then
begin
tmp^.prev := nil;
tmp^.next := head; {Jesli pierwszy element jest "wiekszy" od dodawanego przypisz do nastepnego i az do skutku}
head^.prev := tmp;
head := tmp;
end
else
begin
pom := head;
while (pom^.next <> nil) and (pom^.next^.tytul < tmp^.tytul) do
pom := pom^.next;
tmp^.next := pom^.next; {Jesli dodawany element jest "wiekszy" od obecnie pierwszego zajmuje jego miejsce}
tmp^.prev := pom;
if pom^.next <> nil then
pom^.next^.prev := tmp;
pom^.next := tmp;
end;
end;
end;
procedure wyswietl(head : wksiazka);
begin
clrscr;
if head = nil then
write('Brak ksiazek w bazie!')
else begin
while head <> nil do
begin
{wszystkie writelny sluza do wyswietlania poszczegolnych pol}
writeln('Id ksiazki: ',head^.id);
writeln('Tytul ksiazki: ',head^.tytul);
writeln('Rok wydania ksiazki: ',head^.rok);
writeln('Imie i nazwisko autora: ',head^.im_aut, ' ', head^.naz_aut);
writeln('Gatunek ksiazki: ',head^.gatunek);
writeln('Ilosc ksiazek dostepnych w bibliotece: ', head^.ile_w_sumie);
head := head^.next; {przypisanie nastepnika do pierwszego elementu}
end;
readln;
end;
end;
procedure menu;
var
numer:byte;
begin
repeat
clrscr;
writeln('Podaj liczbe odpowiadajaca opcji');
writeln('1. Dodawanie nowej ksiazki do bazy');
writeln('2. Wyswietlanie wszystkich ksiazek w bibliotece');
readln(numer);
case numer of
1: dodaj(tmp);
2: wyswietl(tmp);
else halt;
end;
until numer>3;
end;
begin
menu;
end.