Mis inicios en VB

Spoddysweg42 Mensajes publicados 1 Estado Miembro -  
NHenry Mensajes publicados 15235 Fecha de registro   Estado Moderador Última intervención   -
Hola, voy a mostrar aquí mi primer mensaje para que veáis uno de mis primeros códigos.
Desde hace poco me lancé a la programación en Vb.net, y me estoy probando con el código.

Recientemente he codificado una pequeña aplicación que permite procesar dos cadenas de caracteres para verificar si coinciden como un anagrama.
La aplicación funciona muy bien, pero un amigo me dijo que el código era "bastante pobre": ¿alguna idea para mejorarlo?
 Option Explicit On Option Strict On Module Module1 Sub Main() Dim mot1, mot2 As String 'Se declaran dos variables que contendrán las palabras a probar Console.Clear() Console.WriteLine("Introduce dos nombres para ver si son anagramas") Console.WriteLine("O escribe 'exit' para salir de la consola") mot1 = Console.ReadLine() If mot1 = "exit" Then Exit Sub Else mot2 = Console.ReadLine() 'Se lanzará nuestra función para probar las palabras If f_is_anagram(mot1, mot2) Then Console.WriteLine("Sí, es un anagrama !") Else Console.WriteLine("No, no es un anagrama") End If Console.ReadLine() Main() End If End Sub Function f_is_anagram(ByVal mot1 As String, ByVal mot2 As String) As Boolean 'Se pasa por ByVal porque no modificamos los datos de las variables mot1 y mot2 'Se realiza una prueba de longitud de las palabras, si no tienen la misma longitud no pueden ser anagramas Dim motTemp As String = mot1 If mot1.Length <> mot2.Length Then Return False End If 'Se realiza una prueba que toma las letras del mot 1 para retirarlas del mot 2 For i = 0 To mot2.Length - 1 motTemp = f_erase(mot1, Mid(mot2, i + 1, 1)) mot1 = motTemp Next If motTemp.Length = 0 Then Return True Else Return False End If End Function 'Se pasa un texto y una letra y la función devuelve el texto con la letra eliminada si está presente Function f_erase(ByVal pTexte As String, ByVal pLettre As String) As String Dim i As Integer = 0 Dim texte As String = pTexte While i < pTexte.Length If Mid(pTexte, i + 1, 1) = pLettre Then Return texte.Remove(i, 1) End If i = i + 1 End While Return texte End Function End Module 

1 respuesta

NHenry Mensajes publicados 15235 Fecha de registro   Estado Moderador Última intervención   387
 
Elimina la importación automática de "Microsoft.VisualBasic" (propiedades del proyecto -> "Referencias"), ya que este espacio de nombres es solo un elemento de compatibilidad que sirve únicamente para las transformaciones de VB6 -> VB.NET.

Mid(Machaine, ...) -> MaChaine.SubString(...)

Otra solución sería tomar las letras y ordenarlas alfabéticamente:
(Implicitamente, Option Infer On)
dim ltChaine1=(FROM lChar In MaChaine1.ToLower().ToCharArray() ORDER By lChar).ToArray() dim ltChaine2=(FROM lChar In MaChaine2.ToLower().ToCharArray() ORDER By lChar).ToArray()

(Código escrito directamente en el foro, puede contener errores)

Luego comparas los 2 arreglos (ignorando puntuación y espacios).

Intervengo principalmente en VB6 y VB.NET, con algo de C#, pero la moderación suele llevarme a otros lenguajes.
En VB.NET piensa en activar "Option Explicit" y "Option Strict"
0