X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=spa2-teorijske-vezbe.git;a=blobdiff_plain;f=Cas09%2FPut.MOD;fp=Cas09%2FPut.MOD;h=2b93a8034b81c5c5c61cd6276578d5ba66b911b4;hp=0000000000000000000000000000000000000000;hb=cfda726ac9ecd0bd02935512ea0edaee2cd31b57;hpb=db836f4604991e1c22ea67943873944cdfae1345 diff --git a/Cas09/Put.MOD b/Cas09/Put.MOD new file mode 100644 index 0000000..2b93a80 --- /dev/null +++ b/Cas09/Put.MOD @@ -0,0 +1,143 @@ +MODULE Put; + + FROM IO IMPORT + WrLn, WrStr, RdCard, WrCard, OK; + + FROM Storage IMPORT + ALLOCATE; + + CONST + MaxBrGrad = 50; + + TYPE + Lista = POINTER TO Grad; + Grad = RECORD + Info: CARDINAL; + Veza: Lista; + END; + Mreza = ARRAY [1 .. MaxBrGrad] OF Lista; + Posecen = ARRAY [1 .. MaxBrGrad] OF BOOLEAN; + + VAR + m: Mreza; + BrojGr: CARDINAL; + GPoc, GKra: CARDINAL; + + PROCEDURE Ubaci(VAR L: Lista; G: CARDINAL); + VAR + Tek, Novi: Lista; + BEGIN + IF (L = NIL) OR (G < L^.Info) THEN + NEW(Novi); + Novi^.Info:= G; + Novi^.Veza:= L; + L:= Novi; + ELSE + Tek:= L; + WHILE (Tek^.Veza # NIL) AND (Tek^.Veza^.Info < G) DO + Tek:= Tek^.Veza; + END; + IF (Tek^.Veza = NIL) OR (Tek^.Veza^.Info > G) THEN + NEW(Novi); + Novi^.Info:= G; + Novi^.Veza:= Tek^.Veza; + Tek^.Veza:= Novi; + END; + END; + END Ubaci; + + PROCEDURE Povezi(G1, G2: CARDINAL); + BEGIN + Ubaci(m[G1], G2); + Ubaci(m[G2], G1); + END Povezi; + + PROCEDURE Unos(VAR G1, G2: CARDINAL); + VAR + G: CARDINAL; + BEGIN + REPEAT + WrStr('Unesite broj gradova (od 2 do '); + WrCard(MaxBrGrad, 1); + WrStr(') ---- '); + BrojGr:= RdCard(); + WrLn; + UNTIL OK AND (2 <= BrojGr) AND (BrojGr <= MaxBrGrad); + FOR G:= 1 TO BrojGr DO + m[G]:= NIL; + END; + REPEAT + WrStr('Unesite dva grada koji su povezani linijom.'); + REPEAT + WrLn; + WrStr('Unesite red. br. prvog grada (ili 0 za kraj unosa linija) -- '); + G1:= RdCard() + UNTIL OK AND (G1 <= BrojGr); + IF G1 > 0 THEN + REPEAT + WrStr('Unesite red. br. drugog grada ------------------------------ '); + G2:= RdCard(); + UNTIL OK AND (1 <= G2) AND (G2 <= BrojGr) AND (G1 # G2); + Povezi(G1, G2); + END; + WrLn; + UNTIL G1 = 0; + REPEAT + WrLn; + WrLn; + WrStr('Unesite red. br. pocetnog grada -- '); + G1:= RdCard(); + UNTIL OK AND (1 <= G1) AND (G1 <= BrojGr); + REPEAT + WrLn; + WrStr('Unesite red. br ciljnog grada -- '); + G2:= RdCard(); + UNTIL OK AND (1 <= G2) AND (G2 <= BrojGr) AND (G1 # G2); + END Unos; + + PROCEDURE NadjiPut(Od, Do, brojGr : CARDINAL); + VAR + Pos: Posecen; + Reseno: BOOLEAN; + i: CARDINAL; + Resenje: ARRAY [1 .. MaxBrGrad] OF CARDINAL; + + PROCEDURE Pokusaj(Od, Br: CARDINAL; VAR Reseno: BOOLEAN); + VAR + Pok: Lista; + BEGIN + Pos[Od]:= TRUE; + Resenje[Br]:= Od; + IF Od = Do THEN + Reseno:= TRUE; + WrLn; + WrStr('Put koji treba precji je sledeci:'); + WrLn; + FOR i:= 1 TO Br DO + WrCard(Resenje[i], 4); + END; + ELSE + Pok:= m[Od]; + WHILE (Pok # NIL) AND NOT Reseno DO + WHILE (Pok # NIL) AND Pos[Pok^.Info] DO + Pok:= Pok^.Veza; + END; + IF Pok # NIL THEN + Pokusaj(Pok^.Info, Br + 1, Reseno); + END; + END; + END; + END Pokusaj; + + BEGIN + Reseno:= FALSE; + FOR i:= 1 TO BrojGr DO + Pos[i]:= FALSE; + END; + Pokusaj(Od, 1, Reseno); + END NadjiPut; + +BEGIN + Unos(GPoc, GKra); + NadjiPut(GPoc, GKra, BrojGr); +END Put.