Le RPL en action

Khanh-Dang Nguyen Thu-Lam <kdntl_at_yahoo_dot_fr>

Version 0.0000001 (document non achevé ;-)
Date: 19 octobre 2003

1. Ce document

Description

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).

Copyright

Vous pouvez copier librement ce document, tant que son contenu reste inchangé.

2. Pré-requis

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.

2.1. La pile

DUP, SWAP, DROP, OVER, ROT, UNROT,
ROLL, ROLLD, PICK, UNPICK

2.2. Les structures de contrôle

IF ... THEN ... [ELSE ...] END
CASE ... THEN ... END [... THEN ... END] ... END
START ... NEXT
START ... STEP
FOR ... NEXT
FOR ... STEP
WHILE ... REPEAT ... END
DO ... UNTIL ... END
IFERR ... THEN ... [ELSE ...] END

2.3. Les objets

SIZE, GET, PUT, SUB, REPL, POS, HEAD, TAIL,
OBJ->,
->STR, STR->,
->LIST, LIST->,
->ARRY, ->ARRY,
NUM, CHR,
TYPE

2.4. Entrées et sorties

INPUT, KEY, WAIT,
CLLCD, FREEZE,
DISP, MSGBOX

2.5. Graphisme

PVIEW, PICT,
PIXON, PIXOFF, LINE, TLINE, BOX, ARC,
BLANK, GOR, GXOR, SUB, REPL

3. Action !

@ 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
»