Ir al contenido



Foto

[MULTILENGUAJE] Contar las PALABRAS contenidas en un String


  • Por favor identifícate para responder
29 respuestas en este tema

#21 Jagluiperd

Jagluiperd

    Member

  • Miembros
  • PipPip
  • 36 mensajes
  • LocationBuscando a Wally

Escrito 04 septiembre 2010 - 07:08

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

  • Moderadores
  • PipPipPip
  • 3.839 mensajes
  • LocationMadrid - España

Escrito 04 septiembre 2010 - 07:12

...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

  • Moderadores
  • PipPipPip
  • 3.839 mensajes
  • LocationMadrid - España

Escrito 04 septiembre 2010 - 07:33


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 mensajes
  • LocationBuscando a Wally

Escrito 04 septiembre 2010 - 07:38

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
  • 13.953 mensajes
  • LocationMéxico

Escrito 04 septiembre 2010 - 07:49

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

Salud OS
  • 0

#26 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.839 mensajes
  • LocationMadrid - España

Escrito 04 septiembre 2010 - 09:32

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
  • 13.953 mensajes
  • LocationMéxico

Escrito 04 septiembre 2010 - 10:19

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 mensajes

Escrito 04 septiembre 2010 - 03:23

Gran trabajo escafandra, eres una máquina!

Saludos.
  • 0

#29 juan1987

juan1987

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 23 septiembre 2011 - 10:48

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

  • Moderadores
  • PipPipPip
  • 3.839 mensajes
  • LocationMadrid - España

Escrito 23 septiembre 2011 - 04:31

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