Advertisement
m4ly

Biblioteka projekt

Feb 21st, 2014
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 15.35 KB | None | 0 0
  1. program bibl;
  2.  
  3. uses crt, sysutils;
  4.  
  5.  
  6. { Typ zawiera inf o czytelniku }
  7. type dane_czytelnika = record
  8.  imie :  string[32];
  9.  nazwisko :  string[32];
  10.  end;
  11.  
  12. { Typ zawiera inf o ksiazce }
  13.  type dane_ksiazki = record
  14.    tytul : string[255];
  15.    id : integer;
  16.  end;
  17.  
  18. { Typ reprezentujący czytelnika }
  19. type
  20.   pCzytelnik = ^TCzytelnik;
  21.     TCzytelnik = record
  22.       dane : dane_czytelnika;
  23.       nast :  pCzytelnik;
  24.     end;
  25.  
  26.  { Typ reprezentujący ksiazke }
  27. type
  28. pKsiazka = ^TKsiazka;
  29.  TKsiazka = record
  30.    dane : dane_ksiazki;
  31.    dostepna : boolean;
  32.    {
  33.    lista czytelnikow - pierwszy element listy tj glowa zawiera dane czytelnika ktory
  34.    aktualnie posiada ksiazke
  35.    }
  36.    czytelnicy : pCzytelnik;
  37.    nast :  pKsiazka;
  38. end;
  39.  
  40. {                                             }
  41. { Funkcje które operuja na liscie czytelnikow }
  42. {                                             }
  43.  
  44. { Procedura dodaje nowego czytelnika na poczatek listy }
  45. procedure dodaj_czytelnika(var glowa : pCzytelnik; czytelnik : dane_czytelnika);
  46. var
  47.   nowy : pCzytelnik;
  48.   begin
  49.  
  50.   new(nowy);
  51.  
  52.   nowy^.dane := czytelnik;
  53.   nowy^.nast := glowa;
  54.   glowa := nowy;
  55.  
  56.   end;
  57.  
  58. { Procedura usuwa calkowice liste czytenilkow z pamieci }
  59. procedure usun_czytelnikow(var glowa : pCzytelnik);
  60. var
  61.     aktualny: pCzytelnik;
  62. begin
  63.     aktualny := glowa;
  64.     while aktualny <> nil  do begin
  65.           aktualny := aktualny^.nast;
  66.           dispose(glowa);
  67.           glowa := aktualny;
  68.     end;
  69.  
  70.     { lista jest pusta wiec wskazujemy na nil`a zeby funkcja dodaj_czytelnika dodawala nadal }
  71.     glowa := nil;
  72. end;
  73.  
  74. { Funkcja liczy ilosc czytelnikow - tj ilosc elemetnow listy }
  75. function ilosc_czytelnikow(glowa : pCzytelnik) : integer;
  76. var
  77.     ile : integer;
  78.     begin
  79.      ile := 0;
  80.      while(glowa <> nil) do begin
  81.            { inkrementacja w gore }
  82.            inc(ile);
  83.            glowa := glowa^.nast;
  84.      end;
  85.     ilosc_czytelnikow := ile;
  86. end;
  87.  
  88. {                                         }
  89. { Funkcje ktore operuja na liscie ksiazek }
  90. {                                         }
  91. { Procedura ustawiana ksiazke na zajeta badz wolna }
  92. procedure ustaw_status_ksiazki(var ksiazka : pKsiazka; status : boolean);
  93. begin
  94.   ksiazka^.dostepna := status;
  95. end;
  96.  
  97. { Procedura dodaje nowa ksiazke na poczatek listy }
  98. procedure dodaj_ksiazke(var glowa : pKsiazka; ksiazka : dane_ksiazki);
  99. var
  100.   nowa : pKsiazka;
  101.  
  102.   begin
  103.   new(nowa);
  104.   { lista czytelnikow domyslnie jest pusta - nie zawiera rekordow }
  105.   nowa^.czytelnicy := nil;
  106.  
  107.   { ksiazka domyslnie jest dosptena }
  108.   ustaw_status_ksiazki(nowa, true);
  109.  
  110.   nowa^.dane := ksiazka;
  111.  
  112.   nowa^.nast := glowa;
  113.   glowa := nowa;
  114.  
  115.   end;
  116.  
  117. { Procedura usuwa ksiazke z bazy danych jak i czytelnikow }
  118. procedure usun_ksiazke(var glowa : pKsiazka;  usun_ksiazka : pKsiazka);
  119. var
  120.   aktualny, poprzedni : pKsiazka;
  121.   begin
  122.    aktualny := glowa;
  123.   while(aktualny <> nil) do begin
  124.     { jesli wskazniki do siebie pasuja - usuwamy }
  125.     if(aktualny = usun_ksiazka) then begin
  126.  
  127.             { a) usuwamy pierwszy element z listy }
  128.             if(aktualny = glowa) then begin
  129.  
  130.                    glowa := aktualny^.nast;
  131.  
  132.                    { usuwamy czytelnikow }
  133.                    usun_czytelnikow(aktualny^.czytelnicy);
  134.  
  135.                    { usuwamy rekord }
  136.                    dispose(aktualny);
  137.  
  138.                    { wskaznik pokazuje na "nic" }
  139.                    aktualny := nil;
  140.  
  141.                    { to wszystko na dzis‡ }
  142.                    exit;
  143.  
  144.             end
  145.             { b) usuwamy obojetnie jaki element ktory nie jest glowa listy }
  146.             else begin
  147.  
  148.                    poprzedni^.nast := aktualny^.nast;
  149.  
  150.                     { usuwamy czytelnikow }
  151.                     usun_czytelnikow(aktualny^.czytelnicy);
  152.  
  153.                    { usuwamy nas }
  154.                    dispose(aktualny);
  155.  
  156.                    { wskaznik pokazuje na "nic" }
  157.                    aktualny := nil;
  158.  
  159.                    { dalej nie musimy iterowac‡ }
  160.                    exit;
  161.             end;
  162.     end
  163.     { przesuwamy się dalej }
  164.     else begin
  165.          poprzedni := aktualny;
  166.          aktualny := aktualny^.nast;
  167.     end;
  168.   end;
  169.   end;
  170.  
  171. { Funkcja szuka ksiazki na liscie wedlug id - zwraca wskaznik na pKsiazka lub nil jesli nie ma takowej }
  172. function szukaj_ksiazki_wedlug_id(var glowa : pKsiazka; id : integer) : pKsiazka;
  173. var
  174.   aktualny : pKsiazka;
  175.   znaleziono : boolean;
  176.   begin
  177.  
  178.    aktualny := glowa;
  179.    while aktualny <> nil do begin
  180.       if (aktualny^.dane.id = id) then begin
  181.          znaleziono := true;
  182.          break;
  183.       end;
  184.  
  185.   aktualny := aktualny^.nast;
  186.   end;
  187.  
  188.   if znaleziono then
  189.     szukaj_ksiazki_wedlug_id := aktualny
  190.   else
  191.     szukaj_ksiazki_wedlug_id := nil;
  192.  
  193.   end;
  194.  
  195. { Procedura usuwa wszystkie ksiazki z pamieci }
  196. procedure usun_ksiazki(var glowa : pKsiazka);
  197. var
  198.     aktualny: pKsiazka;
  199. begin
  200.     aktualny := glowa;
  201.     while aktualny <> nil  do begin
  202.           aktualny := aktualny^.nast;
  203.           { usuwamy czytelnikow ktorzy sa podwieszeni :-) dla danej ksiazki }
  204.           usun_czytelnikow(glowa^.czytelnicy);
  205.           dispose(glowa);
  206.           glowa := aktualny;
  207.     end;
  208.  
  209.     { lista jest pusta wiec wskazujemy na nil`a zeby funkcja usun_ksiazki dodawala nadal }
  210.     glowa := nil;
  211. end;
  212.  
  213.  
  214. {                                  }
  215. { Funkcje operujace na pliku bazy  }
  216. {                                  }
  217. procedure zapisz_do_bazy(glowa : pKsiazka; sciezka_plik : string);
  218. var
  219.     plik_binarny : File;
  220.     i, j : integer;
  221.     glowa_czytelnik : pCzytelnik;
  222.     begin
  223.     { Wylaczamy bledy tymczasowo }
  224.     {$I-}
  225.     assign(plik_binarny, sciezka_plik);
  226.     rewrite(plik_binarny, 1);
  227.     { i wlaczamy }
  228.     {$I+}
  229.  
  230.     { Sprawdzam czy plik otwarto i jest ogolnie git }
  231.     if IOResult = 0 then begin
  232.     while(glowa <> nil) do begin
  233.        { Zapisujemy dane kazdej ksiazki }
  234.        BlockWrite(plik_binarny, glowa^.dane.id, sizeof(glowa^.dane.id));
  235.        BlockWrite(plik_binarny, glowa^.dane.tytul, sizeof(glowa^.dane.tytul));
  236.        BlockWrite(plik_binarny, glowa^.dostepna, sizeof(glowa^.dostepna));
  237.  
  238.        { Liczmy ilosc osob ktore wypozyczyly ksiazke }
  239.        i := ilosc_czytelnikow(glowa^.czytelnicy);
  240.  
  241.        { Zapisumjemy ta liczbe zeby przy odczycie wiedziec ile rekordow(bajtow) czytac }
  242.        BlockWrite(plik_binarny, i, sizeof(i));
  243.  
  244.        { Glowa czytelnika }
  245.        glowa_czytelnik := glowa^.czytelnicy;
  246.  
  247.        { Poruszamy sie po liscie czytelnikow danej ksiazki }
  248.        while(glowa_czytelnik <> nil) do begin
  249.           { Zapisujemy czytelnikow danej ksiazki - tj aktualnego czyli pierwszego na liscie i tych 'historycznych') }
  250.           BlockWrite(plik_binarny, glowa_czytelnik^.dane.imie, sizeof(glowa_czytelnik^.dane.imie));
  251.           BlockWrite(plik_binarny, glowa_czytelnik^.dane.nazwisko, sizeof(glowa_czytelnik^.dane.nazwisko));
  252.  
  253.           glowa_czytelnik := glowa_czytelnik^.nast;
  254.        end;
  255.  
  256.        glowa := glowa^.nast;
  257.     end;
  258.   end;
  259.     close(plik_binarny);
  260. end;
  261.  
  262. { Procedura czyta dane z bazy - pliku binarnego }
  263. procedure czytaj_z_bazy(var glowa: pKsiazka; sciezka_plik : string);
  264. var
  265.   plik_binarny : File;
  266.   i, ilosc : integer;
  267.   glowa_czytelnik : pCzytelnik;
  268.   ksiazka : dane_ksiazki;
  269.   czytelnik : dane_czytelnika;
  270.   nowa_ksiazka : pKsiazka;
  271.   dostepna : boolean;
  272.   begin
  273.   { Wylaczamy bledy tymczasowo }
  274.   {$I-}
  275.   assign(plik_binarny, sciezka_plik);
  276.   reset(plik_binarny, 1);
  277.   { i wlaczamy }
  278.   {$I+}
  279.  
  280.   { Sprawdzam czy plik otwarto i jest ogolnie git }
  281.   if IOResult = 0 then begin
  282.          while not eof(plik_binarny) do begin
  283.             { Czytamy dane ksiazki }
  284.             BlockRead(plik_binarny, ksiazka.id, sizeof(ksiazka.id));
  285.             BlockRead(plik_binarny, ksiazka.tytul, sizeof(ksiazka.tytul));
  286.             BlockRead(plik_binarny, dostepna, sizeof(dostepna));
  287.  
  288.             { Dodajemy ja do listy }
  289.             dodaj_ksiazke(glowa, ksiazka);
  290.  
  291.             { Ustawmy ja na dostepna badz nie - zalezy jak zapisano do pliku }
  292.             ustaw_status_ksiazki(glowa, dostepna);
  293.  
  294.             { Ksiazka to nasza aktluana zmienna 'glowa' - zatem wczytajmy jej czytelnikow }
  295.              nowa_ksiazka := glowa;
  296.  
  297.             { Musimy wiedziec ile przy zapisie miala czytelnikow }
  298.             BlockRead(plik_binarny, ilosc, sizeof(ilosc));
  299.  
  300.             { Wczytajmy ich }
  301.             for i := 1 to ilosc do begin
  302.                    BlockRead(plik_binarny, czytelnik.imie, sizeof(czytelnik.imie));
  303.                    BlockRead(plik_binarny, czytelnik.nazwisko, sizeof(czytelnik.nazwisko));
  304.  
  305.                    { Dodajmy ich }
  306.                    dodaj_czytelnika(nowa_ksiazka^.czytelnicy, czytelnik);
  307.                end;
  308.        end;
  309.   end;
  310.    close(plik_binarny);
  311. end;
  312.  
  313. {                          }
  314. {  Funkcje ekstra          }
  315. {                          }
  316.  
  317. { sprawdza czy zmienna tekstowa jest pusta - zwaraca true jesli pusta }
  318. function pusty_tekst(tekst : string) : boolean;
  319. begin
  320.    if length(tekst) = 0 then begin
  321.      pusty_tekst := true;
  322.    end
  323.    else begin
  324.      pusty_tekst := false;
  325.    end;
  326. end;
  327.  
  328.  
  329. {                          }
  330. { Funkcje trybu tekstowego }
  331. {                          }
  332.  
  333. { Procedura listuje ksiazki }
  334. procedure PokazKsiazki(glowa : pKsiazka);
  335. begin
  336.      while (glowa <> nil) do begin
  337.         if(glowa^.dostepna = true) then begin
  338.               writeln('[+] Id: ', glowa^.dane.id, ', Tytul: ', glowa^.dane.tytul);
  339.            end
  340.            else begin
  341.               writeln('[-] Id: ', glowa^.dane.id, ', Tytul: ', glowa^.dane.tytul);
  342.            end;
  343.  
  344.            glowa := glowa^.nast;
  345.     end;
  346.  end;
  347.  
  348. { Procedura dodaje ksiazke }
  349. procedure DodajKsiazke(var glowa : pKsiazka);
  350. var
  351.     nowa : dane_ksiazki;
  352.     id : integer;
  353.     tytul : string[255];
  354.     tmp_ksiazka : pKsiazka;
  355.     begin
  356.  
  357.     ClrScr;
  358.     write('Podaj tytul: ');
  359.     readln(tytul);
  360.  
  361.     write('Podaj id: ');
  362.     readln(id);
  363.  
  364.       if not pusty_tekst(tytul) then begin
  365.            tmp_ksiazka := szukaj_ksiazki_wedlug_id(glowa, id);
  366.             if tmp_ksiazka = nil then begin
  367.                  nowa.tytul := tytul;
  368.                  nowa.id := id;
  369.                  dodaj_ksiazke(glowa, nowa);
  370.                  writeln('Ksiazke dodano !');
  371.                  end
  372.              else begin
  373.                     writeln('Ksiazka o podanym id juz istnieje');
  374.                 end;
  375.       end
  376.       else begin
  377.         writeln('Nie podano tytulu');
  378.       end;
  379.  
  380.  
  381.  end;
  382.  
  383. { Procedura usuwa ksiazke }
  384. procedure UsunKsiazke(var glowa : pKsiazka);
  385. var
  386.     id : integer;
  387.     tmp_ksiazka : pKsiazka;
  388.     begin
  389.        ClrScr;
  390.        PokazKsiazki(glowa);
  391.        write('Podaj id ksiazki jaka chcesz usunac: ');
  392.        readln(id);
  393.  
  394.        tmp_ksiazka := szukaj_ksiazki_wedlug_id(glowa, id);
  395.        if tmp_ksiazka <> nil then begin
  396.            usun_ksiazke(glowa, tmp_ksiazka);
  397.            writeln('Ksiazke usunieto !');
  398.        end
  399.        else begin
  400.            writeln('Ksiazka o podanym id nie istnieje');
  401.        end;
  402.  
  403.     end;
  404.  
  405. { Procedura rezerwuje ksaizki }
  406. procedure RezerwujKsiazke(var glowa : pKsiazka);
  407. var
  408.     imie, nazwisko : string[32];
  409.     id : integer;
  410.     tmp_ksiazka : pKsiazka;
  411.     nowy_czytelnik : dane_czytelnika;
  412. begin
  413.      ClrScr;
  414.      PokazKsiazki(glowa);
  415.  
  416.      write('Podaj id ksiazki: ');
  417.      readln(id);
  418.  
  419.      tmp_ksiazka := szukaj_ksiazki_wedlug_id(glowa, id);
  420.      { ksiazka znaleziona }
  421.      if tmp_ksiazka <> nil then begin
  422.            { jest dostpena }
  423.              if tmp_ksiazka^.dostepna = true then begin
  424.                 writeln('Czytelnik - dane:');
  425.                 write('Podaj imie: ');
  426.                 readln(imie);
  427.  
  428.                 write('Podaj nazwisko: ');
  429.                 readln(nazwisko);
  430.  
  431.                 { dane sa okej - zarezerwujemy ksiazke }
  432.                 if not pusty_tekst(imie) and not pusty_tekst(nazwisko) then begin
  433.                        { ksiazka zajeta = false }
  434.                        ustaw_status_ksiazki(tmp_ksiazka, false);
  435.  
  436.                        { nowy czytelnik }
  437.                        nowy_czytelnik.imie := imie;
  438.                        nowy_czytelnik.nazwisko := nazwisko;
  439.  
  440.                        { dodajmy go }
  441.                        dodaj_czytelnika(tmp_ksiazka^.czytelnicy, nowy_czytelnik);
  442.  
  443.                        writeln('Ksiazka zarezerowana');
  444.                   end
  445.                 else begin
  446.                    writeln('Nie podano imienia lub nazwiska');
  447.                 end;
  448.              end
  449.              else begin
  450.                 writeln('Ksiazka jest juz zarezerwowana - zwolnij ja');
  451.              end;
  452.      end
  453.      else begin
  454.         writeln('Ksiazki o podanym id nie znaleziono');
  455.      end;
  456. end;
  457.  
  458. { Procedura dla oddania ksaizki }
  459. procedure OddajKsiazke(var glowa : pKsiazka);
  460. var
  461.     id : integer;
  462.     tmp_ksiazka : pKsiazka;
  463. begin
  464.      ClrScr;
  465.      PokazKsiazki(glowa);
  466.  
  467.      write('Podaj ID ksiazki do zwrotu: ');
  468.      readln(id);
  469.  
  470.      tmp_ksiazka := szukaj_ksiazki_wedlug_id(glowa, id);
  471.      if tmp_ksiazka <> nil then begin
  472.         ustaw_status_ksiazki(tmp_ksiazka, true);
  473.         writeln('Ksiazka zwrocona');
  474.      end
  475.      else begin
  476.         writeln('Ksiazka o podanym id nie istnieje');
  477.      end;
  478.  
  479. end;
  480.  
  481. { Procedura pokazuje wszystkie informacje o ksiazkach }
  482. procedure PokazWszystko(glowa : pKsiazka);
  483. var
  484.   tmp_czytelnik : pCzytelnik;
  485. begin
  486.      ClrScr;
  487.      while (glowa <> nil) do begin
  488.         if(glowa^.dostepna = true) then begin
  489.               writeln('| [+] Id: ', glowa^.dane.id, ', Tytul: ', glowa^.dane.tytul);
  490.  
  491.            end
  492.            else begin
  493.               writeln('| [-] Id: ', glowa^.dane.id, ', Tytul: ', glowa^.dane.tytul);
  494.               { Potrzebujemy tylko pierwszego cztelnika (pierwszy element) - tego ktory posiada aktualnie ksiazke) }
  495.               tmp_czytelnik := glowa^.czytelnicy;
  496.               writeln('| Aktualny czytelnik: ', tmp_czytelnik^.dane.imie, ' ',   tmp_czytelnik^.dane.nazwisko);
  497.            end;
  498.  
  499.            glowa := glowa^.nast;
  500.     end;
  501. end;
  502.  
  503. { Procedura pokazuje menu }
  504. procedure Menu;
  505. begin
  506.   writeln('a) Dodaj ksiazke');
  507.   writeln('b) Usun ksiazke');
  508.   writeln('c) Rezerwuj ksiazke');
  509.   writeln('d) Oddaj ksiazke');
  510.   writeln('e) Pokaz ksiazki');
  511.   writeln('f) Pokaz wszystko');
  512.   writeln('g) Wyjscie');
  513. end;
  514.  
  515.  
  516. { Main }
  517.  
  518.  
  519. var
  520.     { glowna lista }
  521.     lista : pKsiazka;
  522.  
  523.     { wybor w menu }
  524.     wybor : char;
  525.  
  526.     sciezkaplik : string;
  527.  
  528. begin
  529.   sciezkaplik := 'D:\biblioteka.bin';
  530.  
  531.   czytaj_z_bazy(lista, sciezkaplik);
  532.   repeat
  533.  
  534.    Menu;
  535.           repeat
  536.           wybor := ReadKey;
  537.           wybor := UpCase(wybor);
  538.  
  539.           until wybor in ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
  540.           case wybor of
  541.  
  542.           'A': begin
  543.                DodajKsiazke(lista);
  544.                zapisz_do_bazy(lista, sciezkaplik);
  545.                end;
  546.           'B': begin
  547.                UsunKsiazke(lista);
  548.                zapisz_do_bazy(lista, sciezkaplik);
  549.                end;
  550.           'C': begin
  551.                RezerwujKsiazke(lista);
  552.                zapisz_do_bazy(lista, sciezkaplik);
  553.                end;
  554.           'D': begin
  555.                OddajKsiazke(lista);
  556.                zapisz_do_bazy(lista, sciezkaplik);
  557.                end;
  558.           'E': begin PokazKsiazki(lista); end;
  559.           'F': begin PokazWszystko(lista); end;
  560.           end;
  561.  
  562.  
  563.     until wybor = 'G';
  564.  
  565.    { czyscimy pamiec }
  566.    usun_ksiazki(lista);
  567.  
  568.    lista := nil;
  569. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement