gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
sve iz starih verzija
[spa2-teorijske-vezbe.git] / Cas09 / Put.MOD
diff --git a/Cas09/Put.MOD b/Cas09/Put.MOD
new file mode 100644 (file)
index 0000000..2b93a80
--- /dev/null
@@ -0,0 +1,143 @@
+MODULE Put;\r
+\r
+  FROM IO IMPORT\r
+    WrLn, WrStr, RdCard, WrCard, OK;\r
+\r
+  FROM Storage IMPORT\r
+    ALLOCATE;\r
+\r
+  CONST\r
+    MaxBrGrad = 50;\r
+\r
+  TYPE\r
+    Lista = POINTER TO Grad;\r
+    Grad = RECORD\r
+             Info: CARDINAL;\r
+             Veza: Lista;\r
+           END;\r
+    Mreza = ARRAY  [1 .. MaxBrGrad] OF Lista;\r
+    Posecen = ARRAY [1 .. MaxBrGrad] OF BOOLEAN;\r
+\r
+  VAR\r
+    m: Mreza;\r
+    BrojGr: CARDINAL;\r
+    GPoc, GKra: CARDINAL;\r
+\r
+  PROCEDURE Ubaci(VAR L: Lista; G: CARDINAL);\r
+    VAR\r
+      Tek, Novi: Lista;\r
+  BEGIN\r
+    IF (L = NIL) OR (G < L^.Info) THEN\r
+      NEW(Novi);\r
+      Novi^.Info:= G;\r
+      Novi^.Veza:= L;\r
+      L:= Novi;\r
+    ELSE\r
+      Tek:= L;\r
+      WHILE (Tek^.Veza # NIL) AND (Tek^.Veza^.Info < G) DO\r
+        Tek:= Tek^.Veza;\r
+      END;\r
+      IF (Tek^.Veza = NIL) OR (Tek^.Veza^.Info > G) THEN\r
+        NEW(Novi);\r
+        Novi^.Info:= G;\r
+        Novi^.Veza:= Tek^.Veza;\r
+        Tek^.Veza:= Novi;\r
+      END;\r
+    END;\r
+  END Ubaci;\r
+\r
+  PROCEDURE Povezi(G1, G2: CARDINAL);\r
+  BEGIN\r
+    Ubaci(m[G1], G2);\r
+    Ubaci(m[G2], G1);\r
+  END Povezi;\r
+\r
+  PROCEDURE Unos(VAR G1, G2: CARDINAL);\r
+    VAR\r
+      G: CARDINAL;\r
+  BEGIN\r
+    REPEAT\r
+      WrStr('Unesite broj gradova (od 2 do ');\r
+      WrCard(MaxBrGrad, 1);\r
+      WrStr(') ---- ');\r
+      BrojGr:= RdCard();\r
+      WrLn;\r
+    UNTIL OK AND (2 <= BrojGr) AND (BrojGr <= MaxBrGrad);\r
+    FOR G:= 1 TO BrojGr DO\r
+      m[G]:= NIL;\r
+    END;\r
+    REPEAT\r
+      WrStr('Unesite dva grada koji su povezani linijom.');\r
+      REPEAT\r
+        WrLn;\r
+        WrStr('Unesite red. br. prvog grada (ili 0 za kraj unosa linija) -- ');\r
+        G1:= RdCard()\r
+      UNTIL OK AND (G1 <= BrojGr);\r
+      IF G1 > 0 THEN\r
+        REPEAT\r
+          WrStr('Unesite red. br. drugog grada ------------------------------ ');\r
+          G2:= RdCard();\r
+        UNTIL OK AND (1 <= G2) AND (G2 <= BrojGr) AND (G1 # G2);\r
+        Povezi(G1, G2);\r
+      END;\r
+      WrLn;\r
+    UNTIL G1 = 0;\r
+    REPEAT\r
+      WrLn;\r
+      WrLn;\r
+      WrStr('Unesite red. br. pocetnog grada -- ');\r
+      G1:= RdCard();\r
+    UNTIL OK AND (1 <= G1) AND (G1 <= BrojGr);\r
+    REPEAT\r
+      WrLn;\r
+      WrStr('Unesite red. br ciljnog grada -- ');\r
+      G2:= RdCard();\r
+    UNTIL OK AND (1 <= G2) AND (G2 <= BrojGr) AND (G1 # G2);\r
+  END Unos;\r
+\r
+  PROCEDURE NadjiPut(Od, Do, brojGr : CARDINAL);\r
+    VAR\r
+     Pos: Posecen;\r
+     Reseno: BOOLEAN;\r
+     i: CARDINAL;\r
+     Resenje: ARRAY [1 .. MaxBrGrad] OF CARDINAL;\r
+\r
+    PROCEDURE Pokusaj(Od, Br: CARDINAL; VAR Reseno: BOOLEAN);\r
+      VAR\r
+        Pok: Lista;\r
+    BEGIN\r
+      Pos[Od]:= TRUE;\r
+      Resenje[Br]:= Od;\r
+      IF Od = Do THEN\r
+        Reseno:= TRUE;\r
+        WrLn;\r
+        WrStr('Put koji treba precji je sledeci:');\r
+        WrLn;\r
+        FOR i:= 1 TO Br DO\r
+          WrCard(Resenje[i], 4);\r
+        END;\r
+      ELSE\r
+        Pok:= m[Od];\r
+        WHILE (Pok # NIL) AND NOT Reseno DO\r
+          WHILE (Pok # NIL) AND Pos[Pok^.Info]  DO\r
+            Pok:= Pok^.Veza;\r
+          END;\r
+          IF Pok # NIL THEN\r
+            Pokusaj(Pok^.Info, Br + 1, Reseno);\r
+          END;\r
+        END;\r
+      END;\r
+    END Pokusaj;\r
+\r
+  BEGIN\r
+    Reseno:= FALSE;\r
+    FOR i:= 1 TO BrojGr DO\r
+      Pos[i]:= FALSE;\r
+    END;\r
+    Pokusaj(Od, 1, Reseno);\r
+  END NadjiPut;\r
+\r
+BEGIN\r
+  Unos(GPoc, GKra);\r
+  NadjiPut(GPoc, GKra, BrojGr);\r
+END Put.\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner