• Jueves 28 de Marzo de 2024, 22:04

Autor Tema:  Ordenación Alfabética De Un Archivo  (Leído 3998 veces)

thot_ohm

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Ordenación Alfabética De Un Archivo
« en: Lunes 27 de Junio de 2005, 23:34 »
0
Hola de nuevo:

Enko, amablemente (y eficientemente), me ha ayudado en el desarrollo de éste código. Cuando pensaba que ya no iba a necesitar más ayuda y que ya era todo un experto B)  :comp: , se me presentó otro problema :blink:  :whistling: . Me explico:

El código lee unas entradas por teclado, las guarda en un archivo y luego debe mostrar por pantalla algunos de los registros guardados (en base a ciertos criterios) y ordenarlos alfabéticamente por el nombre.

Ok. La parte de mostrar los que cumplen ciertos criterios está lista, no hay problema en eso. Ahora, lo de ordenar alfabéticamente, me ha enredado la vida. Tuve la idea de vaciar inicialmente el resultado de la lectura en base a ciertos criterios (filtro) en un array bidimensional  :blink:  y luego aplicar un algoritmo de ordenación que encontré posteado en este mismo foro (siempre el bueno de Enko).

Confieso que lo del array bidimensional lo conozco en la teoría, mas no en la práctica. Puedo intuir y creo saber como manejarlo  :unsure: .  Ahora bien, ¿Es ésta la mejor técnica?

Por otro lado me vuelvo un ocho intentando aplicar el algoritmo de Enko a ésta teoría.

Help me please!!

Adjunto el archivo .pas con mi código y el código copiado de éste mismo foro (gracias Enko).

Código: Text
  1.  
  2. program DemoOrd;
  3.  
  4. uses CRT;
  5.  
  6. var
  7.   {Variables para la primera parte del demo}
  8.   PosLetra          : integer;
  9.   {para la segunda parte del demo}
  10.   Palabra1,Palabra2 : string;
  11.   Ord1, Ord2        : integer;
  12.  
  13.  
  14. begin
  15.    ClrScr;
  16.    PosLetra := Ord('a');
  17.    WriteLn(PosLetra);
  18.    PosLetra := Ord('z');
  19.    WriteLn(PosLetra);
  20.    ReadKey;
  21.   ClrScr;
  22.  
  23.   {Fin Primera Parte del Demo}
  24.  
  25.   Write('Ingese una palabra cualquiera: ');
  26.   ReadLn(Palabra1);
  27.   Write('Ingese una palabra cualquiera que empieze con una letra distinta: ');
  28.   ReadLn(Palabra2);
  29.   Ord1 := Ord(Palabra1[1]); {Seria la primera letra de la palabra}
  30.   Ord2 := Ord(Palabra2[1]); {Seria la primera letra de la segunda palabra}
  31.   WriteLn('A continuacion se escribiran las palabras ordenadas alfabeticamente');
  32.   WriteLn('');
  33.   WriteLn('Presione una tecla');
  34.   ClrScr;
  35.  
  36.   if Ord1 < Ord2 then
  37.      begin
  38.         WriteLn(Palabra1);
  39.         WriteLn(Palabra2);
  40.      end
  41.   else if Ord2 < Ord1 then
  42.      begin
  43.         WriteLn(Palabra2);
  44.         WriteLn(Palabra1);
  45.      end
  46.   else if Ord1 = Ord2 then
  47.      begin
  48.         Writeln('Se suponia que tenian que empezar con letras distintas');
  49.      end;
  50.   readkey;
  51. end.
  52.  
  53.  
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
OHM

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Ordenación Alfabética De Un Archivo
« Respuesta #1 en: Martes 28 de Junio de 2005, 03:09 »
0
El código era solo un ejemplo para dar una idea.
Yo no soy muy bueno en esto de algoritmos de ordenación y mucho menos en algoritmos :rolleyes:
Pero bueno, supongo que la idea sería esta:
*Primero deberías hacer una funcion que te indique cual de dos Strings es menor alpabeticamente que otro. Algo como:
Citar
function esMenor(s1,s2: string): boolean;
*Y otra uqe ordene el vector.

