Anagramme

LeGeekduDimanche -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'ai codé un anagramme avec une fonction est-ce que le code serait pareil avec une procédure ?

Function fNom(nom1 As String, nom2 As String) As String
        Dim val1 As Integer
        Dim val2 As Integer

        Dim tempval As Integer = 0
        Dim tempval2 As Integer = 0

        For i = 1 To Len(nom1)
            val1 = Asc(UCase(Mid(nom1, i, 1))) - 64
            tempval = val1 + tempval
        Next

        For i = 1 To Len(nom2)
            val2 = Asc(UCase(Mid(nom2, i, 1))) - 64
            tempval2 = val2 + tempval2
        Next

        If Len(nom1) = Len(nom2) And nom1 = nom2 Then
            Return CStr(False)
        End If


        If Len(nom1) <> Len(nom2) Then
            Return CStr(False)
        ElseIf tempval = tempval2 Then
            Return CStr(True)
        Else
            Return CStr(False)
        End If


    End Function


    Sub Main()
        Dim nom1 As String
        Dim nom2 As String
        Console.Write("Entrer un mot : ")
        nom1 = Console.ReadLine
        Console.Write("Entrer un deuxième mot : ")
        nom2 = Console.ReadLine

        If CBool(fNom(nom1, nom2)) = False Then
            Console.WriteLine("Ce n'est pas un anagramme ! ")
        Else
            Console.WriteLine("C'est un anagramme ! ")
        End If

        Console.ReadLine()
    End Sub

2 réponses

  1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    La différence entre une function et une Sub, est la même que dans tout langage de programmation.
    Une fonction retourne une valeur.
    Une procédure est une fonction qui ne retourne pas de valeur.

    Si tu veux transformer ta function en Sub, tu as deux possibilités :
    1- passer la "réponse attendue" en paramètre de cette Sub
    2- avoir une variable de portée "Module" pour cette "transmission".

    Exemple :
    Sub Main()
    Dim Nb_1 As Integer, Nb_2 As Integer, Resultat As Integer
    
    Nb_1 = 12: Nb_2 = 15
    Resultat = Addition(Nb_1, Nb_2)
    End Sub 
    
    Function Addition(Nb1 As Integer, Nb2 As Integer) As Integer
        Addition = Nb1 + Nb2
    End Function


    Peut s'écrire :
    1-
    Sub Main()
    Dim Nb_1 As Integer, Nb_2 As Integer, Resultat As Integer
    
    Nb_1 = 12: Nb_2 = 15
    Call Addition(Nb_1, Nb_2, Resultat)
    MsgBox Resultat
    End Sub 
    
    Sub Addition(Nb1 As Integer, Nb2 As Integer, Res As Integer)
        Res = Nb1 + Nb2
    End Sub

    2-
    Dim resultat As Integer
    
    Sub Main()
    Dim Nb_1 As Integer, Nb_2 As Integer
    
    Nb_1 = 12: Nb_2 = 15
    Call Addition(Nb_1, Nb_2)
    MsgBox resultat
    End Sub 
    
    Sub Addition(Nb1 As Integer, Nb2 As Integer)
        resultat = Nb1 + Nb2
    End Sub


    Ces trois méthodes sont strictement identiques. Quoique la première, avec une Function, est plus logique.

    Nota : Dans ton exemple, tu t'embrouilles pour rien en passant des String en Booléen et inversement.
    Tu y gagnerais en traitant tout en Booléen, y compris ta Function.
    Regarde ceci :
    Function fNom(nom1 As String, nom2 As String) As Boolean
            Dim val1 As Integer
            Dim val2 As Integer
    
            Dim tempval As Integer = 0
            Dim tempval2 As Integer = 0
    
            For i = 1 To Len(nom1)
                val1 = Asc(UCase(Mid(nom1, i, 1))) - 64
                tempval = val1 + tempval
            Next
    
            For i = 1 To Len(nom2)
                val2 = Asc(UCase(Mid(nom2, i, 1))) - 64
                tempval2 = val2 + tempval2
            Next
    
            If Len(nom1) = Len(nom2) And nom1 = nom2 Then
                Return False
            End If
    
            If Len(nom1) <> Len(nom2) Then
                Return False
            ElseIf tempval = tempval2 Then
                Return True
            Else
                Return False
            End If
    
        End Function
    
        Sub Main()
            Dim nom1 As String
            Dim nom2 As String
            Console.Write("Entrer un mot : ")
            nom1 = Console.ReadLine
            Console.Write("Entrer un deuxième mot : ")
            nom2 = Console.ReadLine
    
            If fNom(nom1, nom2) = False Then
                Console.WriteLine("Ce n'est pas un anagramme ! ")
            Else
                Console.WriteLine("C'est un anagramme ! ")
            End If
    
            Console.ReadLine()
        End Sub
    0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour LeGeekduDimanche, le forum,

    Je n'avais pas répondu, par manque de temps, sur le fond de la macro.
    Dans ta fonction, tu considères chaque lettre composant tes deux mots comme des nombres. A = 1, B = 2, C = 3 etc, Z = 26.
    Ensuite, pour chacun des 2 mots, tu additionnes les nombres correspondants à leurs lettres.
    Pour finir, tu dis que si les sommes sont identiques alors les mots sont des anagrammes.

    Donc, d'après ton raisonnement, AD (1+4=5) est l'anagramme de BC (2+3=5)...
    0