gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Cas01 preimenovan, dodate XDS verzije koda
[spa2-teorijske-vezbe.git] / 01. Dvosmerni Recnik / XDS / RECNIKATP.MOD
diff --git a/01. Dvosmerni Recnik/XDS/RECNIKATP.MOD b/01. Dvosmerni Recnik/XDS/RECNIKATP.MOD
new file mode 100644 (file)
index 0000000..1977893
--- /dev/null
@@ -0,0 +1,186 @@
+IMPLEMENTATION MODULE RecnikATP;\r
+\r
+  FROM IO IMPORT\r
+    RdKey, WrStr, WrLn, WrCard;\r
+  FROM SYSTEM IMPORT\r
+    TSIZE;\r
+  FROM Str IMPORT\r
+    Compare;\r
+  FROM Storage IMPORT\r
+    ALLOCATE, DEALLOCATE;\r
+\r
+  PROCEDURE Hash(Rec: String): Indeksi;\r
+    VAR\r
+      i, Zbir, Temp: CARDINAL;\r
+  BEGIN\r
+    Zbir:= 0;\r
+    i:= 1;\r
+    WHILE (i <= MaxDuzRec) AND (Rec[i] # CHR(0)) DO\r
+      Temp:= (ORD(Rec[i]) * ORD(Rec[i])) MOD Broj;\r
+      Zbir:= (Zbir + Temp) MOD Broj;\r
+      INC(i);\r
+    END;\r
+    RETURN Zbir;\r
+  END Hash;\r
+\r
+  PROCEDURE Inicijalizuj(VAR R: Recnik);\r
+    VAR\r
+      i: Indeksi;\r
+  BEGIN\r
+    WITH R DO\r
+      BrojReci:= 0;\r
+      FOR i := 0 TO MaxTabela DO\r
+        NEW(Domace[i]);\r
+        Domace[i]^.Veza := Domace[i];\r
+        NEW(Strane[i]);\r
+        Strane[i]^.Veza := Strane[i]\r
+      END;\r
+    END;\r
+  END Inicijalizuj;\r
+\r
+  PROCEDURE Unisti(VAR R: Recnik);\r
+    VAR\r
+      i: Indeksi;\r
+      Tekuci: Lista;\r
+  BEGIN\r
+    FOR i:= 0 TO MaxTabela DO\r
+      WHILE R.Domace[i] # R.Domace[i]^.Veza DO\r
+        Tekuci:= R.Domace[i]^.Veza;\r
+        R.Domace[i]^.Veza:= Tekuci^.Veza;\r
+        DISPOSE(Tekuci);\r
+      END;\r
+      DISPOSE(R.Domace[i]);\r
+      WHILE R.Strane[i] # R.Strane[i]^.Veza DO\r
+        Tekuci:= R.Strane[i]^.Veza;\r
+        R.Strane[i]^.Veza:= Tekuci^.Veza;\r
+        DISPOSE(Tekuci);\r
+      END;\r
+      DISPOSE(R.Strane[i]);\r
+    END;\r
+  END Unisti;\r
+\r
+  PROCEDURE Nadji(VAR Rec: String;\r
+                  VAR Tab: Tabela;\r
+                  VAR Prethodni: Lista;\r
+                  VAR Nadjen: BOOLEAN);\r
+    VAR\r
+      Pozicija: Indeksi;\r
+  BEGIN\r
+    Pozicija:= Hash(Rec);\r
+    Prethodni:= Tab[Pozicija];\r
+    Prethodni^.Rec:= Rec;\r
+    IF Prethodni^.Veza = Prethodni THEN\r
+      Nadjen:= FALSE;\r
+    ELSE\r
+      WHILE Compare(Prethodni^.Veza^.Rec, Rec) # 0 DO\r
+        Prethodni:= Prethodni^.Veza;\r
+      END;\r
+      Nadjen:= Prethodni^.Veza # Tab[Pozicija]\r
+    END;\r
+  END Nadji;\r
+\r
+  PROCEDURE Ubaci(DomacaRec, StranaRec: String;\r
+                  VAR R: Recnik;\r
+                  VAR Duplikat: BOOLEAN);\r
+    VAR\r
+      NadjenDom, NadjenStr: BOOLEAN;\r
+      PrethodniDom, PrethodniStr, PomDom, PomStr: Lista;\r
+  BEGIN\r
+\r
+    Nadji(DomacaRec, R.Domace, PrethodniDom, NadjenDom);\r
+    Nadji(StranaRec, R.Strane, PrethodniStr, NadjenStr);\r
+\r
+    IF NadjenDom OR NadjenStr THEN\r
+      Duplikat:= TRUE;\r
+    ELSE\r
+\r
+      Duplikat := FALSE;\r
+\r
+      NEW(PomDom);\r
+      PomDom^.Rec:= DomacaRec;\r
+      PomDom^.Veza:= PrethodniDom^.Veza;\r
+      PrethodniDom^.Veza:= PomDom;\r
+\r
+      NEW(PomStr);\r
+      PomStr^.Rec:= StranaRec;\r
+      PomStr^.Veza:= PrethodniStr^.Veza;\r
+      PrethodniStr^.Veza:= PomStr;\r
+\r
+      PomDom^.Prevod:= PomStr;\r
+      PomStr^.Prevod:= PomDom;\r
+\r
+      INC(R.BrojReci);\r
+\r
+    END;\r
+  END Ubaci;\r
+\r
+  PROCEDURE Izbaci(Rec: String;\r
+                   VAR R: Recnik;\r
+                   Domaca: BOOLEAN;\r
+                   VAR Ok: BOOLEAN);\r
+    VAR\r
+      Prethodni, Prethodni2, Temp, Temp2: Lista;\r
+  BEGIN\r
+\r
+    IF Domaca THEN\r
+      Nadji(Rec, R.Domace, Prethodni, Ok);\r
+    ELSE\r
+      Nadji(Rec, R.Strane, Prethodni, Ok);\r
+    END;\r
+\r
+    IF Ok THEN\r
+\r
+      Temp:= Prethodni^.Veza;\r
+      Prethodni^.Veza:= Temp^.Veza;\r
+\r
+      Temp2:= Temp^.Prevod;\r
+      Prethodni2:= Temp2^.Veza;\r
+      WHILE Prethodni2^.Veza # Temp2 DO\r
+        Prethodni2:= Prethodni2^.Veza;\r
+      END;\r
+      Prethodni2^.Veza:= Temp2^.Veza;\r
+\r
+      DISPOSE(Temp);\r
+      DISPOSE(Temp2);\r
+\r
+      DEC(R.BrojReci);\r
+    END;\r
+  END Izbaci;\r
+\r
+  PROCEDURE Prevedi(StranuNaDomacu: BOOLEAN;\r
+                    Rec: String;\r
+                    VAR Prevod: String;\r
+                    VAR R: Recnik;\r
+                    VAR Ok: BOOLEAN);\r
+    VAR\r
+      Prethodni: Lista;\r
+  BEGIN\r
+    IF StranuNaDomacu THEN\r
+      Nadji(Rec, R.Strane, Prethodni, Ok);\r
+    ELSE\r
+      Nadji(Rec, R.Domace, Prethodni, Ok);\r
+    END;\r
+    IF Ok THEN\r
+      Prevod:= Prethodni^.Veza^.Prevod^.Rec;\r
+    END\r
+  END Prevedi;\r
+\r
+  PROCEDURE Sadrzaj(VAR R: Recnik);\r
+    VAR\r
+      i: Indeksi;\r
+      Tekuci: Lista;\r
+  BEGIN\r
+    WrStr('Sadrzaj recnika:');\r
+    FOR i:= 0 TO MaxTabela DO\r
+      Tekuci:= R.Domace[i]^.Veza;\r
+      WHILE Tekuci# R.Domace[i] DO\r
+        WrLn;\r
+        WrStr(Tekuci^.Rec);\r
+        WrStr(' --------- ');\r
+        WrStr(Tekuci^.Prevod^.Rec);\r
+        Tekuci:= Tekuci^.Veza;\r
+      END;\r
+    END;\r
+  END Sadrzaj;\r
+\r
+END RecnikATP.\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner