Identification de caracteres

Résolu
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 5 juil. 2005 à 10:26
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 5 juil. 2005 à 22:31
Je voudrais faire un programme en VB qui met sous forme fractionnaire les nombres à écriture décimale infinie ( exemple 0.35353535....=35/99 ).

Il ne me manque plus que deux elements c'est de savoir comment avec un nombre je peux identifier le cycle que présente l'écriture décimale (ici 35, on observe une successin de 35dans l'écriture).

Et comment trouver que le nombre chiffres composant ce cycle ( ici 2 , car 35 est composé de 2 chiffres)

J'espere avoir été assez précis et compréhenssible

D'avance merci.

7 réponses

cs_phil23 Messages postés 79 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 14 juillet 2005 1
5 juil. 2005 à 16:12
'J'ai fais cet exemple en VB6 qui pourrait fonctionner.
'Colle cette fonction dans un form pour tester.

Private Sub RechercheSuite()


Dim ValeurTest As Double 'Variable qui contient la valeur à tester
Dim ValeurTemp As Single 'Variable temporaire pour déterminer le séparateur
'numérique du système (point ou virgule)
Dim sSep As String 'Séparateur numérique du système
Dim lPos As Long 'Position du séparateur dans la variable ValeurTest
Dim sDecimale As String 'Partie décimale de la valeur à tester
Dim i As Long 'Compteur de la boucle 1
Dim j As Long 'Compteur de la boucle 2
Dim sBloc As String 'Bloc de chiffre à comparer
Dim sExtrait As String 'Bloc suivant à comparer avec sBloc
Dim bIdentique As Boolean 'Est-ce que la comparaison est identique ?
Dim lCompteur As Long 'Compte le nombre de comparaison


'Mettre ici la valeur à tester
'---------------------------------------------
ValeurTest = (35 / 99) 'Résultat: 35 2
'ValeurTest = (569 / 999) 'Résultat: 569 3
'ValeurTest = 0.333333343333333 'Résultat: 3 1
'ValeurTest = 0.123456123456 'Résultat: 123456 6
'ValeurTest = 0.375962451655 'Résultat: Impossible de trouver une suite
'---------------------------------------------

'Détermine quel est le séparateur numérique du système
'---------------------------------------------
ValeurTemp = (1 / 10)
sSep = Mid(CStr(ValeurTemp), 2, 1)
'---------------------------------------------

'Recherche la position du séparateur numérique
lPos = InStr(1, CStr(ValeurTest), sSep)
If lPos > 0 Then
'Extrait que la partie décimale
sDecimale = Mid(CStr(ValeurTest), lPos + 1)

'Fait une boucle du nombre de chiffre
For i = 1 To Len(sDecimale)
sBloc = Left(sDecimale, i)

lCompteur = 0
bIdentique = True
'Compare par bloc avec la suite pour déterminer si c'est identique
For j = (i + 1) To Len(sDecimale) Step i
sExtrait = Mid(sDecimale, j, i)
If Len(sExtrait) = Len(sBloc) Then
lCompteur = lCompteur + 1
If sBloc <> Mid(sDecimale, j, i) Then bIdentique = False
End If
If bIdentique = False Then Exit For
Next j If lCompteur 0 Then bIdentique False

If bIdentique = True Then Exit For
Next i

If bIdentique = True Then
MsgBox "La suite de chiffre est: " & sBloc & vbCrLf & _
"Le nombre de chiffres composant est: " & Len(sBloc), vbInformation
Else
MsgBox "Impossible de déterminer une suite logique.", vbExclamation
End If

Else
MsgBox "C'est un nombre entier. Il n'y a pas de séparateur.", vbExclamation
End If

End Sub
3
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 juil. 2005 à 16:52
Je ne comprends pas comment utiliser cette fonction
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 juil. 2005 à 17:53
si c'est une suite de chiffres limités forcément c'est plus facile,

j'ai pas dit que c'était facile, mais ça donne pas le résultat exact à savoir si c'est un nombre rationnel ou pas.



un nombre rationnel peut se mettre se mettre sous forme de fraction.

soit c'est un nombre entier comme 10/2

soit c'est un nombre avec décimale limitée comme 6/5

soit c'est un nombre avec décimale illimitée comme 1/3 mais avec séquence répétitive.



pour les nombres irrationnels, on ne peut pas les mettre sous forme de
fraction, le nombre de décimale est illimitée, et on peut considérer
qu'il n'y a pas de séquence répétitive, mais je suis pas sûr que ça a
été prouvé ?



conclusion:

si on arrive a le mettre sous forme de fraction et si c'est pas un
nombre entier et si le nombre de décimales est illimité là on est sûr
qu'il y a une séquence répétive.

il reste plus qu'à la trouver.


Daniel
3
cs_phil23 Messages postés 79 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 14 juillet 2005 1
5 juil. 2005 à 21:48
OK, je ne savais pas que tu es débutant.
Mon exemple est fait avec VB6. Je ne sais même pas si tu as aussi cette version ou VB.net ou quoi?


Si tu as VB6 tu peux:
1. Ouvrir un nouveau projet
2. Ajouter un bouton "Command1" sur le "Form1"
3. Ouvre la fenêtre code du Form1
4. Efface tout le code (si il y a quelque chose)
5. Copier le code ci-dessous et le coller dans le Form1
6. Exécuter le projet et cliquer sur le bouton pour tester



' Code à copier et coller
'----------------------------------
Option Explicit


Private Sub RechercheSuite(ByVal MonNombre As String)


Dim ValeurTemp As Single 'Variable temporaire pour déterminer le séparateur
'numérique du système (point ou virgule)
Dim sSep As String 'Séparateur numérique du système
Dim lPos As Long 'Position du séparateur dans la variable ValeurTest
Dim sDecimale As String 'Partie décimale de la valeur à tester
Dim i As Long 'Compteur de la boucle 1
Dim j As Long 'Compteur de la boucle 2
Dim sBloc As String 'Bloc de chiffre à comparer
Dim sExtrait As String 'Bloc suivant à comparer avec sBloc
Dim bIdentique As Boolean 'Est-ce que la comparaison est identique ?
Dim lCompteur As Long 'Compte le nombre de comparaison


'Détermine quel est le séparateur numérique du système
'---------------------------------------------
ValeurTemp = (1 / 10)
sSep = Mid(CStr(ValeurTemp), 2, 1)
'---------------------------------------------

'Recherche la position du séparateur numérique
lPos = InStr(1, CStr(MonNombre), sSep)
If lPos > 0 Then
'Extrait que la partie décimale
sDecimale = Mid(CStr(MonNombre), lPos + 1)

'Fait une boucle du nombre de chiffre
For i = 1 To Len(sDecimale)
sBloc = Left(sDecimale, i)

lCompteur = 0
bIdentique = True
'Compare par bloc avec la suite pour déterminer si c'est identique
For j = (i + 1) To Len(sDecimale) Step i
sExtrait = Mid(sDecimale, j, i)
If Len(sExtrait) = Len(sBloc) Then
lCompteur = lCompteur + 1
If sBloc <> Mid(sDecimale, j, i) Then bIdentique = False
End If
If bIdentique = False Then Exit For
Next j If lCompteur 0 Then bIdentique False

If bIdentique = True Then Exit For
Next i

If bIdentique = True Then
MsgBox "La suite de chiffre est: " & sBloc & vbCrLf & _
"Le nombre de chiffres composant est: " & Len(sBloc), vbInformation
Else
MsgBox "Impossible de déterminer une suite logique.", vbExclamation
End If

Else
MsgBox "C'est un nombre entier. Il n'y a pas de séparateur.", vbExclamation
End If

End Sub


Private Sub Command1_Click()

Call RechercheSuite(InputBox("Entrer le chiffre à tester:", "Chiffre", "0.35353535353535353535"))

End Sub
3

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

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
5 juil. 2005 à 12:13
je doûte qu'on puisse faire cela

je citerais en exemple les décimales de Pi,

après quelques 2 milliards de décimales calculées, personne n'a encore prouvé qu'il y avait ou pas de séquences répétitives.

les nombres garderont toujours leurs mystères.

Daniel
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 juil. 2005 à 12:33
Ecrire un nombre a écriture décimale infini et CYCLIQUE est possible comme pour 0.35353535=35/99

Demonstration

Soit n = 0.569569569569....
On remarque un cycle 569...
1000n = 569.569569...
1000n = 569 + 0.569569...
1000n = 569 + n
1000n - n =569
999n = 569
n = 569/999

Donc 0.569569569...=569/999

Pour pi c'est différent, on observe pas de cycle dans son écriture on ne peut donc pas l'écrire sous forme fractionnaire.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 371
5 juil. 2005 à 22:31
Merci d'avoir passé du temps à trouver une répose et a me l'expliquer aussi clairement
0
Rejoignez-nous