Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Duda con arrays en programa para Soundex (https://www.clubdelphi.com/foros/showthread.php?t=47164)

gerupc 20-08-2007 19:44:13

Duda con arrays en programa para Soundex
 
Hola,

estoy intentando hacer un programa relacionado con la codificación Soundex, pero me lio nada más empezar.

El problema es que tengo varios grupos, cada uno de ellos con una lista de caracteres. Por ejemplo: Grupo_0 caracteres : A,E,I,O,U...etc.

Entonces, lo que yo he hecho ha sido declarar cada grupo de la siguiente manera:

Código Delphi [-]
var
  Grupo_0: array[1..8] of char = ('A', 'E', 'I', 'O', 'U', 'H', 'W', 'Y'); // Mas los caracteres no alfabéticos (no sé como puedo ponerlos)
  Grupo_1: array[1..4] of char = ('B', 'F', 'P', 'V');
  Grupo_2: array[1..8] of char = ('C', 'G', 'J', 'K', 'Q', 'S', 'X', 'Z');
  Grupo_3: array[1..2] of char = ('D', 'T');
  Grupo_4: array[1] of char = ('L');
  Grupo_5: array[1..2] of char = ('M', 'N');
  Grupo_6: array[1] of char = ('R');

Pero claro, en lo que el progrma consiste es en que el usuario introduzca un nombre, por ejempl: SMITH, y el programa identifique cada caracter de la palabra con su grupo correspondiente, mostrando en lugar de SMITH:
25030, siendo cada uno de estos el numero de grupo al que pertenece el caracter que ocupa su misma poscion.

Entonces, la manera de la que yo he declarado las matrices...pues como que no consigo hacer nada. Y también, en el grupo 0 tengo que añadir los caracteres no alfabeticos y no sé como.

Si alguien me pudiese echar una mano y decirme cómo podría comenzar...se lo agradecería mucho.

Un saludo,

Geru.

jachguate 20-08-2007 20:02:39

Pues yo veo que si se podría, aunque se me hace mas natural usar conjuntos y no arreglos.
Código Delphi [-]
const
  Grupo_0: set of char = ['A', 'E', 'I', 'O', 'U', 'H', 'W', 'Y', #0..#64, #91..#96, #123..#255]
  //lo último #0..#64, etc.  son los caracteres "no alfabéticos", incluyendo los numéricos
  Grupo_1: set of char = ['B', 'F', 'P', 'V'];
  Grupo_2: set of char = ['C', 'G', 'J', 'K', 'Q', 'S', 'X', 'Z'];
  Grupo_3: set of char = ['D', 'T'];
  Grupo_4: set of char = ['L'];
  Grupo_5: set of char = ['M', 'N'];
  Grupo_6: set of char = ['R'];

begin
  //el resto ya es historia, ¿no?
end;

Saludos.

;)

Delphius 20-08-2007 20:02:42

Hola gerupc,

Puedes trabajar a un string como si fuera un vector. De hecho... lo es.
Un string comienza a numerarse desde 1. De modo que la palabra HOLA, se puede interpretar así:

Posición-Valor
1-H
2-O
3-L
4-A

Entonces si yo hago:

Código Delphi [-]
Letra := HOLA[2];

Obtengo en la variable Letra (tipo Char, o string. Tu elije) la letra O. Siendo HOLA del tipo string.

Existen funciones que te permiten conocer la longitud de un string: Length() y también una función que busca una cadena dentro de otra: Pos().

Con estas dos funciones puedes conseguir lo que buscas.

Es una idea, lo que propongo. En lo personal, prefiero evitarme hacer esos tipos de arrays que usas...
En cuanto a lo caracteres no alfabéticos... ¿Podrías indicar cuales deben ser? ¿Son estos: !"%&$....?¿Alguno "raro"... como este: ¼?

Si no puedes emplear funciones... como en los otros ejercicios hazme saber.
Saludos,

gerupc 20-08-2007 20:08:24

Hola,

muchísimas gracias por vuestras respuestas.

Delphius, una vez más, mil gracias! :D Jejeje, pues mira, este es el primer ejercicio que debo hacer con funciones y procedimientos, asi que... empieza lo bueno ;-)

Pero bueno, muchas gracias por tu explicación, la verdad es que me viene genial, voy a probar, a trastear hasta ver si lo consigo... Si no ya os consultaré!:p

Una vez más, mil gracias

Un saludo,

Geru.

gerupc 20-08-2007 20:25:58

