W pliku binarnym znajdują się informacje o ocenach wszystkich
  studentów ze wszystkich przedmiotów. Dane te są zapisane w postaci
  rekordów TDane (por.\ deklaracje poniżej) w dowolnej
  kolejności. Twoim zadaniem jest utworzenie indeksu pliku a
  następnie wykorzystanie go do wygenerowania posortowanego pliku z
  ostatecznymi ocenami poszczególnych studentów.  Indeks pliku to
  drzewo BST, w którego węzłach znajduje się numer indeksu oraz lista
  ocen. Drzewo jest uporzadkowane po numerach indeksów, a każda lista
  w węzłach - po przedmiotach. Numery indeksów w drzewie nie mogą
  się powtarzać. Przedmioty w listach też się nie powtarzają. Jeśli w
  pliku z danymi znajdują się dwie różne oceny z tego samego
  przedmiotu dotyczące tego samego studenta. to ocena późniejsza
  anuluje wcześniejszą.  Twój program ma składać się z czterech
  modułów i programu głównego.  Program główny ma zapytać użytkownika
  o nazwę pliku z danymi i pliku wynikowego, utworzyć w pamięci indeks
  tego pliku, a następnie utworzyć plik wynikowy (posortowany po
  numerach indeksów, a w obrębie tego samego indeksu po przedmiotach)
  zawierający końcowe oceny studentów z przedmiotów. Następnie plik
  wynikowy ma zostać wyświetlony na ekranie rekord po rekordzie
  (program ma oczekiwać na wciśnięcie klawisza przed wyświetleniem
  kolejnego rekordu).

  A oto interfejsy poszczególnych modułów


unit Oceny;
interface
type
  TPrzedmiot = (ALG, ANA, WDM, WDL, EMD, MNU, WDP, TPR, ASD, PAS);
  TOcena = (bdb, dbplus, db, dstplus, dst);
  TIndeks = integer;
  TDane = record
            indeks: TIndeks;
            przedm: TPrzedmiot;
            ocena:  TOcena;
         end;
  procedure WypiszIndeksNaEkran (i: TIndeks);
  procedure WypiszOceneNaEkran (o: TOcena);
  procedure WypiszPrzedmiotNaEkran (p: TPrzedmiot);
  procedure WypiszDaneNaEkran (t: TDane);
  function PorownajIndeksy (i1, i2: TIndeks): integer;
  { jesli indeksy i1 sa rowne wynikiem funkcji jest 0, 
    jesli i1 < i2, wynikiem funkcji jest -1, wpp 
    wynikiem jest 1 }
  function PorownajPrzedmioty (p1, p2: TIndeks): integer;
  { j. w. ale dla przedmiotow }
end.



unit Listy;
interface
{implementuje listy uporzadkowane rosnaco po polu przedm }
uses
  Oceny;
type
  Lista = ^TElemListy;
  TElemListy = record
                 przedm: TPrzedmiot;
                 ocena:  TOcena;
                 nast: Lista
               end;
procedure Inicjuj (var l: Lista);
{ tworzy pusta liste }
function CzyPusta (l: Lista): boolean;
{ sprawdza czy l jest lista pusta }
procedure Wstaw (var l: Lista; p: TPrzedmiot; o: TOcena);
{ wstawia przedmiot p z ocena o na wlasciwe miejsce 
  w liscie uorzadkowanej l, jesli przedmiot juz 
  sie w niej znajdowal to zmienia zwiazana z nim ocene }
function OcenaZ (l: Lista; p: TPrzedmiot; var o: TOcena): boolean;
{ jesli przedmiot p jest na liscie l to wynikiem funkcji jest 
  true, a zmienna o to ocena zwiazana z przedmiotem p, 
  wpp wynikiem funkcji jest false, a o ma wartosc
  nieokreslona }
procedure UsunZListy (var l: Lista; p: TPrzedmiot);
{ usuwa przedmiot p wraz z ocena z listy l }
procedure Sprzataj (var l : Lista);
{ usuwa wszystkie elementy z listy l, zwalnia pamiec } 
end.



unit BST;
interface
uses
  Oceny, listy;
type
  Drzewo = ^TElemDrzewa;
  TElemDrzewa = record
                  indeks: TIndeks;
                  l : Lista;
                  lewy, prawy: Drzewo
                end;
procedure Inicjuj (var d: Drzewo);
{ Tworzy puste drzewo BST }
procedure Wstaw (var d: Drzewo; i: TIndeks; l: Lista);
{ Wstawia do drzewa d element z numerem indeksu i i lista l,
  jesli element z numerem indeksu i juz jest w drzewie to 
  podmienia zwiazana z nim liste (bez dealokacji) }
function Wyszukaj (d: Drzewo; i: TIndeks): Lista;
{ wynikiem jest lista zwiazana z numerem indeksu i lub nil
  jesli i nie ma w drzewie }
procedure Usun (var d: Drzewo; i: TIndeks);
{ usuwa z drzewa (bez dealokacji listy!) wezel 
  z numerem indeksu i } 
procedure Sprzataj (var d: Drzewo);
{ usuwa wszystkie elementy z drzewa, zwalnia pamiec }
end.


unit pliki;
interface
type TPlik = file of TDane;
function CzyJest (nazwa: string): boolean;
{ sprawdza, czy plik nazwa istnieje }
function BudujIndeks (var g: TPlik): Drzewo;
{ buduje indeks otwartego do odczytu pliku g }
procedure UtworzPlik (var g: TPlik, d: Drzewo);
{ zapisuje dane do otwartego do zapisu pliku g 
  w oparciu o zbudowany indeks d } 
end.