Baza danych obsługująca bibliotekę - wypożyczenia

0

Witam.

Pracuję nad programem obsługującym bibliotekę. Utworzyłem już dwie listy: czytelników i książek. Są one wczytywane i zapisywane do plików. Mam poważny problem gdyż nie mam pojęcia w jaki sposób zrobić wypożyczenia w bazie. Utworzyłem procedure wypozycz ale umozliwia mi ona wypozyczenie tylko jednej ksiazki, następne się nadpisują. Jak zrobić procedurę obsługującą wypożyczenia? Z jakich struktur skorzystać? Bardzo proszę o pomoc.

Kod:

program project1;

type
  czytelnicy=^czytelnik;
  rezerw=^rez;
  ksiazki=^ksiazka;

    rez=record
    wlasciciel:czytelnicy;
    nastepna:rezerw;
    data_wypozyczenia:string;
    ksiazka:ksiazki;

end;

  czytelnik=record
    nazwisko:string[20];
    nastepny:czytelnicy;
    poprzedni:czytelnicy;
    rezerwacja:rezerw;
 end;


   ksiazka=record
     tytul:string[20];
     nastepna_ksiazka:ksiazki;
     rezerwacja:rezerw;
     czy_wypozyczona:boolean;
 end;


  var

    pierwszy_czytelnik:czytelnicy;
    lista_czyt:lista_czyt_opis;
    pierwsza_ksiazka:ksiazki;
    pierwsza_rezerwacja:rezerw;
    plik: file of ksiazka;
    plik2: file of czytelnik;
    rob: string;

  procedure wczytaj(var glowa:czytelnicy);
    var nowy:czytelnicy;
     begin
      assign(plik2,'dane.ele');
      reset(plik2);
      glowa:=nil;
      while not eof (plik2) do
        begin
          new(nowy);
          read(plik2,nowy^);

          nowy^.nastepny:=glowa;
         // writeln(glowa^.nazwisko);
          glowa:=nowy;

        end;
      close(plik2);
     end;

  procedure wstaw(var glowa:czytelnicy);
    var nazw:string;nowy:czytelnicy;
      begin
        writeln('podaj nazwisko');
        readln(nazw);
        new(nowy);
        nowy^.nazwisko:=nazw;
        nowy^.nastepny:=glowa;
        glowa:=nowy;
      end; 

  procedure wyswietl(glowa:czytelnicy);
    begin
      while glowa<>nil do
        begin
          writeln(glowa^.nazwisko);
          glowa:=glowa^.nastepny;
        end;
    end;

  procedure zapisz(glowa:czytelnicy);
    begin
      assign(plik2,'dane.ele');
      rewrite(plik2);
      while glowa<>nil do
        begin
          write(plik2,glowa^);
          glowa:=glowa^.nastepny;
        end;
      close(plik2);
    end;

  procedure wczytaj_ksiazki(var glowa:ksiazki);
    var nowy:ksiazki;
     begin
      assign(plik,'dane_ksiazki.rek');
      reset(plik);
      while not eof (plik) do
        begin
          new(nowy);
          read(plik,nowy^);
          nowy^.nastepna_ksiazka:=glowa;
          glowa:=nowy;
        end;
      close(plik);
     end;

 procedure wyswietl_ksiazki(glowa:ksiazki);
    begin
      while glowa<>nil do
        begin
          writeln(glowa^.tytul);
          glowa:=glowa^.nastepna_ksiazka;
        end;
    end;

  procedure wstaw_ksiazke(var glowa:ksiazki);
    var tyt:string;
        nowy:ksiazki;
      begin
        writeln('podaj tytul');
        readln(tyt);
        new(nowy);
        nowy^.tytul:=tyt;
        nowy^.nastepna_ksiazka:=glowa;
        glowa:=nowy;
      end;

  procedure zapisz_ksiazki(glowa:ksiazki);
    begin
      assign(plik,'dane_ksiazki.rek');
      rewrite(plik);
      while glowa<>nil do
        begin
          write(plik,glowa^);
          glowa:=glowa^.nastepna_ksiazka;
        end;
      close(plik);
    end;

function szukaj_czytelnika (nazwa:string; g:czytelnicy):czytelnicy;
  begin
    while g<>nil do
      begin
      if g^.nazwisko=nazwa then szukaj_czytelnika:=g;
      g:=g^.nastepny;

      end;
  end;

function szukaj_ksiazki (nazwa:string; g:ksiazki):ksiazki;
  begin
    while g<>nil do
      begin
      if g^.tytul=nazwa then szukaj_ksiazki:=g;
      g:=g^.nastepna_ksiazka;

      end;
  end;

 procedure wypozycz(var glowa:czytelnicy; var glowa2:ksiazki);
    var nazw:string;
        tyt:string;
        czytelnik:czytelnicy;
        ksiazka:ksiazki;
        wyp:rezerw;
      begin
        writeln('podaj nazwisko');
        readln(nazw);
        writeln('podaj tytul');
        readln(tyt);
        czytelnik:=szukaj_czytelnika(nazw,glowa);
        ksiazka:=szukaj_ksiazki(tyt,glowa2);
        new(wyp);
        wyp^.wlasciciel:=czytelnik;
        ksiazka^.rezerwacja:=wyp;
        ksiazka^.czy_wypozyczona:=true;
        wyp^.nastepna:=nil;
        czytelnik^.rezerwacja:=wyp;
        wyp^.ksiazka:=ksiazka;
        writeln(ksiazka^.tytul);
        WriteLn(czytelnik^.nazwisko);

 end;

procedure wyswietl_k(glowa:rezerw);
  begin
    while glowa<>nil do
      begin
        writeln(glowa^.ksiazka^.tytul);
        glowa:=glowa^.nastepna;
      end;
  end;

procedure wyswietl_wypozeczenie (glowa:czytelnicy);
  var
    czytelnik:czytelnicy;
    nazw:string;
begin
  writeln ('podaj nazwisko');
  readln(nazw);

  czytelnik:=szukaj_czytelnika(nazw,glowa);
  wyswietl_k(czytelnik^.rezerwacja);

end;


  procedure usun_czytelnika(g:czytelnicy);
    var pomoc:czytelnicy;
        nazw:string[20];
        czytelnik:czytelnicy;
      begin
        writeln('podaj nazwisko');
        readln(nazw);
        czytelnik:=szukaj_czytelnika(nazw,g);
        pomoc:=g;
        while pomoc^.nastepny<>czytelnik do
      pomoc:=pomoc^.nastepny;
      pomoc^.nastepny:=czytelnik^.nastepny;
      dispose(czytelnik);

      end;


procedure usun_ksiazke(g:ksiazki);
  var pomoc:ksiazki;
      tyt:string[20];
      ksiazka:ksiazki;
    begin
      writeln('podaj tytul');
      readln(tyt);
      ksiazka:=szukaj_ksiazki(tyt,g);
      pomoc:=g;
      while pomoc^.nastepna_ksiazka<>ksiazka do
         pomoc:=pomoc^.nastepna_ksiazka;
      pomoc^.nastepna_ksiazka:=ksiazka^.nastepna_ksiazka;
      dispose(ksiazka);
    end;


begin

  lista_czyt.poczatek:=nil;
  lista_czyt.koniec:=nil;
  lista_czyt.dlugosc:=0;

  repeat
  writeln('co chcesz zrobic?');
  readln(rob);
  writeln;
  if rob='wczytaj' then
  wczytaj(pierwszy_czytelnik);
   if rob='wstaw' then
  wstaw(pierwszy_czytelnik);
   if rob='wstaw2' then
  wstaw_ksiazke(pierwsza_ksiazka);
  if rob='wyswietl' then
  wyswietl(pierwszy_czytelnik);
  if rob='zapisz' then
  zapisz(pierwszy_czytelnik);
  if rob='zapisz2' then
  zapisz_ksiazki(pierwsza_ksiazka);
  if rob='wczytaj2' then
  wczytaj_ksiazki(pierwsza_ksiazka);
  if rob='wyswietl2' then
  wyswietl_ksiazki(pierwsza_ksiazka);
  if rob='wypozycz' then
  wypozycz(pierwszy_czytelnik,pierwsza_ksiazka);
  if rob='wyswietlwyp' then
  wyswietl_wypozeczenie(pierwszy_czytelnik);
  if rob='usun' then
  usun_czytelnika(pierwszy_czytelnik);
  if rob='usun2' then
  usun_ksiazke(pierwsza_ksiazka);
  writeln;
 until rob='k';
  readln;
  end.


 
1

Znowu Ty? :]

Poniższe funkcje są niepoprawne:

function szukaj_czytelnika (nazwa:string; g:czytelnicy):czytelnicy;
  begin
    while g<>nil do
      begin
      if g^.nazwisko=nazwa then szukaj_czytelnika:=g;
      g:=g^.nastepny;
 
      end;
  end;
 
function szukaj_ksiazki (nazwa:string; g:ksiazki):ksiazki;
  begin
    while g<>nil do
      begin
      if g^.tytul=nazwa then szukaj_ksiazki:=g;
      g:=g^.nastepna_ksiazka;
 
      end;
  end;

bo przy nieodnalezieniu danej książki nie przypisujesz wartości dla rezultatu funkcji, więc trzeba by zobaczyć do dokumentacji czy rezultat funkcji w takiej sytuacji będzie zawierał śmieci, czy jakąś określoną wartość, jak Nil; Możesz też sie pozbyć tego niedopatrzenia w prosty sposób:

function szukaj_czytelnika(Nazwa: String; G: Czytelnicy): Czytelnicy;
begin
  Result := G;

  while Result <> nil do
    if Result^.Tytul = Nazwa then
      Exit
    else
      Result := Result^.Nastepny;
end;

function szukaj_ksiazki(Nazwa: String; G: Ksiazki): Ksiazki;
begin
  Result := G;

  while Result <> nil do
    if Result^.Tytul = Nazwa then
      Exit
    else
      Result := Result^.Nastepna_ksiazka;
end;

A co do samego wypożyczania - co Twoja procedura wypozycz ma w ogóle robić?

2

@furious programming, czemu nie może być po ludzku?

function szukaj_czytelnika(Nazwa:String;G:Czytelnicy):Czytelnicy;
begin
  while (G<>nil)and(G^.Tytul<>Nazwa) do G:=G^.Nastepny;
  Result:=G;
end;
0

@furious programming, procedura wypożycz ma za zadanie tworzyć strukturę przechowującą informacje o wypożyczeniach danego czytelnika, np. podaję nazwisko czytelnika i tytuł książki i tworzy mi się element który będzie zawierał to wypożyczenie. Za pomocą innych procedur trzeba tym wypożyczeniem zarządzać np. wyświetlać wypożyczenia danego czytelnika, usuwać je. Oczywiście na koniec wszystko muszę zapisać do pliku.

0

Zrobiłem coś takiego. Dodałem nowe pola id_czyt i id_wyp do rekordow:

czytelnik=record
     nazwisko:string[20];
     nastepny:czytelnicy;
     poprzedni:czytelnicy;
     rezerwacja:rezerw;
     id_czyt:czytelnicy;
  end;


   ksiazka=record
      tytul:string[20];
      nastepna_ksiazka:ksiazki;
      rezerwacja:rezerw;
      czy_wypozyczona:boolean;
      id_wyp:czytelnicy;
  end;                    

Napisałem następujące procedury (zastąpiłem nimi poprzednie o tej samej nazwie):

 procedure wypozycz(var glowa:czytelnicy; var glowa2:ksiazki);
  var
      nazw:string[20];
      tyt:string[20];
      czytelnik:czytelnicy;
      ksiazka:ksiazki;
  begin
     writeln('podaj nazwisko');
        readln(nazw);
        writeln('podaj tytul');
        readln(tyt);
        czytelnik:=szukaj_czytelnika(nazw,glowa);
        ksiazka:=szukaj_ksiazki(tyt,glowa2);
        ksiazka^.id_wyp:=czytelnik^.id_czyt;
  end;              

procedure wyswietl_wypozeczenie (glowa:czytelnicy; glowa2:ksiazki);
  var
    czytelnik:czytelnicy;
    nazw:string;
begin
  writeln ('podaj nazwisko');
  readln(nazw);

  czytelnik:=szukaj_czytelnika(nazw,glowa);
  while glowa2<>nil do  begin
     if glowa2^.id_wyp=czytelnik then
   writeln(glowa2^.tytul);
    glowa2:=glowa2^.nastepna_ksiazka;

    end;                    

Dodawanie i wyświetlanie elegancko mi działa jeśli dodaję ręcznie czytelników i książki do list (za pomocą procedur wstaw i wstaw_ksiazke). Jednak gdy wczytuję czytelników i książki z pliku to już program nie działa jak należy, nie wyświetla nic albo wyświetla nie to co trzeba. Gdzie jest problem? Bardzo proszę o pomoc.

0

Rozumiem, że Twój program to tylko "wprawka", ale na pewno tytuły książek i nazwiska trafiają się dłuższe niż 20 znaków. Tak z innego strony to format opisu bibliograficznego książek jest zdefiniowany standardem MARC BN / MARC21. Poza tym wydaje mi się, że tego typu program powinien być oparty na jakimś silniku baz danych SQL. Nie ma co drugi raz wymyślać koła, po prostu bazy danych tworzy się przy wykorzystaniu tego typu silników.

0

Moim zadaniem jest stworzyć prostą bazę danych z wykorzystaniem struktur dynamicznych i plików rekordowych w języku pascal. Tytuły dłuższe niż 20 znaków to raczej sprawa drugorzędna, ważne żeby program był poprawnie zbudowany. cw, zapewniam Cię że z własnej woli nie wybrałbym pascala to zrobienia bazy danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1