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 :
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