Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Projets de programmation


Index du Forum » Projets de programmation » Problème avec les boucles / sauts conditionnels ou non
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Problème avec les boucles / sauts conditionnels ou non

Posté le 31/10/2017 13:49

Bonjour,

Je veux que mon programme me calcule le nombre de dents dont il faut faire tourner deux roues dentées pour obtenir l'angle voulu.
J'ai le programme "qui marche" (selon que la valeur donnée est multiple de 9 ou non), mais je voulais lui ajouter un "petit plus" pour pouvoir recaler les roues dans une position plus facile d'accès (si la donnée n'est pas multiple de 9).
Il suffit dans ce cas de modifier le résultat de la première roue et de recalculer la position de la deuxième roue.
Oui, mais :
- avec les "If-Then-Else-IfEnd", je ne peux pas "sortir" de la boucle : "GO ERROR" ou le deuxième calcul "enchaîne" sur le premier !
- avec "While" ou "Do", je n'arrive pas à trouver les conditions et la structure du programme.

Je joins l'organigramme souhaité au cas où quelqu'un pouvait m'aider. (les deux parties de mon programme (calcul-affichage 1 et Calcul-affichage 2) peuvent être scindées et ne comportent aucune boucle).

Cordialement,
GUGUSSE2.

Fichier joint


Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 Message

Citer : Posté le 31/10/2017 13:58 | #


On a encore un peu de mal à comprendre ce que tu veux modifier. Tu parles de deux roues mais on n'a qu'une variable (A). Est-ce que tu veux modifier A entre le moment où il est entré par l'utilisateur et le moment où le calcul commence (ie. juste avant « A multiple de 9 ») ?

Pour la Go ERROR, n'hésite pas à nous mettre ton code pour qu'on puisse voir ce qui ne va pas.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 01/11/2017 11:33 | # | Fichier joint


Bon, je vous explique depuis le début :
Sur une broche de machine-outil, il y a une roue de 40 dents (module 1,5, donc Ø extérieur 63 mm). Elle est emboitée dans une roue de 45 dents (module 2, donc Ø à fond de dents = 87,5 mm) et indexée par rapport à celle-ci.
Cette roue de 45 dents est indexable par rapport au bâti.

Si l'on fait tourner la roue de 40 d / 45 d de 1 dent dans un sens et la roue de 45 d/ bâti de 1 dent, la broche aura tourné de (1x360/40 - 1x360/45) !
Le but du programme est de trouver de combien de dents tourner chacune des deux roues pour obtenir l'angle de rotation voulu au niveau de la broche.
Comme la roue de 45 dents tourne / bâti, l'indexage peut se trouver inaccessible, d'où la nécessité de modifier les nombres trouvés en ajoutant (retranchant) 8 dents au nombre de dents de la roue de 40 dents et en retranchant (ajoutant) 9 dents au nombre de dents de la roue de 45 dents (8x360/40 - 9x360/45 = 0 !).

Comme après avoir posé mon problème j'ai regardé le tuto, j'ai voulu "essayer" avec les "booléen" que je ne connaissais pas.
Puissants et efficaces !
Voici ce que j'ai finalement réussi à faire (le "programme" est "bidon") (en pièce jointe le programme "en clair" avec la reproduction des écrans dans les deux cas), mais il reste un affichage "parasite".

Y-a t'il mieux comme syntaxe et peut-on éliminer ce "0" ?

Merci de bien vouloir m'aider.
Cordialement,
GUGUSSE2.
Zezombye Hors ligne Rédacteur Points: 1756 Défis: 13 Message

Citer : Posté le 01/11/2017 11:52 | #


Hmm, ce 0 vient du GetKey (où 0 signifie qu'aucune touche n'est appuyée). J'ai aussi réussi à avoir un 31 (code pour EXE).
Le coupable semble être cette condition :
If G = 31 :Then
        Goto 1
    IfEnd

où si je ne laisse que le Goto 1 (le If est inutile, car pour en arriver à ce point, il faut de toute façon appuyer sur EXE) ça ne se produit plus.
Par contre aucune idée de pourquoi il affiche G.

Au passage, au lieu de faire Not G=31 tu peux directement faire G≠31
Divers jeux : Puissance 4 - Chariot Wars - Sokoban
Ecrivez vos programmes basic sur PC avec BIDE
Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 Message

Citer : Posté le 01/11/2017 12:19 | #


Le problème vient du parenthésage à cet endroit :
Do
Getkey→G
While Not G=31

La condition est lue (Not G)=31, or Not G vaut soit 0 soit 1, donc la boucle se termine toujours immédiatement. Et alors si G≠31, la fin du programme est atteinte, et G est affiché. Souvent, c'est 0, parce qu'aucune touche n'était pressée (on n'a pas eu le temps car le programme tourne vite). Si on appuie sur EXE suffisamment longtemps, G vaut 31 donc ça boucle immédiatement pour redemander un nombre.

Si la solution de Zezombye marche, c'est donc parce que dans les cas « fautifs », G = 0 donc virer la condition rétablit une situation normale. Dans tous les cas, mieux vaut écrire G≠31.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 01/11/2017 15:47 | #


Bonjour,
Je ne sais pas "citer" les passage, alors je vais les recopier :
à Zezombye :
Tu dis :
Zezombye a écrit :
où si je ne laisse que le Goto 1 (le If est inutile, car pour en arriver à ce point, il faut de toute façon appuyer sur EXE) ça ne se produit plus.

Si je supprime le "If", il faut aussi supprimer "Then et IfEnd" non ?
J'ai fait l'essai / Avec un nombre <100, fonctionnement correct mais avec un nombre >100, le passage dans la fin de la boucle (Else) "cloche

Zezombye a écrit :
Par contre aucune idée de pourquoi il affiche G.

Je n'ai jamais dit que le programme affichait "G" !

Zezombye a écrit :
Au passage, au lieu de faire Not G=31 tu peux directement faire G≠31

Je suppose que c'est dans la bouche "Do-LpWhile" ?

à Lephénixnoir et à Zezombye:
Modification faite dans la boucle "Do-LpWhile" et "ça marche", le "0" à disparu.

Sauf s'il y a une meilleure approche pour ce programme d'aiguillage, je considère le problème comme résolu.
Merci à vous.
Pour le "fun", quand j'aurai ajouté ce "plus" au programme original, je vous en donnerai copie.

Cordialement,
GUGUSSE2.
Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 Message

Citer : Posté le 01/11/2017 16:09 | #


Deux labels et deux branches pour ça, on peut faire un peu mieux. Quelque chose comme :

?→A
While A≥100
ClrText:"MODIF":Locate 7,1,A
Do:Getkey→G
LpWhile ... # Récupérer les touches pour modifier A, comme tu fais déjà
A + 10(G = 42) - 10(G = 32)→A
WhileEnd

ClrText:"AFFICHAGE":Locate 11,1,A

Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 01/11/2017 18:10 | #


OK, je vais tester.

Cordialement,
GUGUSSE2.

Ajouté le 01/11/2017 à 18:38 :
Bonsoir,

Je viens de tester le programme suivant :
?→A
While A≥100
ClrText:"MODIF":Locate 7,1,A
Do:Getkey→G
LpWhile (G≠42 And G≠32 And G≠31)
A + 10(G = 42) - 10(G = 32)→A
WhileEnd
ClrText:"AFFICHAGE":Locate 11,1,A


1) Pour un nombre >= 100, les touches "+" & "-" agissent comme il faut, jusqu'à ce que l'on soit "<100" !
2) La touche "EXE" est inopérante (on reste dans la boucle) !
3) Pour un nombre <100, seule la touche "EXE" est valable et ramène au début du programme. Les touches "+" & "-" font que l'on quitte le programme !

Sinon, le programme que j'avais fait "pesait" 213 (octets ?), celui cité en tête du message "pèse" 126 (octets ?) !

Peut-on, avec la simplicité de ce dernier programme, palier aux défauts 2) & 3) ?
Je vais y réfléchir, mais je doute d'aboutir vu mon manque de pratique.

