Aller au contenu

%REM

Reste d'une division

Renvoie le reste de la division entière de deux nombres. Le reste prend le signe du dividende.

Syntaxe

%REM(dividende : diviseur)
dividende
Un nombre entier (zone ou expression sans décimales).
diviseur
Un nombre entier, non nul.
Résultat
Un entier : le reste, de même signe que le dividende. %REM(-17 : 5) vaut -2.

À quoi ça sert

Le reste sert à tester la parité (%REM(n : 2) = 0), à répartir en tournée (un client sur trois), à calculer une clé de contrôle ou à faire tourner un compteur dans un cycle. Il complète %DIV : %DIV(a : b) * b + %REM(a : b) redonne a.

Exemple 1 : Signes et parité

**free
// %REM : reste d'une division entiere - il prend le signe du dividende.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s numero int(10) inz(1247);
dcl-s decalage int(10) inz(-17);
dcl-s cycle  int(10) inz(5);
dcl-s pos    int(10);

snd-msg '%REM(17 : 5)   : ' + %char(%rem(17 : 5));
snd-msg '%REM(-17 : 5)  : ' + %char(%rem(-17 : 5));
snd-msg '%REM(17 : -5)  : ' + %char(%rem(17 : -5));
snd-msg '%REM(-17 : -5) : ' + %char(%rem(-17 : -5));

if %rem(numero : 2) = 0;
  snd-msg %char(numero) + ' est pair';
else;
  snd-msg %char(numero) + ' est impair';
endif;

// Un modulo toujours positif : on ajoute le diviseur puis on reprend le reste.
pos = %rem(%rem(decalage : cycle) + cycle : cycle);
snd-msg 'Position dans le cycle de 5 pour -17 : ' + %char(pos);

*inlr = *on;

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

%REM(17 : 5)   : 2
%REM(-17 : 5)  : -2
%REM(17 : -5)  : 2
%REM(-17 : -5) : -2
1247 est impair
Position dans le cycle de 5 pour -17 : 3

Les quatre combinaisons de signes donnent 2, -2, 2 et -2 : le reste suit le signe du dividende, jamais celui du diviseur. Le numéro 1247 est impair car son reste par 2 n'est pas nul.

La dernière ligne montre la technique du reste toujours positif. -17 dans un cycle de 5 doit tomber en position 3 : on ajoute le diviseur au premier reste (-2 + 5 = 3), puis on reprend le reste.

Le piège

Un dividende négatif donne un reste négatif. %REM(-17 : 5) vaut -2, pas 3 comme pour le modulo d'un tableur. Pour un indice de cycle (jour de la semaine, tournée), un reste négatif fait sortir du tableau. La formule %REM(%REM(x : n) + n : n) donne toujours un résultat de 0 à n - 1. Comme pour %DIV, un diviseur nul arrête le programme (MCH1211) et un opérande décimal est refusé à la compilation (RNF0553).