ABCdatos
ABCdatos tu página de inicio Inicio       

[FreePascal] Problema con esta funciòn (mayor en lista)

Cuestiones y dudas acerca de lenguajes de programación diversos.

Moderador: lo_jorge

[FreePascal] Problema con esta funciòn (mayor en lista)

Notapor Mathias » Sab Feb 04, 2012 9:00 pm

Hola, no me sale esta funciòn que para mì que està bien pero sin embargo para el caso de la lista con (1 - 2 - 3 - 4) me dice que el mayor es el 1:
Código: Seleccionar todo
function mayor(lista:TipoLista):integer;
VAR n:integer; q:TipoLista;
begin
   IF lista <> nil           
   THEN BEGIN
      q := lista^.sig;            {que va a estar uno más adelante que lista}
      n := lista^.info;          {asigno el primer valor a n}
      WHILE q <> nil DO                  {y hasta que que llegue al valor nil...}
      begin
         IF lista^.info > q^.info       {empiezo con las comparaciones}
         THEN IF lista^.info > n
             THEN n := lista^.info
         ELSE IF q^.info > n
             THEN n := q^.info;

         lista := lista^.sig;      {ahora avanzan las listas que y lista lugar}
         q := q^.sig
      END;
      mayor := n            {una vez que llegó a nil, le asigno el n resultante a la función
   END
END;


esta es una versión anterior donde pasaba o mismo:
Código: Seleccionar todo
function mayor(lista:TipoLista):integer;
VAR n:integer; q:TipoLista;
   procedure comparavanza(lista:TipoLista;var n:integer);
   begin
      IF q <> nil
      THEN BEGIN
         IF lista^.info > q^.info
         THEN IF q^.info > n
             THEN n := lista^.info
         ELSE IF q^.info > n
             THEN n := q^.info;
         lista := lista^.sig;
         q := q^.sig;
         comparavanza(lista,n)
      END
   END;
begin
   IF lista <> NIL
      THEN BEGIN
         q := lista^.sig;
         n := lista^.info;
         comparavanza(lista,n);
         mayor := n
      END
end;


Tenía otros problemas, pero ya no se me ocurre más nada :(

Dejo el programa entero para que puedan probarlo:
Código: Seleccionar todo
Uses Crt;
TYPE
   TipoLista = ^nodo;
   nodo = record
            info:integer;
            sig:TipoLista
         end;

procedure insertar(var lista : TipoLista; x: integer);
var  p   : TipoLista;
begin
   new(p);
   p^.info:= x;

   p^.sig:= lista;
   lista:= p
end;

procedure insertarf(var lista: TipoLista; x: integer);
VAR nuevo,p,anterior :TipoLista;
begin
   new(nuevo);
   nuevo^.info := x;
   nuevo^.sig := nil;
   anterior := nil;
   
   IF lista = NIL
   THEN lista := nuevo
   ELSE BEGIN
      p := lista;
      while (p^.sig <> nil) do p := p^.sig;
      p^.sig := nuevo;
   END;

end;


procedure imprimir(listar:TipoLista);
Begin
     If listar <> Nil Then
      Begin
        Write(' (',listar^.Info,') ');
        listar := listar^.sig;
        Imprimir(listar);
      End;

End;{
procedure imprimir(listar:TipoLista);
Begin
      WHILE  listar <> NIL DO
      BEGIN
         writeln(listar^.info);
         listar := listar^.sig;
      END;
END;
}

procedure borrar(var lista:TipoLista;n:integer);
VAR p,s,menor: TipoLista; d,t:integer;
Begin
   If lista^.info = n
   THEN BEGIN  p := lista;
            lista := lista^.sig;
            dispose(p)
      END
   ELSE BEGIN
      new(p);
      p := lista;
      new(s);
      s := p^.sig;
      
      WHILE s <> NIL DO
         IF s^.info = n
         THEN BEGIN
            p^.sig := s^.sig;
            dispose(s);
            p := p^.sig;
            s := s^.sig;
            END
         ELSE BEGIN
            p := p^.sig;
            s := s^.sig;
            END
   END
END;

   
procedure borrarHasta(var lista:TipoLista;n:integer);
VAR q,aux:TipoLista; s,t:integer;
begin
IF lista <> nil THEN
   IF (n = lista^.info )
   THEN BEGIN
         q := lista;
         lista := q^.sig;
         dispose(q);
      end
   ELSE BEGIN
      aux := lista;   s := 1; {el contador y la lista auxiliar para el WHILE}
      WHILE  (aux <> nil) and (n <> aux^.info) DO  {busca el número en la lista}
         BEGIN aux := aux^.sig; s := s + 1 END; {su posición será "s"}
      IF aux <> NIL
      THEN
         FOR t := 1 to s DO {hasta esa posición borrar todo}
            BEGIN
               q := lista;
               lista := lista^.sig;
               dispose(q);
            end
      ELSE BEGIN
         writeln(' ');
         writeln('El ',n,', No se encuentra en la lista');
         readkey;
      END
   end
end;
         


function menor(lista:TipoLista):integer;
VAR n:integer; q:TipoLista;
   
procedure comparavanza(lista:TipoLista;var n:integer);

begin
   
   IF q <> nil
   then begin
       IF lista^.info > q^.info
       THEN IF lista^.info < n
           THEN n := lista^.info
       ELSE IF q^.info < n
           THEN n := q^.info;
         
      lista := lista^.sig;
      q := q^.sig;
      comparavanza(lista,n)

   end
end;

BEGIN
   IF lista <> nil
   THEN begin
      q := lista^.sig;
       n := lista^.info;
       comparavanza(lista,n);
      menor := n
   end;
end;
{
function mayor(lista:TipoLista):integer;
VAR n:integer; q:TipoLista;
   procedure comparavanza(lista:TipoLista;var n:integer);
   begin
      IF q <> nil
      THEN BEGIN
         IF lista^.info > q^.info
         THEN IF q^.info > n
             THEN n := lista^.info
         ELSE IF q^.info > n
             THEN n := q^.info;
         lista := lista^.sig;
         q := q^.sig;
         comparavanza(lista,n)
      END
      ELSE IF n < lista^.info
          THEN n := lista^.info

   END;
begin
   IF lista <> NIL
      THEN BEGIN
         q := lista^.sig;
         n := lista^.info;
         comparavanza(lista,n);
         mayor := n
      END
end;

}

function mayor(lista:TipoLista):integer;
VAR n:integer; q:TipoLista;
begin
   IF lista <> nil
   THEN BEGIN
      q := lista^.sig;
      n := lista^.info;
      WHILE q <> nil DO
      begin
         IF lista^.info > q^.info
         THEN IF lista^.info > n
             THEN n := lista^.info
         ELSE IF q^.info > n
             THEN n := q^.info;
         lista := lista^.sig;
         q := q^.sig
      END;
      mayor := n
   END
END;

VAR
   lista:TipoLista;
   i,j,k,m,n:integer;

BEGIN
   lista := NIL;
REPEAT
    ClrScr;
   write('* '); IF lista = NIL THEN write('   ¡No hay numeros!   ') ELSE imprimir(lista); writeln(' *');
   writeln('                     ');
   writeln('Seleccione opcion...');
   writeln('-----------------------------------');
   writeln('1) Insertar al inicio');
   writeln('2) Insertar al final ');
   IF lista = NIL THEN BEGIN
   writeln('3) eliminar numero  (No disponible)');  END ELSE writeln('3) eliminar numero    ');
   writeln('4) eliminar hasta... ');   
   writeln('5) Menor             ');
   writeln('6) Mayor             ');
   writeln('7) Ordenar           ');
   writeln('.                    ');
   writeln('.                    ');
   writeln('.                    ');
   writeln('                     ');
   writeln('9) Salir             ');
   writeln('-----------------------------------');
      CASE k of
   0 : writeln(' ');
   5 : writeln('El menor de la lista es: ',n);
   6 : writeln('El mayor de la lista es: ',n);
   1,2,7 : writeln('Actualizando lista..');
   3,4 : IF lista = nil THEN ELSE writeln('eliminando, actualizando lista...');
   9 : writeln('Saliendo...')
   ELSE writeln('¡Opcion incorrecta!, vuelva a intentarlo')
   END;
   writeln('                     ');
     write('Opcion: '             );
   Readln(k);
   writeln('                     ');

   CASE k of
      1 :   BEGIN
            write('1) Cantidad de celdas a agregar: ');
            j := 1;
            readln(i);
            writeln('-----------------------------------');
            WHILE i >= j DO
            BEGIN
               writeln('Inserte un numero: ');
               readln(m);
               insertar(lista,m);
               j := j + 1;
            END
         END;
      2 :   BEGIN
            write('1) Cantidad de celdas a agregar: ');
            j := 1;
            readln(i);
            writeln('-----------------------------------');
            WHILE i >= j DO
            BEGIN
               writeln('Inserte un numero: ');
               readln(m);
               insertarf(lista,m);
               j := j + 1;
            END;
         END;
      3 :   IF lista <> NIL
            THEN BEGIN write('Numero a eliminar: ');
                     read(i);
                     borrar(lista,i);
                     writeln('Actualizando lista...');
                     imprimir(lista)
               END;
      4: BEGIN    write('¿Hasta donde borrar? -> ');
               read(i);
                    borrarHasta(lista,i)
               END;
      5: n := menor(lista);
      6: n := mayor(lista);
      9 :     write('saliendo');
      
      END;
      writeln;
   
UNTIL k = 9
END.

Ahì podràn encontrar la función menor que es análoga a la mayor y anda correctamente,
Saludos.
Mathias
Junior
 
Mensajes: 9
Registrado: Lun Nov 08, 2010 2:06 am

Re: [FreePascal] Problema con esta funciòn (mayor en lista)

Notapor Mathias » Dom Feb 05, 2012 5:24 am

Ya lo solucioné, tratando de mejorar la función "meno", me salió accidentalmente la "mayor", los códigos son casi iguales como era de esperar:

Código: Seleccionar todo
function menor(lista:TipoLista):integer;
VAR n,p:integer;
BEGIN
   IF lista <> nil
   THEN begin
       n := lista^.info;
      WHILE lista <> nil DO BEGIN
             IF n > lista^.info
             THEN n := lista^.info;
            lista := lista^.sig;
      END;
      menor := n
   end;
end;

function mayor(lista:TipoLista):integer;
VAR n,p:integer;
BEGIN
   IF lista <> nil
   THEN begin
       n := lista^.info;
      WHILE lista <> nil DO BEGIN
             IF n < lista^.info
             THEN n := lista^.info;
            lista := lista^.sig;
      END;
      mayor := n
   end;
end;
Mathias
Junior
 
Mensajes: 9
Registrado: Lun Nov 08, 2010 2:06 am


Volver a Programación

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 4 invitados

Creado con phpBB3 © 2000, 2002, 2005, 2007 Grupo phpBB
Copyright © 1999-2014 ABCdatos.com. Todos los derechos reservados.
Aviso legal. Políticas de privacidad y cookies.
Contactar con ABCdatos.