Ahorita no se me ocurre como hacer bien la funcion que diga cual de las dos palabras es mayor. Para ma;ana se me ocurrir'a algo :rolleyes:
La idea sería comparar letra por letra mientras sean iguales hasta que una sea diferente y bueno, saber cual de las dos letras es menor y a que palabra le corresponde. Al parecer, la recursividad encaje bien ahí.


Para ordenar supongo que con ordenación burbuja sobra...
Código: Text
  1.  
  2. for i:=1 to MAX_CANT do
  3.    for j:=i+1 to MAX_CANT do
  4.        if esMayor(Lista[j], Lista[i]) then Intercambiar(Lista[i], Lista[j]);
  5.  
  6.  

thot_ohm

  • Miembro activo
  • **
  • Mensajes: 46
    • Ver Perfil
Re: Ordenación Alfabética De Un Archivo
« Respuesta #2 en: Martes 28 de Junio de 2005, 23:59 »
0
Perro Enko, con eso de la ordenación burbuja me dejaste más frito de lo que estaba. Investigué en Google un poquito y ví varios ejemplos de ordenación con el método de la burbuja, que aunque no me ha quedado muy claro, lo que sí he visto es que tengo que tener los datos en un array (en mi caso sería uno bidimensional).

Lo que se me ocurre es vaciar los resultados del filtro aplicado en el archivo al array (el cual imagino, deberá ser del tipo string) y aplicar el método burbuja a este array.

Ahora bien, ¿como escribo en al arraylos datos del archivo filtrado? Me explico, en el procedimiento MostrarEMM, una vez que leo el archivo en la variable Datos empiezo a aplicar el mencionado filtro a punta de condicionales y directamente, muestro por pantalla el resultado. ¿En este punto es que tengo que cambiar la orden y ponerlo a que me lo escriba en el array? ¿Que instrucción utilizo para ésto? ¿Algo así?: write[f,c] donde f y c son unas variables que indican la fila y columna donde se va a escribir el registro.

Disculpen a éste ignorante fastidioso jejeje  :losiento:
OHM

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Ordenación Alfabética De Un Archivo
« Respuesta #3 en: Miércoles 29 de Junio de 2005, 00:59 »
0
Vamos por pasos  :rolleyes:
No se la complejidad con la que tienes que trabajar. ;)
 
Lo que pasa es que los Arrays tienen que tener una cantidad de elementos estático, es decir, no pueden variar el tamaño de sus elementos. Así se defines un array con 100 elementos, si el archivo llega a tener 101, fuiste, el programa tirará error.  Para esos casos se usan listas enlazadas (punteros) pero supongo que no llegaste ahí todavía y que tienes que usar Arrays.

Te tiraré estos ejemplos con uso de arrays:

DIFINIENDO VECTORES:
----------------------------
Código: Text
  1.  
  2. const
  3.   Max = 10;
  4.   Min = 1;
  5.   Intervalo = Max..Min;
  6.   elMismoIntervalo = 1..10;
  7.  
  8. type
  9.   MiVector = array[1..10] of String;
  10.   MiSegundoVetor = array[Intervalo] of Integer;
  11.   MiTercerVetor = array[Min..Max] of Boolean;
  12.  
  13. var
  14.   UnVector: MiVetor;
  15.   LoMismo: array[1..10] of string;
  16.   OtroMas: MiTercerVetor;
  17.   OtroVector: array[Intervalo] of Char;
  18.  
  19.  

ASIGNANDO VALORES:
--------------------------
Código: Text
  1.  
  2. {iniciando el vetor}
  3. for i:=Min to Max do
  4.   Vector[i] := 0;
  5.  
  6. {Dando un valor a la posicion N}
  7. Vector[N] := 43;
  8. Vector[4] := 43;
  9.  
  10. {leyendo del teclado assignando en vector}
  11. ReadLn(VectorCadena[1]);
  12. ReadLn(VectorNumero[X]);
  13.  
  14.  

