Aller au contenu

Code opération RPG III / RPG/400 · IBM i (AS/400) · Calculs

DIV

Diviser

Divise le facteur 1 par le facteur 2 dans la zone résultat ; sans facteur 1, divise la zone résultat par le facteur 2 ; une division par zéro arrête le programme.

Syntaxe

     C           facteur1  DIV  facteur2  result  72
     C                     DIV  facteur2  result  72
     C           facteur1  DIV  facteur2  result  72H
Facteur 1 (18-27)
Le dividende. Facultatif : s'il est absent, c'est la zone résultat (result = result ÷ facteur 2).
Facteur 2 (33-42)
Le diviseur : zone numérique ou littéral. Il ne doit pas valoir zéro.
Zone résultat (43-48)
Reçoit le quotient. Ses décimales décident de la précision : une zone sans décimale reçoit un quotient entier.
Longueur (49-51)
Longueur totale de la zone résultat, décimales comprises. Renseignée quand la zone apparaît pour la première fois dans le programme : c'est ce qui la définit. Sans longueur, une zone encore inconnue provoque QRG7030, « La zone ou l'indicateur n'est pas défini ».
Décimales (52)
Nombre de décimales de la zone résultat ; 0 pour un entier.
Colonne 53
H arrondit le quotient à la dernière décimale de la zone résultat. Attention : un H ici rend le MVR suivant impossible (voir MVR).
Indicateurs de conditionnement (9-17)
Facultatif : l'opération n'est exécutée que si les indicateurs indiqués ont l'état demandé.
Effet
La zone résultat contient le quotient, coupé (ou arrondi avec H) aux décimales de la zone. Le reste de la division est récupérable par un MVR placé immédiatement après. Avec un diviseur à zéro, le programme s'arrête sur l'erreur RPG0102.

À quoi ça sert

DIV sert aux moyennes, aux répartitions, aux conversions d'unités et aux conversions heures/minutes. Combiné à MVR, il donne le quotient entier et le reste en deux lignes.

Exemple 1 : Quotient coupé, arrondi, forme à deux opérandes

     H*  DIV : quotient avec et sans arrondi H
     C                     Z-ADD200       SOMME   72
     C           SOMME     DIV  3         PART    72
     C           SOMME     DIV  3         PARTH   72H
     C           'Sans H'  DSPLY
     C           PART      DSPLY
     C           'Avec H'  DSPLY
     C           PARTH     DSPLY
     C                     DIV  8         SOMME
     C           '2 operan'DSPLY
     C           SOMME     DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Sans H
   6666
Avec H
   6667
2 operan
   2500

200 ÷ 3 = 66,666… : la zone à 2 décimales garde 6666 (66,66) sans H et 6667 (66,67) avec H. DIV 8 SOMME divise la zone en place : 200,00 ÷ 8 = 2500 (25,00).

Exemple 2 : Division par zéro

     H*  DIV : division par zero
     C                     Z-ADD500       TOTAL   72
     C                     Z-ADD0         NBPERS  30
     C           'Avant'   DSPLY
     C           TOTAL     DIV  NBPERS    PART    72
     C           'Apres'   DSPLY
     C                     SETON                     LR

Résultat réel, compilé par CRTRPGPGM et exécuté sur IBM i 7.5 :

Avant
Erreur : RPG0102 - a tenté une division par zéro (facteur 2) (C G S D F).

Le premier message s'affiche, puis le DIV par NBPERS (valeur 0) arrête le travail : RPG0102, « a tenté une division par zéro (facteur 2) ». La ligne « Apres » n'est jamais atteinte.

Le piège

Une division par zéro est une erreur fatale, pas un indicateur : le second exemple s'arrête avec RPG0102 (suivi de RPG9001). Testez le diviseur avant : NBPERS IFNE 0.

Sans H, le quotient est coupé (66,66 et non 66,67) .

En RPG ILE full free

En RPG ILE full free, on écrit l'expression ; %DIV donne le quotient entier et %REM le reste. Un groupe MONITOR permet d'intercepter une division par zéro.

part = somme / 3;
eval(h) parth = somme / 3;
somme /= 8;
monitor;
  part = total / nbpers;
on-error;
  part = 0;
endmon;