За допомогою вищих сил, вдалося роздобути, зрозуміти та відредагувати код. Та все ж виводить сполучення в порядку спадання.
program z1;
const
m = 10;
var
a: array [1..m] of integer;
b: array [1..100] of byte;
n, NN, r, i, j, k,fr,fch,fzn: integer;
c: real;
Procedure Swapb(i, k: byte);
var
x : byte;
begin
x := b[i];
b[i] := b[k];
b[k] := x;
end;
Procedure Writeb;
var
i, j : byte;
begin
j := 1;
for i := 1 to NN do
if b[i] = 0 then
Inc(j)
else
write(a[j]);
writeln;
end;
begin
repeat
write('n = ');
readln(n);
if (n < 2) or (n > m) then writeln('n за межами 2..', m, ', повторити.')
until (n >= 2) and (n <= m);
repeat
write('r = ');
readln(r);
if (r < 1) then writeln('r має бути натуральним числом, повторити.')
until (r >= 1);
fch:=1;
for i:=2 to (n+r-1) do
fch:=fch*i;
fr:=1;
for i:=2 to r do
fr:=fr*i;
fzn:=1;
for i:=2 to (n-1) do
fzn:=fzn*i;
c:=fch/(fr*fzn);
writeln('Кількість сполучень - ',c);
NN := n-1+r;
for i:=1 to n do a[i]:=i;
for i:=1 to n-1 do b[i]:=0;
for i:=n to n+r-1 do b[i]:=1;
WriteB;
while (true) do
begin
i:=NN;
while (i>0) and (b[i] >= b[i+1]) do i:=i-1;
if i=0 then exit;
for j:=i+1 to NN do
if (b[j]>b[i]) then k:=j;
SwapB(i,k);
for j:=i+1 to (i+ ((NN+1-i) div 2)) do
SwapB(j,NN+i+1-j);
WriteB;
end;
readln
end.
Змінювала в процедурі значення 0 на 1. В деяких випадках виводить в порядку зростання, в інших - взагалі не вірні сполучення...
Procedure Writeb;
var
i, j : byte;
begin
j := 1;
for i := 1 to NN do
if b[i] = 1 then
Inc(j)
else
write(a[j]);
writeln;
end;
Можливо знаєте як вивести в порядку зростання? Буду вельми вдячна)