program Comb_Calc;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,crt;
var
scelta,n,k,i: byte;
risp:char;
label start;
function Fatt(x:integer):integer;
begin
if ((x=1) or (x=0)) then Result:=1
else Fatt:= x* Fatt(x-1);
end;
function Disp(n,k:integer):integer;
begin
if not(k = 1) then Disp:= n*Disp(n-1,k-1);
end;
function Comb(n,k:integer):integer;
begin
Result:= Disp(n,k) div Fatt(n);
end;
{$IFDEF WINDOWS}{$R Comb_Calc.rc}{$ENDIF}
begin
repeat
clrscr;
start: Writeln(' ****************************** ');
writeln(' * SCEGLIERE L''OPERAZIONE * ');
writeln(' * 1) Permutazione * ');
writeln(' * 2) Disposizioni * ');
writeln(' * 3) Combinazioni * ');
Writeln(' * *') ;
writeln(' ////////////////////////////// ');
writeln;
writeln;
write('Selta: ');
readln(scelta);
clrscr;
k:=1;
if ((scelta<1) or (scelta>3)) then goto start;
write('Inserire il numero "n" di elementi: n = ');
readln(n);
clrscr;
if not(scelta = 1) then
begin
write('Inserire la classe "k" in cui operare: k = ');
readln(k);
clrscr;
end;
case scelta of
1: writeln('P(',n,') = ',Fatt(n));
2: writeln('D(',n,',',k,') = ',Disp(n,k));
3: writeln('C(',n,',',k,') = ',Comb(n,k));
end;
writeln;
writeln;
write('Si desidera ripetere l''operazione? {s/n}: ');
readln(risp);
until risp='n';
end.