Merci pour vos conseils.
Cordialement,
GUGUSSE2.
Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 Message

Citer : Posté le 01/11/2017 18:56 | #


Au fait, pour le code est les citations, utilise les boutons au-dessus de champ de réponse, spécifiquement et , ou utilise les balises [code]...[/code] et [quote]...[/quote].

Tu as raison de parler de poids (c'est bien le terme usuel), et oui c'est en octets.

Le but n'est-il pas de récupérer un nombre de l'utilisateur et de le lui laisser ajuster tant qu'il n'est pas inférieur à 100 ?

Concernant le point 3, tu n'a peut-être pas remarqué que le programme s'arrête immédiatement si A < 100. Je n'ai représenté qu'un seul tour de ta grande boucle à toi, par simplicité. (Tu demandes des nombres à l'infini, l'extrait que j'ai donné en demande un puis s'arrête ; il te suffit de l'encapsuler dans une boucle infinie.)

Je vais m'en tenir exactement au comportement du programme que tu as proposé plus tôt, alors (tant pis si j'ai pas compris ce qu'il fait. :3) Ça me donne :

While 1
ClrText:?→A

If A<100: Then
  ClrText:"AFFICHAGE":Locate 11,1,A
  Do:LpWhile Getkey≠31
Else
  Do
    CltrText:"MODIF":Locate 6,1,A
    Do:Getkey→G
    LpWhile G≠42 And G≠32 And G≠31
    A+10(G=42)-10(G=32)→A
  LpWhile G≠31
IfEnd

WhileEnd

J'ai beaucoup compacté (j'ai un peu abusé de :) mais c'est pour faire ressortir la structure de la chose. (J'ai indenté, aussi.) Plusieurs remarques, en vrac :
- Éviter les labels et les Goto préserve la structure algorithmique du programme et évite le code spaghetti ; une bonne habitude à prendre.
- La boucle Do:LpWhile Getkey≠31 est juste là pour éviter d'utiliser G à un moment où ce n'est pas utile.
- Dans A+10(G=42)-10(G=32)→A, il n'y a pas besoin de vérifier que G=42 ou G=32 car si G est une autre valeur, A est inchangé (A+10×0-10×0→A).
- Lorsqu'une valeur est utilisée comme condition, cela signifie implicitement que la condition est « la valeur est différente de 0 ». While 1 est donc une manière idiomatique d'écrire une boucle infinie.

Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 01/11/2017 19:36 | #


Bonsoir,

Je vais réfléchir à toutes ces remarques et essayer de m'en inspirer dans le futur.

Concernant le point 3, tu n'a peut-être pas remarqué que le programme s'arrête immédiatement si A < 100. Je n'ai représenté qu'un seul tour de ta grande boucle à toi, par simplicité


En ce qui concerne le point 3), je ne voulais pas que lorsque la condition "A<100" était vrai l'appui sur les touches "+" ou "-" aient un effet quelconque (surtout pas celui de quitter le programme !).
Je ne demande pas un nombre de changement défini, mais je veux que l'utilisateur puisses "relancer le programme lorsqu'il a eu une réponse satisfaisante.
Il est difficile d'expliquer un projet sur lequel on travaille depuis un moment. On oublie des détails indispensable à la compréhension d'autrui.

Je vais tenir compte de tes remarques et je reviens si besoin.

Cordialement,
GUGUSSE2.
Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 Message

Citer : Posté le 01/11/2017 20:28 | #


En fait, dans le cas A < 100, le programme que je t'ai suggéré la première fois s'arrête avant même que tu appuies sur + et -. Il s'arrête tout seul car il n'a rien à faire.

Mais, comme je l'ai noté ensuite, tu peux l'enrober dans un boucle infinie pour lui faire répéter la saisie. J'avais omis la boucle extérieure juste pour garder la partie intéressante.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 02/11/2017 16:45 | # | Fichier joint


Bonjour,

