Programación General > Pascal

 Ordenación Alfabética De Un Archivo

(1/2) > >>

thot_ohm:
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 --- program DemoOrd; uses CRT; var  {Variables para la primera parte del demo}  PosLetra          : integer;  {para la segunda parte del demo}  Palabra1,Palabra2 : string;  Ord1, Ord2        : integer;  begin   ClrScr;   PosLetra := Ord('a');   WriteLn(PosLetra);   PosLetra := Ord('z');   WriteLn(PosLetra);   ReadKey;  ClrScr;   {Fin Primera Parte del Demo}   Write('Ingese una palabra cualquiera: ');  ReadLn(Palabra1);  Write('Ingese una palabra cualquiera que empieze con una letra distinta: ');  ReadLn(Palabra2);  Ord1 := Ord(Palabra1[1]); {Seria la primera letra de la palabra}  Ord2 := Ord(Palabra2[1]); {Seria la primera letra de la segunda palabra}  WriteLn('A continuacion se escribiran las palabras ordenadas alfabeticamente');  WriteLn('');  WriteLn('Presione una tecla');  ClrScr;   if Ord1 < Ord2 then     begin        WriteLn(Palabra1);        WriteLn(Palabra2);     end  else if Ord2 < Ord1 then     begin        WriteLn(Palabra2);        WriteLn(Palabra1);     end  else if Ord1 = Ord2 then     begin        Writeln('Se suponia que tenian que empezar con letras distintas');     end;  readkey;end.  

Enko:
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;

--- Fin de la cita ---
*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 --- for i:=1 to MAX_CANT do   for j:=i+1 to MAX_CANT do       if esMayor(Lista[j], Lista[i]) then Intercambiar(Lista[i], Lista[j]);  

thot_ohm:
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:

Enko:
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 --- const  Max = 10;  Min = 1;  Intervalo = Max..Min;  elMismoIntervalo = 1..10;  type  MiVector = array[1..10] of String;  MiSegundoVetor = array[Intervalo] of Integer;  MiTercerVetor = array[Min..Max] of Boolean;  var  UnVector: MiVetor;  LoMismo: array[1..10] of string;  OtroMas: MiTercerVetor;  OtroVector: array[Intervalo] of Char;  
ASIGNANDO VALORES:
--------------------------

--- Código: Text --- {iniciando el vetor}for i:=Min to Max do  Vector[i] := 0;  {Dando un valor a la posicion N}Vector[N] := 43;Vector[4] := 43; {leyendo del teclado assignando en vector}ReadLn(VectorCadena[1]);ReadLn(VectorNumero[X]);  
ORDENANDO UN VECTOR NUMÉRICO:
-------------------------------------------

--- Código: Text --- var  i,j,temp: integer;  v: array[1..10] of integer;begin  {se llena con valores aleatorios}  Randomize; {cambia la semilla del random}  for i:=1 to 10 do    v[i] := Random(10);   {se ordena}  for i:=1 to 10 do    for j:=i+1 to 10 do    {puede ser: j:=1 to 10 do}    {pero seria desperdiciar recursos, creo :S}    {si el segundo elemento es mayor que el primero,    hay intercambiarlos cosa que se ordene}    if v[j] < v[i] then      begin        temp := v[i];        v[i] := v[j];        v[j] := temp;      end;     {se muestra el vector en la pantalla}    for i:=1 to 10 do      writeln(v[i]);    Readln;end.  
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:
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

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa