Advertisement
m4ly

Dziennik

Feb 4th, 2014
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 32.18 KB | None | 0 0
  1. {
  2. Autor: Dawid Mocek
  3.  
  4. }
  5. program dziennik;
  6.  
  7. uses crt, sysutils;
  8.  
  9. const
  10. { nazwa pliku - stala ale nie uzywana globalnie tylko poprzez argumenty funk. }
  11. PLIK = 'uczniowie.bin';
  12.  
  13. { Dla okienek w terminalu }
  14. MENU_ROZDZIELACZ_ZANK =  chr(179); // tj '|'
  15. MENU_LEWY_ZANK = chr(195);  // tj '|-'
  16.  
  17. { !!! stringi ponizej maja stala dlugosc z powodu wykorzystania do zapisu/odczytu pliku binarnego... !!! }
  18.  
  19.  
  20. { rekord przechowujacy dane ucznia }
  21. type personal = record
  22.     imie : string[32];
  23.     nazwisko : string[32];
  24. end;
  25.  
  26. { dla listy przechowujaca oceny }
  27. type woceny=^ocena;
  28.        ocena = record
  29.        nota : integer;
  30.        nastepna_ocena : woceny;
  31. end;
  32.  
  33. { dla listy przechowujacej przedmioty i ich oceny }
  34. type wprzedmioty=^przedmioty;
  35. przedmioty = record
  36.        nazwa : string[32]; // nazwa przedmiotu
  37.        oceny : woceny;   // lista ocen
  38.        nastepny_przedmiot : wprzedmioty;
  39.  end;
  40.  
  41. { dla listy przechowujacej uwagi ucznia }
  42. type wuwagi=^uwagi;
  43. uwagi = record
  44.        tekst : string[255]; // tekst uwagi ucznia
  45.        nastepna_uwaga : wuwagi;
  46. end;
  47.  
  48. { dla listy przechowujacej wszystko co powzyej zostalo wymienione }
  49. type  wuczen=^uczen;
  50. uczen = record
  51.         info : personal; // info o uczniu
  52.         uwagi : wuwagi; // uwagi na jego temat
  53.         przedmioty : wprzedmioty; // przedmioty z ktorych dosatal (w)pale
  54.         nastepny_uczen : wuczen;
  55. end;
  56.  
  57. {---------------------------------}
  58. { Operacje na liscie ocen         }
  59. {---------------------------------}
  60.  
  61. { procedura dodaje ocene          }
  62. procedure dodaj_ocene(var head: woceny; ocena : integer);
  63. var
  64.    p : woceny;
  65. begin
  66.     new(p);
  67.     p^.nota := ocena;
  68.     p^.nastepna_ocena:= head;
  69.     head := p;
  70. end;
  71.  
  72. { procedura liczy ilosc ocen w liscie }
  73. function licz_oceny(head : woceny) : integer;
  74. var
  75.   c : integer;
  76. begin
  77.   c := 0;
  78.   while head <> nil do begin
  79.     inc(c);
  80.     head := head^.nastepna_ocena;
  81.   end;
  82.   licz_oceny := c;
  83. end;
  84.  
  85. { procedura usuwa listę jedno. zaw. oceny z pamieci
  86.   - usuwamy cala liste, poniewaz nie mamy w zasadzie zadnej
  87.   informacji za co ocena zostala uzyskana...
  88. }
  89. procedure usun_oceny(var head : woceny);
  90. var
  91.     aktualny: woceny;
  92. begin
  93.     aktualny := head;
  94.     while aktualny <> nil  do begin
  95.           aktualny := aktualny^.nastepna_ocena;
  96.           dispose(head);
  97.           head := aktualny;
  98.  
  99.   end;
  100.     head := nil;
  101. end;
  102.  
  103. {---------------------------------}
  104. { Operacje na liscie uwag         }
  105. {---------------------------------}
  106.  
  107. { procedura dodaje uwage do listy }
  108. procedure dodaj_uwage( var head : wuwagi; uwaga : string);
  109. var
  110.    p : wuwagi;
  111. begin
  112.     new(p);
  113.     p^.tekst := uwaga;
  114.     p^.nastepna_uwaga := head;
  115.     head := p;
  116. end;
  117.  
  118. { procedura liczy ilosc uwag      }
  119. function licz_uwagi(head : wuwagi) : integer;
  120. var
  121.   c : integer;
  122. begin
  123.   c := 0;
  124.   while head <> nil do begin
  125.     inc(c);
  126.     head := head^.nastepna_uwaga;
  127.   end;
  128.   licz_uwagi := c;
  129. end;
  130.  
  131. { procedura usuwa uwagii          }
  132. procedure usun_uwagi(var head: wuwagi);
  133. var
  134.     aktualny: wuwagi;
  135. begin
  136.     aktualny := head;
  137.     while aktualny <> nil  do begin
  138.           aktualny := aktualny^.nastepna_uwaga;
  139.           dispose(head);
  140.           head := aktualny;
  141.     end;
  142.     head := nil;
  143. end;
  144.  
  145. {---------------------------------}
  146. { Operacje na liscie przedmiotow  }
  147. {---------------------------------}
  148.  
  149. { procedura dodaje przedmiot do listy }
  150. procedure dodaj_przedmiot(var head : wprzedmioty; nazwa : string);
  151. var
  152.    p : wprzedmioty;
  153. begin
  154.       new(p);
  155.       p^.nazwa := nazwa;
  156.       p^.oceny := nil;
  157.       p^.nastepny_przedmiot := head;
  158.       head := p;
  159. end;
  160.  
  161. { funkcja licząca ilosc przedmiotow }
  162. function licz_przedmioty(head : wprzedmioty) : integer;
  163. var
  164.   c : integer;
  165. begin
  166.   c := 0;
  167.   while head <> nil do begin
  168.     inc(c);
  169.     head := head^.nastepny_przedmiot;
  170.   end;
  171.   licz_przedmioty := c;
  172. end;
  173.  
  174. { procedura usuwa przedmioty      }
  175. procedure usun_przedmioty(var head: wprzedmioty);
  176. var
  177.     aktualny: wprzedmioty;
  178. begin
  179.     aktualny := head;
  180.     while aktualny <> nil  do begin
  181.           aktualny := aktualny^.nastepny_przedmiot;
  182.           { ! usuwamy oceny ! }
  183.           usun_oceny(head^.oceny);
  184.           dispose(head);
  185.           head := aktualny;
  186.     end;
  187.     head := nil;
  188. end;
  189.  
  190. { funkcja sprawdzjaca czy podany przedmiot istnieje - jesli tak zwraca przedmiot, nie - nil`a }
  191. function szukaj_przedmiot(head : wprzedmioty; nazwa:string) : wprzedmioty;
  192. var
  193.      aktualny : wprzedmioty;
  194.      jest : boolean;
  195. begin
  196.  aktualny := head;
  197.  
  198.   while aktualny <> nil do begin
  199.       if (aktualny^.nazwa = nazwa)  then begin
  200.          jest:=true;
  201.          break;
  202.       end;
  203.  
  204.   aktualny:=aktualny^.nastepny_przedmiot;
  205.   end;
  206.  
  207.   if jest then szukaj_przedmiot := aktualny else szukaj_przedmiot := nil;
  208.  
  209. end;
  210.  
  211. { procedura usuwa z listu jeden konrketny przedmiot }
  212. procedure usun_przedmiot(var head: wprzedmioty; przedmiot_do_kas: wprzedmioty);
  213. var
  214.      poprzedni, aktualny: wprzedmioty;
  215. begin
  216.   aktualny := head;
  217.   while(aktualny <> nil) do begin
  218.  
  219.     { jesli nazwy pasuja do siebie mozemy usuwac }
  220.     if(aktualny^.nazwa = przedmiot_do_kas^.nazwa) then begin
  221.             { przypadek 1 - usuwamy glowe }
  222.             if(aktualny = head) then begin
  223.  
  224.                    head := aktualny^.nastepny_przedmiot;
  225.  
  226.                    { usuwamy oceny }
  227.                    usun_oceny(aktualny^.oceny);
  228.  
  229.                    { usuwamy nas }
  230.                    dispose(aktualny);
  231.  
  232.                    { dla bezpiecznstwa }
  233.                    aktualny := nil;
  234.  
  235.                    { dalej nie musimy iterować }
  236.                    exit;
  237.  
  238.             end
  239.             { normlane usuwanie }
  240.             else begin
  241.  
  242.                    poprzedni^.nastepny_przedmiot := aktualny^.nastepny_przedmiot;
  243.  
  244.                    { usuwamy oceny }
  245.                    usun_oceny(aktualny^.oceny);
  246.  
  247.                    { usuwamy nas }
  248.                    dispose(aktualny);
  249.  
  250.                    { dla bezpiecznstwa }
  251.                    aktualny := nil;
  252.  
  253.                    { dalej nie musimy iterować }
  254.                    exit;
  255.             end;
  256.     end
  257.     { skaczemy dalej }
  258.     else begin
  259.          poprzedni := aktualny;
  260.          aktualny := aktualny^.nastepny_przedmiot;
  261.     end;
  262.   end;
  263. end;
  264.  
  265. {---------------------------------}
  266. { Operacje na liscie uczniow      }
  267. {---------------------------------}
  268.  
  269. { procedura dodaje ucznia }
  270. procedure dodaj_ucznia(var head :wuczen; info: personal);
  271. var
  272.    p : wuczen;
  273. begin
  274.    new(p);
  275.  
  276.    p^.info := info;
  277.    p^.przedmioty:=nil;
  278.  
  279.    p^.uwagi:=nil;
  280.    p^.nastepny_uczen := head;
  281.    head := p;
  282.  
  283. end;
  284.  
  285. { funkcja szuka ucznia }
  286. function szukaj_ucznia(head : wuczen; info:personal) : wuczen;
  287. var
  288.      aktualny : wuczen;
  289.      jest : boolean;
  290. begin
  291.  aktualny := head;
  292.  
  293.   while aktualny <> nil do begin
  294.       if (aktualny^.info.imie = info.imie) AND (aktualny^.info.nazwisko = info.nazwisko)  then begin
  295.          jest:=true;
  296.          break;
  297.       end;
  298.  
  299.   aktualny:=aktualny^.nastepny_uczen;
  300.   end;
  301.  
  302.   if jest then szukaj_ucznia := aktualny else szukaj_ucznia := nil;
  303.  
  304. end;
  305.  
  306. { funkcja zwaraca ilosc uczniow }
  307. function licz_uczniow(head : wuczen) : integer;
  308. var
  309.   c : integer;
  310. begin
  311.   c := 0;
  312.   while head <> nil do begin
  313.     inc(c);
  314.     head := head^.nastepny_uczen;
  315.   end;
  316.   licz_uczniow := c;
  317. end;
  318.  
  319. { usuwa konkrentego ucznia }
  320. procedure usun_ucznia(var head: wuczen; uczen_do_usun : wuczen);
  321. var
  322.  poprzedni, aktualny: wuczen;
  323. begin
  324.   aktualny := head;
  325.   while(aktualny <> nil) do begin
  326.     { jesli wskazniki do siebie pasuja mozemy usuwac }
  327.     if(aktualny = uczen_do_usun) then begin
  328.             { przypadek 1 - usuwamy glowe }
  329.             if(aktualny = head) then begin
  330.  
  331.                    head := aktualny^.nastepny_uczen;
  332.  
  333.                    { usuwamy przedmiosty i oceny }
  334.                    usun_przedmioty(aktualny^.przedmioty);
  335.  
  336.                    { usuwamy uwagi }
  337.                    usun_uwagi(aktualny^.uwagi);
  338.  
  339.                    { usuwamy nas }
  340.                    dispose(aktualny);
  341.  
  342.                    { dla bezpiecznstwa }
  343.                    aktualny := nil;
  344.  
  345.                    { dalej nie musimy iterować }
  346.                    exit;
  347.  
  348.             end
  349.             { normlane usuwanie }
  350.             else begin
  351.  
  352.                    poprzedni^.nastepny_uczen:= aktualny^.nastepny_uczen;
  353.  
  354.                    { usuwamy przedmiosty i oceny }
  355.                    usun_przedmioty(aktualny^.przedmioty);
  356.  
  357.                    { usuwamy uwagi }
  358.                    usun_uwagi(aktualny^.uwagi);
  359.  
  360.                    { usuwamy nas }
  361.                    dispose(aktualny);
  362.  
  363.                    { dla bezpiecznstwa }
  364.                    aktualny := nil;
  365.  
  366.                    { dalej nie musimy iterować }
  367.                    exit;
  368.             end;
  369.     end
  370.     { skaczemy dalej }
  371.     else begin
  372.          poprzedni := aktualny;
  373.          aktualny := aktualny^.nastepny_uczen;
  374.     end;
  375.   end;
  376. end;
  377.  
  378. { usuwa cala liste uczniow oraz wszystkie podlisty }
  379. procedure usun_uczniow(var head: wuczen);
  380. var
  381.     aktualny: wuczen;
  382. begin
  383.     aktualny := head;
  384.     while aktualny <> nil  do begin
  385.           aktualny := aktualny^.nastepny_uczen;
  386.          //  writeln('usuwam: ', head^.info.nazwisko);
  387.           { usuwa przedmioty i oceny }
  388.           usun_przedmioty(head^.przedmioty);
  389.  
  390.           { usuwa uwagi }
  391.           usun_uwagi(head^.uwagi);
  392.  
  393.           { usawa siebie }
  394.           dispose(head);
  395.           head := aktualny;
  396.     end;
  397.     head := nil;
  398. end;
  399.  
  400.  
  401. {---------------------------------}
  402. { operacje na plikach             }
  403. {---------------------------------}
  404.  
  405. { procedura zapisuje do pliku binarego cala liste uczniow z wszystkimi informacjami}
  406. procedure zapisz(p:wuczen; sciezka:string);
  407. var
  408.   F: File;
  409.   i,j,k:integer;
  410.  
  411.   ptrUwagi : wuwagi;
  412.   ptrPrzedmioty : wprzedmioty;
  413.   ptrOceny : woceny;
  414.  
  415. begin
  416.    {$I-}
  417.    assign(F, sciezka);
  418.    rewrite(F,1);
  419.    {$I+}
  420.    if IOResult = 0 then begin
  421.         { Zapisujmey uczniow }
  422.        while( p <> nil) do begin
  423.         BlockWrite(F, p^.info.imie, sizeof(p^.info.imie));
  424.         BlockWrite(F, p^.info.nazwisko, sizeof(p^.info.nazwisko));
  425.  
  426.        {zapisujemy ich uwagi}
  427.        i := licz_uwagi(p^.uwagi);
  428.        BlockWrite(F, i, sizeof(i));
  429.        ptrUwagi := p^.uwagi;
  430.  
  431.        while(ptrUwagi <> nil) do begin
  432.                BlockWrite(F, ptrUwagi^.tekst, sizeof(ptrUwagi^.tekst));
  433.                ptrUwagi := ptrUwagi^.nastepna_uwaga;
  434.        end; {// Koniec zapisywania uwag // }
  435.  
  436.        {zapisujemy przedmioty }
  437.        j := licz_przedmioty(p^.przedmioty);
  438.        BlockWrite(F, j, sizeof(j));
  439.        ptrPrzedmioty := p^.przedmioty;
  440.  
  441.        while(ptrPrzedmioty <> nil) do begin
  442.            BlockWrite(F, ptrPrzedmioty^.nazwa, sizeof(ptrPrzedmioty^.nazwa));
  443.  
  444.                {Kazdy przedmiot ma swoja ocene/y - zapiszmy ją }
  445.                k :=  licz_oceny(ptrPrzedmioty^.oceny);
  446.                BlockWrite(F, k, sizeof(k));
  447.                ptrOceny := ptrPrzedmioty^.oceny;
  448.  
  449.                while(ptrOceny <> nil) do begin
  450.                   BlockWrite(F, ptrOceny^.nota, sizeof(ptrOceny^.nota));
  451.                   ptrOceny := ptrOceny^.nastepna_ocena;
  452.                end;  {// Koniec zapisywania ocen //}
  453.  
  454.           ptrPrzedmioty := ptrPrzedmioty^.nastepny_przedmiot;
  455.        end;  {// Koniec zapisywania przemiotow //}
  456.  
  457.     p := p^.nastepny_uczen;
  458.     end;   {// Koniec zapisywania uczniow // }
  459.   close(F);
  460.   end;
  461. end;
  462.  
  463. { procedura robi dokladnie na odwrot to co procedura zapisz }
  464. procedure wczytaj(var p:wuczen; sciezka:string);
  465.   var
  466.      F: File;
  467.      ptrUczen : wuczen;
  468.      nazwa_przedmiotu : string[32];
  469.      uczen_info : personal;
  470.      uwaga : string[255];
  471.  
  472.      i,j,k,ilosc_przedmiotow,ilosc_ocen, ilosc_uwag, numer_tmp,nota :integer;
  473.  
  474.  begin
  475.   {$I-}
  476.   Assign(F, sciezka);
  477.   Reset(F,1);
  478.   {$I+}
  479.   if IOResult = 0 then begin
  480.      i:=0;
  481.      while not eof(F) do begin
  482.         { czytamy dane ucznia i dodajemy ucznia}
  483.         BlockRead(F, uczen_info.imie, sizeof(uczen_info.imie));
  484.         BlockRead(F, uczen_info.nazwisko, sizeof(uczen_info.nazwisko));
  485.  
  486.         dodaj_ucznia(p, uczen_info);
  487.         { nasz aktualny uczen to po prostu head }
  488.         ptrUczen := p;
  489.  
  490.         BlockRead(F, ilosc_uwag, sizeof(ilosc_uwag));
  491.  
  492.         { dodajemy uwagi }
  493.         for i:=1 to ilosc_uwag do begin
  494.               BlockRead(F, uwaga, sizeof(uwaga));
  495.               dodaj_uwage(ptrUczen^.uwagi, uwaga);
  496.         end;
  497.  
  498.        { dodajemy przedmioty }
  499.        BlockRead(F, ilosc_przedmiotow, sizeof(ilosc_przedmiotow));
  500.        for j:=1 to ilosc_przedmiotow do begin
  501.              BlockRead(F, nazwa_przedmiotu , sizeof(nazwa_przedmiotu));
  502.              dodaj_przedmiot(ptrUczen^.przedmioty, nazwa_przedmiotu);
  503.  
  504.              { dodajemy oceny }
  505.              BlockRead(F, ilosc_ocen, sizeof(ilosc_ocen));
  506.              for k:=1 to ilosc_ocen do begin
  507.                   BlockRead(F, nota , sizeof(nota));
  508.                   dodaj_ocene(ptrUczen^.przedmioty^.oceny, nota);
  509.              end;
  510.        end;
  511.      end;
  512.  end;
  513.  Close(F)
  514. end;
  515.  
  516.  
  517. {---------------------------------}
  518. {  Inne funkcje                   }
  519. {---------------------------------}
  520.  
  521. { sprawdza czy string jest pusty - zwaraca true jesli jest pusty }
  522. function pusty_string(v : string) : boolean;
  523. begin
  524.    if Length(v) = 0 then begin
  525.      pusty_string := true;
  526.    end
  527.    else begin
  528.      pusty_string := false;
  529.    end;
  530. end;
  531.  
  532.  
  533. {---------------------------------}
  534. {  Interfejs                      }
  535. {---------------------------------}
  536.  
  537. { procedura listuje tylko dane personalne uczniow }
  538. procedure wyswietl_uczniow(head : wuczen);
  539. begin
  540.        while (head <> nil) do begin
  541.            writeln('+ Uczen: ', head^.info.imie , ' ', head^.info.nazwisko);
  542.            head := head^.nastepny_uczen;
  543.        end;
  544. end;
  545.  
  546. { okno sluzace do skasowania CALEJ listy ocen }
  547. procedure okno_usun_oceny(var head: wuczen);
  548.   var
  549.      przedmiot, imie, nazw : string;
  550.      tmp_info : personal;
  551.      tmp_uczen: wuczen;
  552.      tmp_przedmiot : wprzedmioty;
  553.      tmp_przedmiot1 : wprzedmioty;
  554.   begin
  555.      ClrScr;
  556.      wyswietl_uczniow(head);
  557.  
  558.      writeln('Komu skasowac ocene ?');
  559.  
  560.      write('Podaj imie: ');
  561.      readln(imie);
  562.  
  563.      write('Podaj nazwisko: ');
  564.      readln(nazw);
  565.  
  566.       if not pusty_string(imie) and not pusty_string(nazw) then begin
  567.           tmp_info.imie := imie;
  568.           tmp_info.nazwisko := nazw;
  569.  
  570.           { szukamy ucznia ... }
  571.           tmp_uczen := szukaj_ucznia(head, tmp_info);
  572.           if(tmp_uczen <> nil) then begin
  573.  
  574.              { ...i istnieje, pokazemy liste przedmiotow jakie ma(o ile ma}
  575.              if(tmp_uczen^.przedmioty <> nil) then begin
  576.                 tmp_przedmiot :=  tmp_uczen^.przedmioty;
  577.                   while(tmp_przedmiot <> nil) do begin
  578.                     writeln(tmp_przedmiot^.nazwa);
  579.                     tmp_przedmiot := tmp_przedmiot^.nastepny_przedmiot;
  580.                   end;
  581.  
  582.                   { wczytuemy przedmiot }
  583.                   Write('Podaj nazwe przedmiotu z ktorych chcesz skasowac oceny: ');
  584.                   readln(przedmiot);
  585.  
  586.                   { sprawdzmy czy uzy. nie wprowadzil pustej nazwy }
  587.                   if not pusty_string(przedmiot) then begin
  588.  
  589.                         { teraz szukamy czy przedmiot o podanej nazwie istnieje }
  590.                          tmp_przedmiot1 := szukaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);
  591.  
  592.                         { sprawdzamy czy rzeczywiscie jest w lisice }
  593.                          if(tmp_przedmiot1 <> nil) then begin
  594.  
  595.                              { mozemy usunac oceny przedmiotu }
  596.                              usun_oceny(tmp_przedmiot1^.oceny);
  597.                              writeln('Oceny skasowane !');
  598.                         end
  599.                         else begin
  600.                            writeln('Taki przedmiot nie istnieje');
  601.                         end;
  602.                   end
  603.                   else begin
  604.                     writeln('Pusta tresc przedmiotu ?');
  605.                   end;
  606.              end
  607.              else begin
  608.                   writeln('Lista przedmiotow nie istnieje');
  609.              end;
  610.           end
  611.           else begin
  612.               writeln('Taki uczen nie istnieje.');
  613.           end;
  614.           end
  615.           else begin
  616.            writeln('Nie wypelniono wszystich pol.')
  617.       end;
  618.   end;
  619.  
  620. { okno w ktorym dodajemy ocene }
  621. procedure okno_dodaj_ocene(var head : wuczen);
  622. var
  623.    przedmiot, imie, nazw : string;
  624.    tmp_info : personal;
  625.    tmp_uczen: wuczen;
  626.    tmp_przedmiot : wprzedmioty;
  627.    tmp_przedmiot1 :wprzedmioty;
  628.    nota : integer;
  629. begin
  630.    ClrScr;
  631.    wyswietl_uczniow(head);
  632.  
  633.    writeln('Komu wstawic ocene ?');
  634.  
  635.    write('Podaj imie: ');
  636.    readln(imie);
  637.  
  638.    write('Podaj nazwisko: ');
  639.    readln(nazw);
  640.  
  641.     if not pusty_string(imie) and not pusty_string(nazw) then begin
  642.         tmp_info.imie := imie;
  643.         tmp_info.nazwisko := nazw;
  644.  
  645.         { szukamy ucznia ... }
  646.         tmp_uczen := szukaj_ucznia(head, tmp_info);
  647.         if(tmp_uczen <> nil) then begin
  648.  
  649.            { ...i istnieje, pokazemy liste przedmiotow jakie ma(o ile ma}
  650.            if(tmp_uczen^.przedmioty <> nil) then begin
  651.                 tmp_przedmiot :=  tmp_uczen^.przedmioty;
  652.  
  653.                 while(tmp_przedmiot <> nil) do begin
  654.                   writeln(tmp_przedmiot^.nazwa);
  655.                   tmp_przedmiot := tmp_przedmiot^.nastepny_przedmiot;
  656.                 end;
  657.  
  658.                 { wczytujemy nazwe przedmiotu }
  659.                 Write('Podaj nazwe przedmiotu do wpisania oceny: ');
  660.                 readln(przedmiot);
  661.  
  662.                 { sprawdzmy czy uzy. nie wprowadzil pustej nazwy }
  663.                 if not pusty_string(przedmiot) then begin
  664.  
  665.                 { teraz szukamy czy przedmiot o podanej nazwie istnieje }
  666.                   tmp_przedmiot1 := szukaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);
  667.  
  668.                       { sprawdzamy czy rzeczywiscie jest w lisice }
  669.                        if(tmp_przedmiot1 <> nil) then begin
  670.  
  671.                            { mozemy dodac ocene }
  672.                             write('Podaj ocene: ');
  673.                             readln(nota);
  674.                             dodaj_ocene(tmp_przedmiot1^.oceny, nota);
  675.                             writeln('Ocena dodana !');
  676.                       end
  677.                       else begin
  678.                          writeln('Taki przedmiot nie istnieje');
  679.                       end;
  680.                 end
  681.                 else begin
  682.                      writeln('Pusta tresc przedmiotu ?');
  683.                 end;
  684.            end
  685.            else begin
  686.                  writeln('Lista przedmiotow nie istnieje');
  687.            end;
  688.         end
  689.         else begin
  690.           writeln('Taki uczen nie istnieje.');
  691.         end;
  692.         end
  693.     else begin
  694.           writeln('Nie wypelniono wszystich pol.')
  695.      end;
  696.  
  697. end;
  698.  
  699. { okno w ktorym usuwamy dany przedmiot }
  700. procedure okno_usun_przedmiot(var head : wuczen);
  701. var
  702.    przedmiot, imie, nazw : string;
  703.    tmp_info : personal;
  704.    tmp_uczen: wuczen;
  705.    tmp_przedmiot, tmp_przedmiot1 : wprzedmioty;
  706. begin
  707.    ClrScr;
  708.    wyswietl_uczniow(head);
  709.  
  710.    writeln('Komu usunac przedmiot ?');
  711.  
  712.    write('Podaj imie: ');
  713.    readln(imie);
  714.  
  715.    write('Podaj nazwisko: ');
  716.    readln(nazw);
  717.  
  718.     if not pusty_string(imie) and not pusty_string(nazw) then begin
  719.         tmp_info.imie := imie;
  720.         tmp_info.nazwisko := nazw;
  721.  
  722.         { szukamy ucznia ... }
  723.         tmp_uczen := szukaj_ucznia(head, tmp_info);
  724.         if(tmp_uczen <> nil) then begin
  725.  
  726.            { ...i istnieje, pokazemy liste przedmiotow jakie ma(o ile ma}
  727.            if(tmp_uczen^.przedmioty <> nil) then begin
  728.                  tmp_przedmiot :=  tmp_uczen^.przedmioty;
  729.                 while(tmp_przedmiot <> nil) do begin
  730.                   writeln(tmp_przedmiot^.nazwa);
  731.                   tmp_przedmiot := tmp_przedmiot^.nastepny_przedmiot;
  732.                 end;
  733.  
  734.                 { wczytuemy przedmiot }
  735.                 Write('Podaj nazwe przedmiotu do usuniecia: ');
  736.                 readln(przedmiot);
  737.  
  738.                 { sprawdzmy czy uzy. nie wprowadzil pustej nazwy }
  739.                 if not pusty_string(przedmiot) then begin
  740.  
  741.                       { teraz szukamy czy przedmiot o podanej nazwie istnieje }
  742.                        tmp_przedmiot1 := szukaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);
  743.  
  744.                       { sprawdzamy czy rzeczywiscie jest w lisice }
  745.                        if(tmp_przedmiot1 <> nil) then begin
  746.  
  747.                            { mozemy go usunac }
  748.                            usun_przedmiot(tmp_uczen^.przedmioty, tmp_przedmiot1);
  749.                            writeln('Przedmiot usunieto.');
  750.                       end
  751.                       else begin
  752.                          writeln('Taki przedmiot nie istnieje');
  753.                       end;
  754.  
  755.                 end
  756.                 else begin
  757.                   writeln('Pusta tresc przedmiotu ?');
  758.                 end;
  759.            end
  760.            else begin
  761.                 writeln('Lista przedmiotow nie istnieje');
  762.            end;
  763.         end
  764.         else begin
  765.             writeln('Taki uczen nie istnieje.');
  766.         end;
  767.         end
  768.         else begin
  769.          writeln('Nie wypelniono wszystich pol.')
  770.     end;
  771. end;
  772.  
  773. { okno w ktorum dodajemy przedmiot danemu uczniowi }
  774. procedure okno_dodaj_przedmiot(var head : wuczen);
  775. var
  776.    przedmiot, imie, nazw : string;
  777.    tmp_info : personal;
  778.    tmp_uczen: wuczen;
  779.    tmp_przedmiot : wprzedmioty;
  780. begin
  781.    ClrScr;
  782.    wyswietl_uczniow(head);
  783.  
  784.    writeln('Komu dodac przedmiot ?');
  785.  
  786.    write('Podaj imie: ');
  787.    readln(imie);
  788.  
  789.    write('Podaj nazwisko: ');
  790.    readln(nazw);
  791.  
  792.     if not pusty_string(imie) and not pusty_string(nazw) then begin
  793.         tmp_info.imie := imie;
  794.         tmp_info.nazwisko := nazw;
  795.  
  796.         { szukamy ucznia ... }
  797.         tmp_uczen := szukaj_ucznia(head, tmp_info);
  798.         if(tmp_uczen <> nil) then begin
  799.  
  800.            { ... jest takowy, szukamy przedmiotu ... }
  801.               Write('Podaj nazwe przedmiotu ktory chcesz dodac: ');
  802.               readln(przedmiot);
  803.  
  804.               { ... ktory uzytkownik dobrze wprowadzil ...}
  805.               if not pusty_string(przedmiot) then begin
  806.  
  807.                  { ... zatem szukamy go na liscie co by nie bylo duplikatow ... }
  808.                      tmp_przedmiot := szukaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);
  809.                      if(tmp_przedmiot = nil) then begin
  810.  
  811.                         { ... wszystko ok - dodajemy nowy przedmiot. }
  812.                         dodaj_przedmiot(tmp_uczen^.przedmioty, przedmiot);
  813.                         Writeln('Dodano przedmiot: ', przedmiot);
  814.                      end
  815.                      else begin
  816.                          writeln('Taki przedmiot juz istnieje!');
  817.                      end;
  818.               end
  819.               else begin
  820.                 writeln('Tresc przedmiotu jest pusta ?');
  821.               end;
  822.         end
  823.         else begin
  824.             writeln('Taki uczen nie istnieje.');
  825.         end;
  826.         end
  827.         else begin
  828.          writeln('Nie wypelniono wszystich pol.')
  829.     end;
  830.  
  831. end;
  832.  
  833. { okno w ktorym usuwamy ucznia }
  834. procedure okno_usun_ucznia(var head : wuczen);
  835. var
  836.    imie, nazw : string;
  837.    tmp_info : personal;
  838.    tmp_uczen: wuczen;
  839. begin
  840.    ClrScr;
  841.    wyswietl_uczniow(head);
  842.  
  843.    writeln('Kogo usunac ?');
  844.  
  845.    write('Podaj imie: ');
  846.    readln(imie);
  847.  
  848.    write('Podaj nazwisko: ');
  849.    readln(nazw);
  850.  
  851.     if not pusty_string(imie) and not pusty_string(nazw) then begin
  852.         tmp_info.imie := imie;
  853.         tmp_info.nazwisko := nazw;
  854.  
  855.         tmp_uczen := szukaj_ucznia(head, tmp_info);
  856.         if(tmp_uczen <> nil) then begin
  857.            usun_ucznia(head, tmp_uczen);
  858.            writeln('Uczen odwolany.');
  859.         end
  860.         else begin
  861.              writeln('Taki uczen nie istnieje.');
  862.         end;
  863.     end
  864.     else begin
  865.          writeln('Nie wypelniono wszystich pol.')
  866.     end;
  867. end;
  868.  
  869. { okno w ktorym dodajemy uwage }
  870. procedure okno_dodaj_uwage(var head: wuczen);
  871. var
  872.    imie, nazw, uwaga : string;
  873.    tmp_info : personal;
  874.    tmp_uczen: wuczen;
  875. begin
  876.    ClrScr;
  877.    wyswietl_uczniow(head);
  878.  
  879.    writeln('Komus dodac uwage ?');
  880.  
  881.    write('Podaj imie: ');
  882.    readln(imie);
  883.  
  884.    write('Podaj nazwisko: ');
  885.    readln(nazw);
  886.  
  887.     if not pusty_string(imie) and not pusty_string(nazw) then begin
  888.         tmp_info.imie := imie;
  889.         tmp_info.nazwisko := nazw;
  890.  
  891.         tmp_uczen := szukaj_ucznia(head, tmp_info);
  892.         if(tmp_uczen <> nil) then begin
  893.             ClrScr;
  894.             WriteLn('Podaj uwage dla: ', tmp_uczen^.info.nazwisko);
  895.             ReadLn(uwaga);
  896.  
  897.             if not pusty_string(uwaga) then begin
  898.                dodaj_uwage(tmp_uczen^.uwagi, uwaga);
  899.                writeln('Uwaga dodana !');
  900.             end
  901.             else begin
  902.                writeln('Uwaga bez tresc?');
  903.             end;
  904.         end
  905.         else begin
  906.             writeln('Taki uczen nie istnieje.');
  907.         end;
  908.     end
  909.     else begin
  910.        writeln('Nie wypelniono wszystich pol.')
  911.     end;
  912. end;
  913.  
  914. { okno w ktorym listujemy uwagi uzyskane przez ucznia }
  915. procedure okno_uwag(head: wuczen);
  916. var
  917.    imie, nazw : string;
  918.    tmp_info : personal;
  919.    tmp_uczen: wuczen;
  920.    tmp_uwaga: wuwagi;
  921. begin
  922.    ClrScr;
  923.    wyswietl_uczniow(head);
  924.  
  925.    writeln('Podaj inf. zeby zobaczyc uwagi.');
  926.  
  927.    write('Podaj imie: ');
  928.    readln(imie);
  929.  
  930.    write('Podaj nazwisko: ');
  931.    readln(nazw);
  932.  
  933.     if not pusty_string(imie) and not pusty_string(nazw) then begin
  934.         tmp_info.imie := imie;
  935.         tmp_info.nazwisko := nazw;
  936.  
  937.         tmp_uczen := szukaj_ucznia(head, tmp_info);
  938.  
  939.         { sprawdzamy czy taki uczen istnieje ... }
  940.         if tmp_uczen <> nil then begin
  941.  
  942.            { ...i czy uwagi tez jakies ma ... }
  943.            tmp_uwaga := tmp_uczen^.uwagi;
  944.            if(tmp_uwaga <> nil ) then begin
  945.  
  946.               { ... zatem wydrukujemy je. }
  947.               ClrScr;
  948.               writeln('Uwagi pana(i): ', tmp_uczen^.info.nazwisko);
  949.               while( tmp_uwaga <> nil) do begin
  950.                   writeln(tmp_uwaga^.tekst) ;
  951.                   tmp_uwaga := tmp_uwaga^.nastepna_uwaga;
  952.               end;
  953.            end
  954.            else begin
  955.                writeln('Uwagi ucznia: Brak.');
  956.            end;
  957.         end
  958.         else begin
  959.            writeln('Taki uczen nie istnieje.');
  960.         end;
  961.       end
  962.       else begin
  963.        writeln('Nie wypelniono wszystich pol.')
  964.      end;
  965.  
  966. end;
  967.  
  968. { okno w ktorym listujemy uczniow ich przedmioty oraz oceny }
  969. procedure okno_uczniow_i_ocen(head :wuczen);
  970. var
  971.    tmp_oceny : woceny;
  972.    tmp_przedmioty :wprzedmioty;
  973. begin
  974.   ClrScr;
  975.    while (head <> nil) do begin
  976.  
  977.      { listujemy uczniów }
  978.      writeln('+ Uczen: ', head^.info.imie , ' ', head^.info.nazwisko);
  979.  
  980.      { listujemy przedmioty }
  981.      if(head^.przedmioty = nil) then begin
  982.         writeln('| Brak przedmiotow');
  983.         end
  984.         else begin
  985.         writeln('| Przedmioty: ');
  986.         tmp_przedmioty     := head^.przedmioty;
  987.         while( tmp_przedmioty  <> nil) do begin
  988.                 write('|-> ', tmp_przedmioty^.nazwa, ': ');
  989.  
  990.                 tmp_oceny := tmp_przedmioty^.oceny;
  991.  
  992.                 { listujemy oceny danego przedmiotu }
  993.                 while(tmp_oceny <> nil) do begin
  994.                         write(tmp_oceny^.nota, ',');
  995.                         tmp_oceny := tmp_oceny^.nastepna_ocena;
  996.                 end;
  997.                 writeln;
  998.  
  999.        tmp_przedmioty  := tmp_przedmioty^.nastepny_przedmiot;
  1000.         end;
  1001.         end;
  1002.    head := head^.nastepny_uczen;
  1003.    end;
  1004. end;
  1005.  
  1006. { wyswietla menu }
  1007. procedure wyswietl_menu;
  1008. begin
  1009.    Window(1,1,15,25);
  1010.    TextBackGround(LightMagenta);
  1011.    ClrScr;
  1012.    Writeln('MENU');
  1013.  
  1014.    Writeln;
  1015.  
  1016.    Writeln('Uczniowie');
  1017.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' D'); TextColor(LightGray); Writeln('odaj');
  1018.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' W'); TextColor(LightGray); Writeln('ykaz ocen');
  1019.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' L'); TextColor(LightGray); Writeln('ista uwag');
  1020.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' U'); TextColor(LightGray); Writeln('waga+');
  1021.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' O'); TextColor(LightGray); Writeln('dwolaj');
  1022.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' ['); TextColor(LightGray); Writeln('Przedmiot+');
  1023.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' ]'); TextColor(LightGray); Writeln('Przedmiot-');
  1024.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' /'); TextColor(LightGray); Writeln('Ocena+');
  1025.    Write(MENU_LEWY_ZANK); TextColor(LightRed);  Write(' \'); TextColor(LightGray); Writeln('OcenY-');
  1026.  
  1027.    GoToXY(1,24);
  1028.  
  1029.                          TextColor(LightRed);  Write('C'); TextColor(LightGray); Writeln('ya!');
  1030.  
  1031. end;
  1032.  
  1033. { wyswietla glowne okno programu }
  1034. procedure wyswietl_glowne_okno;
  1035. begin
  1036.    Window(17,1,80,26);
  1037.    TextBackGround(Black);
  1038.    ClrScr;
  1039. end;
  1040.  
  1041. { drukuje sperator rozdzielajacy menu od glownego okna }
  1042. procedure wyswietl_separator;
  1043. var i:integer;
  1044. begin
  1045.    Window(16,1,17,25);
  1046.    ClrScr;
  1047.    For i:=1 To 25 Do Writeln(MENU_ROZDZIELACZ_ZANK);
  1048. end;
  1049.  
  1050. { wyswietla jak widac }
  1051. procedure stworz_okna;
  1052. begin
  1053.     Window(10,1,80,25);
  1054.  
  1055.     wyswietl_menu;
  1056.     wyswietl_separator;
  1057.     wyswietl_glowne_okno;
  1058.  
  1059. end;
  1060.  
  1061. { okono do dodania ucznia }
  1062. procedure okno_dodaj_ucznia(var head: wuczen);
  1063. var
  1064.    imie, nazw : string;
  1065.    nowy_uczen : personal;
  1066.    tmp_uczen : wuczen;
  1067.  
  1068. begin
  1069.      ClrScr;
  1070.  
  1071.      Write('Imie: ');
  1072.      readln(imie);
  1073.  
  1074.      Write('Nazwisko: ');
  1075.      readln(nazw);
  1076.  
  1077.      if not pusty_string(imie) and not pusty_string(nazw) then begin
  1078.         nowy_uczen.imie := imie;
  1079.         nowy_uczen.nazwisko := nazw;
  1080.  
  1081.         tmp_uczen := szukaj_ucznia(head, nowy_uczen);
  1082.  
  1083.         { sprawdzamy czy taki uczen aby nie istnieje }
  1084.         if tmp_uczen = nil then begin
  1085.            dodaj_ucznia(head, nowy_uczen);
  1086.            writeln('Dodano ucznia.');
  1087.         end
  1088.         else begin
  1089.            writeln('Taki uczen juz istnieje.');
  1090.         end;
  1091.       end
  1092.       else begin
  1093.        writeln('Nie wypelniono wszystich pol.')
  1094.      end;
  1095. end;
  1096.  
  1097. {---------------------------------}
  1098. { Program glowny                  }
  1099. {---------------------------------}
  1100.  
  1101. var
  1102.    { nasza glowna lista uczniow }
  1103.    lista_uczniow : wuczen;
  1104.  
  1105.    { char do sterowania menu }
  1106.    wybor : char;
  1107.  
  1108.    {sciezka z ktorej program sie uruchomil }
  1109.    sciezka : string;
  1110.  
  1111.    { absolutna scieka do pliku birnaego }
  1112.    plik_uczniow : string;
  1113.  
  1114.  
  1115. begin
  1116.   lista_uczniow := nil;
  1117.  
  1118.   { sciezka z ktorej program sie uruchomil }
  1119.   sciezka := GetCurrentDir;
  1120.  
  1121.   { sciezka + plik czyli absolutna sciezka do pliku }
  1122.   plik_uczniow := sciezka + '\' + PLIK;
  1123.  
  1124.   {
  1125.     wczytuje z pliku binarnego rekordy do listy uczniow oraz wszystkie informaje
  1126.     o ocenach i przedmiotach
  1127.   }
  1128.   wczytaj(lista_uczniow, plik_uczniow);
  1129.  
  1130.   { tworzymy okna tj menu, separtor, glownego okno}
  1131.   stworz_okna;
  1132.   repeat
  1133.         repeat
  1134.         wybor := ReadKey;
  1135.         wybor := UpCase(wybor);
  1136.  
  1137.         until wybor in ['D','W', 'L' ,'U', ']','[','/','\', 'O', 'C'];
  1138.         case wybor of
  1139.  
  1140.         { zapisujemy po kazdym wywolaniu okna nowo dodane informacje }
  1141.         'D': begin okno_dodaj_ucznia(lista_uczniow);    zapisz(lista_uczniow, plik_uczniow);            end;
  1142.         'W': begin okno_uczniow_i_ocen(lista_uczniow);                                                  end;
  1143.  
  1144.         'L': begin okno_uwag(lista_uczniow);                                                            end;
  1145.         'U': begin okno_dodaj_uwage(lista_uczniow);     zapisz(lista_uczniow, plik_uczniow);            end;
  1146.  
  1147.         ']': begin okno_usun_przedmiot(lista_uczniow);  zapisz(lista_uczniow, plik_uczniow);            end;
  1148.         '[': begin okno_dodaj_przedmiot(lista_uczniow); zapisz(lista_uczniow, plik_uczniow);            end;
  1149.  
  1150.         '/': begin okno_dodaj_ocene(lista_uczniow);     zapisz(lista_uczniow, plik_uczniow);            end;
  1151.         '\': begin okno_usun_oceny(lista_uczniow);      zapisz(lista_uczniow, plik_uczniow);            end;
  1152.  
  1153.         'O': begin okno_usun_ucznia(lista_uczniow);     zapisz(lista_uczniow, plik_uczniow);            end;
  1154.         end;
  1155.  
  1156.   until wybor = 'C';
  1157.  
  1158. { usuwamy liste z pamieci wraz z wszystkimi podlistami }
  1159.  usun_uczniow(lista_uczniow);
  1160. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement