Forum

Catégorie : Programmes
Forum : Aide à la programmation
Vues : 2503
Réponses : 6
Type : discussion
Etat : réponses autorisées

Algorithme Pile ou face

Fuzion le 18/03/2014 à 16:39
Bonjour bigmouth.gif

En fait, j'ai un petit problème angry.gif
En maths, on commence la programmation sur calculatrice, la TI 82 Stats(.fr) et pour ça on a un exercice à faire
Un algorithme avec pile ou face:

Le programme génère Pile ou face
Si PILE : Rejouer 1 fois
Si FACE : Rejouer 2 fois
Noter les résultats

Pour l'instant, j'ai le début

Code
EntAléat(1,2)->Z
If Z=1
Disp "PILE"
If Z=2
Disp "FACE"


Mais pour la suite, les "rejouer 1 ou 2 fois", c'est là que j'ai besoin d'aide
J'ai essayé de créer un second programme, faisant appel à celui là pour les relances, mais il relance à l'infinie (même si j'aimerais l'avoir en 1 programme)

Du coup, je fais appel à qui saura m'aider..
Merci bigmouth.gif
linkakro le 18/03/2014 à 19:11
Montres ce que tu as tenté avec le programme principal. Je ne sais pas ce que tu as fait correctement ou pas.

Le sujet est trop flou.
Les lancers supplémentaires peuvent-ils causer d'autres lancers supplémentaires ? Si c'était le cas, on ne cesserait jamais de rejouer puisqu'on doit toujours rejouer, peu importe le nombre de parties supposé à atteindre.
S'il n'y avait pas ce problème de sujet, je t'aurais conseillé d'utiliser des variables mémoire comme des compteurs pour contrôler le nombre de parties.
Voici un code brut, sans optimisation, supposé respecter ma compréhension du sujet.
Code
0->A // numéro de partie
1->B // total parties
While A<B
A+1->A
randInt(1,2->Z
If Z=1
B+1->B
If Z=2
B+2->B
Pause Z
End


Si seul le premier lancer donne lieu à de nouvelles tentatives, alors envisager d'utiliser des boucles est pénible et sans boucle on a quand même besoin de variables intermédiaires.

Il y a peu de code pour générer chaque aléatoire donc je me permet d'écrire ce code plusieurs fois à l'intérieur des alternatives. Par ailleurs l'essentiel me semble être d'afficher donc je ne m'ennuie pas à tout stocker.
Code
randInt(1,2->Z
Pause Z
If Z=1
Then
Pause randInt(1,2
Else
Pause randInt(1,2
Pause randInt(1,2
End
Puis je simplifie.
Code
randInt(1,2->Z
Pause Z
Pause randInt(1,2
If Z=2
Pause randInt(1,2->Z

Pour écrire l'aléatoire une seule fois, je le met dans une boucle.
Code
0->A // numéro de partie
1->B // total parties
While A<B
A+1->A
randInt(1,2->Z
Pause Z
If A=1
Then
If Z=1
B+1->B
If Z=2
B+2->B
End
End
Cela peut bien sûr s'optimiser avec d'autres valeurs.
Code
0->A // numéro de partie
3->B // total parties
While A<B
A+1->A
randInt(1,2->Z
Pause Z
If A=1 and Z=1
B-1->B
End

On peut aussi optimiser en changeant l'ordre des actions et avec la variable Ans/Rép.
Code
0->A // numéro de partie
3->B // total parties
While A<B
A+1->A
Pause randInt(1,2
If A=1 and Ans=1
B-1->B
End
Fuzion le 19/03/2014 à 00:01
Salut

En fait, ce que j'ai fait, c'est dans le post principal, le tout, car ce que j'ai tenté marchait pas, du coup, j'ai que la base, le premier lancer
Et c'est à partir de ce seul lancer, que le pgrm rejouera ou bien 1 fois, ou bien 2 fois

En gros, en français :

Code
Générer soit pile, soit face
SI PILE : Rejouer 1 fois, finir et afficher les résultats
SI FACE : Rejouer 2 fois, finir et afficher les résultats

Les deux lancers secondaires ne relanceront pas, seul le premier décide de rejouer

Ensuite, merci beaucoup pour l'aide, hélas, comme je débute depuis peu dans l'univers vaste de la TI, je saurais pas trop quoi faire de tes morceaux (?) de programme ahh.gif

Donc si ce serait possible d'avoir le programme entier ?

Je répète ;

Code
Aléatoire 1 ou 2 (=PREMIER LANCER)
Si 1 (du premier lancer)
Aléatoire 1 ou 2

Si 2 ( le 2 dans le premier lancer)
Aléatoire 1 ou 2
Aléatoire 1 ou 2 (donc 2x)

1 = Pile
2 = Face


J'aurais pensé à :
D’abord faire es jeux, les générations aléatoires
PUIS alors afficher les résultats
Mais je sais pas trop comment rédiger ça

J'avais fait un essai moi même
Code
Lbl 1
BinAléat (1,2)->Z
Si Z=1
Disp PILE
Goto Lbl 8
Si Z=2
Disp FACE
Goto Lbl 9
Lbl 9
BinAléat (1,2)->X
If X=1
Disp PILE
If X=2
Disp FACE
Lbl 8
BinAléat (1,2)->S
If S=1
Disp PILE
If S=2
Disp FACE
Pause

Seulement, soit le jeu jouait à l'infinie, sinon, il me relancait 2x avec pile au premier lancer (qui doit jouer 1x )


Par ailleurs, je connait pas (pas encore) les commandes "While A<B" Et "A+1->1" (et avec autres valeurs), elle font quoi? moodforlove.gif

Je sais pas trop comment expliquer autrement, mais merci de votre aide minied.gif
linkakro le 19/03/2014 à 00:28
Consulte le tutoriel de ma signature et un manuel. Le tutoriel de Mdr1 est disponible aussi.

Chacune de mes balises contient un programme différent pour réaliser ce que tu veux.

Mon objectif est de montrer plusieurs solutions et des étapes de développement de l'optimisation.

Ton deuxième code de ton deuxième message se traduit purement en mon deuxième code de mon premier message.

"->" représente la touche "sto->" au dessus de ON. C'est l'affectation d'une valeur.
Quand j'écris A+1->A cela incrémente.

While = Tant Que
se trouve dans le menu prgm
C'est un mot-clé commençant une boucle. Elle se termine au End.
La boucle est exécutée tant que la condition est vraie. Le test est aussi effectué avant de rentrer.

Le symbole "<" est avec "=" dans 2nde+math(test)

La fonction BinAléat/randBin(a,p,n) sert à réaliser n expériences de a lancers de pièce à probabilité p. Cela donne un nombre pour une expérience ou une liste de nombres pour plusieurs expériences.

La fonction entAléat/randInt(a,b) permet de générer un entier aléatoire équiprobable entre a et b inclus.

Pause permet d'attendre, d'afficher un calcul ou une variable, de parcourir l'affichage s'il dépasse de l'écran et stocke le résultat dans Rép/Ans.
Ans=answer=Rép= dernière réponse

Les tests se font ainsi.
Code
If condition
une_seule_action
Code
If condition
Then // alors
une_ou_plusieurs_actions
Else  // sinon // facultatif
une_ou_plusieurs actions
End // fin
Fuzion le 19/03/2014 à 22:59
Pour l'instant, je suis le tutoriel TI Basic sur openclassrooms, j'irai voir le tiens par la suite clown.gif

Ok, je comprends, merci pour les explications !

Code
randInt(1,2->Z
Pause Z
If Z=1
Then
Pause randInt(1,2
Else
Pause randInt(1,2
Pause randInt(1,2
End


Donc j'arrive à générer des 1,1 sinon 2,1,1 etc..
Mais où placer les commandes qui annonceront Pile/Face à la place des 1/2 ?

En tout cas, merci beaucoup pour l'aide ! bigmouth.gif
linkakro le 20/03/2014 à 00:27
Mon tutoriel aide à passer de l'algorithmie à la calculatrice. Mdr1 enseigne toute la calculatrice.

Remplaces les affichages Disp ou Pause par des alternatives qui affichent les messages.

Comme je veux alléger le code, je montrerai un appel de programme.

Nomme ce programme PILEFACE pour que ce soit cohérent avec mon code d'appel.
Code
 // programme PILEFACE
entAléat(1,2->Z
If Z=1
Disp "PILE"
If Z=2
Disp "FACE"
Ceci appelle le programme PILEFACE.
La comande "prgm" est dans le menu prgm et la liste des programmes déjà existants pour saisir rapidement est dans prgm\exec de l'éditeur.
Code
prgmPILEFACE
If Z=1
Then
prgmPILEFACE
Else
prgmPILEFACE
prgmPILEFACE
End
Fuzion le 03/04/2014 à 22:24
Salut

Certes avec du retard, mais merci beaucoup moodforlove.gif