Une des instructions les plus connues en langage COBOL est le DISPLAY, qui permet d’écrire des chaînes de caractères sur la sortie système en sortie du programme, c’est-à-dire le plus souvent en SYSOUT sur MVS ou bien encore à l’écran pour le cas des autres environnements.
Bien que chaque développeur ait utilisé le DISPLAY un nombre incalculable de fois, une de ses options pourtant très pratique leur est totalement inconnue. Il s’agit du NO ADVANCING.
Celle-ci permet de ne pas faire de saut de ligne après l’utilisation du DISPLAY.
Une première utilité concernant les environnements hors MVS est de faire des messages de saisie de données qui peuvent suivis d’un ACCEPT sur une même ligne. Ceci rend les saisies interactives beaucoup plus conviviales.
Voici un exemple invitant l’utilisateur à saisir son nom :
DISPLAY "Veuillez saisir votre nom : " NO ADVANCING
ACCEPT NOM-SAISI
Une seconde utilité est de permettre un affichage de multiples données en plusieurs temps sur une seule ligne. Cette méthode peut permettre de répartir des DISPLAYS sur plusieurs parties du programme.
En guise d’exemple pour ce cas de figure, je vous propose un programme qui permet de lister tous les diviseurs d’une suite de nombres :
******************************************************************
* Auteur : Cyril Coquilleau
* Date : 28/03/2019
* Nom : BNBPREM0
* Langage : COBOL
* Objet : Affiche la liste des diviseurs pour une liste
* de nombres
******************************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. BNBPREM0.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NOMBRE-MAX PIC 9(4) VALUE 50.
01 NOMBRE PIC 9(4).
01 DIVISEUR PIC 9(4).
01 BOOLEEN-PREMIER PIC 9(1).
88 NON-PREMIER VALUE 0.
88 EST-PREMIER VALUE 1.
PROCEDURE DIVISION.
* Balayage de tous les nombres jusqu'à la borne maximale
PERFORM VARYING NOMBRE FROM 2 BY 1 UNTIL NOMBRE > NOMBRE-MAX
SET EST-PREMIER TO TRUE
DISPLAY NOMBRE " divisible par : " NO ADVANCING
* Balayage de tous les diviseurs potentiels du nombre
* examiné
PERFORM VARYING DIVISEUR FROM 2 BY 1
UNTIL DIVISEUR >= NOMBRE
* Test sur le modulo pour voir si le nombre est premier.
* Si le reste est égal à 0, le nombre n'est pas premier,
* et l'on l'affiche en sortie
IF FUNCTION MOD(NOMBRE DIVISEUR) = 0
SET NON-PREMIER TO TRUE
DISPLAY '{' DIVISEUR '}' NO ADVANCING
END-IF
END-PERFORM
* Affichage d'un message spécifique en cas de nombre premier
IF EST-PREMIER
DISPLAY 'lui-même (nombre premier)' NO ADVANCING
END-IF
* Ajout d'un DISPLAY pour faire le saut de ligne en vue
* du prochain nombre
DISPLAY ' '
END-PERFORM
* Appelle le paragraphe de fin de programme
GOBACK
.
END PROGRAM BNBPREM0.
Ce qui donne en sortie l’affichage suivant :
0002 divisible par : lui-même (nombre premier)
0003 divisible par : lui-même (nombre premier)
0004 divisible par : {0002}
0005 divisible par : lui-même (nombre premier)
0006 divisible par : {0002}{0003}
0007 divisible par : lui-même (nombre premier)
0008 divisible par : {0002}{0004}
0009 divisible par : {0003}
0010 divisible par : {0002}{0005}
0011 divisible par : lui-même (nombre premier)
0012 divisible par : {0002}{0003}{0004}{0006}
0013 divisible par : lui-même (nombre premier)
0014 divisible par : {0002}{0007}
0015 divisible par : {0003}{0005}
0016 divisible par : {0002}{0004}{0008}
0017 divisible par : lui-même (nombre premier)
0018 divisible par : {0002}{0003}{0006}{0009}
0019 divisible par : lui-même (nombre premier)
0020 divisible par : {0002}{0004}{0005}{0010}
0021 divisible par : {0003}{0007}
0022 divisible par : {0002}{0011}
0023 divisible par : lui-même (nombre premier)
0024 divisible par : {0002}{0003}{0004}{0006}{0008}{0012}
0025 divisible par : {0005}
0026 divisible par : {0002}{0013}
0027 divisible par : {0003}{0009}
0028 divisible par : {0002}{0004}{0007}{0014}
0029 divisible par : lui-même (nombre premier)
0030 divisible par : {0002}{0003}{0005}{0006}{0010}{0015}
0031 divisible par : lui-même (nombre premier)
0032 divisible par : {0002}{0004}{0008}{0016}
0033 divisible par : {0003}{0011}
0034 divisible par : {0002}{0017}
0035 divisible par : {0005}{0007}
0036 divisible par : {0002}{0003}{0004}{0006}{0009}{0012}{0018}
0037 divisible par : lui-même (nombre premier)
0038 divisible par : {0002}{0019}
0039 divisible par : {0003}{0013}
0040 divisible par : {0002}{0004}{0005}{0008}{0010}{0020}
0041 divisible par : lui-même (nombre premier)
0042 divisible par : {0002}{0003}{0006}{0007}{0014}{0021}
0043 divisible par : lui-même (nombre premier)
0044 divisible par : {0002}{0004}{0011}{0022}
0045 divisible par : {0003}{0005}{0009}{0015}
0046 divisible par : {0002}{0023}
0047 divisible par : lui-même (nombre premier)
0048 divisible par : {0002}{0003}{0004}{0006}{0008}{0012}{0016}{0024}
0049 divisible par : {0007}
0050 divisible par : {0002}{0005}{0010}{0025}