Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Exclamation 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.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto

Última edición por gerupc fecha: 20-08-2007 a las 20:51:40.
Responder Con Cita
  #2  
Antiguo 20-08-2007
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
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.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 20-08-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #4  
Antiguo 20-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Talking

Hola,

muchísimas gracias por vuestras respuestas.

Delphius, una vez más, mil gracias! 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é!

Una vez más, mil gracias

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #5  
Antiguo 20-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Exclamation

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?

Un saludo,

Geru.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #6  
Antiguo 20-08-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #7  
Antiguo 22-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Unhappy

Hola Delphius,

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

Aunque 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.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
  #8  
Antiguo 22-08-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
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,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 22-08-2007 a las 21:08:18. Razón: corrección del algoritmo buscar
Responder Con Cita
  #9  
Antiguo 22-08-2007
Avatar de gerupc
gerupc gerupc is offline
Miembro
 
Registrado: jul 2007
Ubicación: Universidad de Deusto
Posts: 61
Poder: 17
gerupc Va por buen camino
Smile

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.
__________________
Mi Blog
---------------------
Universidad de Deusto
ESIDE-Escuela Superior de Ingenieros Deusto
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
programa para ver en que direccion del registro de windows escribe un programa? JuanErasmo Varios 1 09-11-2006 21:42:05
arrays nenufer Varios 7 13-05-2006 22:44:51
Duda sobre version de un programa escrito en delphi Codexfk Varios 6 17-11-2005 21:29:38
Soundex para castellano jam Varios 5 20-07-2005 01:35:31
¿ayuda para un programa para el msn kaiser_robert Internet 1 15-06-2005 21:52:07


La franja horaria es GMT +2. Ahora son las 07:44:51.


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
Copyright 1996-2007 Club Delphi