Pascal/Turbo Pascal - ejercicio sobre listas

 
Vista:

ejercicio sobre listas

Publicado por Alejandra (1 intervención) el 29/01/2008 20:12:29
hola estoy atascada en este ejrcicio me dice que la solucion no es correcta...el enunciado es el siguiente

Completar la función ordinal_maximo para que devuelva la posición (ordinal: nº entero) de un elemento que almacene el máximo valor en el campo dato en una lista dinámica simple a cuyo primer elemento apunta la variable puntero cabeza. Por ejemplo, si se encuentra en el primer elemento debe devolver el valor 1... Ha de considerarse también el caso de lista vacía, en cuyo caso, la función devolverá el valor -9999.
Nota: si dos o más elementos contienen el mismo valor máximo, entonces la función debe devolver el ordinal del primero de ellos que se encuentre en la lista.

yo lo q he puesto

type ptr=^elemento;
elemento=record
dato:integer;
sig:ptr

end;

function ordinal_maximo(cabeza:ptr):integer;
var aux,contador,maximo:integer;
begin
maximo:=0;aux:=0;contador:=0;
if cabeza=nil then ordinal_maximo:=-9999 else begin

while cabeza<>nil do begin
if cabeza^.dato>aux then begin
maximo:=cabeza^.dato;
contador:=contador+1; aux:=maximo; cabeza:=cabeza^.sig end;

if cabeza^.dato<maximo then begin contador:=contador+1; cabeza:=cabeza^.sig;end;

ordinal_maximo:=aux; end;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:ejercicio sobre listas

Publicado por Roberto Garcia (56 intervenciones) el 02/02/2008 09:43:39
Lo que pasa es que tu funcion encuentra el numero mas alto en una lista pero no dice cual es su posicion (o en que posicion aparece por primera vez si hay mas de uno)

1. como no te pide mostrar cuantas veces aparece el numero mas alto entonces contador creo que no es necesario ademas que en el contexto actual solo te indica cuantas veces cambio de valor la variable maximo ademas no entiendo bien la logica de la linea

if cabeza^.dato<maximo then begin contador:=contador+1; cabeza:=cabeza^.sig;end

2. Podrias utiilzar una variable lugar para indicar en que lugar de la lista se encuentra el ordinal maximo, de forma que la funcion podria quedar como sigue

function ordinal_maximo(cabeza:ptr):integer;
var
maximo, lugar , i : integer ;

begin
maximo := 0;
lugar : = 0;
i :=1;

while cabeza <> nil do begin

if cabeza^.dato > maximo then begin
maximo := cabeza^.dato;
lugar := i;
end;

inc( i );
cabeza := cabeza^.sig;
end;

ordinal_maximo := lugar;

end;

Asi la funcion devuelve el lugar en la lista donde se encuentra el ordinal maximo


Si quieres que ademas te diga cuantas veces aparece el ordinal maximo entonces si puedes usar la variable contador y la funcion quedaria como sigue;

function ordinal_maximo(cabeza:ptr):integer;
var
maximo, lugar , i : integer ;

begin
maximo := 0;
lugar : = 0;
i :=1;
contador : = 0;

while cabeza <> nil do begin

if cabeza^.dato > maximo then begin
maximo := cabeza^.dato;
lugar := i;
contador : = 1;
end
else
if cabeza^.dato = maximo then
inc ( contador );


inc( i );
cabeza := cabeza^.sig;
end;

ordinal_maximo := lugar;

end;

Solo que la variable contador debera ser global puesto que si la declaras local no la podras usar fuera de la funcion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar