Bubullejujulle le 06/03/2017 à 16:55
Bonjour à tous!
J'aimerais me faciliter la vie en cours en programmant un compteur sur ma calto. En gros il s'agirait de faire +1 à chaque appui sur la touche correspondante à la cellule (avec un total de 6 catégories de cellules). Là je résume mais si vous voulez plus de détails n'hésitez pas à demander

Voici mon souci : quand je lance le programme il se termine tout seul sans avoir le temps d'appuyer sur mes touches... je vous donne mon programme, (sachant que je suis quand même sacrément novice). J'ai une TI82 stats.fr. n'hésitez pas à me dire ce qui ne va pas et comment m'améliorer :
Code
:0->N:0->E:0->B:0->L:0->M:0->Z:0->T /// avec N, E, B, L et M mes cellules, Z une cellule particulière
:EffEcr ///(détail plus bas) et T le total de cellules
:codeTouche->K
:If K=82
:Then:N+1->N:T+1->T:End
:If K=83
:Then:E+1->E:T+1->T:End
:If K=84
:Then:B+1->B:T+1->T:End
:If K=92
:Then:L+1->L:T+1->T:End
:If K=93
:Then:M+1->M:T+1->T:End
:If K=94
:Then:Z+1->Z:End /// cette cellule doit rester à part et ne pas être comprise dans le total
:Output(1,1,T
:Output(2,1,"PN
:Output(3,1,"PE
:Output(4,1,"PB
:Output(5,1,"L
:Output(6,1,"M
:Output(7,1,"EB
:Output(2,5,N
:Output(3,5,E
:Output(4,5,B
:Output(5,5,L
:Output(6,5,M
:Output(7,5,Z
Voila, si mon code pouvait marcher ce serait bien, mais si en plus on pouvait faire en sorte qu'il s'arrête à 100 cellules ce serait super ! Et bien sûr je suis ouverte à toute suggestion pour l'optimiser!
merci d'avance pour votre aide !
m@thieu41 le 06/03/2017 à 17:52
Salut!
En gros ce que fais ton prgm là c'est regarder quelle touche est pressée, incrémenter les compteurs, afficher les valeurs puis bah il s'arrête puisque tu ne lui demande rien de plus...
Pour relancer les différentes opérations, une boucle while est adaptée.
Ex:
Code
//Tes initialisations
:0->N:0->E:0->B:0->L:0->M:0->Z:0->T
:EffEcr
//Une boucle while
:Repeat K=45 or T=100 //ie jusqu'à ce qu'on appuye sur 45 ou que le compteur ai passé 100
//Ici tu mets ton code (moins les initialisations déjà effectuées à ne pas refaire à chaque fois)
...
:End //La fin de la boucle
Concernant d'éventuelles optimisations, il n'y a pas vraiment de trucs majeurs à faire.
On pourrait mettre la partie d'affichage qui ne bouge pas au debut, au niveau de l'initialisation (avant la boucle repeat)
Code
Output(2,1,"PN
:Output(3,1,"PE
:Output(4,1,"PB
:Output(5,1,"L
:Output(6,1,"M
:Output(7,1,"EB
Tu n'as pas besoin de Then/End s'il n'y a qu'une instruction dans le bloc après un If:
Code
:If K=94
:Then:Z+1->Z:End
devient:
Homer_Dalor le 22/04/2017 à 14:50
Code
{0,0,0,0,0,0,0 -> L1 //Mettre dans une liste pour faciliter l'incrémentation (voir suite)
:EffEcr
:Disp"","PN","PE","PB","L","M","EB //Prend moins de place que tous les outputs
:Repeat K=45 ou 100=L1(7 //L1(7) est le nombre total d'incrémentation (Sauf si c'est la touche 94 ;)
:codeTouche->K
:If max(K={82,83,84,92,93,94 //Si K=83 par exemple, l'égalité renvoie la liste {0,1,0,0,0,0} et max renvoie la valeur maximum de la liste, ici 1, on en conclue donc qu'une des 6 touches est pressée.
:Then
:10partDec(K/10)-1+3(9-ent(K/10->A //Ce calcul donnera 1 si on appuie sur le 1, 2 si on appuie sur le 2, etc.
:1+L1(A->L1(A
:If K [Pas égal à] 94 : 1+L1(7->L1(7
:End
:Output(1,1,L1(7
:Output(2,5,L1(4
:Output(3,5,L1(5
:Output(4,5,L1(6
:Output(5,5,L1(1
:Output(6,5,L1(2
:Output(7,5,L1(3
:End
Et voilà, optimisation totale et surpuissante ! B|
Sur ce, salut <3
m@thieu41 le 24/04/2017 à 16:43
Un peu brutal comme transition.
L'idée d'utiliser une liste est bien, mais on peut toujours mieux faire:
Code
:10partDec(K/10)-1+3(9-ent(K/10->A //Ce calcul donnera 1 si on appuie sur le 1, 2 si on appuie sur le 2, etc.
:1+L1(A->L1(A
devient:
Code
:10partDec(K/10)-1+3(9-ent(K/10
:1+L1(Rép->L1(Rép
et même:
Code
:10partDec(.1K)-1+3(9-ent(.1K
:1+L1(Rép->L1(Rép
et mieux:
Code
:10partDec(.1K)+26-3ent(.1K
:1+L1(Rép->L1(Rép
########################
D'autre part,
Code
{0,0,0,0,0,0,0 -> L1 //Mettre dans une liste pour faciliter l'incrémentation (voir suite)
:EffEcr
devient:
#########################
Une petite boucle pour l'affichage:
Code
For(I,1,6
Output(1+I,5,L1(3+I-6(I>3 //Rq : on pourrait peut être mettre simplement Output(I+1,5,L1(I ça inverserait juste les 2 lignes du clavier (ou, si c'est important, modifier le calcul de feu A pour les placer dans l'ordre d'affichage dans la liste, et non l'ordre de numéro (flemme de le faire))
End
#########################
Et pour les amateurs de bourrins:
Code
0->C //Ne pas remplacer par EffVar C à cause de IS>(C
EffVar L16->dim(L1
EffEcr
Disp "","PN","PE","PB","L","M","EB
Repeat K=45
codeTouche->K
If max(K={82,83,84,92,93,94
Then
10partDec(.1K)+26-3ent(.1K
1+L1(Rép->L1(Rép
If K!=94
IS>(C,99
End
Output(1,1,C
For(I,1,6
Output(1+I,5,L1(I
End
End
[/code]
Explication:
Si K=94, la commande IS> n'est pas lue, on sort du If normalement.
Sinon, on incrémente C (le compteur), et :
_si la valeur est tjr inférieure à 99, alors on lit le End, et on sort du If normalement.
_si la valeur est supérieure strictement (100 à fortiori), alors on ne lit pas le End... on n'est toujours pas sorti du If! Ainsi le If final sera interprété comme une sortie du If et non du Repeat, et le prgm terminera.
#####################
Une dernière remarque pour la route:
Modifier le calcul de feu A pour envoyer la touche 92 sur 5, 93 sur 6, 94 sur 7, 82 sur 2, 83 sur 3 et 84 sur 4, et mettre à 7 la dimension de L1 permettrait d'écrire, dans la boucle d'affichage, Output(I,5,L1(I
#####################
On peut certainement faire encore plus compact, mais je ne vois pas là directement
