Aller au contenu

%MINARR

Position du plus petit élément

Renvoie la position (et non la valeur) de l'élément le plus petit d'un tableau, éventuellement sur une plage d'éléments.

Syntaxe

%MINARR(tableau {: départ {: nombre}})
tableau
Le tableau à examiner : numérique, texte ou date. On ne peut pas y passer %subarr.
départ
Position du premier élément examiné (1 par défaut).
nombre
Nombre d'éléments examinés à partir de départ (jusqu'à la fin du tableau par défaut).
Résultat
Un entier : la position de l'élément le plus petit, comptée dans le tableau entier même si on limite la plage. S'il y a des ex aequo, c'est le premier.

À quoi ça sert

Chercher la plus petite valeur d'un tableau et retrouver, au même indice, les données associées : le client le plus endetté, la date la plus ancienne, le tarif le moins cher. %min compare quelques valeurs ; %minarr parcourt tout un tableau.

Exemple 1 : Le plus petit solde

**free
// %MINARR : position de l'element le plus petit d'un tableau.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s nom   char(20) dim(5);
dcl-s solde packed(9:2) dim(5);
dcl-s pos   int(10);

nom(1) = 'Dupont SA';
solde(1) = 1250.50;
nom(2) = 'Martin et fils';
solde(2) = 0;
nom(3) = 'Leroy SARL';
solde(3) = -320.00;
nom(4) = 'Bernard Transports';
solde(4) = 98000.00;
nom(5) = 'Petit Atelier';
solde(5) = 45.10;

pos = %minarr(solde);
snd-msg 'Position du plus petit solde : ' + %char(pos);
snd-msg 'Client : ' + %trim(nom(pos)) + ', solde ' + %char(solde(pos));

// Le plus petit solde parmi les clients 4 et 5 : la position est celle du tableau entier.
pos = %minarr(solde : 4 : 2);
snd-msg 'Plus petit entre 4 et 5      : ' + %char(pos);

*inlr = *on;

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

Position du plus petit solde : 3
Client : Leroy SARL, solde -320.00
Plus petit entre 4 et 5      : 5

%minarr(solde) renvoie 3, la position de -320,00, et nom(pos) donne le client correspondant. Avec un départ à 4 sur 2 éléments, le plus petit des soldes 4 et 5 est en position 5 : la position est comptée dans le tableau entier.

Exemple 2 : Éléments inutilisés

**free
// %MINARR : les elements inutilises comptent, ils valent 0.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-s solde packed(9:2) dim(6);
dcl-s nb    int(10) inz(3);
dcl-s pos   int(10);

// 3 soldes seulement sur 6 elements.
solde(1) = 1250.50;
solde(2) = 98000.00;
solde(3) = 45.10;

pos = %minarr(solde);
snd-msg 'Tout le tableau     : element ' + %char(pos) + ', valeur ' + %char(solde(pos));

// On limite la recherche aux elements remplis.
pos = %minarr(solde : 1 : nb);
snd-msg 'Elements 1 a 3 (nb) : element ' + %char(pos) + ', valeur ' + %char(solde(pos));

*inlr = *on;

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

Tout le tableau     : element 4, valeur .00
Elements 1 a 3 (nb) : element 3, valeur 45.10

Trois soldes sont remplis sur six. Sur tout le tableau, le plus petit est 0,00, en position 4 : c'est le premier élément inutilisé. En passant le nombre d'éléments remplis (nb), on obtient bien la position 3 (45,10).

Le piège

Les éléments inutilisés valent 0 et gagnent presque toujours. Dans un tableau numérique à moitié rempli, le plus petit élément est un des éléments vides, comme le montre le second exemple (position 4, valeur 0,00) : le résultat n'a rien à voir avec les données.

Il faut limiter la recherche aux éléments utiles avec départ et nombre, ou utiliser un tableau dim(*auto), qui ne contient que ce qu'on y a ajouté.