Fusionner chaînes en alternant les lettres.

Résolu
libellule123 Messages postés 4 Statut Membre -  
acive Messages postés 129 Statut Membre -
Bonjour,
Je m'exerce à créer des fonctions, en ce moment j'essaie de créer une fonction qui me permettra de fusionner deux chaînes en alternant les lettres, par exemple si je saisie deux mots, le programme récupèrera la première lettre de chaque mots pour les placées dans un tableau "res" et ainsi de suite jusq'à avoir parcouru les deux mots .
Je ne sais pas si j'ai été claire, voici un exemple:
caramel
bonbons
le résultat donnera ceci : cbaornabmoenls
quelqu'un pourrais me mettre sur la voie ?
merci d'avance pour votre aide.

7 réponses

  1. acive Messages postés 129 Statut Membre 7
     
    Bonjour,
    On veux bien, mais on a pas vu le début de ton code...
    0
  2. libellule123
     
    Bonsoir, merci de me répondre.
    Pour le code j'avais débuté comme suis:
     Public Function fusion(ByVal mot1 As String, ByVal mot2 As String) As String
            
            Dim res As String = ""
    
            For i = 0 To mot1.Length And mot2.Length - 1
                mot1 = mot1.Substring(0)
                mot2 = mot2.Substring(0)
                res = mot1 & mot2
    
            Next
            Return res
    
     End Function


    je sais que le code n'est pas bon puisqu'il m'affiche même des lettres que je n'ai pas saisies.

    jusqu'a présent je n'avais travailler que sur une chaîne comme le code qui suit :

     Public Function tri(ByVal lexie As String) As String
    
            'On déclare la variable test qui est de type booleen qui prend la valeur "vraie".
            Dim Test As Boolean = True
    
            'On déclare la variable res qui est de type chaîne.
            Dim res As String
    
            'On déclare la variable car qui est de type caractère.
            Dim car As Char
    
            'On affecte à res la valeur de "lexie"
            res = lexie
    
            'booleen qui devient Vrai uniquement si le tri est correct.
            While Test = True
    
                'On affecte à "test" la valeur "faux"
                Test = False
    
                'boucle qui parcours le res tant que le booléen est à faux:
    
                'Pour i allant de res à la longueur du mot -2 (pourquoi pas -1 simplement car la comparaison du tri d'effectue sur 2 céllules donc à la fin du tri on se retrouverai en dehors du tableau) 
                For i = 0 To res.Length - 2
    
                    'si la valeur de la cellule est supérieur à la cellule qui suit, les inverser:
    
                    'Tant que res de i est suppérieur à res de i+1 Alors
                    If res(i) > res(i + 1) Then
    
                        'On affecte à car la valeur de res de i.
                        car = res(i)
                        res = res.Remove(i, 1)
                        res = res.Insert(i + 1, car)
                        Test = True
                    End If
                Next
            End While
            Console.ReadLine()
    
            Return res


    Pour la fonction que je souhaite créer je ne sais pas par quoi commencer.

    EDIT : Ajout des balises de code (la coloration syntaxique).
    Explications disponibles ici : ICI

    Merci d'y penser dans tes prochains messages.
    0
    1. libellule123
       
      J'y penserais merci pour l'info.
      0
  3. acive Messages postés 129 Statut Membre 7
     
    Ta formule me pose problème...
    Et si tu fais :
        Public Function fusion(ByVal mot1 As String, ByVal mot2 As String) As String
            Dim res As String = ""
            For i = 0 To mot1.Length -1
                res &= mot1.ToCharArray(i, 1) & mot2.ToCharArray(i, 1)
            Next
            Return res
        End Function
    


    Ca fonctionne...
    Mais que se passera-t-il quand le mot2 sera plus court que le mot1 ??? => Erreur...
    0
    1. Utilisateur anonyme
       
       
      Bonsoir acive,

      Quand mot2 sera plus court que mot1 (ou inversement, quand mot1
      sera plus court que mot2), il y aura effectivement un problème, car
      il faut gérer ce que j'appelle le « reliquat » : quand une chaîne est
      plus courte que l'autre.

      Dans ta boucle For .. Next, tu as mis : res &= ... ; j'ai été bien déçu,
      car j'ai cru que tu avais trouvé un moyen plus court pour mettre :
      res = res & ... ; hélas, avec mon VBA Excel 2007, ça produit une
      erreur de compilation ! Est-ce que tu as une version ultérieure
      avec laquelle ça marche ?

      Cordialement.  😊
       
      0
  4. acive Messages postés 129 Statut Membre 7
     
    Re:
    Oui pour moi c'est du VB.net avec une légère façon de réfléchir à la manière VB6

    Le problème n'est pas pas du tout le langage de programmation, c'est plutôt la façon de réfléchir que se passera-il quand la longueur des deux mots seront différents?
    Et d'ailleurs quel est le but concrètement?
    0
    1. Utilisateur anonyme
       
       
      1) Comme je l'ai indiqué à Whismeril dans mon message #8, je ne connais
          que le VBA Excel, pas les autres.

      2) libellule123 a bien précisé dans son énoncé initial qu'elle s'exerce à créer
          des fonctions, donc c'est peut-être juste un exercice d'entraînement (jeu)
          ou peut-être a-t-elle un exercice pour lequel le but est plus concret.

      3) Ma fonction Alterner() fait son travail sur les 2 chaînes jusqu'à la longueur
          de la chaîne la plus courte (alternance, donc) ; ensuite, si une chaîne est
          plus courte que l'autre, ajout du reliquat au résultat retourné ; reliquat :
          caractères en plus de la chaîne la plus longue. Une autre solution serait
          de ne pas concaténer ce reliquat au résultat, donc on ignorerait alors
          purement et simplement les caractères en trop (par rapport à la chaîne
          la plus courte).
       
      0
      1. libellule123 > Utilisateur anonyme
         
        Bonjour albkan, avant tout merci pour tes conseils.
        pour répondre a ce que tu as dit(libellule123 a bien précisé dans son énoncé initial qu'elle s'exerce à créer des fonctions, donc c'est peut-être juste un exercice d'entraînement (jeu) ou peut-être a-t-elle un exercice pour lequel le but est plus concret.)
        en fait je suis assistante maternelle et cela fait quelques mois que je me forme à la programmation afin de créer un programme qui me permettra de gérer aux mieux mes contrats. Pour cela j'ai commencer par étudié le langage SQL et par la suite je me suis lancé sur visual basic 2010 afin de m'exercer sur la créations de fonctions pour avoir des bases solides.
        C'est quelque chose qui me plait vraiment.
        voilà en tout cas encore merci pour ton aide, bien sur je ne vais pas faire du copier coller j'ai étudié ta façons de procéder et je pense que j'ai compris ou était mon erreur.
        Je dois bien penser lorsque je fait mon algo a ce que je souhaite retrouver dans mon programme en entrée et en sortie.
        En tout cas c'est plus clair pour moi.
        0
      2. Utilisateur anonyme > libellule123
         
         
        Bonjour libellule123,

        Merci pour ta réponse et tes éclaircissements. J'ai bien vu ton message #16
        et j'en ai parlé dans mon message #17.

        Ne culpabilise pas d'avoir indiqué avec du retard ta version de VBA : beaucoup
        d'autres membres n'indiquent jamais, malheureusement, la version du logiciel
        qu'ils utilisent, même pour Word et Excel.

        Bonne chance pour tes programmes de gestion de contrats
        d'assistante maternelle ; et c'est un très beau métier !

        Attention quand même à ne pas créer de nouveau baby boom : augmenter
        la démographie du pays, c'est très bien ; mais point trop n'en faut !  😉

        Cordialement.  😊
         
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    Bonsoir

    ToCharArray sert à convertir toute la chaine en tableau de char si on a besoin de faire plein de chose avec un tableau de char.
    C'est un peu long à l'exécution, donc dommage de le faire à chaque itération, pour optimiser le temps d'exécution (même si c'est peanuts) il est plus judicieux de convertir une fois les 2 tableaux et ensuite de travailler dessus.

    Une autre option est d'utiliser la méthode Chars(Index) qui retourne uniquement le caractère à l'index demandé.

    Comme acive le fait remarquer, il faut gérer les potentielles différences de taille.

    Voici une solution
       Public Function Fusion(ByVal Mot1 As String, ByVal Mot2 As String) As String
            'liste contenant les caractères mélangés, c'est moins contraignant qu'un tableau
            Dim debut As New List(Of Char)()
            
            Dim i As Integer
            'Mélange les lettres jusqu'à la fin du mot le plus court
            For i = 0 To Math.Min(Mot1.Length, Mot2.Length) - 1
                debut.Add(Mot1.Chars(i))
                debut.Add(Mot2.Chars(i))
            Next i
    
            'ajoute la fin du mot le plus long s'il y a
            Dim fin As String = ""
            Select Case Math.Sign(Mot1.Length - Mot2.Length)
                Case 1 'Mot1 est le plus long
                    fin = Mot1.Substring(i)
    
                Case -1 'Mot2 est le plus long
                    fin = Mot2.Substring(i)
            End Select
    
            Return String.Join("", debut) & fin
        End Function
    
    
    
    'testé avec
    Dim toto As String = Fusion("bonjour", "1234567")
    Dim tota As String = Fusion("bonjour", "123456789")
    Dim toti As String = Fusion("bonjour", "12345")
    


    Quand j'étais petit, la mer Morte n'était que malade.
    George Burns
    0
  7. acive Messages postés 129 Statut Membre 7
     
    Oui... il existe pas mal de façons de le faire...

    Public Function Fusionne(ByVal a As String, ByVal b As String)
            Dim res As String = ""
            Dim mot1 As List(Of Char) = a.ToList
            Dim mot2 As List(Of Char) = b.ToList
            Dim i As Integer
            If mot2.Count > mot1.Count Then
                For i = 0 To mot1.Count - 1
                    res &= mot1(i) & mot2(i)
                Next
                res &= b.Substring(i, b.Length - i)
            Else
                For i = 0 To mot2.Count - 1
                    res &= mot1(i) & mot2(i)
                Next
                res &= a.Substring(i, a.Length - i)
            End If
            Return res
        End Function
    
    0
    1. libellule123
       
      Merci acive pour tes éclaircissements, j'ai expliquer plus haut le but de mon travail et c'est vrai j'aurais du prévenir que je travaillais avec visual basic 2010
      merci encore
      0
      1. acive Messages postés 129 Statut Membre 7 > libellule123
         
        De rien...
        N'oublie pas le fameux sujet résolu...
        0
  8. Utilisateur anonyme
     
    Bonsoir libellule123,

    Je te propose cette solution : Fichier Excel 2007
    que j'ai faite avant ton message #2.

    Sur la feuille de calcul, tu verras 3 exemples ; et la fonction
    est dans le Module1. Je te laisse adapter ton propre code
    VBA selon ma fonction Alterner().

    Regarde attentivement le problème du reliquat, quand une
    chaîne de caractères est plus courte que l'autre.

    Dis-moi ce que tu en penses, et si ça te convient. Si oui,
    merci d'aller en haut de page pour cliquer sur le lien
    « Marquer comme résolu ».

    Cordialement.  😊
     
    -1
    1. Utilisateur anonyme
       
      Bonsoir, si tu regardes bien son code, tu verras des choses qui n'existent pas en VBA.
      C'est du VB.net.
      Et les deux couchent très mal ensemble.
      0
      1. Utilisateur anonyme > Utilisateur anonyme
         
         
        Bonsoir Whismeril,

        J'avais bien précisé dans mon article que j'ai fait ma solution avant que
        libellule123 poste son message #2. Donc, comme rien n'était précisé
        pour la version du VB, j'ai pensé que c'était peut-être du VBA Excel.

        Je connais seulement le VBA Excel, pas les autres ; tu as probablement raison,
        et dans ce cas tu as bien fait de noter mon article -1, sauf qu'en VBA Excel,
        ça marche parfaitement bien, et ça pourrait servir à d'autres.

        Cordialement.  😊
         
        0
      2. Utilisateur anonyme > Utilisateur anonyme
         
        Whismeril,

        Pour éviter les erreurs sur les versions de VBA, pourrais-tu créer
        un forum « Programmation: VBA Excel » spécifique ?

        Merci d'avance si tu veux bien le faire.

        Cordialement.  😊
         
        0
    2. Utilisateur anonyme
       
      Bonjour,

      Sur CodeS SourceS cette séparation existe, et 90% des questions posées ne le sont pas dans le bon forum. Une majorité parce que les gens ne savent même pas avec quel language ils travaillent et les autres par feignantise/bêtise (il arrive régulièrement qu'un membre à qui la modération a déplacé plusieurs messages s'obstine à poster dans le mauvais forum).
      Une remise à plat des catégories est demandée au moins depuis que CCM a racheté CS, avant je ne sais pas.
      Le débat a récemment été relancé sur CS http://codes-sources.commentcamarche.net/forum/affich-10068031-choisir-les-priorites-pour-codes-sources , mais ça ne déchaîne pas les foules.

      Seuls les employés de CCM (et ils sont peu) peuvent modifier les catégories, je te conseille donc, si tu y tiens, d'en parler à Noctambule ou Crashounette.
      0
      1. Utilisateur anonyme > Utilisateur anonyme
         
        Bonjour Whismeril,

        Merci pour ta réponse très claire. Compte tenu de ce que tu as écris, je renonce
        à demander la création d'un forum "Programmation:VBA Excel" spécifique.

        Quand je vois une chose spéciale dans un code VBA, je me dis parfois que
        c'est peut-être une nouveauté des versions ultérieures de VBA Excel, et pas
        forcément d'une autre version VB (VB6, VB.Net, ou autre...).

        Si je refais la même erreur à l'avenir, je compte sur ta diligence (ou celle
        d'un autre intervenant) pour me noter à nouveau -1 comme il se doit.

        Bien sûr, l'idéal serait tout simplement que le demandeur précise toujours
        la version de VBA qu'il utilise (et cela de façon systématique) !

        Pour ce sujet, merci à libellule123 d'avoir indiqué dans son message #16
        qu'elle utilise Visual Basic 2010.

        Cordialement.  😊
         
        0