Anagramme

Fermé
LeGeekduDimanche - Modifié par pijaku le 5/03/2015 à 08:03
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 6 mars 2015 à 14:03
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

pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
5 mars 2015 à 08:14
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 743
6 mars 2015 à 14:03
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