Page 1 sur 4

1er programme pour HP39gII : calcul mental

Message non luPosté: 17 Sep 2014, 05:36
de zorglub13
Bonjour,

Je ne sais pas si cela intéresse vraiment quelqu'un mais bon histoire de contribuer un peu sur cette partie du forum sur les HP voici un exemple de programme permettant de s'entrainer au calcul mental (addition, soustraction, multiplication et division); bref un gros classique mais qui a l'avantage de montrer les avancées au niveau du langage par rapport à une TI83 (du moins quand la HP ne plante pas). Ceci n'est pas une critique pour la TI83, car même si le langage est réduit, cela donne l'avantage de savoir ce qu'on peut faire, comment le faire avec un langage, le ti basic z80, stable.

Code: Tout sélectionner
// Declaration des fonctions
Comparaison();
Addition();
Soustraction();
Multiplication();
Division();

// Programme principal
EXPORT Calcul_Mental()
BEGIN
LOCAL vmx, emx, chx;
RANDSEED();
vmx:=10;
emx:=3;
REPEAT
  CHOOSE(chx,"Travail","Addition","Soustraction","Multiplication","Division","Quitter");
  IF chx==1 THEN
   Addition(vmx, emx);
  END;
  IF chx==2 THEN
   Soustraction(vmx, emx);
  END;
  IF chx==3 THEN
   Multiplication(vmx, emx);
  END;
  IF chx==4 THEN
   Division(vmx, emx);
  END;
UNTIL chx==5;
END;

// Les additions
Addition(vmx, emx)
BEGIN
LOCAL vl1, vl2, res;
vl1:=INT(RANDOM(vmx-1))+1;
vl2:=INT(RANDOM(vmx-1))+1;
res:=vl1+vl2;
Comparaison(vl1, vl2, res, emx, "+");
END;

// Les soustractions
Soustraction(vmx, emx)
BEGIN
LOCAL vl1, vl2, res;
vl1:=INT(RANDOM(vmx-1))+1;
vl2:=INT(RANDOM(vmx-1))+1;
IF vl1 < vl2 THEN
  res:=vl1;
  vl1:=vl2;
  vl2:=res;
END;
res:=vl1-vl2;
Comparaison(vl1, vl2, res, emx, "-");
END;

// Les multiplications
Multiplication(vmx, emx)
BEGIN
LOCAL vl1, vl2, res;
vl1:=INT(RANDOM(vmx-1))+1;
vl2:=INT(RANDOM(vmx-1))+1;
res:=vl1*vl2;
Comparaison(vl1, vl2, res, emx, "*");
END;

// Les divisions
Division(vmx, emx)
BEGIN
LOCAL vl1, vl2, res;
vl1:=INT(RANDOM(vmx-1))+1;
vl2:=INT(RANDOM(vmx-1))+1;
Comparaison(vl1*vl2, vl2, vl1, emx, "/");
END;

// Comparaison de valeurs
Comparaison(vl1, vl2, res, emx, ope)
BEGIN
LOCAL ess, nbr, ok;
LOCAL msg, txt;
LOCAL pos,dec;
pos:=0;
dec:=12;
ess:=0;
txt:=vl1+ope+vl2+"=";
REPEAT
  INPUT(nbr,"Opération",txt,"0");
  RECT_P;
  ess:=ess+1;
  msg:="Essai n"+ess+" : " + txt + nbr;
  TEXTOUT_P(msg+" ?",0,pos,0);
  ok:=(nbr==res);
  IF ok THEN
   TEXTOUT_P("Bravo, c'est la bonne réponse !",0,dec,0);
  ELSE
   IF ess < emx THEN
    TEXTOUT_P("Erreur, essaye encore !",0,dec,0);
   ELSE
    TEXTOUT_P("Erreur, "+txt+res+" !",0,dec,0);
   END;
  END;
  // 20 (BACK) pour la HP39Gii et 4 (ESC) pour la HP Prime
  REPEAT UNTIL ISKEYDOWN(20);
UNTIL ok OR (ess==emx);
END;


J'ai eu pas mal de soucis avec la commande PRINT (que j'ai remplacé par TEXTOUT_P) car lors d'exécution multiple du PRINT, le texte fini par depasser la taille de l'écran et ne scrolle pas. Comme le programme attend ensuite une touche particulière pour passer à la suite on ne peut pas utiliser les touches haut et bas pour faire scroller l'écran. De plus, je n'ai pas vu comment effacer la console d'écran (utilisée avec les PRINT). Ce problème n'existait pas avec les HP Prime.

Autre soucis avec le CASE (avant les IF et en rajoutant une clause DEFAULT à la fin) qui ne fonctionne pas sur la 39gII.

Autre problème du genre pour passer à l'écran suivant j'appuie une seule fois sur la touche ENTREE mais à l'écran suivant il y a un menu qui prend malheureusement en compte la touche ENTREE une 2ème fois et l'option par défaut (ou la dernière sélectionnée) du menu est sélectionné automatiquement. Du coup pour éviter ce problème, la touche ESC sur la 39gII est utilisée pour sortir d'un écran d'affichage de message. Je n'ai pas utilisé MSGBOX car lorsque le message est affiché, je vois en arrière-plan, l'écran de gestion des programmes...

Par contre, avantage pour le côté moderne : variables locales, fonctions avec paramètres... sauf que le CASE ne marche pas.

A+

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 18 Sep 2014, 20:36
de zorglub13
C'est marrant, j'essaye de programmer en TI Basic 68k (émulateur) et finalement je découvre que le langage est encore bien mieux que ce que je pensais par rapport au TI Basic Z80. Il est du même style que celui de HP mais sans les bugs... De plus, j'ai l'impression qu'il y a plus de possibilité en matière d'interface graphique (boîte de dialogue...). Donc finalement HP a essayé de copier TI et s'est planté !

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 18 Sep 2014, 21:27
de zorglub13
Sauf qu'il y a peut être des limitations dans le ti basic 68k : dans mon programme sur HP, le programme calcul_mental appelle le sous programme addition qui appelle lui-meme comparaison. Je n'ai pas pu le faire en basic 68k ? Comme si dans un même programme on ne pouvait définir qu'un seul niveau de sous programmes ? Est-ce bien le cas ?

Je suppose qu'on peut s'en sortir en sortant comparaison du programme calcul_mental ?

À+

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 18 Sep 2014, 22:09
de Bisam
Non, il n'y a pas du tout de limitations de ce genre dans le Basic 68k.
La seule limitation est qu'une fonction ne peut pas appeler un programme (mais un programme peut appeler un programme ou une fonction et une fonction peut appeler une fonction également)
On peut même faire de la récursivité, si on veut !

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 19 Sep 2014, 05:15
de zorglub13
Ok je vais vérifier cela merci..

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 22 Sep 2014, 21:06
de zorglub13
Apparemment je ne peux pas mettre tout dans le même programme TI89 (tant pis si c'est le forum HP mais c'est dans la suite du post)...

Voici le 1er programme "calcul"

Code: Tout sélectionner
calcul(vmx,emx)
Prgm

Local add,sub,mul,div

Define add(vmx,emx)=Prgm
Local vl1,vl2,res
rand(vmx)->vl1
rand(vmx)->vl2
vl1+vl2->res
opecmp(vl1,vl2,res,emx,"+")
EndPrgm


Define sub(vmx,emx)=Prgm
Local vl1,vl2,res
rand(vmx)->vl1
rand(vmx)->vl2
If vl1<vl2 Then
  vl1->res
  vl2->vl1
  res->vl2
EndIf
vl1-vl2->res
opecmp(vl1,vl2,res,emx,"-")
EndPrgm

