Overblog
Suivre ce blog Administration + Créer mon blog
13 août 2006 7 13 /08 /août /2006 15:24

// On m'a, sans plus d'manières,
// Bouclé, bouclé.
// On m'a mis pensionnaire
// Dans l'collèg' dont j'n'ai pas la clef.

// Paroles & musique de Charles Trenet.

// Vous vous en doutez, aujourd'hui les BOUCLES.

______________________________________________

res=0;                    // Il est prudent de vérifier la variable qui contrôle
                                // la boucle avant le début de celle-ci...

dou lafindesharicot;       // Booléen toujours à off : boucle infinie...
                                         // (comme l'ancien DO    *HIVAL  en format fixe)
res+=1;                         // Incrémentation

if res=13;   
iter;                        // Occurrence de boucle suivante : il n'y aura pas
endif;                     // de traitement(13).

traitement(res);

if res=38;   
leave;                       // Puisque cette boucle est infini, il faut une intruction
endif;                       // de sortie !

enddo;
______________________________________________

res=0;

dou res=38;               // Do Until, jusqu'à ce que la condition soit vraie.
                                     // Test en fin de boucle.
res+=1;                       // On passe au moins une fois dans la boucle.
traitement(res);

enddo;
______________________________________________

res=0;

dow res<38;                // Do while, tant que la condition est vraie.
                                       // Test en début de boucle.
res+=1;                         // On peut ne pas passer dans la boucle.
traitement(res);           // C'est une sorte de "if".

enddo;
______________________________________________

// Depuis peu il existe une instruction for
// je vous laisse la joie de la découvrir dans la doc et à vos claviers...
// Par exemple pour gérer un tableau grace à son incrémentation intégrée.

// L'essentiel est d'entrer dans la boucle,
// d'effectuer le nombre de tours voulus,
// et d'en sortir.

// Mélanger les While et les Until peut s'avérer délicat...
// Mais pourquoi pas :
// Until pour les fichiers. While pour les écrans, For pour les tableaux ?

// L'avantage de la boucle infinie, me semble-t'il, 
// c'est sa franchise et sa simplicité :
// vous allez y entrer et vous savez qu'il faut un leave dedans pour en sortir !
// A ce propos, leave vous fait sortir de la boucle qui le contient ;
// s'il faut sortir de plusieurs boucles imbriquées, opérer par cascade.

// Le iter peut rendre service pour sauter une partie  de la boucle,
// mais attn :  codé un peu rapidement, il peut vous piéger !

______________________________________________

// a12c4 - à un de ces quatre

Partager cet article
Repost0
8 août 2006 2 08 /08 /août /2006 14:46

Le langage que vous voyez dans cette rubrique est du Rpg IV, dans sa version actuelle, baptisée "free format" ou "format libre", par opposition à l'ancienne façon "colonnée".

C'est pour faciliter le passage de l'ancienne syntaxe à la nouvelle qu'existe ce blog ; et aussi pour me faire un peu de pub !     www.attn.fr

Le Rpg IV a fait suite - en le rénovant complètement - au Rpg III en 94, lequel est apparu sur le S/38, grosso modo en 80.

Auparavent existait, très populaire à l'époque de l'IBM 34, le Rpg II, célèbre par son cycle logique - aujourd'hui on dirait que cette "plateforme" disposait d'un "framework avancé de traitement batch".

Plus d'info sur http://en.wikipedia.org/wiki/RPG_programming_language

Gap - Générateur Automatique de Programme - est la traduction en français de Rpg - Report Program Generator. C'est le même langage !

Curieusement, il y a quelques années, on disait volontier : "Je travaille en Gap." De nos jours on dit plutôt : "Je travaille en Rpg".
Allez savoir pourquoi !

Bon dev sur System 38 et ses successeurs AS/400, iSeries, System i, ...

Quelques instructions de TESTS...

______________________________________________

if zonea=zoneb;
res='égalité';
endif;

______________________________________________

if zonea=zoneb;
res='égalité';

else;
res='différence';
endif;

______________________________________________

if zonea=zoneB;
res='égalité';

elseif zonea>zoneb;
res='plus grand';

elseif zonea<zoneb;
res='plus petit';

else;
res='cas non prévu';
endif;

______________________________________________

select;
when zonea=zoneB;
res='égalité';

when zonea>zoneb;
res='plus grand';

when zonea<zoneb;
res='plus petit';

other;
res='cas non prévu';
endsl;

// Attn : un seul groupe est exécuté : le premier groupe when
// dont la condition est satisfaite ou le groupe other.
// En l'absence du groupe other, il se pourrait que rien ne soit exécuté.
// (D'autre langages présentent une structure similaire
// mais se comportent différement...)

______________________________________________

// Les exemples ci-dessus ne montrent que des comparaisons de 2 zones,
// if, elseif et when évaluent l'expression qui les suit :
// celle-ci doit pouvoir être résolue en vrai ou faux. Voilà tout.

// Vous pouvez écrire :

bin=zonea=zoneb;               // ou ...
bin=(zonea=zoneb);            // bin est définie comme binaire

if bin;
res='égalité';
endif;

 

if unefonction(zonea:zoneb:'=')      // unefonction retourne un binaire
res='égalité';
endif;

// Et bien sûr les opérateurs logiques or, and, not et les parenthèses ( )
// brûlent d'entrer en piste :

if (trouvé and not trop_vieux) or (jour='dimanche');
res='ok';
endif;

______________________________________________

// Peut-être un peu sec tout ça ?
// N'avez-vous jamais bu un whiskey sans soda ou eau ajouté !

Partager cet article
Repost0