IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Lister toutes les possibilités de casse d'une chaîne


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut Lister toutes les possibilités de casse d'une chaîne
    Bonjour,
    j'ai une chaîne de 16 caractères et je voudrais lister toutes les possibilités de casse de cette chaîne (majuscule ou minuscule pour chaque lettre)
    par ex : MaCHaineDeCARaCtEres, maChAINEdEcaRActeReS, etc...

    j'ai réussi avec des for...next mais avec 16 lettres c'est assez laborieux donc je me dit qu'il y a sûrement plus simple (désolé je suis débutant...)

    Sur 16 caractères ça fait 2^16 = 65536 possibilités. J'ai essayé en m'aidant d'un tableau de bits (je me suis dit que ça se rapprochait plus ou moins de ça) mais je n'ai pas réussi à faire fonctionner l'exemple de la faq (ici)

    Merci

  2. #2
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    up!

  3. #3
    Membre actif Avatar de hellspawn_ludo
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    257
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 257
    Points : 215
    Points
    215
    Par défaut
    Bonjour,

    Moi non plus je n'ai pas réussi avec l'exemple.

    Cependant vu que tu y arrives avec For..Next, pourquoi veux-tu utilisé un tableau de bits ?

    C'est plus rapide ou cherches-tu quelques chose de plus simple que le For..Next qui lui est déjà facile à utiliser ?

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    291
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 291
    Points : 270
    Points
    270
    Par défaut
    Bonjour,

    Quel est ton but final?
    Tu vais comparer deux chaînes? Dans ce cas, utilises Upper

    Gwendal

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    En fait, je pensais trouver une fonction plus courte qu'un emboitement de 16 for... next.
    C'est pas grave merci pour vos réponses en tout cas

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Après moultes heures de recherche, j'ai réussi à résoudre mon problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    Imports System.IO
    Sub CaseLister()
            Dim InputString As String = "machaine"
            Dim Possibilite, Position As Integer
            Dim OutputString, PossBinaire As String
            Dim Caractere As Char()
            Dim MyWriter As New StreamWriter("CaseList.txt")
     
            InputString = InputString.ToLower() 'Convertit la chaîne en minuscules
            InputString = InputString.Trim(" ") 'Enlève les espaces de chaque côté
     
            Caractere = InputString.ToCharArray 'Place la chaîne dans un tableau de caractères
     
            For Possibilite = 0 To 2 ^ InputString.Length - 1 'Nombre de possibilités de casse différentes
     
                'Transforme le numéro de possibilité en binaire puis en string en complétant avec des 0
                PossBinaire = Convert.ToString(Convert.ToByte(Possibilite), 2).PadLeft(InputString.Length, "0")
     
                OutputString = ""
     
                'Vérifie si chaque lettre de la chaîne Possibilite est un 0 ou un 1 
                'et met la lettre correspondante de la chaîne Inputstring en majuscule
                For Position = 0 To InputString.Length - 1
                    If PossBinaire.Chars(Position) = "1" Then
                        OutputString += Caractere(Position).ToString.ToUpper()
                    Else
                        OutputString += Caractere(Position).ToString.ToLower()
                    End If
                Next Position
     
                MyWriter.WriteLine(OutputString) 'Ecrit le résultat dans le fichier txt
     
            Next Possibilite
     
            MyWriter.Close()
            Process.Start("Notepad.exe", "CaseList.txt") 'Ouvre le fichier txt
    End Sub
    J'imagine que ce n'est pas encore optimal mais ça marche et c'est bien plus court que ce que j'avais fait au départ.
    Dites-moi ce que vous en pensez

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Moi je trouve cette solution plutôt astucieuse. C'est quand même beaucoup plus sexy qu'une grosse pelle de 'for'.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    J'ai enlevé le "résolu" car j'ai une erreur lorsque je mets une chaîne de plus de 8 caractères.
    "Unhandled exception has occured bla bla...
    Value was either too large or too small for an unsigned byte"
    Je pense donc que c'est la conversion de la variable "possibilité" en binaire qui pose problème.
    Est-ce que quelqu'un a une idée ?

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    je t'ai fait une méthode avec une procédure récursive (qui s'appelle elle meme)
    ca a l'air de marcher
    pour le tester il suffit d'un bouton button1 et d'un textbox textbox1
    j'ai essayé avec 10 caractère, le temps de traitement est d'environ 40 secondes, je sais pas si ton code est plus rapide ...
    y a encore moyen de trouver d'autres algo je pense

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim chaine As String
            chaine = InputBox("chaine à listcaser ?")
            TextBox1.Text = ""
     
            Dim strB, strB2 As New System.Text.StringBuilder
     
            listecase(strB, chaine)
     
            For Each a As String In liste
                TextBox1.Text = TextBox1.Text & a & vbCrLf
            Next
     
        End Sub
     
        Private liste As New Collection
     
        Private Sub listecase(ByVal strB As System.Text.StringBuilder, ByVal chaine_restante As String)
            If chaine_restante.Length = 0 Then
                liste.Add(strB.ToString)
            Else
                Dim a As New System.Text.StringBuilder
                a.Append(strB.ToString)
                Dim b As New System.Text.StringBuilder
                b.Append(strB.ToString)
     
                Debug.Print(a.ToString)
                a.Append(LCase(chaine_restante.Chars(0)))
                listecase(a, Microsoft.VisualBasic.Right(chaine_restante, Len(chaine_restante) - 1))
     
                Debug.Print(b.ToString)
                b.Append(UCase(chaine_restante.Chars(0)))
                listecase(b, Microsoft.VisualBasic.Right(chaine_restante, Len(chaine_restante) - 1))
     
            End If
     
        End Sub
    les stringbuilder sont réputés plus rapide que les string pour des traitements
    faudrait voir pour changer le chaine_restante en stringbuilder aussi ...

    pour des calculs précis de temps :
    dim chrono as system.diagnostrics.stopwatch
    chrono.start
    ...
    chrono.stop
    chrono.ellapsedmilliseconds donne le temps en ms
    chrono.reset


    enfin sinon, quel est le but de ce code ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Merci pour ta réponse mais fallait pas t'embêter à refaire un programme complet.
    Je vais essayer ce que ça donne en tout cas. Merci
    J'ai pas chronométré mon code mais pour 8 caractères, c'est quasiment instantané (quelques secondes pas plus). Je reposterai pour donner le temps exact.
    Par contre, les string builders, je sais pas ce que c'est...
    Sinon si quelqu'un peut me dire pourquoi mon code limite la chaîne à 8 caractères... Ca me permettrait de comprendre.

  11. #11
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est un code fait en 2 minutes ...
    pour 8 caractères je mets 2 secondes à vu de nez
    mais c'est exponentiel c'est pour ca que ca peut vite grimper

    un stringbuilder c'est une classe qui n'est pas tout à fait un string et qui a plein de fonction de manipulation de sa valeur string

    sinon ton erreur c'est une variable qui depasse sa capacité on dirait, et meme un short (int16) à priori
    or tu n'as déclaré qu'un integer
    donc ca doit etre une variable que tu utilises qui est un int16 sans que tu le sache
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    ah si, trouvé:
    Convert.ToByte(Possibilite)

    tobyte veut dire entre 0 et 255 (int8)



    et en fait c'est l'affichage dans le textbox qui est long
    lol
    je mets une seconde à calculer et le reste à faire la boucle pour mettre dans le textbox

    et en utilisant
    Dim strtot As New System.Text.StringBuilder
    For Each a As String In liste
    strtot.Append(a & vbCrLf)
    Next
    TextBox1.Text = strtot.ToString
    c'est instantanné
    normal vu que textbox.text déclenche plein de code sur l'objet
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Merci
    Effectivement, j'ai une variable integer "possibilite" qui s'incrémente de 0 à 2^(nb de caractères de la chaîne)
    Ensuite je convertis cette variable en binaire (par ex : 13 devient 00001101)
    Enfin, je mets en majuscules les caractères qui correspondent aux '1'
    Pour l'exemple "machaine" devient
    00001101
    machAInE
    Du coup s'l y a plus de 8 caractères la valeur binaire de "possibilite" ne tient plus sur un octet
    Comment je peux convertir un int16 ou un int32 en binaire alors ?

  14. #14
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    tu le découpes en 2 ou en 4 ...
    avec des masques peut etre ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Pas bête ça
    faudrait que je divise l'integer par 255 pour le traiter en 2 fois et concaténer les strings ensuite
    Je vais essayer ça
    Bizarre qu'il n'y ait pas de fonction pour convertir directement en binaire un nombre supérieur à 255...

  16. #16
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si ca doit se trouver
    tout existe dans le framework
    faut chercher dans les espaces de noms...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par sperot51
    si ca doit se trouver
    tout existe dans le framework
    faut chercher dans les espaces de noms...
    Tu as tout à fait raison, j'en veux pour preuve, cette classe :
    Ainsi que sa méthode
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  18. #18
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Merci SaumonAgile mais je n'arrive pas à comprendre cette fonction...
    Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim mybytearray As Byte() = BitConverter.GetBytes(13)
    RichTextBox1.Text = BitConverter.ToString(mybytearray)
    et j'obtiens de l'hexadecimal : "0D-00"
    Est-ce que quelqu'un peut m'expliquer comment simplement convertir un entier en binaire ?
    Merci

  19. #19
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    c'est le tostring qui fait que tu obtiens de l'hexa
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #20
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 38
    Points : 17
    Points
    17
    Par défaut
    Oui mais j'ai besoin d'une string puisque j'analyse les caractères ensuite...
    Par exemple si possibilite = 13 je veux le convertir en binaire (1101) puis en string ("00001101")
    J'ai fait d'autres essais mais je n'y arrive pas

Discussions similaires

  1. Réponses: 14
    Dernier message: 16/08/2014, 19h05
  2. [MySQL] avec php lister toutes les bases de donnée d'une serveur sql
    Par sebou07 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 17/01/2012, 21h00
  3. Réponses: 2
    Dernier message: 14/08/2006, 19h23
  4. [debutant] lister tout les mots d'une page web!
    Par kriskikout dans le forum Web
    Réponses: 20
    Dernier message: 31/05/2006, 22h47
  5. [MySQL] lister toutes les tables d'une base
    Par Tr@nkill dans le forum Langage SQL
    Réponses: 8
    Dernier message: 14/04/2006, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo