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

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

Moderador: Moderadores

Mathias
Junior
Mensajes: 9
Registrado: Lun Nov 08, 2010 2:06 am

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

Mensaje por 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)

Mensaje por 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;

Responder