Autor Tema: PIC16f84a  (Leído 2311 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Anastasia

  • PIC10
  • *
  • Mensajes: 3
PIC16f84a
« en: 06 de Mayo de 2017, 14:41:45 »
f
« Última modificación: 06 de Mayo de 2017, 18:44:10 por Anastasia »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar palabras en PIC16f84a
« Respuesta #1 en: 06 de Mayo de 2017, 15:22:00 »
Si los espacios no se pudieran repetir, entonces seria mas simple.

Primero fijemonos en los caracteres que pueden separar las palabras: '.' ,',' y ' '.

Son esos 3. El problema es que pueden repetirse, es decir "hola . Como, estas"
Ahi tendriamos 3 palabras, pero debido a que se encuentra un espacio con el punto y/o la coma, debemos prevenir esto.

Como detectar el fin de la palabra y sumar el contador? Eso lo hacemos cuando detectamos cualquiera de los caracteres especiales que desde ahora le llamo DELIMITADORES que son la coma, el punto y el espacio. El problema es la posibilidad de contar mas palabras de las que hay como ya dijimos debido a que puede haber mas delimitadores juntos.
La solucion para mi es que vas a necesitar de al menos 2 registros y una tabla con los "delimitadores".

1 registro para mantener la cuenta de las palabras
1 registro para mantener el caracter anterior..

Al comienzo cargamos nuestro registor de "Caracter anterior" con uno cualquiera de nuestros DELIMITADORES, suponete el espacio ' '.
Tenemos la primer letra.. Pueden ocurrir 2 cosas.
- Que el "caracter actual" sea un DELIMITADOR como seria el punto, la coma y el espacio. Lo cual apartir de aca nos queda verificar 2 cosas. Que el "caracter anterior" sea o no un delimitador, si lo es entonces no sumamos nada, cambiamos nuestro "caracter anterior" (poniendo el actual en el registro del anterior) y procedemos a leer la proxima letra. Y la otra que puede suceder es que el caracter anterior no sea un delimitador, esto quiere decir que termino la palabra y por lo tanto debo sumar 1

- O que sea una letra de una palabra, en este caso no hacemos nada.

Es decir el unico momento que voy a sumar 1 es cuando se cumple las siguientes condiciones:

- Caracter anterior distinto de cualquier de los delimitadores
- Caracter actual igual a uno de los delimitadores.

Hagamos un string de ejemplo:

" Hola, Como ,.Estas"

Creo que seria tu peor caso, teniendo en cuenta las condiciones que nombre antes, apenas comienza dijimos que cargamos si o si el caracter anterior con un delimitador, esto nos permite si hay un espacio, punto o coma al comienzo no sea contado como palabra, asi hasta llegar a la 'a' de Hola. es alli cuando nuestro registros quedarian:
Caracter anterior = 'a'
Caracter actual = ','

En ese punto es el unico que se cumple las condiciones dadas y procede a incrementar el registro de contador de palabras.

Por otro lado seria bueno que ademas de el punto, la coma y el espacio, tengas un caracter que delimite el string, Ya que programas en ASM esto no suele suceder. en C los string terminan en 0x00, entonces en ese caso que tengas una terminacion como en C agregues el 0x00 como un delimitador mas. Sino no contaria la ultima palabra.

Desconectado Anastasia

  • PIC10
  • *
  • Mensajes: 3
PIC16f84a
« Respuesta #2 en: 06 de Mayo de 2017, 18:00:44 »
f
« Última modificación: 06 de Mayo de 2017, 18:46:05 por Anastasia »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Contar palabras en PIC16f84a
« Respuesta #3 en: 06 de Mayo de 2017, 18:23:30 »
Recorda que para contar ( sumar 1 al registro de cantidad de palabras) debe cumplirse que:

Citar
- Caracter anterior distinto de cualquier de los delimitadores
- Caracter actual igual a uno de los delimitadores.

La condicion era cargar el registro de "caracter anterior" con un delimitador al inicio, ya que no existe ningun caracter anterior en ese momento, pero cargandolo de esa forma te protejes de si hay un espacio, coma o punto al principio.

Y si hay 2 espacios, comas o puntos o una combinacion de estos juntos, no se contaria, ya que 1 de esos quedaria en "caracter anterior" por lo tanto ya no cumple la condicion y no sumariamos. En resumen solucionamos el otro problema.

Te di el ejemplo antes... vamos a hacerlo mas grafico.

" Hola, Como  ,.Estas"

Al comienzo tenemos:
Caracter anterior = espacio
Caracter actual = espacio

Lo voy a abreviar asi: {c. anterior ; c. actual } para que sea mas entendible cada "vuelta" en tu loop/bucle que hagas.

Los siguientes van a quedar esos 2 registros con estos valores y ademas voy a nombrar cuando es que se cumple la condicion

Código: [Seleccionar]
{C. anterior ; C-actual} -> Condicion cumplida para sumar
{' ';'H'} -> NO
{'H';'o'} -> NO
{'o';'l'} -> NO
{'l';'a'} -> NO
{'a';','} -> SI
{',';' '} -> NO
{' ';'C'} -> NO
{'C';'o'} -> NO
{'o';'m'} -> NO
{'m';'o'} -> NO
{'o';' '} -> SI
{' ';' '} -> NO
{' ';','} -> NO
{',';'.'} -> NO
{'.';'E'} -> NO
{'E';'s'} -> NO
{'s';'t'} -> NO
{'t';'a'} -> NO
{'a';'s'} -> NO
{'s';0x00} -> SI ( Aca si si es que agregas al 0x00 como terminacion de la string y como un delimitador, no se como saben cuando termina la string)

Como observas los unicos que cumplen estas condiciones son los fines de las palabras, por mas que uno agregue muchos de estos caracteres no van a tener influencia sobre los anteriores.

Esto o lo haces aparte del programa de copiado desde la EEPROM a la RAM, o lo incorporas junto a esa rutina.

Mas rapido computacionalmente: Incorporarlo en la rutina EEPROM -> RAM
Mejor para vos ya que tenes el codigo separado y podes usarlo en otro lado/proyecto: Hacelo despues de que copies todo a la RAM en su subrutina aparte.

Todo depende de que finalidad queres darle a tu codigo.
« Última modificación: 06 de Mayo de 2017, 18:28:25 por KILLERJC »


 

anything