Forum

Catégorie : Support
Forum : TI-82 STATS.fr
Vues : 928
Réponses : 18
Type : discussion
Etat : réponses autorisées

Problème de compteur

Joey le 17/09/2011 à 22:39
Slt

Je me suis mis à la programmation sur TI-82 stats il y a très peu de temps car je souhaite réaliser un programme pour me faciliter la vie en cours.
je souhaite qu'en appuyant sur les touches:
- enter => la variable N augmente de 1
- + => la variable E augmente de 1
- - => la variable B augmente de 1
- * => la variable L augmente de 1
- / => la variable M augmente de 1

J'aimerai que les valeur de N,E,B,L,M soit affiché en permanence en haut de la fenêtre et qu'une fois à 100, la personne ne puisse plus augmenter les variables mais seulement les regarder.

Pour cela, j'ai réalise lé script ci-dessous

Code

:ClrHome
:Lbl D
:0→N
:0→E
:0→B
:0→L
:0→M
:codetouche→K
:Output(N,E,B,L,M)

:If K(105)
:Then
:N+1→N

:If K(95)
:Then
:N+1→N

:If K(85)
:Then
:E+1→E

:If K(85)
:Then
:B+1→B

:If K(75)
:Then
:L+1→L

:If K(65)
:Then
:M+1→M

:Output(N,E,B,L,M)
:If N+E+B+L+M=100
:End
:Else
:Goto D



Hélas, lorsque je lance ce programme, la calculette m'affiche FAIT.
je ne vois vraiment pas l'erreur (je débute dans ce langage).
Pouvez vous m'aider ?


Merci d'avance


A+ happy.gif
sandro le 18/09/2011 à 00:07
Ton code contient plusieurs problèmes :
-les conditions : pour tester si k=valeur, tu doit écrire " If k=Valeur " au lieu de " If k(Valeur) "
-tu ne ferme pas tes If : pour chaque If ouvert, il te faut un end.
-tu utilise les Goto alors que tu pourrait utiliser une boucle Repeat à la place.

Voici ce que je te propose (non optimisé):
Code
:Reapeat N+E+B+L+M=100
:ClrHome
:0 -> N
:0 -> E
:0 -> ;B
:0 -> L
:0 -> M
:codetouche -> K

:If K=105
:Then
:N+1 -> N
:End

:If K=95
:Then
:E+1 -> E
:End

:If K=85
:Then
:B+1 -> B
:End

:If K=75
:Then
:L+1 -> L
:End

:If K=65
:Then
:M+1 -> M
:End

:ClrHome
:Disp N,E,B,L,M


:End    //retourne au début (boucle reapeat).


Sandro
linkakro le 18/09/2011 à 00:48
Cela ne te ressemble pas, Sandro, de laisser des Then/End innutiles ! ahh.gif On peut effectivement dire qu'il n'est pas optimisé.
De plus je crois que tu réinitialises les variables à chaque boucle.
Code
EffEcr
EffVar N
EffVar E
EffVar B
EffVar L
EffVar M
Repeat N+E+B+L+M=100
codetouche -> K
If K=105:N+1 -> N
If K=95:E+1 -> E
If K=85:B+1 -> B
If K=75:L+1 -> L
If K=65:M+1 -> M
EffEcr
Disp N,E,B,L,M
End
On peut encore le modifier si on veut afficher les nombres en haut de l'écran.
Et on peut mettre tous les EffVar sur la même ligne.
Joey le 18/09/2011 à 09:00
Slt

En effet, il semble qu'il y avait des erreurs. Néanmoins je me pose quelques questions:

Code

Code
EffEcr
EffVar N Pourquoi le 0->N ne marchait pas, il servait bien à initialiser la var ?
EffVar E
EffVar B
EffVar L
EffVar M
Repeat N+E+B+L+M=100 Ce flood est il obligatoire ?
codetouche -> K
If K=105:N+1 -> N
If K=95:E+1 -> E
If K=85:B+1 -> B
If K=75:L+1 -> L
If K=65:M+1 -> M
EffEcr
Disp N,E,B,L,M On ne peut pas rajouter N:valeur etc à chaque fois ?
End


Le bouclage du script est vraiment la meilleure solution ? (car je fais d'autre langage de programmation et en général, c’est utilisé en dernier recours).
Sans mes erreurs de débutants, mon idée se tournait plus vers le script de Sandro.


A+
sandro le 18/09/2011 à 09:44
Vous avez raison, j'ynitialise à chaque fois les variables, Désolé.

Sinon les 0 -> N marchent, mais ils sont moins rapides que les EffVar N qui deplus ne nécessitent pas un retours à la ligne s'il ne sont pas précédé par un If (sans then) et pas suivit d'un End ou d'un Lbl ce qui entraine des gains d'octés.

Sino, le bouclage est fortement recomendé en TI-Basic car les étiquettes et goto :
- rendent la relecture plus difficile
- le programme étant interprété au fur et à mesure, au moment où le programme rencontre un goto, il doit chrcher dans tout le programme le l'étiquette corespendante jusqu'à ce qu'il la trouve, ce qui est très lent
- vu que le programme est interprété au fur et à mesure, le début de chaque boucle est enregisté quelquepat en mémoire (je supos la pile) jusqu'à ce qu'elle soit fermée. Par conséquent, si on sort d'une boucle à l'aide d'un Goto, le boucle n'est pas terminée et la pile s'encombre jusqu'à créer une erreur mémoir (quand la pile occupe tout l'espace de la Ram utilisateur qui est disponnible).
-ça te prend plus de place en mémoire

Voici donc le plus optimisé que tu peut faire :
Code
EffEcr
EffVar NEffVar EEffVar BEffVar LEffVar MRepeat N+E+B+L+M=100
codetouche -> K
If K=105:N+1 -> N
If K=95:E+1 -> E
If K=85:B+1 -> B
If K=75:L+1 -> L
If K=65:M+1 -> M
EffEcr
Disp N,E,B,L,M
End


Sandro
Joey le 18/09/2011 à 10:07
Merci pour ces précisions.

est ce qu'il y a moyen d'afficher ça de la manière suivante:
texte:var N
texte:var E
texte:var B
texte:var L
texte:var M

?
sandro le 18/09/2011 à 10:23
Tu entend quoi par là ?
Sa devrait t'afficher les 5 les uns en dessous des autres à droite de l'écran.

Sinon, tu peut aussi faire à la place de Disp N,E,B,L,M :
Code
Output(1,1,"ENTRER:    FOIS        //4 espaces entre ":" et "fois"
Output(1,10,N
Output(1,1,"+:    FOIS        //4 espaces entre ":" et "fois"
Output(1,5,E
Output(1,1,"-:    FOIS        //4 espaces entre ":" et "fois"
Output(1,5,B
Output(1,1,"*:    FOIS        //4 espaces entre ":" et "fois"
Output(1,5,L
Output(1,1,"/:    FOIS        //4 espaces entre ":" et "fois"
Output(1,5,M


Sandro
Joey le 18/09/2011 à 11:15
Ton code m'affiche:
Citation
/: valeur


Moi je voudrai que ça est la structure ci-dessous:

Citation

Neutro: 50
Eosino: 4
Baso: 5
Lympho: 10
Mono: 6
sandro le 18/09/2011 à 11:20
Oups, j'ai fait une petite erreur.
Code
Output(1,1,"NEUTRO:    FOIS        //4 espaces entre ":" et "fois"
Output(1,10,N
Output(2,1,"EOSINO:    FOIS        //4 espaces entre ":" et "fois"
Output(2,10,E
Output(3,1,"BASO:    FOIS        //4 espaces entre ":" et "fois"
Output(3,8,B
Output(4,1,"LYMPHO:    FOIS        //4 espaces entre ":" et "fois"
Output(4,10,L
Output(5,1,"MONO:    FOIS        //4 espaces entre ":" et "fois"
Output(5,8,M


Sandro
Joey le 18/09/2011 à 11:41
Merci, ça marche nickel bien que l'utilité de la boucle me parait bizarre encore.
Je ne comprend pas pourquoi ce ne serait pas mieux de faire un script qui vérifie s'il est rendu à 100 une fois la touche tapé. En effet, je ne vois pas en quoi de taper sur une touche pour incrémenter une variable nécessite un bouclage.
linkakro le 18/09/2011 à 12:21
Ce programme est petit, donc l'un ou l'autre est négligeable.
Mais sandro et moi aimons bien les économies.

--- explications

Dans un language réellement compilé, le bouclage est toujours la meilleur solution.
Dans un language avec des goto comme le ti-basic, c'est le mélange des goto et boucles qui pose problème.

Il faut savoir que presque tous les goto peuvent être réécrit en boucles ou fonctions paramétrée (absentes des TI).

Le problème des goto, c'est qu'on a tendance à en abuser. (moi aussi)
Et ceux qui ne savent créer que des goto évitent les boucles quand ils savent qu'elles poseront problème, plutôt que de réécrire l'ensemble des goto.

Pour expliquer l'incohérence des goto/boucles : https://tout82.pages-perso.fre[...].php?sujet=2757


Et maintenant revenons sur le fonctionnement de ces fonctions.

Boucles :

Avantage : La TI retrouve immédiatement une entrée de boucle sans avoir à la chercher (contrairement aux Lbl)

Avantage : certaines structures logiques complexes ne peuvent être assurées efficacement que par une boucle While.

Inconvénient : La TI stocke en mémoire toutes les boucles jusqu'à ce quelles soient fermées.

Inconvénient : Une entrée de boucle ne peut servir que pour une seule boucle.

Goto :

Avantage : Un seul Lbl peut être lié à plusieurs Goto. (innutile dans notre programme)

Avantage : La TI ne garde pas en mémoire les Goto et Lbl.

Incovénient : La TI cherche un Lbl en parcourant tout le programme. Cela se ressent dans les gros programmes.

Dernier critère :
Parfois seule la mémoire occupée dans le code permet de choisir.

--- conclusion

Le code que nous avons écrit dans ce sujet présente l'avantage d'occuper moins de mémoire avec une boucle. Et aucun inconvénient ne se ressent dans ce code.
Joey le 18/09/2011 à 13:49
Je comprend mieux merci. Par contre, je rajouterai un inconvénient à:
Citation

Le code que nous avons écrit dans ce sujet présente l'avantage d'occuper moins de mémoire avec une boucle. Et aucun inconvénient ne se ressent dans ce code.

Ce bouclage entraine des "sauts" lors de l'affichage.

A oui aussi, est ce qu'il y a une fonction pour fermer le programme? En effet, lorsque j'arrive à 100 et que je tape entrer, il relance le programme. J'aimerai donc en quelques sortes que le programme ne soit pas relancé.
Je pensais à envoyer la personne dans la section liste mais je ne trouve pas le fonction pour ça, je trouve juste celle pour aller dans les tables. ( Je sauvegarder les variables dans ma liste L6)


A+
linkakro le 18/09/2011 à 16:38
L'effet de clignotement se résoud en enlevant le "EffEcr" précédant les affichages.
On peut aussi créer une autre boucle permettant une pause jusqu'à la prochaine pression d'une touche.

---
On ne peut pas éviter qu'une pression sur "entrer" hors du programme lance la dernière instruction de l'écran principal, à savoir le programme.
Même "Efface Entrées" ne fonctionne pas.

A moins qu'un test au début du programme teste une variable initialisée à la fin du prog. Mais il faudra modifier manuellement la variable avant de pouvoir relancer le prog une autre fois.

Tu peux aussi changer les touches de commande de tes variables.

---

Consulte les listes L1 à L6 dans le menu stat>Edit.
Le menu liste sert à pratiquer des calculs propres aux listes et à gérer les listes personnalisées. (autres que L1 à L6)
Joey le 18/09/2011 à 16:54
Ok merci

Citation


Consulte les listes L1 à L6 dans le menu stat>Edit.
Le menu liste sert à pratiquer des calculs propres aux listes et à gérer les listes personnalisées. (autres que L1 à L6)


Je sais que c'est censé servir pour les stats et les maths, mais je ne me seras jamais des 6, c'est pour ça que je les save ds la liste L6
linkakro le 18/09/2011 à 17:28
Joey a écrit :
Je pensais à envoyer la personne dans la section liste mais je ne trouve pas le fonction pour ça, je trouve juste celle pour aller dans les tables.
Je ne comprends donc pas ce que tu veux dire par là.
Je t'ai pourtant dit comment consulter les listes sous forme de tableau.
Joey le 18/09/2011 à 18:02
Les consulter, je sais les faire mais en fait, je voulais l'envoyer dans edit> stats pour consulter les résultats et quitter le programme.
Or, tu m' dit qu'on ne pouvait pas quitter le programme de cette manière. J'ai donc abandonné cette idée et j'ai changé mes touches pour moins de soucis.

J'ai aussi retiré les clrecr pour éviter l'écran qui clignote.

Voilà, je crois qu'il est enfin au point bigmouth.gif
linkakro le 18/09/2011 à 18:23
Pour être sûr que tu utilises les listes le mieux possible.
Ce que j'ai bidouillé avec L6(6) est bizarre mais permet d'éliminer des tests et des sto.
Code
EffEcr
EffList L6
6->dim(L6
Repeat 100+L6(6)=somme(L6
codetouche->K
6
If K=105:1
If K=95:2
If K=85:3
If K=75:4
If K=65:5
L6(Rép)+1->L6(Rép
Output(1,1,"NEUTRO:
Output(2,1,"EOSINO:
Output(3,1,"BASO:
Output(4,1,"LYMPHO:
Output(5,1,"MONO:
For(W,1,5
Output(W,10,L6(W
End
End
Sangohan38 le 19/09/2011 à 16:35
J'ai encore mieux pour supprimer des tests:

Code
EffEcr
EffList L6
6->dim(L6
Repeat 100+L6(6)=somme(L6
codetouche->K
6
If K=105 ou K=95 ou K=75 ou K=65:partent(.1(105-65
L6(Rép)+1->L6(Rép
Output(1,1,"NEUTRO:
Output(2,1,"EOSINO:
Output(3,1,"BASO:
Output(4,1,"LYMPHO:
Output(5,1,"MONO:
For(W,1,5
Output(W,10,L6(W
End
End
Persalteas le 19/09/2011 à 20:27
ça sent le TP de BHU, ça... C'est super chiant de les compter au compteur je suis content de voir que d'autres le font à la TI... glasses.gif