DivEuclidSS - Ben ça alors o_O
Posted: 08 May 2015, 19:24
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 :
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) :
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
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