{ Terreno Antonio mat.9714216 }
unit
   vettori;

interface

const
   min=1;
   max=20;
type
   tipo_elemento= integer;
   tipo_array= array[min..max] of tipo_elemento;

   procedure leggi_array(var a: tipo_array; var n : integer);
   procedure stampa_array(var a: tipo_array; n : integer);
   procedure insertion_sort(var a: tipo_array; n : integer);
   procedure selection_sort(var a: tipo_array; n : integer);
   procedure elimina_ripetizioni(var a: tipo_array; var n : integer);
   procedure inserisci_ordinato(x: tipo_elemento; var a: tipo_array; var n : integer);
   procedure fondi_array(var a,b,c: tipo_array; n,m : integer;var r : integer);

implementation

procedure leggi_array(var a: tipo_array; var n : integer);

var
   i : integer;
begin
   write('numero di elementi? ');
   readln(n);
   writeln('inserisci ',n,' elementi');
   for i:=min to n do
      read(a[i])
end;

procedure stampa_array(var a: tipo_array; n : integer);

var
   i : integer;
begin
   write('array -> ');
   for i:=min to n do
      write(a[i],' ');
end;

procedure insertion_sort(var a: tipo_array; n : integer);

var
   i,j: integer;
   key: tipo_elemento;
begin
   for i:=min+1 to n do
      begin
         key:=a[i];
    j:=i-1;
    while (j>=min) and (a[j]>key) do
       begin
          a[j+1]:=a[j];
          j:=j-1
       end;
    a[j+1]:=key
      end
end;

procedure selection_sort(var a: tipo_array; n : integer);

var
   i,j,piccolo: integer;
   temp: tipo_elemento;
begin
   for i:=min to n-1 do
      begin
         piccolo:=i;
    for j:=i+1 to n do
       if (a[j] < a[piccolo]) then
          piccolo:=j;
          temp:=a[piccolo];
          a[piccolo]:=a[i];
          a[i]:=temp
      end
end;

procedure elimina_ripetizioni(var a: tipo_array; var n : integer);
{ elimina ogni ripetizione di a[i] dall'array aggiornando n }
var
   i,j: integer;
begin
   i:=min;
   while (i<n) do
      if (a[i] <> a[i+1]) then
         i:=i+1
      else
         begin
       for j:=i to n-1 do
          a[j]:=a[j+1];
       n:=n-1
    end;
end;

procedure inserisci_ordinato(x: tipo_elemento; var a: tipo_array; var n : integer);

var
   i : integer;
begin
   if (n<max) then
      begin
         n:=n+1;
    i:=n;
    while (i>min) and (x<a[i-1]) do
       begin
          a[i]:=a[i-1];
          i:=i-1
       end;
    a[i]:=x
      end
   else
      writeln('overflow error!')
end;

procedure fondi_array(var a,b,c: tipo_array; n,m : integer;var r : integer);

var
   i,j,k: integer;
begin
   i:=min;
   j:=min;
   k:=min;
   if (n+m <=max) then
   begin
      while (i<=n) and (j<=m) do
      begin
         if (a[i] <= b[j]) then
       begin
          c[k]:=a[i];
          i := i+1
       end
    else
            begin
          c[k]:=b[j];
          j:=j+1
       end;
    k:=k+1;
      end;
   for i:=i to n do
      begin
         c[k]:=a[i];
    k:=k+1
      end;
   for j:=j to m do
      begin
         c[k]:=b[j];
    k:=k+1
      end
   end
   else
      write('I vettori sono troppo grandi:IMPOSSIBILE FARE LA FUSIONE');
   r:=k-1;
end;

end.