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
Harrondit le quotient à la dernière décimale de la zone résultat. Attention : unHici rend leMVRsuivant impossible (voirMVR).- 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 unMVRplacé immédiatement après. Avec un diviseur à zéro, le programme s'arrête sur l'erreurRPG0102.
À 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;