Jump to content


Photo

[MULTILENGUAJE] Contar las PALABRAS contenidas en un String


  • Please log in to reply
29 replies to this topic

#21 Jagluiperd

Jagluiperd

    Member

  • Miembros
  • PipPip
  • 36 posts
  • LocationBuscando a Wally

Posted 04 September 2010 - 07:08 AM

Hola.

Gracias escafandra.

Añado:

Por si alguien necesita escribir código que no sea dependiente del S.O,
os dejo estas funciones para que no os de problemas con el código propuesto por
escafandra:


delphi
  1. Function IsCharAlpha(Const Caracter: Char): Boolean;
  2. Begin
  3.   {No tiene en cuenta caráteres especiales ni números, solo letras}
  4.   Result:=(Caracter IN['A'..'Z','a'..'z']);
  5. End; 
  6.  
  7. Function IsCharAlphaNumeric(Const Caracter: Char): Boolean;
  8. Begin
  9.   {No tiene en cuenta caráteres especiales, solo letras y números}
  10.   Result:=(Caracter IN['A'..'Z','a'..'z','0'..'9']);
  11. End; 


Insertar las lineas de código tras la clausula "Implementation".

Si se emplea el código de escafandra con estas funciones que propongo,
se puede implementar en Lazarus, tanto para Ms Windos como para Linux.

Saludos.
  • 0

#22 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 04 September 2010 - 07:12 AM

...el punto es que la mayoría de las veces me cuesta trabajo entender el código :)...


Bueno para eso tienes una fácil solución, escribirlo. Sólo llegas a entenderlo realmente y en profundidad cuando lo puedes escribir con soltura. En ocasiones puede parecer que se entiende hasta que tenemos que hacerlo... Eso es debido a la parte críptica del asunto y lo rico de su sintaxis. Por eso pienso que la única forma es escribir y experimentar distintas formas de sintaxis.

Saludos.
  • 0

#23 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 04 September 2010 - 07:33 AM


Por si alguien necesita escribir código que no sea dependiente del S.O,
os dejo estas funciones para que no os de problemas con el código propuesto por
escafandra:

delphi
  1. Function IsCharAlpha(Const Caracter: Char): Boolean;
  2. Begin
  3.   {No tiene en cuenta caráteres especiales ni números, solo letras}
  4.   Result:=(Caracter IN['A'..'Z','a'..'z']);
  5. End; 
  6.  
  7. Function IsCharAlphaNumeric(Const Caracter: Char): Boolean;
  8. Begin
  9.   {No tiene en cuenta caráteres especiales, solo letras y números}
  10.   Result:=(Caracter IN['A'..'Z','a'..'z','0'..'9']);
  11. End; 



Bueno, aquí tenemos otra de las ventajas de C/C++. En realidad esas funciones están en la librería del ANSI C como isalpha y isalnum, de modo que el código, usando esas funciones, es portable tal cual.

La API de Windows las incorpora en ntdll.dll con los mismos nombres. En la librería User32.dll incorpora las versiones que yo he propuesto usar.

Si tenéis curiosidad, podeis explorar las librerías de Windows y de su mismo Kernel con la aplicación que desarrolle y que publiqué en el foro: IEDataVisor (aunque no ha sido muy aceptada o comprendida... :(). A mi me es muy útil cuando deseo explorar los entresijos de Windows.


Saludos.
  • 0

#24 Jagluiperd

Jagluiperd

    Member

  • Miembros
  • PipPip
  • 36 posts
  • LocationBuscando a Wally

Posted 04 September 2010 - 07:38 AM

Bueno, aquí tenemos otra de las ventajas de C/C++. En realidad esas funciones están en la librería del ANSI C como isalpha y isalnum, de modo que el código, usando esas funciones, es portable tal cual.


Redondo y Perfecto.

Un saludo.
  • 0

#25 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 04 September 2010 - 07:49 AM

Yo sigo aprendiendo algo todos los días (y)

Salud OS
  • 0

#26 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 04 September 2010 - 09:32 AM

Optimizando código en C/C++:
 


cpp
  1. int ContarPalabras(char* S)
  2. {
  3.   int Result = 0;
  4.   char *c;
  5.   for(c = S; *c;)
  6.     if(IsCharAlpha(*c++) && *c == ' ') Result++;
  7.   if(IsCharAlpha(*--c)) Result++;
  8.   return Result;
  9. }

Usando punteros en delphi:


delphi
  1. function ContarPalabras(const S: string): integer;
  2. var
  3.   c: PCHAR;
  4. begin
  5.   Result:= 0;
  6.   c:= PCHAR(S);
  7.   repeat
  8.     if IsCharAlpha(c^) and ((c+1)^ = ' ') then inc(Result);
  9.     inc(c);
  10.   until (c^ = #0);
  11.   if IsCharAlpha((c-1)^) then inc(Result);
  12. end;

En ensamblador para delphi:


delphi
  1. function _ContarPalabras(Cadena: PCHAR): integer;
  2. begin
  3.   Result:= 0;
  4.   asm
  5.     mov esi, Cadena
  6.  
  7. @loop_scan_cadena:
  8.     push [esi]
  9.     call IsCharAlphaA        // Call IsCharAlpha
  10.     inc  esi
  11.     cmp  eax, 1
  12.     jne  @continue_loop_scan_cadena
  13.     mov  ax, word ptr [esi]
  14.     cmp  al, 20h            // ¿Es un espacio? ' '
  15.     jne  @continue_loop_scan_cadena
  16.     inc  Result;            // Palabra encontrada
  17. @continue_loop_scan_cadena:
  18.     mov  ax, word ptr [esi]
  19.     cmp  al, 0              // ¿Fin de la cadena?
  20.     jne  @loop_scan_cadena
  21.  
  22.     dec  esi;
  23.     push [esi]
  24.     call IsCharAlphaA      // Call IsCharAlpha
  25.     cmp  eax, 1
  26.     jne  @Fin_ContarPalabras
  27.     inc  Result;            // Ultima palabra encontrada;
  28.  
  29. @Fin_ContarPalabras:
  30.   end;
  31. end;

Si los números cuentan se sustituye IsCharAlpha por IsCharAlphaNumeric

Saludos.         


  • 0

#27 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14460 posts
  • LocationMéxico

Posted 04 September 2010 - 10:19 AM

Ah vaya, ahora hasta en asm (y), habrá que poner el Prefijo [MULTILENGUAJE] :D :D :D

Salud OS
  • 0

#28 Khronos

Khronos

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 56 posts

Posted 04 September 2010 - 03:23 PM

Gran trabajo escafandra, eres una máquina!

Saludos.
  • 0

#29 juan1987

juan1987

    Newbie

  • Miembros
  • Pip
  • 1 posts

Posted 23 September 2011 - 10:48 AM

Hola escafandra. ¿Está bien ese código? Porque quise implementarlo y no funciona. ¿Puede ser por la versión?
Muchas gracias.
  • 0

#30 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4111 posts
  • LocationMadrid - España

Posted 23 September 2011 - 04:31 PM

Hola escafandra. ¿Está bien ese código? Porque quise implementarlo y no funciona. ¿Puede ser por la versión?
Muchas gracias.


Hola, juan1987 Bienvenido a delphiaccess.

El código mostrado esta probado. No se exactamente a qué código te refieres. Supongo que al que viene en este mensaje, pero ¿la versión C, delphi o asm?.

Si usas una versión de compilador que use unicode, no funcionará, no esta diseñado para eso. Fíjate que el parámetro de entreda es un puntero a CHAR y no a WCHAR. La versión delphi con punteros asume también que con CHAR. Puedes adaptarlo a unicode o pasar las cadenas unicode a clásicas con esto, si te gusta el bajo nivel:
 

cpp
  1. // Convierte cadenas Unicode a clásicas
  2. char* WideCharToChar(const wchar_t* Entrada, char* Salida, unsigned int Size=-1)
  3. {
  4.   if(Entrada){
  5.     int size = Size;
  6.     if(Size==-1) size = wcslen(Entrada)+1;
  7.     WideCharToMultiByte(CP_ACP, 0, Entrada, -1, Salida, size, NULL, NULL);
  8.     return Salida;
  9.   }
  10.   else return 0; 
  11. }

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.