Poster un nouveau sujet Poster une réponse
Problème de compteur
Auteur Message
Joey



Autorisation : Membre
Nb de messages : 8
Inscrit le : Sam 17 Sep 2011, 22:32
Posté le : Sam 17 Sep 2011, 22:39   Citer 

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

 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Dim 18 Sep 2011, 0:07   Citer 

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

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 18 Sep 2011, 0:48   Citer 

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.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Joey



Autorisation : Membre
Nb de messages : 8
Inscrit le : Sam 17 Sep 2011, 22:32
Posté le : Dim 18 Sep 2011, 9:00   Citer 

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+

 Adresse email Haut de page Bas de page 
 
Google_AdSense



Publicité    



 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Dim 18 Sep 2011, 9:44   Citer 

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

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
Joey



Autorisation : Membre
Nb de messages : 8
Inscrit le : Sam 17 Sep 2011, 22:32
Posté le : Dim 18 Sep 2011, 10:07   Citer 

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

?

 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Dim 18 Sep 2011, 10:23   Citer 

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

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
Joey



Autorisation : Membre
Nb de messages : 8
Inscrit le : Sam 17 Sep 2011, 22:32
Posté le : Dim 18 Sep 2011, 11:15   Citer 

Ton code m'affiche:

Citer
/: valeur



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


Citer

Neutro: 50
Eosino: 4
Baso: 5
Lympho: 10
Mono: 6



 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Dim 18 Sep 2011, 11:20   Citer 

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

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
Joey



Autorisation : Membre
Nb de messages : 8
Inscrit le : Sam 17 Sep 2011, 22:32
Posté le : Dim 18 Sep 2011, 11:41   Citer 

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.

 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 18 Sep 2011, 12:21   Citer 

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.free.fr/forum/sujet.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.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Joey



Autorisation : Membre
Nb de messages : 8
Inscrit le : Sam 17 Sep 2011, 22:32
Posté le : Dim 18 Sep 2011, 13:49   Citer 

Je comprend mieux merci. Par contre, je rajouterai un inconvénient à:

Citer

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+

 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 18 Sep 2011, 16:38   Citer 

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)

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Joey



Autorisation : Membre
Nb de messages : 8
Inscrit le : Sam 17 Sep 2011, 22:32
Posté le : Dim 18 Sep 2011, 16:54   Citer 

Ok merci


Citer


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

 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 18 Sep 2011, 17:28   Citer 


Citer : Joey
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.

----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Joey



Autorisation : Membre
Nb de messages : 8
Inscrit le : Sam 17 Sep 2011, 22:32
Posté le : Dim 18 Sep 2011, 18:02   Citer 

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

 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 18 Sep 2011, 18:23   Citer 

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



----------------------
ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Sangohan38



Autorisation : Membre
Nb de messages : 3293
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Lun 19 Sep 2011, 16:35   Citer 

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



 Adresse email Haut de page Bas de page 
 
Persalteas



Autorisation : Membre
Nb de messages : 2086
Inscrit le : Sam 23 Jan 2010, 20:09
Posté le : Lun 19 Sep 2011, 20:27   Citer 

ç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

 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Page générée en 6 requêtes