Hier j'ai copié c" programme, mais "Syntax Error" pour "A>100" et "A<100" !
La raison en est la suivante :
les instructions "Then" & "Else" DOIVENT être suivies sur la même ligne par une autre instruction !
Plus de peur que de mal.
J'ai donc adapté ce programme en y incluant mes formules et mes commentaires (utiles si l'on ne se sert pas souvent du programme !).
Il a fallu que je décale d'une ligne au dessus les instructions qui modifiaient la variable.
Et, en refléchissant et en donnant la possibilité de modifier les résultats si la première condition (A<100 dans l'exemple donné), j'ai réussi à supprimer le "If-Then-Else-IfEnd" !

La taille du programme final est de moitié celle du départ (qui n'avait pas les aiguillages et la possibilité de modifier les résultats) (432 octets/529 octets dans la calculatrice; 14,5 Ko/29Ko dans le répertoire windows de sauvegarde).
Esthétiquement, ce programme "me plaît bien". Et pour vous ?

While 1
0→A~Z
Deg:Fix 0
ClrText:
"DE QUEL ANGLE VOULEZé
"-VOUS FAIRE TOURNER"
" LA BROCHE (0-360)"
?→A
Frac (A/9) →B: 8Frac (A/8) →R
(A/9)(B=0)+R(B≠0) →R
Do:CltrText: Locate 1,1,"POUR ": Locate 6,1,A: Locate 9,1," DEGRES"
Locate 1,3,"TOURNEZ DE ": Locate 12,3,R: Locate 15,3," DENTS"
Locate 1,4,"LA ROUE DE 40 D /45 D"
Locate 1,5,"TOURNEZ DE ": Locate 12,5, (A-9R)/8: Locate 15,5," DENTS"
Locate 1,6,"LA ROUE DE 45 D /BATI"
Locate 1,7,"AJUST:[+][-] OU [EXE]"
Do:Getkey→G
R+8(G=42)-8(G=32)→R
LpWhile G≠42 And G≠32 And G≠31
LpWhile G≠31
IfEnd
WhileEnd


Mais il faut connaître toutes les finesses des instructions pour avoir une telle simplicité et je n'y serais jamais arrivé sans votre aide.
Pour les curieux, je vous joins la photo de cet indexeur qui est installé sur mon tour en bout de broche.
Et dans le message suivant, le programme pour CASIO GRAPH 35+.

Merci à tous,
Cordialement,
GUGUSSE2.
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 02/11/2017 16:49 | # | Fichier joint


La suite :

(Pour que le fichier soit accepté, j'ai dû ajouter ".PDF" à la fin du nom.
Veuillez retirer cet ajout avant de le lire.)
Ne0tux Hors ligne Membre d'honneur Points: 3524 Défis: 265 Message

Citer : Posté le 02/11/2017 21:33 | #


Salut Gugusse,

C'est vrai que ce programme est plus optimisé que le tout premier. Mais il y a encore moyen de faire mieux, en terme de performance et d’esthétique !

Tu as inséré dans ta boucle principale tous tes "Locate", ce qui signifie qu'ils sont tous re-affichés à chaque passage dans la boucle, dès que "+", "-" et "EXE" sont pressés. Tu pourrais n'afficher qu'une seule fois le texte avant cette boucle, et ne laisser que les "Locate" qui servent à mettre à jour les variables à l'écran ! Tu gagnerais dès lors du temps d'exécution, donc un changement plus rapide grâce aux touches des valeurs et l'écran "clignoterait" moins.

De plus tu pourrais compacter tout le texte sans utiliser de "Locate" et en utilisant astucieusement les espaces et le retour à la ligne automatique à partir de 21 caractères, comme tu l'as fait au début de ton programme, ce qui diminuerait encore la taille de ton programme.

Ainsi tu obtiendrais un code similaire à cet exemple :

While 1
0→A~Z
Deg:Fix 0:ClrText:
"DE QUEL ANGLE VOULEZ"
"-VOUS FAIRE TOURNER"
" LA BROCHE (0-360)"
?→A
Frac (A/9) →B:
(A/9)(B=0)+8Frac (A/8) (B≠0) →R
CltrText:
"POUR      DEGRES"
"TOURNEZ DE    DENTS  LA ROUE DE 40D/45D"
"TOURNEZ DE    DENTS  LA ROUE DE 40D/BATI"
"AJUST:[+][-] OU [EXE]"
Do: Locate 6,1,A: Locate 12,3,R: Locate 12,5,(A-9R)/8:
Do:Getkey→G
LpWhile G≠42 And G≠32 And G≠31
R+8(G=42)-8(G=32)→R
LpWhile G≠31
IfEnd
WhileEnd


Tu peux noter que j'ai sorti le calcul de R en fonction du symbole pressé. De la sorte ce calcul ne sera effectué que lorsque l'on sort de la boucle, pas en permanence.
Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 03/11/2017 10:15 | #


Bonjour,

Les subtilités de l'affichage me sont un peu (totalement) étrangères.
Là, j'avoue mon admiration.
Mais le fait de voir le texte s'afficher sans les réponses fait "bizarre" !
Je ne sait pas quelle est la meilleure option, entre un affichage "classique" et un programme plus court (371 octets au lieu de 432).
J'ai "rétréci" le "AJUST: ......[EXE]", car il y avait un saut d'une ligne et les résultats étaient alors mélangés au texte !
Le "IfEnd" est à supprimer (laissé là par erreur).

Cordialement,
PUSSY

Ajouté le 04/11/2017 à 09:39 :
Bonjour,

Partis comme nous l'étions à améliorer ce programme, j'ai suivi :
- Les rotations de chacune des roues n'étaient pas "optimisées". J'ai donc modifié les formules.
- Il est plus "court" de "travailler" avec des angles ≤ 180°. Donc conversion si nécessaire et modification pour pouvoir calculer avec des angles négatifs.
La deuxième condition (10ème ligne) n'a pas été facile à trouver, mais c'était pour éviter deux "If...."
- Et écrit en minuscules (via le programme "FX").
While 1
0→A~Z
Deg:Fix 0
ClrText:
"De quel angle voulez"
"-vous faire tourner"
"la broche (-360/360) "?A
A-360(A>180)+360(A<-180) →A
Int(A/9) →B
B+(A/ Abs A)(9Frac (A/9)>=3 Or 9Frac (A/9)<=-3 ) →B
A-8B→R
CltrText:"Pour degres :"
"tournez de dents"
"la roue de 40 D /45 D"
"tournez de dents"
"la roue de 45 D /bati"
"Ajust:[+][-] / [EXE]"
Do:Locate 6,1,A:Locate 12,2,R:Locate 12,5,(A-9R)/8
Do:Getkey→G
LpWhile G≠42 And G≠32 And G≠31
R+8(G=42)-8(G=32)→R
LpWhile G≠31
Whike End


Le programme occupe maintenant 416 octets, (moins que le tout premier programme, mais avec plus de possibilités !).

Cordialement,
GUGUSSE2.
Lephenixnoir En ligne Administrateur Points: 24146 Défis: 170 Message

Citer : Posté le 04/11/2017 09:53 | #


Remarque en coup de vent :
B+(A/ Abs A)(9Frac (A/9)>=3 Or 9Frac (A/9)<=-3 ) →B

peut se simplifier en
B + (A / Abs A)(Abs (9 Frac(A / 9)) ≥ 3)→B

Un coup de modulo serait peut-être encore mieux mais c'est pas garanti que ça marche bien.
Mon graphe (24 Mars): (gint#27 ; (Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; ...) || (shoutbox v5 ; v5)
Gugusse Hors ligne Membre Points: 73 Défis: 0 Message

Citer : Posté le 04/11/2017 21:02 | #


Bonsoir,

Joli le coup du "Abs" sur la condition !
Pas sur que dans quelques temps la condition soit facile à trouver (pour les angles négatifs).
On oublie le Modulo car absent de ma calculatrice.

Cordialement,
GUGUSSE2.

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 103 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd