DUDA VB.NET: ¿Cómo saber si se escribió o no alguna palabra?

Iniciado por Crazy.sx, 17 Octubre 2019, 08:11 AM

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

Crazy.sx

Buenas noches gente, tantisimo tiempo!!
Hace rato que no programo y se me ocurrió volver a tocar un poco de código en VB.NET, estoy poniendome pruebas o desafíos yo mismo como para empezar a agarrar el ritmo, pero esto no se como hacerlo, me compliqué solo ;D

O sea, quiero intento hacer lo siguiente:

Tengo 2 textbox, en uno, un texto predeterminado sin errores, y en el otro donde yo transcribiré el texto que muestre el textbox anterior. Ejemplo:

Texto predeterminado:
Código (vbnet) [Seleccionar]
TextBox1.Text="Mi casa es muy confortable. Mi habitacion es calida. Mi mascota duerme"

Texto transcripto:
Código (vbnet) [Seleccionar]
TextBox2.Text="Mi casa es muy confortable. habitacion es es calida. Mi masc"


Lo que busco hacer es que presionando un botón, me diga, por ejemplo: "Olvidaste de escribir la palabra Mi"

Además como queriendo poner algun tipo de dificultad, hago como que no pude terminar de transcribir el Texto predeterminado, por lo que la palabra mascota del Texto transcripto no la escribo completa, repito 2 veces consecutiva la palabra es. (Esto lo hice porque primero intenté contar las palabras que tenía un texto y el otro, y así comparar las cantidades, o para evitar el uso del .Text.Contains o InStr (bueno, por lo menos hasta donde lo pude manejar jeje)

Espero que se entienda mi planteo, la verdad que ya no se como mas intentar o qué hacer porque me encontré limitado.

Saludos gente, un abrazo!!
Destruir K. LOL

Serapis

#1
y qué dificultad presenta el caso , como para que no puedas hacerlo ???.

Antes que programación, es un ejercicio de lógica...

¿no eres capaz de resolver la lógica subyacente indistintamente del lenguaje que se use?????.

Considera que tu texto se compone de 1 palabra seguida de ninguna una o más veces un espacio y una palabra... así queda definido:
texto = palabra [espacio palabra]*

Luego, lo primero que procede es considerar el espacio , pero 1 solo espacio, si no lo siguiente puede fallar... entonces una de dos, o tiras del funciones del lengueja o creas tu propia función. También debes decidir si importa o no la capitalización ¿A = a?...

A - Si tiras del lenguaje la función split, crea un array de un contenido, cortando precisamente por un 'substring'... el espacio, vale, pero 1 solo espacio, antes hay que asegurarse eso, que solo hay un espacio entre cada palabra.
Código (vbnet) [Seleccionar]

text2.text = String.Replace(text2.text, "  ", " ")  ' Remplazamos si hay 2 o más caracteres por solo 1.

Ahora obtener sendos arrays de palabras para el original y la seudocopia.
Código (vbnet) [Seleccionar]

dim palabras() as string = string.Split(texto2.text, " ")
dim original() as string = string.Split(text1.text, " ")


Finamente en un bucle comparar, sin hacer una búsqueda exhaustiva... simplemente se espera que cada palabra esté en su sitio, si no lo está se señala...
Código (vbnet) [Seleccionar]

for k= 0 to original.length
   if (palabras(n) <> original(k)) then
      ' Si además pretendes ver si aparece parcialmente...
       if original(k).Contains(palabras(n)) then
           msgbox "La palabra " & original(k) & " aparece incompleta: " & palabras(n)
           n = (n +1)
       else
           msgbox "Falta la palabra: " & original(k)
       end if
   else
       n = (n +1)
   end if
next


B - Si pretendes hacer tú mismo la función... básicamente puedes unificar todo en una sola funcionalidad, bastando con recorrer una sola vez el texto. y Se trata simplemente de operar con los caracteres sueltos... cuando aparezca un espacio, considera que la palabra acaba... y omites el resto de espacios hasta el siguiente carácter que no sea espacio... ahí considera que empieza otra palabra... el resto de la lógica es similar a lo de más arriba... pero como operas con caracteres, puedes o bien leer palabras enteras del original y luego buscar si la siguiente palabra en la copia es idéntica o solo parcial o es completamente distinta, o bien tratarlo carácter a carácter, si más de 1 caracter coinciden, y la palabra copia acaba podrás suponer que está incompleta, si no ausente.

Aumenta el índice de la copia, solo si coincide o coincide parcialmente, no si está ausente... pero así tampoco detecta si una palabra que aparece en copia no aparece en la original (pero este caso, no está recogido en tu exposición, igual que tampoco si coincide parcialmente pero son distintas palabras, solo la coincidencia parcial cuando es una palabra completa la parcial (esto es que le sigue un espacio o final del texto))... por ejemplo:
coincidencia parcial, pero no es una palabra completa el parcial... confort'able' versus agr'adable':
text2.text = "Mi casa es muy agradable. Mi habitacion es calida. Mi mascota duerme"
Palbara no existente, ausente en original: 'super' no aparece en la original.
text2.text = "Mi casa es muy confortable. Mi habitacion es super calida. Mi mascota duerme"
Tampoco recoge tu exposicion si contiene las palabras pero en otro orden:
text2.text = "es muy confortable Mi casa. es calida Mi habitacion . duerme Mi mascota"


Puede buscarse un enfoque más preciso, si queda claro el propósito final del asunto, si solo es escribir código por escribir, sin una especificación... queda abierto a cualquier cosa y cuando lo haga, todavía podrás inventar más 'reglas/casos' con las que fallaría el presente código... y así vas parcheando código. Procede siempre antes de escribir una sola línea de código definir una especificación completa de lo que se espera, sin supuestos cambios a posteriori al mero capricho.

...o dicho más llanamente, búscate algo más razonable que hacer como ejercicio, del que no tengas que inventarte sobre la marcha qué reglas quieres... por ejemplo toma 4 líneas de código de un lenguaje y define si al menos todas las palabras que aparecen forman parte de ese lenguaje, aunque no estén sintácticamente formadas.
Cuando te refresques del lenguaje, luego intenta definir si tal composición es o no sintácticamente correcta. Ahí las reglas están definidas, no pueden inventarse sobre la marcha, ni cambiarlas si no te gustan, etc...

Eleкtro

#2
Si lo quieres resolver por ti mismo, entonces ya te respondieron. Si no quieres reinventar la rueda y además buscas algo óptimo, entonces deberías usar un algoritmo Diff para .NET (el cual te devuelva las diferencias entre una cadena de texto y otra, y sus índices), por ejemplo:


Saludos.