Witam mam problem z programem. Program oblicza permutacje wariacje, takie dziwne rzeczy z matmy ogolnie ale tu nie chodzi o to jak to liczy tylko nie wyswietla wszystkiego w tym problem. A mianowicie dziala on, ale nie zawsze wypisuje wszystkie opcje, tzn liczy je ale wypisze jak sie poda np 20 wariacji to na ekranie sie wyswietla od 12 do 20. Jak to rozwiazac? Nie mam kompletnie pomyslu. Z gory dziekuje za pomoc.
program waznyprojekt;
uses crt;
procedure losowanie_permutacji(wielkosc_zbioru, k :integer);
var
tmp : array[0..20,0..1000] of integer;
zbior : array[0..20] of integer;
i,j,z,a : integer;
zmp: integer;
powtorka,powtorka2 : integer;
ilosc,przecinek : integer;
begin
for i:=1 to 1000 do
begin
for z:=1 to wielkosc_zbioru do
begin
tmp[z-1][i]:=0;
end;
end;
for i:=1 to wielkosc_zbioru do
begin
zbior[i-1]:=0;
end;
for j:=1 to k do
begin
przecinek:=0;
ilosc:=0;
powtorka2:=0;
while powtorka2 = 0 do
begin
while ilosc< wielkosc_zbioru do
begin
powtorka :=0;
zmp:=random(wielkosc_zbioru)+1;
for z:=1 to wielkosc_zbioru do
begin
if zbior[z-1]=zmp then
begin
powtorka:=1;
break;
end;
end;
if powtorka=0 then
begin
ilosc:=ilosc+1;
zbior[ilosc-1]:=zmp;
end;
end;
powtorka2:=1;
for i:=1 to k do
begin
if tmp[0][i-1]=0 then
begin
break;
end;
for z:=1 to wielkosc_zbioru do
begin
if tmp[z-1][i-1]=zbior[z-1] then
begin
powtorka2:=0;
end else
begin
powtorka2:=1;
break;
end;
end;
if powtorka2=0 then
begin
for a:=1 to wielkosc_zbioru do
begin
zbior[a-1]:=0;
end;
ilosc:=0;
break;
end;
end;
end;
writeln('Permutacja',j,': ');
for i:= 1 to wielkosc_zbioru do
begin
write(zbior[i-1]);
tmp[i-1][j-1]:= zbior[i-1];
przecinek:= przecinek + 1;
if przecinek < wielkosc_zbioru then
begin
write(', ');
end;
end;
for i:= 1 to wielkosc_zbioru do
begin
zbior[i-1] := 0;
end;
writeln();
end;
end;
procedure permutacja;
var
wielkosc_zbioru :integer;
k : integer;
silnia : integer;
wyniksilnia, isilnia: integer;
begin
silnia:=0;
wielkosc_zbioru:=0;
while wielkosc_zbioru=0 do
begin
write('Podaj wielkosc zbioru (od 3 do 20): ');
read(wielkosc_zbioru);
if (wielkosc_zbioru < 3) AND (wielkosc_zbioru > 20) then
begin
writeln();
writeln();
writeln();
writeln('podales liczbe z poza zakresu');
end;
end;
wyniksilnia:=1;
isilnia:=1;
while isilnia<wielkosc_zbioru do
begin
isilnia:=isilnia+1;
wyniksilnia:=wyniksilnia*isilnia;
end;
silnia:=wyniksilnia;
writeln();
writeln('Ilosc permutacji zbioru ',wielkosc_zbioru,' elementowego wynosi: ', silnia);
writeln('Podaj ilosc generowanych losowych permutacji zbioru ',wielkosc_zbioru,' elementowego: ');
readln(k);
while k>silnia do
begin
writeln('podales zla wartosc. podaj jeszcze raz ilosc gen. permutacji ');
readln(k);
end;
while k>1000 do
begin
writeln('Podales ilosc losowan poza zakresem! Podaj jescze raz ');
readln(k);
end;
losowanie_permutacji(wielkosc_zbioru,k);
end;
function Silnia(n:byte):longint;
begin
if n=0 then Silnia:=1
else
Silnia:=n*Silnia(n-1);
end;
function ObliczKombinacjeZPowtorzeniami(wielkosc_zbioru, m :integer) :real;
var
a1, a2:integer;
b1, b2, b3:real;
mianownik:real;
licznik:real;
begin
a1 := wielkosc_zbioru + m - 1;
a2 := m;
b1 := Silnia(a1);
b2 := Silnia(a2);
b3 := Silnia(a1-a2);
mianownik := b2 * b3;
licznik := b1;
ObliczKombinacjeZPowtorzeniami:=(licznik / mianownik);
end;
procedure GENEROWANIE_LOSOWYCH_KOMBINACJI_Z_POWTORZENIAMI_W_LICZBIE_k(wielkosc_zbioru,wielkosc_podzbioru,k:integer) ;
var
tmp:array[0..20,0..1000] of integer;
podzbior:array[0..20] of integer;
i, j, z, x,a:integer;
zmp:integer;
powtorka:integer;
powtorka2:integer;
ilosc:integer;
przecinek:integer;
licznik_cyfr:array[0..20] of integer;
licznik_cyfr2:array[0..20] of integer;
begin
for i := 1 to 1000 do
begin
for z := 1 to wielkosc_podzbioru do
begin
tmp[z-1][i] := 0;
end;
end;
for i := 1 to wielkosc_podzbioru do
begin
podzbior[i-1] := 0;
end;
for j := 1 to k do
begin
przecinek := 0;
ilosc := 0;
powtorka2 := 0;
while powtorka2 = 0 do
begin
while ilosc < wielkosc_podzbioru do
begin
zmp := random(wielkosc_zbioru) + 1;
ilosc := ilosc + 1;
podzbior[ilosc-1] := zmp;
end;
powtorka2 := 1;
for i := 1 to wielkosc_zbioru do
begin
licznik_cyfr[i-1] := 0;
end;
for i := 1 to wielkosc_zbioru do
begin
for x := 1 to wielkosc_podzbioru do
begin
if podzbior[x-1] = i then
begin
licznik_cyfr[i-1] := licznik_cyfr[i-1] + 1;
end;
end;
end;
for i := 1 to k do
begin
if (tmp[0][i-1] = 0) then
begin
break;
end;
for x := 1 to wielkosc_zbioru do
begin
licznik_cyfr2[x-1] := 0;
end;
for z := 1 to wielkosc_zbioru do
begin
for x := 1 to wielkosc_podzbioru do
begin
if tmp[x-1][i-1] = z then
begin
licznik_cyfr2[z-1] := licznik_cyfr2[z-1] + 1;
end;
end;
end;
for z := 1 to wielkosc_zbioru do
begin
if licznik_cyfr[z-1] = licznik_cyfr2[z-1] then
begin
powtorka2 := 0;
end
else
begin
powtorka2 := 1;
break;
end;
end;
if powtorka2 = 0 then
begin
for a := 1 to wielkosc_podzbioru do
begin
podzbior[a-1] := 0;
end;
ilosc := 0;
break;
end;
end;
end;
writeln('Kombinacja z powtorzeniami: ', j);
for i := 1 to wielkosc_podzbioru do
begin
writeln(podzbior[i-1]);
tmp[i-1][j-1] := podzbior[i-1];
przecinek := przecinek + 1;
if przecinek < wielkosc_podzbioru then
begin
writeln();
end;
end;
for i := 1 to wielkosc_podzbioru do
begin
podzbior[i-1] := 0;
end;
writeln();
end;
end;
procedure kombinacjezpowtorzeniami;
var
wielkosc_zbioru:integer;
m:integer;
k:integer;
sil:real;
kombinacje_z_powtorzeniami:real;
begin
writeln('Podaj wielkosc zbioru (od 3 do 20): ');
readln(wielkosc_zbioru);
sil := Silnia(wielkosc_zbioru);
writeln('Podaj wielkosc podzbioru: ');
readln(m);
kombinacje_z_powtorzeniami := ObliczKombinacjeZPowtorzeniami(wielkosc_zbioru, m);
writeln('Ilosc kombinacji ' , m, ' elementowych z powtorzeniami zbioru ', wielkosc_zbioru ,' elementowego wynosi: ') ;
writeln (kombinacje_z_powtorzeniami:4:0);
writeln('Podaj ilosc generowanych losowych kombinacji ', m );
writeln('elementowych z powtorzeniami zbioru ', wielkosc_zbioru ,' elementowego: ');
readln(k);
GENEROWANIE_LOSOWYCH_KOMBINACJI_Z_POWTORZENIAMI_W_LICZBIE_k(wielkosc_zbioru, m, k);
writeln('Nacisnij ENTER');
readln();
end;
function ObliczKombinacjeBezPowtorzen(sil:real;wielkosc_zbioru, m:integer):real;
var
mianownik:real;
licznik:real;
begin
mianownik := Silnia(wielkosc_zbioru - m) * Silnia(m);
licznik := sil;
ObliczKombinacjeBezPowtorzen:= (licznik / mianownik);
end;
procedure GENEROWANIE_LOSOWYCH_KOMBINACJI_BEZ_POWTORZEN_W_LICZBIE_k(wielkosc_zbioru,wielkosc_podzbioru, k:integer);
var
tmp:array[0..20,0..1000] of integer;
podzbior:array[0..20] of integer;
i, j, z, x,a:integer;
zmp:integer;
powtorka:integer;
powtorka2:integer;
ilosc:integer;
przecinek:integer;
begin
for i := 1 to 1000 do
begin
for z := 1 to wielkosc_podzbioru do
begin
tmp[z-1][i] := 0;
end;
end;
for i := 1 to wielkosc_podzbioru do
begin
podzbior[i-1] := 0;
end;
for j := 1 to k do
begin
przecinek := 0;
ilosc := 0;
powtorka2 := 0;
while powtorka2 = 0 do
begin
while ilosc < wielkosc_podzbioru do
begin
powtorka := 0;
zmp := random(wielkosc_zbioru) + 1;
for z := 1 to wielkosc_podzbioru do
begin
if podzbior[z-1] = zmp then
begin
powtorka := 1;
break;
end;
end;
if powtorka = 0 then
begin
ilosc := ilosc + 1;
podzbior[ilosc-1] := zmp;
end;
end;
powtorka2 := 1;
for i := 1 to k do
begin
if (tmp[0][i-1] = 0) then
begin
break;
end;
for z := 1 to wielkosc_podzbioru do
begin
for x := 1 to wielkosc_podzbioru do
begin
if tmp[z-1][i-1] = podzbior[x-1] then
begin
powtorka2 := 0;
break;
end;
powtorka2 := 1;
end;
if powtorka2 = 1 then
begin
break;
end;
end;
if powtorka2 = 0 then
begin
for a := 1 to wielkosc_podzbioru do
begin
podzbior[a-1] := 0;
end;
ilosc := 0;
break;
end;
end;
end;
writeln('Kombinacja bez powtorzen ', j);
for i := 1 to wielkosc_podzbioru do
begin
writeln(podzbior[i-1]);
tmp[i-1][j-1] := podzbior[i-1];
przecinek := przecinek + 1;
if przecinek < wielkosc_podzbioru then
begin
writeln();
end;
end;
for i := 1 to wielkosc_podzbioru do
begin
podzbior[i-1] := 0;
end;
writeln();
end;
end;
procedure kombinacjebezpowtorzen;
var
wielkosc_zbioru:integer;
m:integer;
k:integer;
sil:real;
kombinacje_bez_powtorzen:real;
begin
writeln('Podaj wielkosc zbioru (od 3 do 20): ');
readln(wielkosc_zbioru);
sil := Silnia(wielkosc_zbioru);
writeln('Podaj wielkosc podzbioru: ');
readln(m);
kombinacje_bez_powtorzen := ObliczKombinacjeBezPowtorzen(sil, wielkosc_zbioru, m);
writeln('Ilosc kombinacji ', m ,' elementowych bez powtorzen zbioru ', wielkosc_zbioru,' elementowego wynosi: ');
writeln(kombinacje_bez_powtorzen:4:0);
writeln('Podaj ilosc generowanych losowych kombinacji ', m, ' elementowych bez powtorzen zbioru ',wielkosc_zbioru,' elementowego: ');
readln(k);
GENEROWANIE_LOSOWYCH_KOMBINACJI_BEZ_POWTORZEN_W_LICZBIE_k(wielkosc_zbioru, m, k);
writeln('Nacisnij ENTER');
readln();
end;
function ObliczWariacjeZPowtorzeniami(wielkosc_zbioru,m:integer):real;
var
wynik,i:integer;
begin
wynik := wielkosc_zbioru;
for i := 1 to m-1 do
begin
wynik := wynik * wielkosc_zbioru;
end;
ObliczWariacjeZPowtorzeniami:=wynik;
end;
procedure GENEROWANIE_LOSOWYCH_WARIACJI_Z_POWTORZENIAMI_W_LICZBIE_k(wielkosc_zbioru,wielkosc_podzbioru,k:integer);
var
tmp:array[0..20,0..1000] of integer;
podzbior:array[0..20] of integer;
i, j, z,a:integer;
zmp:integer;
powtorka:integer;
powtorka2:integer;
ilosc:integer;
przecinek:integer;
begin
for i := 1 to 1000 do
begin
for z := 1 to wielkosc_podzbioru do
begin
tmp[z-1][i] := 0;
end;
end;
for i := 1 to wielkosc_podzbioru do
begin
podzbior[i-1] := 0;
end;
for j := 1 to k do
begin
przecinek := 0;
ilosc := 0;
powtorka2 := 0;
while powtorka2 = 0 do
begin
while ilosc < wielkosc_podzbioru do
begin
zmp := random(wielkosc_zbioru) + 1;
ilosc := ilosc + 1;
podzbior[ilosc-1] := zmp;
end;
powtorka2 := 1;
for i := 1 to k do
begin
if (tmp[0][i-1] = 0) then
begin
break;
end;
for z := 1 to wielkosc_podzbioru do
begin
if tmp[z-1][i-1] = podzbior[z-1] then
begin
powtorka2 := 0;
end
else
begin
powtorka2 := 1;
break;
end;
end;
if (powtorka2 = 0) then
begin
for a:= 1 to wielkosc_podzbioru do
begin
podzbior[a-1] := 0;
end;
ilosc := 0;
break;
end;
end;
end;
writeln('Wariacja z powtorzeniami ', j);
for i := 1 to wielkosc_podzbioru do
begin
writeln(podzbior[i-1]);
tmp[i-1][j-1] := podzbior[i-1];
przecinek := przecinek + 1;
if przecinek < wielkosc_podzbioru then
begin
writeln();
end;
end;
for i := 1 to wielkosc_podzbioru do
begin
podzbior[i-1] := 0;
end;
writeln();
end;
end;
procedure wariacjezpowtorzeniami;
var
wielkosc_zbioru:integer;
m:integer;
k:integer;
sil:real;
wariacje_z_powtorzeniami:real;
begin
writeln('Podaj wielkosc zbioru (od 3 do 20): ');
readln(wielkosc_zbioru);
sil := Silnia(wielkosc_zbioru);
writeln('Podaj wielkosc podzbioru: ');
readln(m);
wariacje_z_powtorzeniami := ObliczWariacjeZPowtorzeniami(wielkosc_zbioru, m);
writeln('Ilosc wariacji ' ,m, ' elementowych z powtorzeniami zbioru ', wielkosc_zbioru, ' elementowego wynosi: ');
writeln(wariacje_z_powtorzeniami:4:0);
writeln('Podaj ilosc generowanych losowych wariacji ',m,' elementowych z powtorzeniami zbioru ',wielkosc_zbioru,' elementowego: ' );
readln(k);
GENEROWANIE_LOSOWYCH_WARIACJI_Z_POWTORZENIAMI_W_LICZBIE_k(wielkosc_zbioru, m, k);
writeln('Nacisnij ENTER');
readln();
end;
function ObliczWariacjeBezPowtorzen( sil:real;wielkosc_zbioru, m:integer):real;
var
mianownik:real;
licznik:real;
begin
mianownik := Silnia(wielkosc_zbioru - m);
licznik := sil;
ObliczWariacjeBezPowtorzen:=licznik / mianownik;
end;
procedure GENEROWANIE_LOSOWYCH_WARIACJI_BEZ_POWTORZEN_W_LICZBIE_k(wielkosc_zbioru,wielkosc_podzbioru,k:integer);
var
tmp:array[0..20,0..1000] of integer;
podzbior:array[0..20] of integer;
i, j, z,a:integer;
zmp:integer;
powtorka:integer;
powtorka2:integer;
ilosc:integer;
przecinek:integer;
begin
for i := 1 to 1000 do
begin
for z := 1 to wielkosc_podzbioru do
begin
tmp[z-1][i] := 0;
end;
end;
for i := 1 to wielkosc_podzbioru do
begin
podzbior[i-1] := 0;
end;
for j := 1 to k do
begin
przecinek := 0;
ilosc := 0;
powtorka2 := 0;
while powtorka2 = 0 do
begin
while ilosc < wielkosc_podzbioru do
begin
powtorka := 0;
zmp := random(wielkosc_zbioru) + 1;
for z := 1 to wielkosc_podzbioru do
begin
if podzbior[z-1] = zmp then
begin
powtorka := 1;
break;
end;
end;
if powtorka = 0 then
begin
ilosc := ilosc + 1;
podzbior[ilosc-1] := zmp;
end;
end;
powtorka2 := 1;
for i := 1 to k do
begin
if tmp[0][i-1] = 0 then
begin
break;
end;
for z := 1 to wielkosc_podzbioru do
begin
if tmp[z-1][i-1] = podzbior[z-1] then
begin
powtorka2 := 0;
end
else
begin
powtorka2 := 1;
break;
end;
end;
if powtorka2 = 0 then
begin
for a := 1 to wielkosc_podzbioru do
begin
podzbior[a-1] := 0;
end;
ilosc := 0;
break;
end;
end;
end;
writeln('Wariacja bez powtorzen ', j);
for i := 1 to wielkosc_podzbioru do
begin
writeln(podzbior[i-1]);
tmp[i-1][j-1] := podzbior[i-1];
przecinek := przecinek + 1;
if przecinek < wielkosc_podzbioru then
begin
writeln();
end;
end;
for i := 1 to wielkosc_podzbioru do
begin
podzbior[i-1] := 0;
end;
writeln();
end;
end;
procedure wariacjebezpowtorzen;
var
wielkosc_zbioru:integer;
m:integer;
k:integer;
sil:real;
wariacje_bez_powtorzen:real;
begin
writeln('Podaj wielkosc zbioru (od 3 do 20): ');
readln(wielkosc_zbioru);
sil := Silnia(wielkosc_zbioru);
writeln('Podaj wielkosc podzbioru: ');
readln(m);
wariacje_bez_powtorzen := ObliczWariacjeBezPowtorzen(sil, wielkosc_zbioru, m);
writeln('Ilosc wariacji ', m ,' elementowych bez powtorzen zbioru ', wielkosc_zbioru ,' elementowego wynosi: ');
writeln(wariacje_bez_powtorzen:4:0);
writeln('Podaj ilosc generowanych losowych wariacji ' ,m,' elementowych bez powtorzen zbioru ', wielkosc_zbioru ,' elementowego: ');
readln(k);
GENEROWANIE_LOSOWYCH_WARIACJI_BEZ_POWTORZEN_W_LICZBIE_k(wielkosc_zbioru, m, k);
writeln('Nacisnij ENTER');
readln();
end;
var
wybor:integer;
BEGIN
writeln('1 permutacja');
writeln('2 kombinacje z powtorzeniami');
writeln('3 kombinacje bez powtorzen');
writeln('4 wariacje z powtorzeniami');
writeln('5 wariacje bez powtorzen');
writeln('Twoj wybor? ');
readln(wybor);
case wybor of
1: permutacja;
2: kombinacjezpowtorzeniami;
3: kombinacjebezpowtorzen;
4: wariacjezpowtorzeniami;
5: wariacjebezpowtorzen;
else writeln('zly wybor');
end;
readln();
END.