Transformation d'une chaine de caractères

anthony.unac

XLDnaute Occasionnel
Bonjour,

Prenons un réel mettons sqrt(2) et intéressons nous à ses décimales :
414213562373095...

Réécrivons ces décimales en utilisant le fait que chaque décimale *appelle* une autre décimale :
4 appelle la 4e décimale à savoir 2
1 appelle la 1ere décimale à savoir 4
42 appelle la 42e décimale à savoir 1
(et oui car 4 à déja était appelé donc on prend l'entier composé par deux décimales)
13 appelle la 13e décimale à savoir 0
5 appelle la 5e décimale à savoir 1
6 appelle la 6e décimale à savoir 3
....
On aboutit au final à la création d'un réel dont les décimales sont :
24101314597...

Comment puis je m'y prendre pour créer un programme sous excel pour aboutir au résultat ci dessus ?

Je pensais partir sur une macro qui demande dès l'ouverture du fichier à l'utilisateur de saisir une suite de n décimales (sous forme de box)
Ensuite je voulais récupérer la suite de décimales saisie pour la traiter à l'aide de l'algorithme suivant :
algorithme.jpg

Mais je bloque complètement avec le VBA.

Mon programme pourrait commencer par la déclaration des variables ainsi que leurs initialisations.
Je distingue ainsi 3 variables, 1 constante et un tableau :
*******************************************
* i, j, k qui sont des variables entières
* n qui est une constante représentant le nombre de décimales saisies par l'utilisateur
* tab qui est un tableau

Initialisation :
**********
i:=1
j:=0
k:=1
n dépend directement du nombre de décimales inscrites par l'utilisateur
tab=0


Cordialement
Anthony
 

Pièces jointes

  • algorithme.jpg
    algorithme.jpg
    58.8 KB · Affichages: 324
  • algorithme.jpg
    algorithme.jpg
    58.8 KB · Affichages: 321

TempusFugit

XLDnaute Impliqué
Re : Transformation d'une chaine de caractères

Bonjour

Il s'agit d'une InputBox et non d'une TextBox.
Code:
Private Sub Workbook_Open()
Decimales = InputBox("Bonjour, veuillez inscrire une suite de décimales")
End Sub
C'est un peu léger comme code non ?


Pour le reste, peux-tu donner plus de détails et un exemple complet avec un entier.
(Situation de départ et résultat à obtenir) le tout dans un fichier excel joint.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Transformation d'une chaine de caractères

Bonsoir,
le sujet pourrait être intéressant mais les informations manquent de précision :
4 appelle la 4e décimale à savoir 2
1 appelle la 1ere décimale à savoir 4
ok
42 appelle la 42e décimale à savoir 1
et s'il n'y a pas de 42ème décimale, on fait quoi ?
Comment puis je m'y prendre pour créer un programme sous excel pour aboutir au résultat ci dessus ?
tu veux quoi exactement ? Une procédure ou un algorithme ? Parce que là, ton code est bien pauvre en l'état.
Quel est ton niveau en VBA ?
A+
 

anthony.unac

XLDnaute Occasionnel
Re : Transformation d'une chaine de caractères

Bonsoir David
et s'il n'y a pas de 42ème décimale, on fait quoi ?

On prend 0 en partant du principe 0,1234 par exemple est égal à 0,123400000000...

tu veux quoi exactement ? Une procédure ou un algorithme ?

Je souhaite un code qui respecte au mieux l'algorithme que j'ai fourni.
Le revoici : algorithme.jpg

Quel est ton niveau en VBA ?

Pas top, je sais (comme vous l'avez remarqué) inviter l'utilisateur à saisir sa chaine de décimales mais c'est après que je bloque.
Je ne sais pas en fait coder mon algorithme.

Cordialement
Anthony
 

Pièces jointes

  • algorithme.jpg
    algorithme.jpg
    58.8 KB · Affichages: 92
  • algorithme.jpg
    algorithme.jpg
    58.8 KB · Affichages: 83

anthony.unac

XLDnaute Occasionnel
Re : Transformation d'une chaine de caractères

Bonsoir,

Il s'agit d'une InputBox et non d'une TextBox.

Vous avez entièrement raison.

Code:
Private Sub Workbook_Open()
Decimales = InputBox("Bonjour, veuillez inscrire une suite de décimales")
End Sub
C'est un peu léger comme code non ?

Non, non ça suffit amplement pour inviter l'utilisateur à saisir sa chaine de décimales :eek:

Pour le reste, peux-tu donner plus de détails et un exemple complet avec un entier.
Ah ça par contre il me semble que je l'ai fait avec d'une part un exemple numérique et d'autre part (peut etre est ce le plus important) avec l'algorithme.

Cordialement
Anthony
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Transformation d'une chaine de caractères

Re
Bonsoir David
Envoyé par david84
et s'il n'y a pas de 42ème décimale, on fait quoi ?
On prend 0 en partant du principe 0,1234 par exemple est égal à 0,123400000000...
ok
4 appelle la 4e décimale à savoir 2
1 appelle la 1ere décimale à savoir 4
et si la décimale est 0 ? elle appelle quoi ? 0 ?
Je souhaite un code qui respecte au mieux l'algorithme que j'ai fourni.
Si tu veux cela je passe la main car je ne suis pas familiarisé avec les algorithmes, donc je ne vais pas m'amuser à déchiffrer celui que tu fournis (d'ailleurs est-ce le tien ou un algorithme que tu as trouvé ou qui t'a été fourni ?).
Par contre, si tu recherches une procédure qui fait ce que tu demandes, je peux regarder de mon côté ce que je peux te proposer.
A+
 

david84

XLDnaute Barbatruc
Re : Transformation d'une chaine de caractères

Re re,
en attendant tes précisions, ci-joint une proposition à tester :
Code:
Sub Test()
Dim Decimales, i&, j&, k&, tablo(), tablo2(), temp, temp2, Num
On Error GoTo gestion_erreur
Decimales = InputBox("Bonjour, veuillez inscrire une suite de décimales")
j = 1
For i = 1 To Len(Decimales)
ReDim Preserve tablo(1 To i)
tablo(i) = Mid(Decimales, i, 1)
Next i
i = 1
For i = LBound(tablo) To UBound(tablo)
    temp = tablo(i)
    ReDim Preserve tablo2(LBound(tablo) To j)
    tablo2(j) = temp

    For k = LBound(tablo2) To UBound(tablo2)
        If temp = tablo2(k) Then Num = Num + 1
    Next k
    If Num = 1 Then
        temp2 = temp2 & tablo(temp)
    Else
        temp2 = temp2 & tablo(CDbl(tablo(i) & tablo(i + 1)))
    End If
    j = j + 1
    Num = 0: k = LBound(tablo2)
Next i
MsgBox temp2
Exit Sub

gestion_erreur:
 temp2 = temp2 & 0
 Resume Next
End Sub
A toi de nous dire ce qui ne va pas (mais sois précis).
A+
 

Pièces jointes

  • Transformation de décimales_test.xls
    41.5 KB · Affichages: 36
  • Transformation de décimales_test.xls
    41.5 KB · Affichages: 38
  • Transformation de décimales_test.xls
    41.5 KB · Affichages: 39
Dernière édition:

anthony.unac

XLDnaute Occasionnel
Re : Transformation d'une chaine de caractères

Re
ok

et si la décimale est 0 ? elle appelle quoi ? 0 ?

Si tu veux cela je passe la main car je ne suis pas familiarisé avec les algorithmes, donc je ne vais pas m'amuser à déchiffrer celui que tu fournis (d'ailleurs est-ce le tien ou un algorithme que tu as trouvé ou qui t'a été fourni ?).
Par contre, si tu recherches une procédure qui fait ce que tu demandes, je peux regarder de mon côté ce que je peux te proposer.
A+

Si vous tombez sur l'appel de la 0eme décimale alors l'algo vous renvoie vers l'appel de la décimale suivante (la 0eme décimale n'existant pas cela se tient).
L'algo est de moi d'ailleur il s'agit plutot d'un GRAFCET car je ne suis pas habitué à l'écriture spécifique de l'algo.
Oui oui c'est du VBA qu'il faut avoir au final ;)
 