Hola,

una cosilla. Vale, sé cómo saber tanto la posición como la longitud de determinada palabra, pero cómo hago que me busque por todos los arrays? Es decir, cómo hago que una vez identificada un caracter, lo busque entre todos los arrays para que me diga el grupo en el cual se encuentra? :confused:

Un saludo,

Geru.

Delphius 20-08-2007 20:35:41

Hola de nuevo!:)

El ejemplo que te paso no hace lo que pides... pero puede que te de una pista:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
const
  VOCALES = 'AEIOU'; //grupo 1
  CONSONANTES = 'BCDFGHJKLMNÑPQRSTVWXYZ';  // grupo 2
var i, grupo, posic: integer;
    resultado: string;
begin
 resultado := '';
 for i :=1 to Length(Edit1.Text) do
   begin
     posic := Pos(Edit1.Text[i],VOCALES);
     IF Posic > 0 // se encontró la subcadena dentro de vocales
        then grupo := 1
        else grupo := 2;  // son grupos excluyentes... por tanto
        // si no está en vocales... va a estar en consonantes
// damos por supuesto que no se ingresan caracteres "raros";)
     resultado := resultado + IntTostr(grupo);
   end;
   ShowMessage(resultado);
end;

Saludos,

gerupc 22-08-2007 19:30:46

Hola Delphius,

nuevamente, gracias por tus ayuda. Realmente me es útil ya que aprendo cosas totalmente nuevas.

Aunque :o en este caso, no me sirve (para el ejercicio en cuestión, pero si para aprender más 'allá' ;-) ), ya que necesito diferenciar bien cada 'Grupo', y es necesario utilizar arrays (es para practicarlos).

A ver si me puedes echar una mano a pesar de haya tantas 'exigencias' :).

Gracias.

Un saludo,

Geru.

Delphius 22-08-2007 19:54:05

El problema de tener que emplear arrays (lo cual es el verdadero ejercicio) es que debes emplear tu propio algoritmo de búsqueda. Asi que debes tener una función (si deseas) que realice dicha operación. Hay diversos algoritmos, es más sencillo es a "fuerza bruta":

Código Delphi [-]
i := 1; encontrado := false; resultado := 0;
while i <= longitud and NOT encontrado do
  begin
    if a_buscar = vector[i]
       then begin
                encontrado_en := i; //guardamos la posicion
                encontrado := True; // paramos la busqueda
              end;
     i := i + 1; 
   end;
  if encontrado
     then resultado := encontrado_en;

Para vectores pequeños puede ser útil, pero para vectores grandes hay mejores algoritmos. Sobretodo considerando si están ordenados.

El mayor problema que tienes es el grupo. Lamentablemente debes buscar grupo por grupo hasta encontrar el elemento. La alternativa puede ser buscar obligadamente en todos. Solo uno devolverá la posición (y como podrás ver... esta no es la más económica). Es decir que puedes hacer algo como:
Código Delphi [-]
if Buscar(elem,grupo1) = 0 // no lo encontró
   then if Buscar(elem,grupo2) = 0 // no lo encontró
             then ....

// O la otra alternativa:
en_pos := Buscar(elem,grupo1);
...
en_pos := Buscar(elem,grupo6);

De modo que en_pos logra de cualquier manera encontrar el elemento. pero no así el grupo...
Como lo que necesitas es el número de grupos, tal vez puedas considerar hacer una matriz. O array de array. De modo que al primer array le corresponde el grupo 1, y asi en forma análoga para todos.
Es decir que Grupo[1][2] hace referencia al segundo elemento del grupo 1.

La forma de conseguir esto es:
Código Delphi [-]
UnaMatriz := array[1..CantidadGrupos] of vector;
Y vector puede ser:
Type
Vector = array[1..la_maxima_cantidad] of char;

Entonces, puedes modificar a Buscar de modo que vaya recorriendo a cada grupo (asi consigues mantener la referencia al grupo) y dentro de cada grupo los elementos.

Hay muchas alternativas. Tu evalua la que te resulte más conveniente.
Si pudieras emplear conjuntos la cosa sería más facil.

Saludos,

gerupc 22-08-2007 20:34:14

Hola,

no sabes cuanto te agradezco tu esfuerzo y ayuda. Gran explicación.

Bueno, voy a practicarlo y a retorcerme un poquito la cabeza y ya te contaré qué tal :)

Un saludo,

Geru.


La franja horaria es GMT +2. Ahora son las 18:45:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi