From: Doni Pracner Date: Wed, 6 Nov 2013 12:06:29 +0000 (+0100) Subject: 04 - napravljen kod dir i premesten MOD u njega X-Git-Url: https://svarog.pmf.uns.ac.rs/gitweb/?a=commitdiff_plain;h=e1af7631d745d516614eb329eba1ca5f1acad285;p=spa2-teorijske-vezbe.git 04 - napravljen kod dir i premesten MOD u njega --- diff --git a/04. N brojeva/NBROJEVA.MOD b/04. N brojeva/NBROJEVA.MOD deleted file mode 100644 index 9f15488..0000000 --- a/04. N brojeva/NBROJEVA.MOD +++ /dev/null @@ -1,112 +0,0 @@ -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. diff --git a/04. N brojeva/kod/NBROJEVA.MOD b/04. N brojeva/kod/NBROJEVA.MOD new file mode 100644 index 0000000..9f15488 --- /dev/null +++ b/04. N brojeva/kod/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.