ORDENANDO UN VECTOR NUMÉRICO:
-------------------------------------------
Código: Text
  1.  
  2. var
  3.   i,j,temp: integer;
  4.   v: array[1..10] of integer;
  5. begin
  6.   {se llena con valores aleatorios}
  7.   Randomize; {cambia la semilla del random}
  8.   for i:=1 to 10 do
  9.     v[i] := Random(10);
  10.  
  11.   {se ordena}
  12.   for i:=1 to 10 do
  13.     for j:=i+1 to 10 do
  14.     {puede ser: j:=1 to 10 do}
  15.     {pero seria desperdiciar recursos, creo :S}
  16.     {si el segundo elemento es mayor que el primero,
  17.     hay intercambiarlos cosa que se ordene}
  18.     if v[j] < v[i] then
  19.       begin
  20.         temp := v[i];
  21.         v[i] := v[j];
  22.         v[j] := temp;
  23.       end;
  24.  
  25.     {se muestra el vector en la pantalla}
  26.     for i:=1 to 10 do
  27.       writeln(v[i]);
  28.     Readln;
  29. end.
  30.  
  31.  

FUNCIONAMIENTO DE LA ORDENACION BURBUJA:
---------------------------------------------------------
Mi explicacion es medio chapusera por eso te recomiendo leer en algun otro lado :ph34r:
La idea es ir comparando un elemento del vector con todos para saber si es el mayor, si llega a serlo tiene que estar al principio o al final según sea ascendente o descendente.
Simulemos una primera corrida del algoritmo:
Toma el elemento V que es V[1] y lo comparar con V[j] donde J es igual a I+1 por lo que estar'ia comparandolo con V[2], luego J aumenta en 1 unidad y lo comparar'ia con v[3], y asi hasta 10.  
Si el elemento V[2] o [v3] llegaran a ser mayores que v[1], tendrian que ser los priemero por lo que se intercambian.
Despues de comparar el v[1] con v[2..10], se termina la primera ejecucion del  for de J y se ejecuta ejecuta el for de I auementando la en 1 unidad.
Asi pues, estar'iamos comparando el V[2] con 3,4,5,6...10. Porque V[2] es V y los otros son v[j] donde J = i+1;   que se incrementa en el for de J.

 :hola:

ferchum

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Ordenación Alfabética De Un Archivo
« Respuesta #4 en: Miércoles 29 de Junio de 2005, 03:39 »
0
para el tema de ordenacion creo que te convendria un quick sort es muy rapido y eficente que el burbuja ya que el burbuja tiene una velocidad me parece no recuerdo de On2 encuanto al quick sort es de o nlog n, ademas e  quick sort es recursivo

ferchum

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Ordenación Alfabética De Un Archivo
« Respuesta #5 en: Miércoles 29 de Junio de 2005, 03:45 »
0
bueno realmente me gustaria saber que tiene que hacer tu programa ais te puedo ayudar mejor

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Ordenación Alfabética De Un Archivo
« Respuesta #6 en: Miércoles 29 de Junio de 2005, 03:52 »
0
Cita de: "ferchum"
para el tema de ordenacion creo que te convendria un quick sort es muy rapido y eficente que el burbuja ya que el burbuja tiene una velocidad me parece no recuerdo de On2 encuanto al quick sort es de o nlog n, ademas e  quick sort es recursivo
Muy Sierto.

Tambien cabe anotar que por ser recursiva, es más lenta de lo que podría ser. Hay versiones iterativas que usan listas enlasadas lo que la acelera mucho mas.

La velocidad de burbuja es:  n*n
Citar
Ventajas:

    * Fácil implementación.
    * No requiere memoria adicional.
Desventajas:
    * Muy lento.
    * Realiza numerosas comparaciones.
    * Realiza numerosos intercambios

La de Quiksort es: n log2n

Citar
Ventajas:
    * Muy rápido
    * No requiere memoria adicional.
Desventajas:
    * Implementación un poco más complicada.
    * Recursividad (utiliza muchos recursos).
    * Mucha diferencia entre el peor y el mejor caso.


Lo que si, es que la "ordenacion rápida" es un algoritmo bastante complicado para entender, o mucho más complejo que el de burbuja.