lexico.pas

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

  Ejercicio tomado en el 1er parcial 16/04/02.
  Dadas dos listas de enteros L1 y L2, escribir una
  function LEXICORD (L1, L2: lista): boolean, que retorna
  true si la lista L1 es mayor que la L2 en sentido
  lexicogr\'afico, y false en caso contrario. El orden
  lexicogr\'afico es el orden alfab\'etico y puede
  definirse de la siguiente manera:

  1) si las dos listas son vacias, entonces son iguales
     (valor de retorno false);

  2) si L1 es vacia y L2 no lo es, entonces L1 < L2 es falso;
  3) si L2 es vacia y L1 no lo es, entonces L1 < L2 es true; 

  4) Si las dos listas no son vacias, y los primeros
     elementos son diferentes (digamos a_1 y b_1),
     entonces el valor de retorno es a_1 > b_1.
     Si los dos primeros elementos fueran iguales,
     entonces el valor de retorno ser\'a el
     correspondiente a las listas que se obtienen
     eliminando los primeros elementos.

  Asi, por ejemplo,

  a) Si L1 = [1 3 2 4 6] y L2 = [1 3 2 5], entonces L2 > L1
     y LEXICORD (L1, L2) retorna false;

  b) Si L1 = [1 3 3 4 5] y L2 = [1 3 3], entonces L1 > L2 y
     LEXICORD (L1, L2) retorna true;

  c) Si L1 = [1 3 3 4] y L2 = [1 3 3 4], entonces L1 = L2 y
     LEXICORD (L1, L2) retorna false.
  keywords: lista

FIN DE DESCRIPCION}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id:lexicord_p.pas 2002/04/12 00:17 mstorti Exp jdelia  $}
program lexicord_p;
uses u_lispif;
type
  lista = lispif;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function LEXICORD (L1, L2 : lista) : boolean;
var
  p, q : posicion;
begin
  { Posiciones sobre los elementos a comparar }
  p := L1.PRIMERO;
  q := L2.PRIMERO;
  while (p <> L1.FIN) and (q <> L2.FIN) do begin
    { Si los primeros elementos son diferentes}
    { entonces ya se pueden comparar          }
    if L1.RECUPERA (p) <> L2.RECUPERA (q) then begin
      LEXICORD := L1.RECUPERA (p) > L2.RECUPERA (q);
      exit ; end
    else begin { Si son iguales, avanzar posiciones }
      p := L1.SIGUIENTE (p);
      q := L2.SIGUIENTE (q);
    end ; {if}
  end; {while}
  { Se termino alguna de las listas. L1 es la mayor }
  { si contiene elementos }
  LEXICORD := p <> L1.FIN;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
  L1, L2 : lista;
  n, i   : integer;
begin
  randomize ;
  for i := 1 to 20 do begin
    writeln ;
    writeln ('caso test ; i = ', i); 
    L1.ANULA;
    L2.ANULA;
  { Primero inserta una serie de numeros iguales}
    while random (4)<> 0 do begin
      n := random (10);
      L1.INSERTA (n, L1.FIN);
      L2.INSERTA (n, L2.FIN);
    end; {while}
  { inserta una cierta cantidad de numeros random en L1 }
    while random (2) <> 0 do begin
      n := random (10);
      L1.INSERTA (n, L1.FIN);
    end; {while}
  { inserta una cierta cantidad de numeros random en L2 }
    while random (2) <> 0 do begin
      n := random (10);
      L2.INSERTA (n, L2.FIN);
    end; {while}

  { Imprime listas }
    L1.IMPRIME ('L1: ');
    L2.IMPRIME ('L2: ');

  { Reporta la relacion entre L1 y L2} 
    if      LEXICORD (L1, L2) then
      writeln ('L1 > L2')
    else if LEXICORD (L2, L1) then
      writeln ('L1 < L2')
    else begin
      writeln ('L1 = L2')
    end ; {if}
    readln ;
  end; {i}
  writeln ;
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.