Khanh-Dang Nguyen Thu-Lam <kdntl_at_yahoo_dot_fr>
Version 0.0000001 (document non achevé ;-)
Date: 19 octobre 2003
Ce tutoriel est destiné aux utilisateurs de calculatrices HP48 ou HP49 qui désirent s'avancer un peu plus en programmation RPL (plus précisément User RPL).
Vous pouvez copier librement ce document, tant que son contenu reste inchangé.
J'ai mis ici les commandes qui sont les plus utiles pour programmer. Si vous voulez programmer, vous devriez connaître toutes les commandes ci-dessous. Si ça n'est pas le cas, reportez-vous à la documentation. Toutes ces commandes se trouvent dans le menu PRG.
@ Cal: retourne le calendrier du mois spécifié
@ mois année -> "calendrier"
@ note: ne fonctionne que si le flag -42 est activé (jour de la forme jj.mmaaaa)
« -> m a
«
1 m 100. / + a 1000000. / + @ 01.mmaaaa
@ jour de la semaine
DUP
0. TSTR 1 3 SUB
{ "MON" "TUE" "WED" "THU" "FRI" "SAT" "SUN" }
SWAP POS 1 -
-> j d @ j contient le jour sous la forme jj.mmaaaa
@ d contient le jour de la semaine (0->lundi...)
«
@ le titre
{
"JANVIER"
"FEVRIER"
"MARS"
"AVRIL"
"MAI"
"JUIN"
"JUILLET"
"AOUT"
"SEPTEMBRE"
"OCTOBRE"
"NOVEMBRE"
"DECEMBRE"
}
m GET
" " +
a R->I ->STR +
DUP SIZE 20 SWAP - 2 /
1 SWAP
START
" " SWAP +
NEXT
@ le nom des jours
"
Lu Ma Me Je Ve Sa Di
"
+
@ décalage initial (tous les mois ne commencent pas par un lundi !)
"" d
WHILE 1 - DUP 0 >= REPEAT
SWAP " " + SWAP
END
DROP +
@ la boucle principale
DO
j IP R->I ->STR @ le numéro du jour transformé en chaîne
DUP 1 DISP @ on affiche le numéro du jour pour pas
@ que l'utilisateur s'impatiente ;)
IF DUP SIZE 1 == THEN @ si c'est un jour à un chiffre,
" " SWAP + @ on rajoute un espace devant
END
+
d 1 + 7 MOD @ le numéro dans la semaine de demain
SWAP
IF OVER 0 == THEN @ si demain est un lundi,
"
" @ on va à la ligne
ELSE
" " @ sinon on met un simple espace
END
+
SWAP
'd' STO @ d et j sont maintenant prêts pour la
j 1 DATE+ 'j' STO @ prochaine boucle
UNTIL
j IP 1 == @ si le jour du mois est à 1,
@ c'est qu'on est passé au mois suivant
END
»
»
»
@ Camembert: trace un camembert avec les données en argument
@ { donnée_1 ... donnée_n } ->
«
DUP ΣLIST
-> t @ t est la somme de tous les éléments de la liste
«
0. SWAP + @ on ajoute 0 en début de liste (voir après)
'PPAR' PURGE @ tous les paramètres à zéro
ERASE @ on efface PICT
{ # 0h # 0h } PVIEW @ on affiche PICT à l'écran
DEG @ on se met en mode degrés
0 @ total intermédiaire
@ pile: {données} sous-total
1 PICK3 SIZE
FOR i
OVER i GET @ on prend la i-ème donnée
+ @ qu'on rajoute au sous-total
DUP t / 360. * @ calcul de l'angle
DUP
SIN SWAP COS
R->C 3. * @ coordonnées du point à tracer
(0.,0.)
LINE @ trace
NEXT
DROP2 @ plus besoin de la liste et du sous-total
»
(0.,0.) 3. 0. 360. ARC @ trace le cercle
»
@ Dec2base: convertit un nombre décimal en entier base b
@ n b -> n'
«
-> b
«
"" SWAP @ pile: "résultat" reste
WHILE DUP @ tant que reste non nul
REPEAT
DUP b / IP SWAP @ le quotient dans la division euclidienne par b
b MOD @ le reste
IF DUP 9 > THEN @ si le chiffre en base b,
55 + CHR @ on prend les caractères à partir de la lettre A
ELSE
R->I @ sur HP49 seulement
->STR @ transforme le chiffre en caractère
END
ROT + SWAP @ préfixe le résultat par le nouveau chiffre
END
DROP
b ->TAG @ un petit tag pour faire joli :)
»
»
@ Euclide1: retourne le PGCD de a et b par l'algorithme d'Euclide
@ a b -> pgcd
@ note: version itérative de l'algorithme
«
WHILE DUP @ on regarde si le dernier reste était nul
REPEAT
SWAP OVER MOD @ pile: b, r
END
DROP
»
@ Euclide2: retourne le PGCD de a et b par l'algorithme d'Euclide @ a b -> pgcd @ note: version récursive de l'algorithme « DUP UNROT MOD @ pile: a, b, r IF DUP @ si le reste est non nul, on réapplique l'algorithme THEN Euclide2 ELSE DROP END »
@ Eval2: évalue un programme. A la fin de l'exécution, les flags se retrouvent
@ au même état qu'au début, quoi que le programme fasse
@ «programme» -> ?
«
RCLF
-> f @ f contient les réglages du système
«
IF
IFERR EVAL
THEN 1
ELSE 0
END @ la pile contient 1 en cas d'erreur et 0 sinon
f STOF @ on restore les réglages
THEN
ERRN DOERR @ s'il y a eu erreur, on la déclenche
END
»
»
@ Rot13: applique le chiffrement rot13 à la chaîne de caractère
@ "chaîne" -> chaîne'"
@ note: très très lent ! Vaut mieux programmer ça en assembleur, mais c'est pour
@ un prochain tutoriel.
« @ pile: "chaîne"
1 OVER SIZE
FOR i
DUP i DUP SUB @ on extrait le i-ème caractère
@ rot13 appliqué sur le caractère en cours de traitement
NUM
CASE DUP 97 >= OVER 109 <= AND THEN
13 +
END DUP 110 >= OVER 122 <= AND THEN
13 -
END DUP 65 >= OVER 77 <= AND THEN
13 +
END DUP 78 >= OVER 90 <= AND THEN
13 -
END
CHR
i SWAP REPL @ on remet le caractère à sa place
NEXT
»