stride.pas

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

Escribir un procedimiento
STRIDE (L1: lista ; var L2: lista; c, f, i: integer);
que retorna en L2 los elementos que ocupan las posiciones
desde el comienzo "c" hasta el final "f" (inclusive), a
intervalos "i", pero sin incluir las posiciones iguales
o mayores que FIN de lista. Es decir, debe retornar
los elementos en las posiciones: c, c+i, c+2*i, ...,
mientras \'estas sean menores o iguales que "f" y est\'en
dentro del rango de posiciones v\'alidas en la lista.
Por ejemplo, si L1 = (3,2,1,5,4,2,3,2,6) y llamamos
STRIDE (L1, L2, 2, 8, 3), entonces debe retornar
L2 = (2, 4, 2); mientras que si hacemos
STRIDE (L1, L2, 3, 20,4) debe retornar
L2 = (1,3) [Ejercicio tomado en el final del 27-Feb-2003].
keywords: lista

  FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: stride.pas 2003/02/11 18:15 jdelia  Exp jdelia    $ }

program stride_p;

uses u_listpi;

type
  lista	= listpi ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure stride (L1: lista; var L2: lista; c,f,i: integer);
var
  j, k: integer;
  p1  : posicion;
begin
  L2.ANULA;
  p1 := L1.PRIMERO ; 
  for j := 1 to (c - 1) do begin {avanza c posiciones en L1}
    if (p1 = L1.FIN) then  exit;
    p1 := L1.SIGUIENTE (p1);
  end ; {j}
  {empieza a recorrer L1 extrayendo a saltos i}
  j := c ;
  while (j <= f) and (p1 <> L1.FIN) do begin
    L2.INSERTA ( L1.RECUPERA (p1), L2.FIN );
    for  k := 1 to i do begin
      p1 := L1.SIGUIENTE (p1);
      if ( p1 = L1.FIN ) then exit;
    end ; {k}
    j := j + i;
  end ; {while}

end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
  j	 : integer;
  L1, L2 : Lista;
begin	
  randomize;
  L1.ANULA;
  L2.ANULA;

  {ejemplo 1: genera  9 datos pseudo-aleatorios } 
  for j := 1 to  9 do L1.INSERTA (random (10), L1.FIN);
  writeln ;
  L1.IMPRIME ('L1: lista dato');
  STRIDE (L1, L2, 2, 9, 3);
  L2.IMPRIME ('L2 = STRIDE (L1, L2, 2, 9, 3) ' );

  {ejemplo 2: agrega 11 datos pseudo-aleatorios a L1 } 
  for j := 1 to 11 do L1.INSERTA (random (10), L1.FIN);
  writeln ;
  L1.IMPRIME ('L1: lista dato');
  STRIDE (L1, L2, 5, 30, 5);
  L2.IMPRIME ('L2 = STRIDE (L1, L2, 5, 30, 5) ' );

end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.