UTNianos

Versión completa: Ayuda con un ejercicio
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
Es para un TP de un amigo...

Cita:Dada una pila de numeros, informar el numero que se repite mas veces.

Para ver el numero que se repite mas veces, tengo que ordenar la pila...para eso, se me ocurre que lo mejor es pasarla a una lista nueva (no pila, lista normal) y ahi una vez que está ordenada, es mucho mas facil encontrar el numero que se repite mas veces...

A alguno se le ocurre alguna solucion no tan fea?
jajaja eh ? SE puede usar algun vector/ por que se me ocurre:

va contando la pila y el vector de registro seria : numero - cantidad de repeticiones(contador). Pero debo saber la cantidad de numeros que hay. Luego lo rodenas y mostras el mayor.

Si no lo sabes, onda usa la lista y pone numero - cantidad de repeticiones, una vez que lo llenas te fijas el mayor.
Las unicas formas que se me ocurren son recontra no-optimas.


Si no queres ordenar, podes hacer algo muy feo, que es comparar valor contra valor MUCHAS veces.

basicamente, comparas el primero contra todos y contas. comparas el segundo contra todos y contas; si es mayor cantidad que el que tenias, tenes que es ese, sino el otro. Y asi sucesivamente.

No es optimo, es horrible, pero funciona.
No, no se pueden usar vectores...

Estoy en la situacion que dice el pibe, tengo ese tipo de soluciones, pero son horribles!
Es sólo eso el enunciado? es medio rarito. Supongo que debe querer que lo hagas sólo con operaciones de pila. Creo que es lo mismo que dijo El pibe.


while(pila<>nil) do begin

nroActual := sacar(pila);
cantActual:=1;


//Recorro toda la pila contando las veces que aparece ese nro
while(pila<>nil) do begin

nro := sacar(pila);
if (nro = nroActual) then cantActual:= cantActual +1 else meter(pilaAuxiliar,nro);

end;

if(cantActual> cantMax) then begin
nroMax:= nroActual;
cantMax := cantActual;
end;

pila := pilaAuxiliar; //Vuelvo a hacer lo mismo con los que quedan

end;


a mi tambien me parece raro que solo te permitan usar pilas,
ya que presisamente ese es el chiste de las pilas, no tener orden
ni podes no ser optimo para procesos de contar,

Off-topic:
es como cuando en analisis 2 te hacen usar coordenadas esfericas para regiones que ni siquiera son circulares
Dani, me encanto tu solucion, ya la implementé, pero ando con un problema

Me tira error 204 (pueden compilar y verlo)

Segun leí puede ser un problema con el dispose pero no lo puedo encontrar Confused


type
tPunt = ^tNodo;
tNodo = record
info:integer;
sig:tPunt;
end;

procedure crearPila(var p:tPunt);
var nuevo:tPunt;
begin
new(nuevo);
nuevo^.info:=2;
nuevo^.sig:=nil;
p:=nuevo;
//apunta a NIL por ser el unico nodo

new(nuevo);
nuevo^.info:=3;
nuevo^.sig:=p;
p:=nuevo;

//A partir de ahora, ahora todos los hago apuntar a P, que antes era el primer nodo (es una pila)

new(nuevo);
nuevo^.info:=3;
nuevo^.sig:=p;
p:=nuevo;

new(nuevo);
nuevo^.info:=1;
nuevo^.sig:=p;
p:=nuevo;

new(nuevo);
nuevo^.info:=4;
nuevo^.sig:=p;
p:=nuevo;
//aca ya tengo la lista con 5 nodos
end;

function sacar(var p:tPunt):integer;
var aux:tPunt;
begin
sacar:=p^.info;
aux:=p;
p:=p^.sig;
dispose(aux);
end;

procedure meter(var p:tPunt; valor:integer);
var nuevo:tPunt;
begin
new(nuevo);
nuevo^.info:=valor;
nuevo^.sig:=p;
p:=nuevo;
end;

var
nroActual,cantActual,cantMax,nro,nroMax:integer;
pila,pilaAuxiliar:tPunt;

begin

crearPila(pila); // 4 1 3 3 2

while(pila<>nil) do begin
nroActual := sacar(pila);
cantActual :=1;
//Recorro toda la pila contando las veces que aparece ese nro
while(pila<>nil) do begin
nro := sacar(pila);
if (nro = nroActual) then begin
cantActual:= cantActual +1;
end else begin
meter(pilaAuxiliar,nro);
end;
end;
if(cantActual > cantMax) then begin
nroMax := nroActual;
cantMax := cantActual;
end;
pila := pilaAuxiliar; //Vuelvo a hacer lo mismo con los que quedan
end;

writeln('El numero que mas se repite es el ',nroMax);

end.


el error 204 es puntero invalido, y se produce en tu funcion "sacar"

No preguntas si p == NIL cuando haces el p^.info, por lo que si p es NIL, rompe porque no existe el ^.info
(13-06-2012 00:19)el pibe escribió: [ -> ]el error 204 es puntero invalido, y se produce en tu funcion "sacar"

No preguntas si p == NIL cuando haces el p^.info, por lo que si p es NIL, rompe porque no existe el ^.info

Probe preguntando si es nil y me tira el mismo error...

Es cierto, el error esta en la funcion sacar, pero es en la linea del dispose...

---

Aparte p nunca va a ser nil, porque entra en un while donde la condicion es que sea Distinto de NIL

---

faltaba inicializar cantMax, pero tampoco es eso...
A veces pasa, es como si pascal se pone tarado cuando haces un dispose de algo que creaste recien. Proba esto:

begin
sacar:=p^.info;
aux:=p^.sig;
dispose(p);
p:=aux;
end;
No, me pasa lo mismo...

[Imagen: impossibru-imgur-668.jpg]
La pregunta de si es NIL incluye el dispose?
Porque sino aux va a ser invalido, dependiendo de tu if va a ser Nil si haces la linea de "aux=" o basura si mantenes el puntero a la linea anterior.

Aclaro que peudo estar diciendo cualqueir cosa, podrias poner tu codigo con el if== NIL asi lo vemos?
Te deje un gracias por haber usado correctamente el compilador integrado en el foro para mostrar tu problema
Fijate que si borras el dispose el error te lo tira en un putno anterior
hum, que porqueria. No habra que incluir alguna biblioteca (onda C)

Un uses crt; o parecido para el dispose ?
Ahora que miro tb me faltó poner la pilaAuxiliar en nil al inicio del while. Lo cambié pero me sigue fallando.
Páginas: 1 2
URLs de referencia