Anagramme
LeGeekduDimanche
-
pijaku Messages postés 13513 Date d'inscription Statut Modérateur Dernière intervention -
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 ?
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
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 :
Peut s'écrire :
1-
2-
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 :
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
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)...
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)...