Define mul(vmx,emx)=Prgm
Local vl1,vl2,res
rand(vmx)->vl1
rand(vmx)->vl2
vl1*vl2->res
opecmp(vl1,vl2,res,emx,"*")
EndPrgm

Define div(vmx,emx)=Prgm
Local vl1,vl2,res
rand(vmx)->res
rand(vmx)->vl2
res*vl2->vl1
opecmp(vl1,vl2,res,emx,"/")
EndPrgm

Local chx
Loop
ClrHome
ClrIO
PopUp {"Addition","Soustraction", "Multiplication", "Division", "Quitter"}, chx
If chx=1 Then
  add(vmx,emx)
ElseIf chx=2 Then
  sub(vmx,emx)
ElseIf chx=3 Then
  mul(vmx,emx)
ElseIf chx=4 Then
  div(vmx,emx)
Else
  Exit
EndIf
EndLoop

EndPrgm


qui appelle le programme "opecmp" :

Code: Tout sélectionner
opecmp(vl1,vl2,res,emx,ope)
Prgm
Local txt, ess, nbr
ClrIO
0->ess
string(vl1)&" "&ope&" "&string(vl2)&" = "->txt
Loop
  ess+1->ess
  Input "Essai n°"&string(ess)&" : "&txt&"?",nbr
  If nbr=res Then
   Disp "Bravo, bonne reponse !"
   Exit
  Else
   If ess<emx Then
   Disp "Erreur, mauvaise reponse !"
   Else
   Disp "Erreur, voici la correction !"
   Disp txt&string(res)
   Exit
   EndIf
  EndIf
EndLoop
Pause
EndPrgm


Donc "calcul" appelle soit le sous-programme "add", soit "sub", soit "mul", soit "div" qui pour chacun de ces 4 sous programmes appelle le programme "opecmp".

Le programme "opecmp" peut il être défini comme un sous-programme de calcul et être appelé de "add", "sub", "mul" et "div" ?

Merci

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 24 Sep 2014, 16:39
de zorglub13
Bonjour, je ne sais si j'ai été clair dans ma question ? Avez vous déjà expérimenté ce problème en ti basic 68k d'organisation du code ?

Merci

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 24 Sep 2014, 19:37
de critor
zorglub13 a écrit:Donc "calcul" appelle soit le sous-programme "add", soit "sub", soit "mul", soit "div" qui pour chacun de ces 4 sous programmes appelle le programme "opecmp".

Le programme "opecmp" peut il être défini comme un sous-programme de calcul et être appelé de "add", "sub", "mul" et "div" ?


Déjà, quelle différence fais-tu entre "programme" et "sous-programme" ?

Car pour moi, "opecmp" est déjà un sous-programme au sens où il est appelé par les programmes add, sub, mul et div.

En quoi cette situation ne te convient-elle pas ?

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 24 Sep 2014, 19:59
de zorglub13
Salut

J'appelle un programme ce que'on crée à partir du program editor avec la commande New. Dans mon exemple, il y a calcul et opecmp. J'appelle sous-programme un programme définit dans un programme. J'appelle add, sub, mul et div des sous programmes parce qu'ils sont définis dans le programme calcul.

Ce que je souhaite faire c'est comme pour la version hp39gii, tout mettre dans un seul code pour faire un tout.

À+

Re: 1er programme pour HP39gII : calcul mental

Message non luPosté: 24 Sep 2014, 20:24
de Lepzulnag
D'après mes souvenirs (cela fait longtemps que je n'ai pas programmé en TI-Basic) tu ne peux en effet pas créer de sous-programme dans un programme, mais tu peux par contre créer des sous-fonctions (dans ce langage, une "fonction" est comme un "programme", sauf que toutes les variables doivent être locales).

Donc je te conseille de modifier un peu ton code pour utiliser non pas des sous-programmes, mais des sous-fonctions, et cela devrait marcher. Il va falloir que tu modifies la structure de ton code par contre, car une fonction ne peut pas appeler un programme, mais uniquement une autre fonction.