Fusionner chaînes en alternant les lettres.

Résolu/Fermé
libellule123 Messages postés 4 Date d'inscription dimanche 11 septembre 2016 Statut Membre Dernière intervention 19 septembre 2016 - 11 sept. 2016 à 19:35
acive Messages postés 122 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 14 décembre 2016 - 12 sept. 2016 à 17:10
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.
A voir également:

7 réponses

acive Messages postés 122 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 14 décembre 2016 7
11 sept. 2016 à 19:41
Bonjour,
On veux bien, mais on a pas vu le début de ton code...
0
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
libellule123
12 sept. 2016 à 13:30
J'y penserais merci pour l'info.
0
acive Messages postés 122 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 14 décembre 2016 7
Modifié par acive le 11/09/2016 à 22:21
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
Utilisateur anonyme
11 sept. 2016 à 22:33
 
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
acive Messages postés 122 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 14 décembre 2016 7
Modifié par acive le 11/09/2016 à 22:36
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
Utilisateur anonyme
11 sept. 2016 à 22:53
 
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
libellule123 > Utilisateur anonyme
12 sept. 2016 à 13:54
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
Utilisateur anonyme > libellule123
12 sept. 2016 à 16:36
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
Modifié par Whismeril le 11/09/2016 à 22:48
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
acive Messages postés 122 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 14 décembre 2016 7
12 sept. 2016 à 12:53
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
libellule123
12 sept. 2016 à 14:02
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
acive Messages postés 122 Date d'inscription vendredi 29 août 2014 Statut Membre Dernière intervention 14 décembre 2016 7 > libellule123
12 sept. 2016 à 17:10
De rien...
N'oublie pas le fameux sujet résolu...
0
Utilisateur anonyme
11 sept. 2016 à 22:08
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
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
11 sept. 2016 à 22:26
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
Utilisateur anonyme > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
11 sept. 2016 à 22:40
 
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
Utilisateur anonyme > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
11 sept. 2016 à 23:05
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
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
12 sept. 2016 à 07:24
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
Utilisateur anonyme > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
12 sept. 2016 à 16:16
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