refina.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION

  (a) Escriba un procedimiento
  REFINA (delta: real; var L:lista) tal que dada una lista
  de reales clasificados de menor a mayor $L$, REFINA
  inserta elementos entre los de $L$, de modo tal que la
  diferencia m\'axima entre elementos de la lista final
  sea menor o igual que delta;

  (b) Escriba un procedimiento
  DESREFINA (delta: real; var L:lista) tal que dada una
  lista de reales clasificados de menor a mayor
  L, REFINA suprime elementos entre los de $L$, de modo tal que
  la diferencia minima entre elementos de la lista final
  sea mayor o igual que delta.

  FIN DE DESCRIPCION }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ 1. Escriba un procedure REFINA (delta: real; var L:lista);
  tal que dada una lista de reales clasificados de menor a
  mayor L, REFINA inserta elementos entre los de L de modo
  tal que la diferencia maxima entre elementos de la lista
  final sea menor o igual que delta.

  Sea la lista L= [ a_1, a_2,..., a_n], entonces si
  a_[j+1] - a_j > delta debe insertar a_j + delta,
  a_j + 2 * delta, etc... hasta que el ultimo elemento
  insertado este a una distancia menor que delta de
  a_[j+1]. Por ejemplo, si
  L = [1.3, 1.4, 2.0, 2.33, 3.4] y delta = 0.25 entonces
  REFINA debe retornar
  L = [1.3, 1.4, 1.65, 1.9, 2. 2.25 2.33, 2.58, 2.83, 3.08,
  3.33, 3.4]

  2. Escriba un procedure DESREFINA (delta: real; var L:lista);
  tal que dada una lista de reales clasificados de menor a
  mayor L, REFINA suprime elementos entre los de L de modo
  tal que la diferencia minima entre elementos de la lista
  final sea mayor o igual que delta.

  Sea la lista L= [a_1, a_2,..., a_n], entonces si
  a_[j+1] - a_j < delta debe suprimir a_[j+1].
  Si a_[j+2] - a_j < delta tambien se suprime hasta
  encontrar algun a_[j+p] tal que a_[j+p] - a_j >= delta
  o se encuentre el fin de la lista. El procedimiento
  continua con el siguiente elemento, si existe.

  Por ejemplo, si L = [ 1.3, 1.4, 1.65, 1.9, 2. 2.33,
  2.58, 2.83, 3.08, 3.35, 3.4] y delta = 1 entonces
  REFINA debe retornar L = [ 1.3, 2.33, 3.35 ]

  Nota: la versiones aqui implementadas de REFINA y
        DESREFINA no son reciprocas, esto es, al refinar y
        desrefinar sucesivamente no se obtiene, en general,
        la misma lista inicial.
}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: refina.pas 2002/04/05 17:35 jdelia  Exp jdelia    $ } 
program refina_p ;
uses u_listpr ;
type
lista = listpr ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure REFINA (delta: real; var L: lista);
var
  p,  q      : posicion;
  rp, rq, dr :  real;
begin 
  p := L.PRIMERO;
  while true do begin
    q := L.SIGUIENTE (p);
    if (q = L.FIN) then break;
    rp := L.RECUPERA (p);
    rq := L.RECUPERA (q);
    dr := rq - rp ;
    if (dr > delta) then L.INSERTA (rp + delta, q);
    p := L.SIGUIENTE (p);
  end; {while}
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure DESREFINA (delta: real; var L: lista);
var
  p, q	     : posicion;
  rp, rq, dr : real;
begin 
  p := L.PRIMERO;
  while ( p <> L.FIN ) do begin
    rp := L.RECUPERA (p);
    while (true) do begin
      q := L.SIGUIENTE (p);
      if (q = L.FIN ) then break;
      rq := L.RECUPERA (q);
      dr := rq - rp ;
      if (dr) > delta then break;
      L.SUPRIME (q);
    end ; {while}
    p := L.SIGUIENTE (p);
  end; {while}
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}      
var 
  L        : lista;
  r, delta : real;
  n, k     : integer;
begin
 {Prueba poniendo un numero de reales generados al azar}
  delta := 0.5;
  n := 10 ;
  L.ANULA ;
  for k := 1 to n do begin
    r := (k + 0.9 * random) * delta;
    L.INSERTA (r, L.FIN);
  end;
  L.IMPRIME ('antes de refinar: ');

  REFINA (delta, L);
  L.IMPRIME ('despues de refinar a delta = ');

  REFINA (0.3*delta, L);
  L.IMPRIME ('despues de refinar a 0.3*delta = ');

  DESREFINA (delta,L);
  L.IMPRIME ('despues de desrefinar: ');
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}      

Generated by GNU enscript 1.6.1.