Autorisation : Membre
Nb de messages : 856
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Sam 27 Jui 2015, 19:17
Bonsoir,
Ce code est très compliqué a mon goût...
Est ce le tien ?
Déjà, il vaut mieux éviter de mélanger boucles et ggoto/lbl (cf tuto de linka pour plus de précisions sur les pb que ça pose).
Ici, ce qu'il se passe, c'est que tu détermines le plus petit diviseur de A, puis tu recommence en prenant le quotient (tu redemarre une nouvelle boucle for, donc tu "reprend" a I=2).
Ce qui fait qu'une fois que tu as déterminé que 3 divisait 27 (par exemple), tu prends A=9. Ensuite tu reteste si 2 divises 9 (alors que tu le sais déjà que c'est faux car il ne divise pas 27...).
(Je suppose que tu as oublié un Then après le if partDec(A/I)=0)
Plutôt que de faire un goto/lbl et de tout retester:
_stocke le diviseur comme tu le fais
_conserve le A/I->A
_mais decremente I: ainsi, au prochain passage dans la boucle, I sera incremente, et tu testera bien si le diviseur trouve divise le quotient.
_enleve carrément le goto/lbl
- j'ai trouvé ce code dans un site, j'ai voulu voir justement le fonctionnement de Lbl / Goto
_ si on observe l'essais 2520 = 2^3x3^2x5x7 j'ai esayé de revoir tout le processus en utilisant 2 colonnes : celle des "A" et celle de "I" en parallèle.
je ne comprends pas la colonne des " I " qui donne:
2 2 2 2 3 2 3 2 3 4 5 2 3 le 3ème 2 donne A =315 on remonte For redonne 2 qui ne divise plus A donc on remonte For passe à 3. C'est ce que tu expliques dans ton message.
Mais comment expliquer la suite : un 2 !! puis 3, puis encore un 2!! ( For monte et descend !)
la suite est normale 3 4 5, mais ensuite à nouveau on termine avec 2 3!!
- l'essais que tu proposais en fin de message ,très bien. On apprécie l'astuce si simple et pourtant on trompe For, c'est bien celà ?. (je m'étais demandé, il y a quelque temps si on pouvait intervenir sur le " I " de For..( For a une mémoire I et on l'a modifiée?)
Autorisation : Membre
Nb de messages : 856
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Mar 30 Jui 2015, 9:15
Le fonctionnent de for est le suivant :
For(var,debut,fin,pas
...
End
Lorsque la calto lit la ligne for, il initialise var a début, et enregistre le fait qu'on est dans un for.
Lorsqu'elle lit le End, elle détermine dans quelle type de boucle/structure elle se trouve.
Si c'est un for: elle augmente la valeur de var du pas (1 par défaut), puis elle teste si var>pas pour savoir si elle doit rester dans le for ou pas.
C'est donc la valeur actuelle de la variable qui compte, seuls fin et pas sont enregistrés comme caractéristiques de la boucle.
Modifier var dans la boucle permet donc d'y rester plus ou moins longtemps.
Ici, ce qu'il se passe, c'est qu'on a un goto qui nous fais retourner avant la ligne for:
La calto va pour la première fois dans la boucle. Elle initialise I a 2. I s'incremente a chaque End, puis on passe au niveau du goto. A ce moment, la calto repasse par la ligne for. Pour elle, il s'agit d'une nouvelle boucle ! Elle initialise donc I a 2, et reprend donc a partir de la...
A la fin du prgm, il y a donc plusieurs for en attente, qui n'ont pas été "finis" comme cela aurait dû, avec un End et un I>var. Seule la dernière boucle est correctement fermée.
Nous y sommes.Remarquons que ce code à Goto marchait mais son mécanisme était compliqué à comprendre ( pour moi ). C'est fait.Satisfaction d'avoir levé le problème. Merci Mathieu pour ces explications précises et aussi pour l'autre code à " I-1 " que j'ai bien apprécié.
Puis-je terminer en te demandant toi que ferais comme code pour ce problème des diviseurs?
merci encore, je suis toujours satisfait de tout ce que tu apportes.
Autorisation : Membre
Nb de messages : 856
Inscrit le : Mer 18 Juil 2012, 18:44
Posté le : Jeu 02 Juil 2015, 22:48
Oui je te l'accorde il est compliqué parce qu'il fait plusieurs fois la même chose.
L'association des goto/boucles est en général une façon plus compliquée de coder ales qu'on peut faire plus simple et plus efficace (d'autant plus si comme ici on repasse au début de la boucle).
ici il y a une discussion qui traite de ce programme : http://tout82.free.fr/forum/sujet.php?sujet=2688&page=1
Le dernier code est intéressant, il y a une petite association goto/boucle qui ici est plus efficace car permet de sortir de la boucle, et non d y rentrer sans cesse.
J'avais code ce programme, mais sans apporter de nouvelles idées.