• Viernes 8 de Noviembre de 2024, 21:51

Autor Tema:  Contar El Numero De Veces Que Aparece Una Letra  (Leído 2236 veces)

tirengarfio

  • Miembro activo
  • **
  • Mensajes: 29
    • Ver Perfil
Contar El Numero De Veces Que Aparece Una Letra
« en: Viernes 22 de Febrero de 2008, 14:52 »
0
Deberia decir "Hola Eternal" :),


he escrito un codigo que me cuenta el numero de letras "a" en la palabra "Hola".

El problema es que tabla1[4] es siempre igual que tabla1[3], con lo que la cuenta siempre es incorrecta.

Mis preguntas son dos:

- ¿Porque tabla1[4] es siempre igual a tabla1[3]? (Es que soy curioso...)

- ¿Hay alguna manera de  correctamente este ejercicio? Se me ocurre que la linea "sub cl, 1" se podria sustituir por "sub cl, 2", pero quiza haya alguna manera mas "seria"...


Código: Text
  1.  
  2.  
  3.   DOSSEG
  4.   .MODEL SMALL
  5.   .STACK 100h
  6.   .DATA
  7.  
  8. tabla1   DB "Hola"  &#59; Una tabla de 0Ah caracteres
  9. carac  DB "a"
  10.  
  11.   .CODE
  12.  
  13. INICIO:
  14.  
  15.  
  16.   mov ax, @data
  17.   mov ds, ax
  18.  
  19.   xor di, di
  20.  
  21.  
  22.   mov bh, carac[0]
  23.  
  24.  
  25. numero:  
  26.  
  27.   add cl, 1
  28.  
  29.  
  30.  
  31. bucle:
  32.  
  33.   mov bl, tabla1[di]  
  34.  
  35.   inc di
  36.  
  37.   cmp bl, carac
  38.   je numero
  39.  
  40.  
  41.   cmp di, 05h
  42.   jl bucle      
  43.  
  44.  
  45.  
  46.   sub cl, 1
  47.  
  48.  
  49.  
  50. FIN:
  51.  
  52.   mov ah, 4ch
  53.   int 21h
  54.   end INICIO
  55.  

Un saludo

Javier

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Contar El Numero De Veces Que Aparece Una Letra
« Respuesta #1 en: Viernes 22 de Febrero de 2008, 15:40 »
0
Cita de: "tirengarfio"
El problema es que tabla1[4] es siempre igual que tabla1[3], con lo que la cuenta siempre es incorrecta.

Mis preguntas son dos:

- ¿Porque tabla1[4] es siempre igual a tabla1[3]? (Es que soy curioso...)

tabla1   DB "Hola"  ; Una tabla de 0Ah caracteres
carac  DB "a"


En C:
tabla1[0] = 'H';
tabla1[1] = 'o';
tabla1[2] = 'l';
tabla1[3] = 'a';

¿Quien dijo que hay un tabla1[4]? Esta fuera de los limites y simplemente estas accediendo a carac que justamente es 'a'  ;)

Cita de: "tirengarfio"
- ¿Hay alguna manera de  correctamente este ejercicio? Se me ocurre que la linea "sub cl, 1" se podria sustituir por "sub cl, 2", pero quiza haya alguna manera mas "seria"...

Incializa asi: tabla1   DB "Hola",0 y recorre las cadenas justo hasta encontrarte el 0 terminador de las mismas.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

tirengarfio

  • Miembro activo
  • **
  • Mensajes: 29
    • Ver Perfil
Re: Contar El Numero De Veces Que Aparece Una Letra
« Respuesta #2 en: Viernes 22 de Febrero de 2008, 18:36 »
0
Citar
¿Quien dijo que hay un tabla1[4]? Esta fuera de los limites y simplemente estas accediendo a carac que justamente es 'a'  ;)


Ya se que esta fuera de los limites, pero ¿no te parece curioso que tabla1[4] albergue el mismo caracter que tabla1[3] siempre?

Citar
Incializa asi: tabla1   DB "Hola",0 y recorre las cadenas justo hasta encontrarte el 0 terminador de las mismas.

Ok, aqui abajo esta mi codigo haciendo lo que tu me dices. Pero en el caso de que la letra que estoy contando (la "a") sea la que termina la palabra (Hola), tu consejo no funciona, al menos como yo lo hago...


   
Citar
DOSSEG
   .MODEL SMALL
   .STACK 100h
   .DATA

tabla1  DB "Hola", 0  ; Una tabla de 0Ah caracteres
carac   DB "a"

   .CODE

INICIO:

   
   mov ax, @data
   mov ds, ax

   xor di, di


   mov bh, carac[0]


numero:   

   add cl, 1


bucle:

   mov bl, tabla1[di]   

   inc di

   cmp bl, carac
   je numero

   
   cmp tabla1[di], 0
   jnz bucle 
   

FIN:

   mov ah, 4ch
   int 21h
   end INICIO

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Contar El Numero De Veces Que Aparece Una Letra
« Respuesta #3 en: Viernes 22 de Febrero de 2008, 19:21 »
0
Cita de: "tirengarfio"
Ya se que esta fuera de los limites, pero ¿no te parece curioso que tabla1[4] albergue el mismo caracter que tabla1[3] siempre?

No ... es pura logica, cambia carac y tabla1[4] y tabla1[3] no seran iguales.

Cita de: "tirengarfio"
Ok, aqui abajo esta mi codigo haciendo lo que tu me dices. Pero en el caso de que la letra que estoy contando (la "a") sea la que termina la palabra (Hola), tu consejo no funciona, al menos como yo lo hago...

Nuevamente pura logica, si recorres la cadena HASTA encontrarte el cero (mientras no sea cero el byte apuntado por ponerlo de otra manera) no tiene ningun sentido que no sea capaz de contar una cadena como Hola. Simplemente es una implementacion incorrecta.


La etiqueta numero se ejecuta independientemente del contenido de la cadena, tenga la letra buscada o no, saltala y ademas de que cl tendra cualquier valor incialmente ... ponelo a 0 al principio. Si usas las dos veces bl para comparar te funcionara tambien para terminar el bucle, si usas tabla1[di] no funciona por haber incrementado di primero al ser 'a' (di apunta a 0) en bucle y despues al entrar nuevamente en bucle desde numero (si la cadena fuera "holas" no pasaria pero es un error) apunta a la 'a' de carac.

Si le asignas a bh carac[0] usalo en la comparacion posterior tambien ... y en lugar de add 1 podes usar inc.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.