UTNianos

Versión completa: ¨Dev-PASCAL Búsqueda Lineal Pura
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2
=) Buenas Tardes... =( Necesito ayuda con un procedimiento en Pascal, quiero saber cómo se hace el procedure de 'BuscarAlumno' para el siguiente ejercicio:

Codificar el método de búsqueda lineal pura para un arreglo de 100 registros de alumnos que contiene numero de legajo (5 posiciones numericas) y Apellido y nombre (alfanumerico de 20 posiciones)...

Yo tengo una idea más o menos pero el compilador me tira muchos errores y realmente ya no sé cómo seguir con esa parte... bueno mi programa tiene 3 procedure:

1)procedure Cargar Alumnos
2)Procedure BuscarAlumno (es busqueda lineal pura -para vectores desordenados-)
3)Procedure MostrarAlumnos

=) Desde ya muchas gracias...
por que no te posteas el codigo? asi lo vemos, sino no hay nada que hacer

como UTNianos es el futuro tenemos un compilador de pascal y todo

fijate que dice codigo arriba de donde escribis un post, te tendria que quedar algo asi:



begin

writeln('hola mundo, tirate un paso');

end.



incluso el compilador nos va a decir que errores tenes en el codigo
Podrías trabajar jugando con el método de búsqueda binaria, en el caso de que el array esté ordenado por número de legajo. Posición del último, posición del primero, entre que mitades pertenece, e ir acotando hasta intentar llegar a una solución.
Igual me parece que el enunciado te pide que busques sobre un vector cualquiera, no que cargues primero un vector, o muestres algo; de hecho el mismo procedimiento de buscarAlumno te va a permitir grabar en una variable el resultado, la cual pasará a una global y te permitirá trabajar en cualquier algoritmo (ppio. de reusabilidad).

Claro está, suponé que siempre va a estar en el vector de registros lo que se busca. Animate así, y de última pegá un paste como te dijeron arriba del código que intentaste.


Adieu.
Gracias por la respuesta =) ... Aquí dejo el código aunque el programa sigue sin resolver el ejercicio correctamente... la parte de búsqueda creo que es la que está mal pero no sé como continuar ... gracias nuevamente
Cita:uses
crt;

Const
max=3;

Type
ALUMNOS=record
legajo:integer;
nombre:string [20];
end;

Alu=array [1..max] of ALUMNOS;

Var
a:Alu;
pos:integer;



Procedure CargarListaAlumnos ( var a:Alu);
var
i:integer;
begin
Writeln('______________________________________________________________');
Writeln (' A continuacion cargue los datos solicitados de cada alumno ');
writeln('______________________________________________________________');
for i:=1 to max do
begin
with a[i] do
begin
write('Legajo: ');readln(a[i].legajo);
write('Apellido y nombre: ');readln(a[i].nombre);
writeln;
writeln('..................');
writeln;



;
end;

end;
end;


Procedure BuscarAlumno (var a:Alu);
var
pos,i,j:integer;

begin
j:=0;
Writeln('Para buscar a un alumno escriba su posicion a continuacion: ');
Read(pos);

for i:=1 to max do begin

if (pos<i)then begin
with a[i]do begin
writeln (legajo,' ',nombre );
end;
j:=j+1;
end;

begin
if (j=0) then begin
Writeln('Error!!: Alumno No Existe');
readln;
end;
end;
end;
end;



Procedure MostrarListaAlumnos (var a:Alu);
var
i:integer;
begin
writeln ('Nro.Legajo | Alumno');
for i:=1 to max do begin

with a[i]do begin
writeln (legajo,' ',nombre );
end;
end;
End;


BEGIN
clrscr;
CargarListaAlumnos(a);
MostrarListaAlumnos(a);
BuscarAlumno(a);

Writeln('presione ernter para salir');
readkey;
END.

Sí, es cierto, no me pide carga solo que pueda realizar la busqueda pero me gustaria hacerlo algo mas interactivo por eso agrequé esa parte, no pensé que me costaria tanto hacer la busqueda... Nuevamente el código, esta vez en el compilador...


Program BusquedaLineal;

uses
crt;

Const
max=3;

Type
ALUMNOS=record
legajo:integer;
nombre:string [20];
end;

Alu=array [1..max] of ALUMNOS;

Var
a:Alu;
pos:integer;



Procedure CargarListaAlumnos ( var a:Alu);
var
i:integer;
begin
Writeln('______________________________________________________________');
Writeln (' A continuacion cargue los datos solicitados de cada alumno ');
writeln('______________________________________________________________');
for i:=1 to max do
begin
with a[i] do
begin
write('Legajo: ');readln(a[i].legajo);
write('Apellido y nombre: ');readln(a[i].nombre);
writeln;
writeln('..................');
writeln;



;
end;

end;
end;


Procedure BuscarAlumno (var a:Alu);
var
pos,i,j:integer;

begin
j:=0;
Writeln('Para buscar a un alumno escriba su posicion a continuacion: ');
Read(pos);

for i:=1 to max do begin

if (pos<i)then begin
with a[i]do begin
writeln (legajo,' ',nombre );
end;
j:=j+1;
end;

begin
if (j=0) then begin
Writeln('Error!!: Alumno No Existe');
readln;
end;
end;
end;
end;



Procedure MostrarListaAlumnos (var a:Alu);
var
i:integer;
begin
writeln ('Nro.Legajo | Alumno');
for i:=1 to max do begin

with a[i]do begin
writeln (legajo,' ',nombre );
end;
end;
End;


BEGIN
clrscr;
CargarListaAlumnos(a);
MostrarListaAlumnos(a);
BuscarAlumno(a);

Writeln('presione ernter para salir');
readkey;
END.

Mi consejo personal sería que primero te amigues con los diagramas y luego los pases a código para verificar, te pueden ayudar a no cometer ciertos errores pavos. Lo mío va en items:

1- volá a la mie### el "const", no sirve para nada y hasta te puede tirar algun error.
2- de todo ese código, dedicate SOLO al "procedure buscarAlumno", que tenga como variable de entrada un legajo posible, y de salida una posición (integer) en donde se encuentra ese legajo en cuestión, para que luego fuera del procedimiento puedas invocar la posición dentro del índice del vector y extraer los datos. te complicaste mucho!

Para buscarlo luego tenés dos formas:
1- La secuencial, que mientras no llegue al tope (como acá hay 100 posiciones, sería mientras X <= 100 o no encuentre el legajo), va sumando 1 a la variable de retorno (que arrancará en 0). Luego devuelve la posición que devuelve y extraés la data fuera del algoritmo, que ni te gastes en intentar ahora porque no te correspondería.
2- La binaria (si está ordenado por número de legajo), que vas acotando de primera a última posición (0-100), apuntas a la posición media (50) y verificás si es mayor o menor el número de legajo al que tenés, y repetis el proceso pero acotando a la mitad que parece que puede estar (ej: si es mayor al legajo de la posición 50, entonces acotás de 50-100, y te fijás en la posición media que es 75).

No quiero ser más detallado como para que puedas pensarlo bien, con algunas ayudas a mano por si no entendiste en la cursada.
Pero tratá de "jugar" un poco y sólo en la parte que tenés que trabajar, no te pongas a resolver cosas que no te piden!
=) Perfecto, esos tips ya me dieron una idea de cómo hacerlo, muchas gracias por todo y sip, hace tres días vengo "jugando" y no me sale por eso se me ocurrió preguntar aquí ya que debo entregarlo para el sábado a mi profe... tampoco pretendo q me lo resuelvan todo solo necesitaba ayuda nomas jejeje... pero con esto ya me animo a volver a intentar thumbup3 Gracias ROB. y SACROS...
yo lo veo compilar, me parece que quisiste poner una version que funciona por decoro, por que no te veo intentar una busqueda lineal. No tengas miedo de postear cosas que revienten, sino no te podemos ayudar (ademas de no poder ver donde revienta)

para las busquedas es lo que dice rob: las busquedas que se ven en algoritmos son o la "lineal/secuencial" o la "binaria". Con eso ya podes googlear muchisimo mejor material del que podamos escribir nosotros aca, siendo que esta ultra documentado. Suerte con eso, cualquier cosa mandate otro post.


nota: creo que no se pueden ingresar datos en los ejecutables que genera el compilador de aca xD
(28-08-2013 21:10)Lou escribió: [ -> ]=) Perfecto, esos tips ya me dieron una idea de cómo hacerlo, muchas gracias por todo y sip, hace tres días vengo "jugando" y no me sale por eso se me ocurrió preguntar aquí ya que debo entregarlo para el sábado a mi profe... tampoco pretendo q me lo resuelvan todo solo necesitaba ayuda nomas jejeje... pero con esto ya me animo a volver a intentar thumbup3 Gracias ROB. y SACROS...

Perfecto entonces, no te olvides que podés agradecer clickeando el botón "gracias" =P
Cualquier cosa seguí preguntando!


EDIT: Me corrijo en una cosa, si hay que hacer "busqueda lineal", me temo que sólo podés probar con la secuencial.
Aunque como desafío podés intentarlo desinteresadamente con el ejemplo de búsqueda binaria, al menos en diagrama; puede parecer engorroso pero es una interesante y eficaz solución que a futuro te van a pedir mucho! (en los finales sólo se lo emplea como invocación, pero no está de más que sepas su funcionamiento a fondo)
Bueno de tanto hacer y deshacer llegué a esto... yo no estoy muy conforme con el resultado que devuelve el programa thumbdown pero es tal cual como lo dimos en la teoría así que supongo no debe haber problemas, qué dicen uds.? ... =)


Program BusquedaLinealPura;

uses
crt;

Type

Alu=array [1..100] of integer;


Var
a:Alu;
legajo:integer;
nombre:string [20];
{______________________________________________________________________________}
Procedure BuscarAlumno;
var
d,i,j:integer;
begin
j:=0;
Writeln('Ingrese posicion del alumno a buscar');
readln(d);
for i:=1 to 100 do begin
if (d<=a[i])then begin
Writeln('Posicion: ',a[i]);
Writeln('Legajo: ',legajo);
Writeln('Apellido y Nombre',nombre);
j:=j+1;
end;

end;

if (j=0) then
Writeln('ERROR: Alumno no existe');
end;



{______________________________________________________________________________}
BEGIN
clrscr;

writeln('Busqueda Lineal Pura');
writeln;
BuscarAlumno;
writeln;
Writeln('pulse una tecla para salir');
readkey;
END.

Bueno, analizamos la semántica (?)
Para empezar, preparás un array de 100 posiciones donde en cada una irían enteros (seguro legajos de 5 digitos, pero en el caso de los 5 dígitos comprende hasta el -creo- 32000 y un poco más). Probá cambiando integer por longint (entero largo). En VAR vas a tener que cambiar lo mismo.

Y entrando al procedimiento en sí, dos cosas:
1- Para que lo entiendas mejor, intentá ser descriptiva con las variables. Es mejor para que evites confusiones y requiera menos esfuerzo recordar de donde sale cada cosa!
2- Si lo que necesitás es que el vector devuelva los datos de una posición que conocemos, es más simple que hacer un "for", directamente alcanza con lo siguiente:


writeln("Por favor, tipee la posición a la que se desea acceder");
read(pos);
datosDeLaPosicion <-- arrayAlumnos[pos];



Y así recibirías datos. Popularmente se lo conoce como "búsqueda directa".

Aunque de todos modos, hay algo de tu código que no me queda muy claro. Porque por un lado pareciera que buscaras una posición en particular, y más luego estás invocando un dato que creo que no existe.
Más tarde leo mejor el enunciado y planteo una sugerencia en diagrama =)
Ahora que lo reviso bien, noto un gran y grave error de concepto: EL ENUNCIADO PIDE QUE HAGAS UNA BÚSQUEDA LINEAL, EN OTROS TERMINOS, SECUENCIAL. Tu misión es con una palabra clave buscada, que coincida con alguna posición del array (lo más fácil sería pensar en un número de legajo como objeto a buscar), por lo que la vas a tener que recorrer toda hasta que encuentre lo que busca (suponiendo que, en el caso que diagramé, sea único).
Otro error grave es que no hayas podido crear un array que pueda contener un registro de dos campos por cada posición, estaría bueno que lo repases. Después un caso menor sería que hayas en su momento querido declarar al legajo como un entero (si revisás bien los límites de datos representados, llega al 32000 más o menos; para que sea compatible con legajos al estilo UTN debería ser un entero largo)

La solución se resume a un simple procedimiento, que tiene como parametro de entrada un legajo buscado, trabajando siempre (entrada/salida) con un array y legajo+nomApe. Luego es cuestión de revolver.
Revisá el adjunto, que si bien es el diagrama que no quería mandar, lo tengo que hacer porque no parecés entender demasiado, te tendría que servir esto para revisar conceptos, practicar un poco más con la guía y realizar consultas, ya sea en clase o fuera de clase a tu profesor/a.

[attachment=7345]


PD: La casita (?) que está al final, en realidad no es necesaria, pero es a modo de que se vea una posible forma de que el procedimiento salve un posible error en la búsqueda, como consecuencia de una no existencia del legajoBuscado en el array. Se supone que el usuario va a ingresar un dato correcto.
¿siguen con las casitas?

ugh
Mil Gracias Rob. !! trabajaré en ello thumbup3 y sip, mañana consulto al profe si no me sale... de nuevo muchas gracias =)
(29-08-2013 21:27)Dem0 escribió: [ -> ]¿siguen con las casitas?

ugh


Off-topic:
Yo siempre creí que es mejor que se explique se esa forma tan novata, mentalizá que el secundario tiene un nivel muy bajo, y muchos entran a Ingeniería en Sistemas sin casi tener nociones básicas para poder adaptarse al nuevo mundo.
Pero en fin, cada persona tendrá una opinión distinta y la respeto.


(29-08-2013 21:31)Lou escribió: [ -> ]Mil Gracias Rob. !! trabajaré en ello thumbup3 y sip, mañana consulto al profe si no me sale... de nuevo muchas gracias =)

Genial! si necesitas seguir preguntando por acá, ya sabés =)
no por mí lo digo, pero hay muchísima gente que puede hacer lo que hice yo e incluso mejor.
(29-08-2013 21:40)rob. escribió: [ -> ]
(29-08-2013 21:27)Dem0 escribió: [ -> ]¿siguen con las casitas?

ugh


Off-topic:
Yo siempre creí que es mejor que se explique se esa forma tan novata, mentalizá que el secundario tiene un nivel muy bajo, y muchos entran a Ingeniería en Sistemas sin casi tener nociones básicas para poder adaptarse al nuevo mundo.
Pero en fin, cada persona tendrá una opinión distinta y la respeto.

Pero esas casas restan. El significado de los símbolos es muy poco claro: se parecen entre ellos (lo que dá para quilombos) y el lenguaje visual no se parece a nada que los alumnos se puedan haber cruzado con anterioridad. Además son innecesariamente engorrosas de dibujar. No se me ocurre ningún argumento a favor de las casitas por sobre un diagrama de flujos común y corriente.

Y es una materia de algoritmos en una carrera de ingeniería. No subestimes a los alumnos, si pudieron ingresar a la facultad, pueden adaptarse a estudiar algoritmos sin muletas.
Páginas: 1 2
URLs de referencia