PDA

Ver la Versión Completa : Cómo lograr que un mismo procedimiento funcione para varios arreglos?


Aszael
15-11-2017, 05:00:51
Saludos, señores. Estoy trabajando con varios arreglos y preciso que un mismo procedimiento funcione para todos ellos. Cada arreglo guarda distintos números, números que alguien introduzca a través de un Edit. Es decir:
Elem1[dim1]:=2,4,1
Elem2[dim2]:=9,8
Elem3[dim3]:=8,5,3

Tengo este procedimiento, que ordena el arreglo de menor a mayor:

procedure Vector.ordenarvector;
var c,m:integer;
begin
for t:=1 to dim1 do begin
c:=1;
repeat
if (elem1[t]>elem1[t+c]) and (elem1[t+c]>0)then begin
m:=elem1[t];
for i:=t+c to t+c do
elem1[t]:=elem1[t+c];
elem1[t+c]:=m
end else
c:=c+1;
until c=dim1;
end;
end;

Ahora como bien dicta la pregunta, ¿cómo puedo lograr que funcione para mis tres arreglos? Ya que este procedimiento solo me funciona para "Elem1".

Intente pasar Elem2[dim2]=9,8 a Elem1[dim1] y desde ahí ordenarlo, y luego pasarlo de Elem1 a Elem2 nuevamente, -funciona- pero interfiere con otros procedimientos que tengo.

PD: No puedo usar Sort's. Muchas gracias y saludos. ^\||/

Neftali [Germán.Estévez]
15-11-2017, 09:24:40
Para eso se utilizan los parámetros en procedimientos y funciones.
Revisa estos links o si buscas en internet encontrarás muchos más.

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Calling_Procedures_and_Functions_(Delphi)
http://docwiki.embarcadero.com/RADStudio/Berlin/en/Parameters_(Delphi)

Se trata al final de modificar ese procemiento para que admita un parámetro de tipo array. De esa forma funcionará con todos los arrays (siempre que sean similares).

Haz pruebas y si no te sale comenta lo que has hecho aquí y iremos ayudándote.

Aszael
16-11-2017, 01:33:33
Se trata al final de modificar ese procemiento para que admita un parámetro de tipo array. De esa forma funcionará con todos los arrays (siempre que sean similares).

Haz pruebas y si no te sale comenta lo que has hecho aquí y iremos ayudándote.

¿Te refieres a hacer esto? No pude ir ni para atrás ni para adelante, mi arreglo se desbordaba, falta de conocimiento debo decir:

procedure Vector.ordenarvector(elem:array of integer; dim: integer);

Hum, me falto decir que quería el mismo procedimiento para cada arreglo, y cada arreglo tiene su propio botón. No buscaba que con un solo botón se me ordenaran todos mis arreglos sino, solo los que yo quisiera. Encontré otra manera, bueno, al menos funciona -llorando por dentro-:

Cree dos procedimientos más y luego desde el programa principal hago la llamada:

//Unidad donde va la clase...
procedure Vector.copia(num:integer);
begin
case num of
1: for t:=1 to getDim(1) do
x[t]:=getElem(t,1);
2: for t:=1 to getDim(2) do
x[t]:=getElem(t,2);
end;
end;

procedure Vector.copiafinal(num: integer);
begin
case num of
1: for t:=1 to getDim(1) do
elem1[t]:=x[t];
2: for t:=1 to getDim(2) do
elem2[t]:=x[t];
end;
end;

procedure Vector.ordenarvector(dim: integer);
var c,m:integer;
begin
for t:=1 to dim do begin
c:=1;
repeat
if (x[t]>x[t+c]) and (x[t+c]>0)then begin
m:=x[t];
for i:=t+c to t+c do
x[t]:=x[t+c];
x[t+c]:=m
end else
c:=c+1;
until c=dim;
end;
end;
//Fin unidad.

//Programa principal...
procedure TP2.B1OrdenarClick(Sender: TObject);
begin
v.copia(1);
v.ordenarvector(v.getDim(1));
v.copiafinal(1);
ActualizarSG1;
end;

procedure TP2.B2OrdenarClick(Sender: TObject);
begin
v.copia(2);
v.ordenarvector(v.getDim(2));
v.copiafinal(2);
ActualizarSG2;
end;
//Fin programa principal.

Lo hago de esta manera para darle independencia a cada arreglo y que cuando haga una operación, el arreglo 2 o 3 no se una al 1 y viceversa.

Cómo habrás notado, estoy en pañales, trato de aprender, pero "¿arreglos en parámetros?" No, aún no he visto a fondo este tema. Te agradezco por tu tiempo y si tienes algún consejo para hacer más pequeño todo este código, o para no darle tantas vueltas al asunto, estoy más que dispuesto a leerte, gracias.

mamcx
16-11-2017, 03:04:31
No se entiende lo que quieres y el codigo no ayuda.

Como debe quedar los datos ordenados?

Aszael
16-11-2017, 04:07:59
No se entiende lo que quieres y el codigo no ayuda.

Como debe quedar los datos ordenados?

Ya solucioné, gracias.

Neftali [Germán.Estévez]
16-11-2017, 12:54:39
¿Te refieres a hacer esto? No pude ir ni para atrás ni para adelante, mi arreglo se desbordaba, falta de conocimiento debo decir:


procedure Vector.ordenarvector(elem:array of integer; dim: integer);



Si, a eso me refería.

hal1967
18-11-2017, 23:20:04
¿Por qué pasan un parámetro de nombre dim?

¿No debería bastar con usar low y high?

algo como

for i:= low(v) to high(v) do
...

Neftali [Germán.Estévez]
20-11-2017, 09:10:53
¿Por qué pasan un parámetro de nombre dim?
¿No debería bastar con usar low y high?


Es correcto.
Y también se puede usar la función Length (http://www.delphibasics.co.uk/RTL.asp?Name=lengthhttp://)para saber la longitud del array, pero en este caso (yo al menos) no quise distraerle con más cosas que no fueran estrictamente del problema que tenía este usuario.

Tal vez él lo ve más claro así. Una vez solucionado el problema, se le puede añadir ese comentario como "mejora/optimización".

Aszael
26-11-2017, 01:40:13
No me permiten llamar a las funciones del programa, como ser Length, o esas mismas Low, High.

Simplemente no quería parecer descortés no contestando sus observaciones. Gracias por los consejos.