Code:
PROGRAM SABIRCI2;
USES
CRT;
TYPE NIZ=ARRAY [1..10] OF INTEGER;
VAR
X,Y:NIZ;
I,J,K,N,M,SLED:INTEGER;
PROCEDURE JEDINICE (VAR X:NIZ; N:INTEGER); {-Ucitava niz koji ima onoliko jedinica koliko ih ima i uneseni broj N}
VAR
I:INTEGER;
BEGIN
FOR I:=1 TO N DO
X[I]:=1;
WRITE (' ',X[1]);
FOR I:=2 TO N DO
WRITE ('+',X[I]);
END;
PROCEDURE POCETAK (VAR X:NIZ; N:INTEGER);
VAR
I:INTEGER;
BEGIN
X[1]:=2;
X[N]:=0;
WRITE (' ',X[1]);
FOR I:=2 TO N-1 DO
WRITE ('+',X[I]);
END;
PROCEDURE GRANICE (VAR X:NIZ; N:INTEGER); {-Nalazi prvi (od pocetka) najmanji i prvi (od kraja) najveci broj}
VAR
T,I,K,TC,P,MAX,MIN,SLED:INTEGER;
BEGIN
MIN:=X[1];
MAX:=X[N];
I:=0;
REPEAT
I:=I+1;
P:=X[N-I];
IF (MAX<X[N-I]) THEN BEGIN X[N-I]:=X[N-I]-1; TC:=X[N-I]; END;
UNTIL (P>X[N-I]);
I:=1;
REPEAT
I:=I+1;
P:=X[I];
IF (MIN>X[I]) THEN
BEGIN
IF ((X[I]=0) OR (X[I]=TC)) THEN
BEGIN
P:=X[1];
X[1]:=X[1]+1;
END
ELSE X[I]:=X[I]+1;
END;
UNTIL ((P<X[I]) OR (P<X[1]));
WRITE (' ',X[1]);
FOR I:=2 TO N DO
BEGIN
IF (X[I]<>0) THEN WRITE ('+',X[I]);
IF (X[I]>1) THEN SLED:=X[I];
END;
WRITELN;
END;
{PROCEDURE NAJVECI (VAR X:NIZ; N:INTEGER);
VAR
M,I,VECI:INTEGER;
BEGIN
VECI:=X[N];
I:=0;
REPEAT
I:=I+1;
IF (X[N-I]>VECI) THEN VECI:=X[N-I];
UNTIL (VECI=X[N-I]);
M:=VECI;
WRITELN ('*****',M,'*****');
END;}
{PROCEDURE ZADNJI (VAR Y:NIZ; M:INTEGER);
VAR
P1,TC1,T,J,MAX2,MIN1,MAX1:INTEGER;
BEGIN
M:=SLED;
FOR J:=1 TO M DO
Y[J]:=1;
MAX2:=Y[M];
J:=0;
REPEAT
J:=J+1;
IF (Y[M-J]>MAX2) THEN MAX2:=Y[M-1];
UNTIL (MAX2=Y[M-1]);
IF (Y[M]>1) THEN
BEGIN
M:=Y[M];
REPEAT
MIN1:=Y[1];
MAX1:=Y[M];
J:=0;
REPEAT
J:=J+1;
P1:=Y[M-J];
IF (MAX1<Y[M-J]) THEN BEGIN Y[M-J]:=Y[M-J]-1; TC1:=Y[M-J]; END;
UNTIL (P1>Y[M-J]);
J:=1;
REPEAT
J:=J+1;
P1:=Y[J];
IF (MIN1>Y[J]) THEN BEGIN
IF ((Y[J]=0) OR (Y[J]=TC1)) THEN BEGIN
P1:=Y[1];
Y[1]:=Y[1]+1;
END
ELSE Y[J]:=X[J]+1;
END;
UNTIL ((P1<Y[J]) OR (P1<Y[1]));
WRITE (Y[1]);
FOR J:=2 TO M DO
IF (Y[J]<>0) THEN WRITE ('+',Y[J]);
WRITELN;
UNTIL (Y[1]=M);
END;
END;}
BEGIN
WRITELN; {ovaj dio mozete zanemariti jer je dio grafike programa}
TEXTCOLOR (RED);
TEXTBACKGROUND (BLACK);
WRITE (#457);
FOR I:=1 TO 7 DO
WRITE (#461#461#461#461#461#461#461#461#461#461#461);
WRITELN (#443);
WRITE (#442#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITE (#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITELN (#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#442);
WRITE (#442#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITE (#176#176#176#176#176#176#176#176#176);
TEXTCOLOR (LIGHTBLUE);
TEXTBACKGROUND (BLACK);
WRITE ('Pocetak programa');
TEXTCOLOR (RED);
WRITE(#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITELN (#176#176#176#176#176#176#176#176#176#442);
WRITE (#442#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITE (#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITELN (#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#442);
WRITE (#456);
FOR I:=1 TO 7 DO
WRITE (#461#461#461#461#461#461#461#461#461#461#461);
WRITE (#444);
WRITELN;
WRITELN;
TEXTCOLOR (LIGHTBLUE); {kraj grafickog dijela :)}
WRITE (' Unesite broj: ');
READLN (N);
WRITELN (' Kombinacije cjelobrojnih sabiraka ovog broja su: ');
IF (N>1) THEN
BEGIN
JEDINICE (X,N);
WRITELN;
POCETAK (X,N);
WRITELN;
WHILE (X[1]<>N) DO
BEGIN
GRANICE (X,N);
END;
END
ELSE
WRITE (' ',N);
READLN;
CLRSCR;
END.
{Program stampa kombinacije sabiraka unijetog broja N}
PROGRAM SABIRCI2;
USES
CRT;
TYPE NIZ=ARRAY [1..10] OF INTEGER;
VAR
X,Y:NIZ;
I,J,K,N,M,SLED:INTEGER;
PROCEDURE JEDINICE (VAR X:NIZ; N:INTEGER); {-Ucitava niz koji ima onoliko jedinica koliko ih ima i uneseni broj N}
VAR
I:INTEGER;
BEGIN
FOR I:=1 TO N DO
X[I]:=1;
WRITE (' ',X[1]);
FOR I:=2 TO N DO
WRITE ('+',X[I]);
END;
PROCEDURE POCETAK (VAR X:NIZ; N:INTEGER);
VAR
I:INTEGER;
BEGIN
X[1]:=2;
X[N]:=0;
WRITE (' ',X[1]);
FOR I:=2 TO N-1 DO
WRITE ('+',X[I]);
END;
PROCEDURE GRANICE (VAR X:NIZ; N:INTEGER); {-Nalazi prvi (od pocetka) najmanji i prvi (od kraja) najveci broj}
VAR
T,I,K,TC,P,MAX,MIN,SLED:INTEGER;
BEGIN
MIN:=X[1];
MAX:=X[N];
I:=0;
REPEAT
I:=I+1;
P:=X[N-I];
IF (MAX<X[N-I]) THEN BEGIN X[N-I]:=X[N-I]-1; TC:=X[N-I]; END;
UNTIL (P>X[N-I]);
I:=1;
REPEAT
I:=I+1;
P:=X[I];
IF (MIN>X[I]) THEN
BEGIN
IF ((X[I]=0) OR (X[I]=TC)) THEN
BEGIN
P:=X[1];
X[1]:=X[1]+1;
END
ELSE X[I]:=X[I]+1;
END;
UNTIL ((P<X[I]) OR (P<X[1]));
WRITE (' ',X[1]);
FOR I:=2 TO N DO
BEGIN
IF (X[I]<>0) THEN WRITE ('+',X[I]);
IF (X[I]>1) THEN SLED:=X[I];
END;
WRITELN;
END;
{PROCEDURE NAJVECI (VAR X:NIZ; N:INTEGER);
VAR
M,I,VECI:INTEGER;
BEGIN
VECI:=X[N];
I:=0;
REPEAT
I:=I+1;
IF (X[N-I]>VECI) THEN VECI:=X[N-I];
UNTIL (VECI=X[N-I]);
M:=VECI;
WRITELN ('*****',M,'*****');
END;}
{PROCEDURE ZADNJI (VAR Y:NIZ; M:INTEGER);
VAR
P1,TC1,T,J,MAX2,MIN1,MAX1:INTEGER;
BEGIN
M:=SLED;
FOR J:=1 TO M DO
Y[J]:=1;
MAX2:=Y[M];
J:=0;
REPEAT
J:=J+1;
IF (Y[M-J]>MAX2) THEN MAX2:=Y[M-1];
UNTIL (MAX2=Y[M-1]);
IF (Y[M]>1) THEN
BEGIN
M:=Y[M];
REPEAT
MIN1:=Y[1];
MAX1:=Y[M];
J:=0;
REPEAT
J:=J+1;
P1:=Y[M-J];
IF (MAX1<Y[M-J]) THEN BEGIN Y[M-J]:=Y[M-J]-1; TC1:=Y[M-J]; END;
UNTIL (P1>Y[M-J]);
J:=1;
REPEAT
J:=J+1;
P1:=Y[J];
IF (MIN1>Y[J]) THEN BEGIN
IF ((Y[J]=0) OR (Y[J]=TC1)) THEN BEGIN
P1:=Y[1];
Y[1]:=Y[1]+1;
END
ELSE Y[J]:=X[J]+1;
END;
UNTIL ((P1<Y[J]) OR (P1<Y[1]));
WRITE (Y[1]);
FOR J:=2 TO M DO
IF (Y[J]<>0) THEN WRITE ('+',Y[J]);
WRITELN;
UNTIL (Y[1]=M);
END;
END;}
BEGIN
WRITELN; {ovaj dio mozete zanemariti jer je dio grafike programa}
TEXTCOLOR (RED);
TEXTBACKGROUND (BLACK);
WRITE (#457);
FOR I:=1 TO 7 DO
WRITE (#461#461#461#461#461#461#461#461#461#461#461);
WRITELN (#443);
WRITE (#442#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITE (#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITELN (#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#442);
WRITE (#442#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITE (#176#176#176#176#176#176#176#176#176);
TEXTCOLOR (LIGHTBLUE);
TEXTBACKGROUND (BLACK);
WRITE ('Pocetak programa');
TEXTCOLOR (RED);
WRITE(#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITELN (#176#176#176#176#176#176#176#176#176#442);
WRITE (#442#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITE (#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176);
WRITELN (#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#176#442);
WRITE (#456);
FOR I:=1 TO 7 DO
WRITE (#461#461#461#461#461#461#461#461#461#461#461);
WRITE (#444);
WRITELN;
WRITELN;
TEXTCOLOR (LIGHTBLUE); {kraj grafickog dijela :)}
WRITE (' Unesite broj: ');
READLN (N);
WRITELN (' Kombinacije cjelobrojnih sabiraka ovog broja su: ');
IF (N>1) THEN
BEGIN
JEDINICE (X,N);
WRITELN;
POCETAK (X,N);
WRITELN;
WHILE (X[1]<>N) DO
BEGIN
GRANICE (X,N);
END;
END
ELSE
WRITE (' ',N);
READLN;
CLRSCR;
END.
{Program stampa kombinacije sabiraka unijetog broja N}
Sto je problem? Pa program ovakav kakav jeste stampa skoro sva resenja.
Npr broj 5:
1+1+1+1+1
2+1+1+1
2+2+1
3+2
4+1
5
I to su sva resenja. Ali za vece brojeve npr. broj 7:
1+1+1+1+1+1+1
2+1+1+1+1+1
2+2+1+1+1
2+2+2+1
3+2+2 -evo prve greske, znaci treba jos da stampa 3+2+1+1
3+3+1
4+3 -i ovdje treba da bude jos: 4+2+1 i 4+1+1+1
5+2 -slicno...
6+1
7
Problem je u sledecem: ako je zadnji broj veci od jedan nece ga rastavljati.
Ja sam pokusao da provjeravam da li zadnji broj veci od 1 i ako jeste pozivam posebnu proceduru da ga rastavi i stampa pozivajuci proceduru u proceduri ali ne ide.