program teste_max_min;
 procedure troca (var x, y: integer);
 var
    aux	: integer;
 begin
    aux := x;
    x := y;
    y := aux;
 end;

procedure ordena (var a, b, c, d : integer);
begin
   {Passo 1: garante que a contém o menor valor.}
   if (b < a) and (b <= c) and (b <= d) then
      troca (a, b)
   else
      if (c < a) and (c <= b) and (c <= d) then
	 troca (a, c)
      else
	 if (d < a) and (d <= b) and (d <= c) then
	    troca (a, d);

   {Passo 2: garante que b contém o segundo menor valor.}
   if (c < b) and (c <= d) then
      troca (b, c)
   else
      if (d < b) and (d <= c) then
	 troca (b, d);

   {Passo 3: garante que c contém o terceiro menor valor e
   que d contém o maior valor. }

   if (c > d) then
      troca (c, d);
end; 

procedure max_min (a, b, c, d : integer; var max, min: integer);
begin
   ordena(a, b, c, d);
   max := d;
   min := a;
end; 

var
   a, b, c, d, max, min: integer;
begin 
   write('a: '); read(a);
   write('b: '); read(b);
   write('c: '); read(c); 
   write('d: '); read(d);  
   max_min(a,b,c,d, max, min);
   writeln('Os valores de a, b, c e d não foram alterados. ');
   writeln('a: ', a, ' b: ', b,' c: ', c, ' d: ', d);
   writeln('O valor máximo é: ', max);
   writeln('O valor mínimo é: ', min);   
end.