david84

XLDnaute Barbatruc
Re : Transformation d'une chaine de caractères

Re
Si vous tombez sur l'appel de la 0eme décimale alors l'algo vous renvoie vers l'appel de la décimale suivante (la 0eme décimale n'existant pas cela se tient).
donc, si je te suis, on peut dès le départ traiter la chaîne sans les 0 en ne prenant que la chaîne utile avant traitement par la procédure (1200000045 devient 1245). Est-ce cela ?
De plus, il nous faut prendre en compte la remarque de Gruick, n'est-ce pas ?
A+
 

anthony.unac

XLDnaute Occasionnel
Re : Transformation d'une chaine de caractères

Re

donc, si je te suis, on peut dès le départ traiter la chaîne sans les 0 en ne prenant que la chaîne utile avant traitement par la procédure (1200000045 devient 1245). Est-ce cela ?
De plus, il nous faut prendre en compte la remarque de Gruick, n'est-ce pas ?
A+

Non non il ne faut surtout pas virer les 0 d'entrée de jeu !

Voici un exemple détaillé :
*******************
Prenons un réel mettons racine(2) et intéressons nous à ses décimales :
414213562373095...

Réécrivons ces décimales en utilisant le fait que chaque décimale *appelle* une autre décimale :
4 appelle la 4e décimale à savoir 2
1 appelle la 1ere décimale à savoir 4
42 appelle la 42e décimale à savoir 1
(et oui car 4 à déjà était appelé donc on prend l'entier composé par deux décimales)
13 appelle la 13e décimale à savoir 0
(et oui car 1 à déjà était appelé donc on prend l'entier composé par deux décimales)
5 appelle la 5e décimale à savoir 1
6 appelle la 6e décimale à savoir 3
2 appelle la 2e décimale à savoir 1
3 appelle la 3e décimale à savoir 4
7 appelle la 7e décimale à savoir 5
30 appelle la 30e décimale à savoir 9
(et oui car 3 à déjà était appelé donc on prend l'entier composé par deux décimales)
9 appelle la 9e décimale à savoir 2
...

On aboutit au final à la création d'un réel dont les décimales sont :
24101314592...

Deuxième exemple :
***************
123123123123123123123123123123123.....

1 appelle la 1e décimale à savoir 1
2 appelle la 2e décimale à savoir 2
3 appelle la 3e décimale à savoir 3
12 appelle la 12e décimale à savoir 3
(et oui car 1 à déjà était appelé donc on prend l'entier composé par deux décimales)
31 appelle la 31e décimale à savoir 1
(et oui car 3 à déjà était appelé donc on prend l'entier composé par deux décimales)
23 appelle la 23e décimale à savoir 2
(et oui car 2 à déjà était appelé donc on prend l'entier composé par deux décimales)
123 appelle la 123e décimale à savoir 3
(et oui car 1 à déjà était appelé et 12 à déjà été appelé donc on prend l'entier composé par trois décimales)
1231 appelle la 1231e décimale à savoir 1
(et oui car 1 à déjà était appelé et 12 à déjà été appelé et 123 à déjà été appelé donc on prend l'entier composé par quatre décimales)
231 appelle la 231e décimale à savoir 3
(et oui car 2 à déjà était appelé et 23 à déjà été appelé donc on prend l'entier composé par trois décimales)
....
On aboutit au final à la création d'un réel dont les décimales sont :
123312313...
 

david84

XLDnaute Barbatruc
Re : Transformation d'une chaine de caractères

Re
une autre procédure à tester.
Si c'est ok, je regarderai comment éventuellement simplifier.
Si ce n'est pas bon, donne la chaîne complète que tu as utilisée (pas le début et les points qui suivent...), précise à quelle décimale cela coince ainsi que le résultat attendu (et explique pourquoi) :

Code:
Sub Test()
Dim Decimales, i&, j&, k&, l&, m&, n&, o&, tablo(), tablo2(), tablo3(), temp, temp2, temp3, Num, Num2
On Error GoTo gestion_erreur
Decimales = InputBox("Bonjour, veuillez inscrire une suite de décimales")
j = 1: l = 1
    For i = 1 To Len(Decimales)
        ReDim Preserve tablo(1 To i)
        tablo(i) = Mid(Decimales, i, 1)
    Next i
i = 1
For i = LBound(tablo) To UBound(tablo)
    temp = tablo(i)
    ReDim Preserve tablo2(LBound(tablo) To j)
    tablo2(j) = temp
    If temp <> 0 Then
        For k = LBound(tablo2) To UBound(tablo2)
            If temp = tablo2(k) Then Num = Num + 1
        Next k
        If Num = 1 Then
            temp2 = temp2 & tablo(temp)
        Else
            ReDim Preserve tablo3(LBound(tablo) To l)
            temp3 = CDbl(tablo(i) & tablo(i + 1))
            tablo3(l) = temp3
            l = l + 1
Calcul:
        For n = LBound(tablo3) To UBound(tablo3)
            If temp3 = tablo3(n) Then Num2 = Num2 + 1
        Next n
            If Num2 > 1 Then
                o = i + Len(temp3)
                If o > Len(Decimales) Then
                    temp2 = temp2 & 0
                Else
                    temp3 = temp3 & tablo(o)
                    tablo3(n - 1) = temp3
                    Num2 = 0
                    GoTo Calcul
                End If
            Else
                temp2 = temp2 & tablo(temp3)
            End If
        End If
    j = j + 1
    Num = 0: Num2 = 0: k = LBound(tablo2)
    End If
Next i
MsgBox temp2
Exit Sub

gestion_erreur:
 temp2 = temp2 & 0
 Resume Next
End Sub
A+

Edit : je viens de relire ton message précédent et quelque chose me paraît bizarre :
1 appelle la 1e décimale à savoir 1
2 appelle la 2e décimale à savoir 2
3 appelle la 3e décimale à savoir 3
12 appelle la 12e décimale à savoir 3
(et oui car 1 à déjà était appelé donc on prend l'entier composé par deux décimales)
ok

31 appelle la 31e décimale à savoir 1
(et oui car 3 à déjà était appelé donc on prend l'entier composé par deux décimales)
et que fais-tu de 23 ? Personnellement j'ai traité 23 avant 31 puisque 23 vient après 12. Est-ce une erreur de ta part ou faut-il sauter une décimale quand la chaîne est à 2 chiffres (et donc 3 si la chaîne est à 3 chiffres,etc).
A toi de le préciser.
 
Dernière édition:

david84

XLDnaute Barbatruc
Re : Transformation d'une chaine de caractères

Re re,
suite à mon message précédent, si ce que j'ai noté à la fin du message est ce que tu attends, alors à tester :
Code:
Sub Test()
Dim Decimales, i&, j&, k&, l&, m&, n&, o&, tablo(), tablo2(), tablo3(), temp, temp2, temp3, Num, Num2
On Error GoTo gestion_erreur
Decimales = InputBox("Bonjour, veuillez inscrire une suite de décimales")
j = 1: l = 1
    For i = 1 To Len(Decimales)
        ReDim Preserve tablo(1 To i)
        tablo(i) = Mid(Decimales, i, 1)
    Next i
i = 1
For i = LBound(tablo) To UBound(tablo)
    temp = tablo(i)
    ReDim Preserve tablo2(LBound(tablo) To j)
    tablo2(j) = temp
    If temp <> 0 Then
        For k = LBound(tablo2) To UBound(tablo2)
            If temp = tablo2(k) Then Num = Num + 1
        Next k
        If Num = 1 Then
            temp2 = temp2 & tablo(temp)
        Else
            ReDim Preserve tablo3(LBound(tablo) To l)
            temp3 = CDbl(tablo(i) & tablo(i + 1))
            tablo3(l) = temp3
            'i = i + Len(temp3) - 1
            l = l + 1
Calcul:
        For n = LBound(tablo3) To UBound(tablo3)
            If temp3 = tablo3(n) Then Num2 = Num2 + 1
        Next n
            If Num2 > 1 Then
                o = i + Len(temp3)
                If o > Len(Decimales) Then
                    temp2 = temp2 & 0
                Else
                    temp3 = temp3 & tablo(o)
                    tablo3(n - 1) = temp3
                    Num2 = 0
                    GoTo Calcul
                End If
            Else
                temp2 = temp2 & tablo(temp3): i = i + Len(temp3) - 1
            End If
        End If
    j = j + 1
    Num = 0: Num2 = 0: k = LBound(tablo2)
    End If
Next i
MsgBox temp2
Exit Sub

gestion_erreur:
 temp2 = temp2 & 0
 Resume Next
End Sub
Sauf erreur de ma part, cela te renvoie ce que tu décris.
Par contre, le problème est que tablo() ne prend en compte que les 254 1er caractères et je ne sais pas pourquoi :
- est-ce dû aux capacités de l'inputbox (pourtant, l'aide d'Excel dit "La longueur maximale de l'argument prompt est d'environ 1 024 caractères, selon la largeur des caractères utilisés."),
- est-ce dû aux capacités d'un tableau VBA (pour moi non mais...) ?
- est-ce dû à une déclaration de variable inappropriée ?
Si quelqu'un a une idée pour m'éclairer...
A+
 

david84

XLDnaute Barbatruc
Re : Transformation d'une chaine de caractères

Re re re
suite à mes 2 messages précédents, test sur une chaîne aléatoire de 2000 caractères sans passer par l'inputbox afin de pouvoir tester sur des chaînes importantes (car je pense que c'est l'inputbox qui limite le nombre de caractères de la chaîne) :
Code:
Sub Test3()
Dim Decimales, i&, j&, k&, l&, m&, n&, o&, tablo(), tablo2(), tablo3(), temp, temp2, temp3, Num, Num2, Nb
On Error GoTo gestion_erreur
Nb = 2000 'nombre maxi de caractères à modifier si besoin
    For i = 1 To Nb
        temp = Int((9 * Rnd))
        ReDim Preserve tablo(1 To i)
        tablo(i) = temp
    Next i

j = 1: l = 1
i = 1
For i = LBound(tablo) To UBound(tablo)
    temp = tablo(i)
    ReDim Preserve tablo2(LBound(tablo) To j)
    tablo2(j) = temp
    If temp <> 0 Then
        For k = LBound(tablo2) To UBound(tablo2)
            If temp = tablo2(k) Then Num = Num + 1
        Next k
        If Num = 1 Then
            temp2 = temp2 & tablo(temp)
        Else
            ReDim Preserve tablo3(LBound(tablo) To l)
            temp3 = CDbl(tablo(i) & tablo(i + 1))
            tablo3(l) = temp3
            l = l + 1
Calcul:
        For n = LBound(tablo3) To UBound(tablo3)
            If temp3 = tablo3(n) Then Num2 = Num2 + 1
        Next n
            If Num2 > 1 Then
                o = i + Len(temp3)
                If o > Len(Decimales) Then
                    temp2 = temp2 & 0
                Else
                    temp3 = temp3 & tablo(o)
                    tablo3(n - 1) = temp3
                    Num2 = 0
                    GoTo Calcul
                End If
            Else
                temp2 = temp2 & tablo(temp3): i = i + Len(temp3) - 1
            End If
        End If
    j = j + 1
    Num = 0: Num2 = 0: k = LBound(tablo2)
    End If
Next i
MsgBox temp2
Decimales = Join(tablo, "")
[A6] = "chaîne initiale" & ": " & Decimales
[A7] = "chaîne finale" & ": " & temp2
Exit Sub

gestion_erreur:
 temp2 = temp2 & 0
 Resume Next
End Sub
A+
 

Discussions similaires