Page 1 of 1

DivEuclidSS - Ben ça alors o_O

Unread postPosted: 08 May 2015, 19:24
by Lu_Lu54
Bonjour, je poste ce topic parce que j'ai récemment fait une update de mon programme DivEuclidSS, et qu'un bug persiste... Et je n'y comprends rien.

Vous avez une petite description du programme sur la page de téléchargement :
Myself wrote:Ce programme réalise une division euclidienne en affichant toutes les étapes de calcul.

V 2.0 :
Gère à présent rapidement les dividendes supérieurs aux diviseurs,
et adapte les premières soustractions à la taille du diviseur.

V 3.0 :
Gère les nombres relatifs et décimaux (précision de 10E-5) en donnant une explication claire et simple.

Et voici un gif de présentation :
Image

Je vais vous remettre la source (dsl pour ceux qui aiment les belles présentations, j'essaye de faire de mon mieux) :
Code: Select all
Define LibPub div_euclid(av,b)=
Prgm
:Local ind,n,i,av,a,b,result,l,c
:result:=intDiv(av,b)
:©suivent les manières de gérer relatifs/décimaux
:If b=0 Then
:  Text "Erreur"
:  Stop
:ElseIf b<0 and av≥0 Then
:  Disp "Comme le diviseur est négatif, on travaille avec sa valeur absolue, et on rajoutera le signe moins à la fin du raisonnement."
:  b:=abs(b)
:ElseIf av<0 and b>0 Then
:  Disp "Comme le dividende est négatif, on travaille avec sa valeur absolue, et on rajoutera le signe moins à la fin du raisonnement."
:  av:=abs(av)
:ElseIf b<0 and av<0 Then
:  Disp "Le diviseur et le dividende sont négatifs, donc cela revient a dire que les deux sont positifs."
:  b:=abs(b)
:  av:=abs(av)
:EndIf
:
:
:
:If int(av)≠av or int(b)≠b Then
:  n:=1
:  i:=0
:  While int(av)≠av or int(b)≠b
:    n:=n*10
:    av:=av*10
:    b:=b*10
:    i:=i+1
:    If i=6 Then
:      b:=((b)/(n))
:      av:=((av)/(n))
:      Text "Erreur, partie décimale trop grande"
:      Stop
:    EndIf
:  EndWhile
:Disp "Ce quotient comprend des nombres décimaux."
:Disp "Multiplier le diviseur et le dividende d'un rapport ne change rien à sa valeur, on peut donc se servir de cette règle pour travailler avec des nombres entiers :"
:Disp "on multiplie le numérateur et le dénominateur par 10",i,", dans le but d'obtenir deux nombres entiers : le diviseur ",b," et le dividende ",av,"."
:Disp ""
:EndIf
:
:
:©présentation du début de division
:Disp av,"     ∣     ",b
:Disp "              ————"
:
:
:a:=av
:
:If b>a Then
:  Disp "le dividende est plus grand que le diviseur, donc le résultat est ",result," et le reste est ",av
:  stop
:EndIf
:
:
:©première boucle qui met en liste le dividende
:l:={}
:Loop
:  c:=remain(a,10)
:  l:=augment(l,{c})
:  a:=intDiv(a,10)
:  If a=0 Then
:    Exit
:  EndIf
:EndLoop
:
:ind:=dim(l)
:a:=l[ind]
:
:©boucle qui effectue les soustractions successives
:Loop
:ind:=ind-1
:If a<b Then
:  a:=remain(a,b)
:  a:=a*10+l[ind]
:  If ind<1 Then
:    Exit
:  EndIf
:Else
:  Disp a
:  Disp "-    ",b*intDiv(a,b)
:  Disp "——————"
:  a:=remain(a,b)
:  Disp a
:  If ind<1 Then
:    Exit
:  EndIf
:  Disp "On abaisse le ",l[ind]
:©la ligne qui suit sert à abaisser un chiffre de plus, c'est dans cette ligne que le bug est indiqué, au moment d'abaisser le dernier chiffre des dividendes que je donne en exemple en dessous
:  a:=a*10+l[ind]
:EndIf
:EndLoop
:Disp "Résultat = ",result
:EndPrgm


Donc on en vient au bug :
Pour certaines opérations, dont la liste suit, j'obtient une erreur de dimension dans un message me rappelant que je ne peux pas appeler le 5ème élément d'une liste composée de 4 nombres.
voici la liste de ceux que j'ai repéré (il y en a sûrement d'autres) :
* 54854/1.62
* -451/3
* 254/-5
La liste comprend aussi les multiples des fractions (du genre (254*3)/(-5*3))

Ce qui est frustrant, c'est que je ne trouve aucun rapport entre eux, et malgré avoir relu le programme 7/8 fois, je trouve rien qui serait responsable de ce truc...
Le bug lui même se situe sûrement dans la 1ère boucle Loop qui permet de transformer mon nombre en liste, puisque à cet endroit le nombre d'éléments dans la liste est visiblement supérieur au nombre d'éléments à la fin de la dernière boucle Loop qui termine le programme.

Donc si vous apercevez quelque chose d'évident que j'aurais raté, faites le moi savoir ;)
Merci

Lien de téléchargement

Re: DivEuclidSS - Ben ça alors o_O

Unread postPosted: 09 May 2015, 10:13
by Bisam
Tu as modifié l'ordre du test "if Ind < 1" et de l'affectation " a := a*10+l[ind]" dans le cas "a >= b" mais pas dans le cas "a<b".

Remplace :
Code: Select all
:If a<b Then
:  a:=remain(a,b)
:  a:=a*10+l[ind]
:  If ind<1 Then
:    Exit
:  EndIf

par
Code: Select all
:If a<b Then
:  If ind<1 Then
:    Exit
:  a:=a*10+l[ind]
:  EndIf
et tout rentrera dans l'ordre.

Il serait bien également de rajouter une ligne pour renvoyer le quotient ET le reste... car le reste n'est pas forcément affiché juste avant.

Re: DivEuclidSS - Ben ça alors o_O

Unread postPosted: 09 May 2015, 11:23
by Lu_Lu54
Ah ben oui tiens j'avais laissé ça passer...
Merci !