Mes débuts en VB

Fermé
Spoddysweg42 Messages postés 1 Date d'inscription mercredi 4 mars 2015 Statut Membre Dernière intervention 4 mars 2015 - Modifié par NHenry le 4/03/2015 à 21:58
NHenry Messages postés 15186 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 janvier 2025 - 4 mars 2015 à 21:58
Bonjour, je poste ici mon premier message pour vous montrer un de mes premiers codes.
Depuis peu je me suis lancé dans la programmation en Vb.net, et je m'essaye au code.

J'ai récemment codé une petite application qui permet de traiter deux chaînes de caractères pour vérifier si elle correspondent à un anagramme.
L'application fonctionne très bien, mais un ami m'a dit que le code était "Assez pauvre" des idées pour l'améliorer ?
Option Explicit On
Option Strict On

Module Module1

    Sub Main()
        Dim mot1, mot2 As String 'On déclare deux variable qui contiendront les mots à tester
        Console.Clear()
        Console.WriteLine("Entrez deux noms pour voir si ce sont des anagrammes")
        Console.WriteLine("Ou tappez 'exit' pour quitter la console")
        mot1 = Console.ReadLine()
        If mot1 = "exit" Then
            Exit Sub
        Else
            mot2 = Console.ReadLine() 'On va lancer notre fonction pour tester les mots
            If f_is_anagram(mot1, mot2) Then
                Console.WriteLine("Oui c'est un anagramme !")
            Else
                Console.WriteLine("Non, Ce n'est pas un anagramme")
            End If
            Console.ReadLine()
            Main()
        End If
    End Sub

    Function f_is_anagram(ByVal mot1 As String, ByVal mot2 As String) As Boolean 'On passe par le ByVal car on ne modifie pas les données des variables mot1 et mot2
        'On effectue un test de longueur des mots, s'ils n'ont pas la mêne longueur ils ne sont pas des anagrammes
        Dim motTemp As String = mot1
        If mot1.Length <> mot2.Length Then
            Return False
        End If
        'On effectue un test qui prends les lettres du mot 1 pour les retirer au 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
    'On passe un nom et une lettre et la fonction nous retourne le nom en enlevant la lettre si elle y est présente
    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
A voir également:

1 réponse

NHenry Messages postés 15186 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 19 janvier 2025 351
Modifié par NHenry le 4/03/2015 à 21:58
Retires l'import automatique de "Microsoft.VisualBasic" (propriétés du projet -> "références"), car cet espace de nom est juste un élément de compatibilité qui ne sert que pour les transformations de VB6 -> VB.NET.

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

Une autre solution serait de prendre les lettres et de les ranger par ordre croissant :
(Implicitement, 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()

(Code tapé directement sur le forum, peut contenir des erreurs)

Ensuite tu compares les 2 tableaux (en ignorant la ponctuation et les espaces).

J'interviens principalement en VB6 et VB.NET, avec un peu de C#, mais la modération m'amène souvent sur d'autre langages.
En VB.NET pensez à activer "Option Explicit" et "Option Strict"
0