X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=spa2-teorijske-vezbe.git;a=blobdiff_plain;f=04.%20Dve%20grupe%20brojeva%2FTopSpeed%20%26%20XDS%2FNBROJEVA.MOD;fp=04.%20Dve%20grupe%20brojeva%2FTopSpeed%20%26%20XDS%2FNBROJEVA.MOD;h=9f1548843d89a49a8188171666ddc6c6f50989c1;hp=0000000000000000000000000000000000000000;hb=8a74ce20c68b61b8992a348e34c43671116e9549;hpb=a35f3e51789ace81cea01e548963568da918635f diff --git a/04. Dve grupe brojeva/TopSpeed & XDS/NBROJEVA.MOD b/04. Dve grupe brojeva/TopSpeed & XDS/NBROJEVA.MOD new file mode 100644 index 0000000..9f15488 --- /dev/null +++ b/04. Dve grupe brojeva/TopSpeed & XDS/NBROJEVA.MOD @@ -0,0 +1,112 @@ +MODULE NBrojeva; + + FROM IO IMPORT + WrLn, WrCard, RdCard, WrStr; + + CONST + MaxNiz = 50; + MaxSuma = 500; + + VAR + n, Suma, SumaPola: CARDINAL; + Broj: ARRAY [1 .. MaxNiz] OF CARDINAL; + Iskor: ARRAY[1 .. MaxNiz] OF BOOLEAN; + Mat: ARRAY[0 .. MaxSuma], [0 .. MaxNiz] OF CARDINAL; + (* Mat[i, j] je suma brojeva u resenju ako je maksimalna *) + (* dozvoljena suma brojeva u resenju jednaka 'i' i ako se *) + (* koristi samo prvih 'j' brojeva. *) + + PROCEDURE Unos; + VAR + i: CARDINAL; + BEGIN + WrStr('Unesite n: '); + n:= RdCard(); + Suma:= 0; + FOR i:= 1 TO n DO + WrStr('Unesite '); + WrCard(i, 1); + WrStr('. broj: '); + Broj[i]:= RdCard(); + Suma:= Suma + Broj[i]; + Iskor[i]:= FALSE; + END; + SumaPola:= Suma DIV 2; + END Unos; + + PROCEDURE Resi; + VAR + i, j, Pom: CARDINAL; + BEGIN + FOR i:= 0 TO SumaPola DO + Mat[i, 0]:= 0; (* Koristi se prvih 0 brojeva *) + END; + FOR j:= 1 TO n DO + Mat[0, j]:= 0; (* Maksimalna dozvoljena suma brojeva u resenju je 0 *) + END; + FOR i:= 1 TO SumaPola DO + (* Maks. dozvoljena suma brojeva u resenju je i *) + FOR j := 1 TO n DO + (* U resenju mogu ucestvovati prvih j brojeva *) + Mat[i, j]:= Mat[i, j - 1]; + IF Broj[j] <= i THEN + Pom:= Mat[i - Broj[j], j - 1] + Broj[j]; + IF Pom > Mat[i, j] THEN + Mat[i, j]:= Pom; + END; + END; + END; + END; + END Resi; + + PROCEDURE IspisiPrvu; + VAR + i, j: CARDINAL; + BEGIN + WrStr('Zbir prve grupe brojeva je '); + WrCard(Mat[SumaPola, n], 1); + WrLn; + WrStr('Prvu grupu brojeva cine brojevi:'); + WrLn; + i:= SumaPola; + j:= n; + REPEAT + WHILE (j > 0) AND (Mat[i, j] = Mat[i, j - 1]) DO + DEC(j); + END; + IF j > 0 THEN + WrCard(Broj[j], 8); + Iskor[j]:= TRUE; + i:= i - Broj[j]; + DEC(j); + END; + UNTIL j = 0; + END IspisiPrvu; + + PROCEDURE IspisiDrugu; + VAR + i, j: CARDINAL; + BEGIN + WrLn; + WrStr('Zbir druge grupe brojeva je '); + WrCard(Suma - Mat[SumaPola, n], 1); + WrLn; + WrStr('Drugu grupu brojeva cine brojevi:'); + WrLn; + FOR i := 1 TO n DO + IF NOT Iskor[i] THEN + WrCard(Broj[i], 8); + END; + END; + END IspisiDrugu; + +BEGIN + Unos; + IF SumaPola > MaxSuma THEN + WrStr('Ulazni podaci su suvise veliki.'); + ELSE + Resi; + IspisiPrvu; + IspisiDrugu; + END; +END NBrojeva.