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] / Cas05 / NBROJEVA.MOD
diff --git a/Cas05/NBROJEVA.MOD b/Cas05/NBROJEVA.MOD
new file mode 100644 (file)
index 0000000..9f15488
--- /dev/null
@@ -0,0 +1,112 @@
+MODULE NBrojeva;\r
+\r
+  FROM IO IMPORT\r
+    WrLn, WrCard, RdCard, WrStr;\r
+\r
+  CONST\r
+    MaxNiz = 50;\r
+    MaxSuma = 500;\r
+\r
+  VAR\r
+    n, Suma, SumaPola: CARDINAL;\r
+    Broj: ARRAY [1 .. MaxNiz] OF CARDINAL;\r
+    Iskor: ARRAY[1 .. MaxNiz] OF BOOLEAN;\r
+    Mat: ARRAY[0 .. MaxSuma], [0 .. MaxNiz] OF CARDINAL;\r
+   (*   Mat[i, j] je suma brojeva u resenju ako je maksimalna *)\r
+   (* dozvoljena suma brojeva u resenju jednaka 'i' i ako se  *)\r
+   (* koristi samo prvih 'j' brojeva.                         *)\r
+\r
+  PROCEDURE Unos;\r
+    VAR\r
+      i: CARDINAL;\r
+  BEGIN\r
+    WrStr('Unesite n: ');\r
+    n:= RdCard();\r
+    Suma:= 0;\r
+    FOR i:= 1 TO n DO\r
+      WrStr('Unesite ');\r
+      WrCard(i, 1);\r
+      WrStr('. broj: ');\r
+      Broj[i]:= RdCard();\r
+      Suma:= Suma + Broj[i];\r
+      Iskor[i]:= FALSE;\r
+    END;\r
+    SumaPola:= Suma DIV 2;\r
+  END Unos;\r
+\r
+  PROCEDURE Resi;\r
+    VAR\r
+      i, j, Pom: CARDINAL;\r
+  BEGIN\r
+    FOR i:= 0 TO SumaPola DO\r
+      Mat[i, 0]:= 0;  (* Koristi se prvih 0 brojeva *)\r
+    END;\r
+    FOR j:= 1 TO n DO\r
+      Mat[0, j]:= 0;  (* Maksimalna dozvoljena suma brojeva u resenju je 0 *)\r
+    END;\r
+    FOR i:= 1 TO SumaPola DO\r
+      (* Maks. dozvoljena suma brojeva u resenju je i *)\r
+      FOR j := 1 TO n DO\r
+        (* U resenju mogu ucestvovati prvih j brojeva *)\r
+        Mat[i, j]:= Mat[i, j - 1];\r
+        IF Broj[j] <= i THEN\r
+          Pom:= Mat[i - Broj[j], j - 1] + Broj[j];\r
+          IF Pom > Mat[i, j] THEN\r
+            Mat[i, j]:= Pom;\r
+          END;\r
+        END;\r
+      END;\r
+    END;\r
+  END Resi;\r
+\r
+  PROCEDURE IspisiPrvu;\r
+    VAR\r
+      i, j: CARDINAL;\r
+  BEGIN\r
+    WrStr('Zbir prve grupe brojeva je ');\r
+    WrCard(Mat[SumaPola, n], 1);\r
+    WrLn;\r
+    WrStr('Prvu grupu brojeva cine brojevi:');\r
+    WrLn;\r
+    i:= SumaPola;\r
+    j:= n;\r
+    REPEAT\r
+      WHILE (j > 0) AND (Mat[i, j] = Mat[i, j - 1]) DO\r
+        DEC(j);\r
+      END;\r
+      IF j > 0 THEN\r
+        WrCard(Broj[j], 8);\r
+        Iskor[j]:= TRUE;\r
+        i:= i - Broj[j];\r
+        DEC(j);\r
+      END;\r
+    UNTIL j = 0;\r
+  END IspisiPrvu;\r
+\r
+  PROCEDURE IspisiDrugu;\r
+    VAR\r
+      i, j: CARDINAL;\r
+  BEGIN\r
+    WrLn;\r
+    WrStr('Zbir druge grupe brojeva je ');\r
+    WrCard(Suma - Mat[SumaPola, n], 1);\r
+    WrLn;\r
+    WrStr('Drugu grupu brojeva cine brojevi:');\r
+    WrLn;\r
+    FOR i := 1 TO n DO\r
+      IF NOT Iskor[i] THEN\r
+        WrCard(Broj[i], 8);\r
+      END;\r
+    END;\r
+  END IspisiDrugu;\r
+\r
+BEGIN\r
+  Unos;\r
+  IF SumaPola > MaxSuma THEN\r
+    WrStr('Ulazni podaci su suvise veliki.');\r
+  ELSE\r
+    Resi;\r
+    IspisiPrvu;\r
+    IspisiDrugu;\r
+  END;\r
+END NBrojeva.\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner