Les instructions arithmétiques sont de 2 types:
- les opérations simples :
– ADD
– SUBTRACT
– MULTIPLY
– DIVIDE - les opérations complexes :
– COMPUTE et ses opérateurs + – * / **
Ces instructions disposent d’options communes :
GIVING nom-de-donnée :
qui indique que le résultat de l’opération sera mémorisé dans nom-de-donnée.ADD VAR1 VAR2 GIVING RESULTAT
ROUNDED :
après une opération le résultat tronque les décimales au-delà de ce qui
a été déclaré dans la PIC. Ainsi la quantité 234,478 sera de 234,4 si la
PIC de la variable résultat est de 999V9.
Avec ROUNDED, COBOL ajoute 5 au premier chiffre non significatif de droite pour réaliser l’arrondi à l’unité supérieure du chiffre le moins significatif si le premier chiffre non significatif de droite est >= 5.
Avec rounded notre exemple devient 234,5.
ON SIZE ERROR ordre impératif
Cette option permet de prévenir des incidents de calcul comme :
– la division par zéro
– les dépassements de capacité (pour rappel un numérique est limité à 18 chiffres)
exemple : DIVIDE A BY B ON SIZE ERROR MOVE ZERO TO B
!!!! Les calculs ne pourront se faire naturellement qu’avec des zones élémentaires numériques, il en ira de même pour les constantes. !!!!
L’ADDITION – ADD
Format n°1 :
| nom-de-donnée-1 | | nom-de-donné-2 |
ADD |
| | | | littéral-numérique-1 | | littéral-numérique-2 |
[ ROUNDED]
TO nom-de-donnée.
-n [ ROUNDED]
nom-de-donnée.
]
[ ON SIZE ERROR ordre-impératif.
On ajoute nom-de-donnée-1 ou littéral-numérique-1 et nom-de-donnée-2 ou littéral-numérique-2 à la variable nom-de-donnée et le résultat peut être arrondi.
Exemple :
ADD 1000 QTE1 TO TOTAL ROUNDED ON SIZE ERROR MOVE 0 TO TOTAL
Ce qui signifie ajouter 1000 + QTE1 + TOTAL arrondir, transférer le résultat de l’opération dans TOTAL. En cas d’erreur mettre TOTAL à 0.
Format n° 2 :
|nom-de-donnée-1| |nom-de-donné-2|
|nom-de-donné-n|
ADD |
| | | … | | | littéral-1 | | littéral-2 |
[ ROUNDED]| littéral-n |
GIVING nom-de-donnée.
]
[ ON SIZE ERROR ordre-impératif.
Dans ce cas on ajoute nom-donnée-1 à nom-donnée-2 à….. nom-donnée-n le résultat est placé dans nom-de-donnée, éventuellement arrondi.
Exemple :
ADD TVA TOTHTVA GIVING TOTTVAC
Format n°3 :
ADD CORRESPONDING nom-de-groupe-1 TO nom-de-groupe2
[ ROUNDED ] [ ON SIZE ERROR ordre-imp. ]
Avec ce format, les zones élémentaires du groupe-1 sont additionnées aux données élémentaires du groupe-2 ayants des noms-données identiques, et les résultats sont placés dans les zones élémentaires du groupe-2.
L’abréviation COBOL de CORRESPONDING est CORR. Les clauses OCCURS et REDEFINES sont mal supportées.
Prenons par exemple un fichier paie mensuel d’enregistrement ENRMENS et le fichier ENRTOT.
De description :
01 ENRMENS.
02 CODE-EMPLOYEE PIC 999.
02 HEURE-P PIC 999.
02 SAL-BRUT PIC 9(6).
01 ENRTOT.
02 COD-EMPL PIC 999.
02 HEURE-P PIC 999.
02 SAL-BRUT PIC 9(6).
02 SAL-NET PIC 9(6).
Le fait d’écrire ADD CORR ENRMENS TO ENRTOT, engendre les additions suivantes :
HEURE-P OF ENRTOT = HEURE-P OF ENRTOT + HEURE-P OF ENRMENS
SAL-BRUT OF ENRTOT = SAL-BRUT OF ENRTOT + SAL-BRUT OF ENRMENS
ADD identifier-1 TO identifier-2
ROUNDED ON SIZE ERROR ordre-impératif-1
NOT ON SIZE ERROR ordre impératif-2
END-ADD
ADD identifier-1 TO identifier-2
GIVING identifier-3 ROUNDED
ON SIZE ERROR ordre-impératif-1
NOT ON SIZE ERROR ordre-impératif-2
END-ADD
Identifier-1 peut être une constante ou une variable numérique ou un ensemble des deux.
Les ordres impératifs 1 et 2 peuvent être constitués d’une ou de plusieurs instructions.
Avec l’option GIVING identifier-2 peut également être une constante numérique puisque le résultat est placé dans identifier-3.
LA SOUSTRACTION – SUBTRACT
Format 1 :
|Identifier-1|
SUBTRACT|
| FROM identifier-2 ROUNDED
| littéral-1 |
ON SIZE ERROR
ordre-impératif
-1
NOT ON SIZE ERROR ordre-impératif-2
END-SUBTRACT
Format 2 :
|Identifier-1|
|Identifier-2|SUBTRACT|
| FROM
|
| | littéral-1 |
| littéral-2 |
GIVING identifier-3
ROUNDED ON SIZE ERROR
ordre-impératif
-1
NOT ON SIZE ERROR ordre-impératif-2
END-SUBTRACT
Format 3 :
SUBTRACT CORR identifier-1 FROM identifier-2 ROUNDED
ON SIZE ERROR ordre-impératif-1
NOT ON SIZE ERROR ordre-impératif-2
END-SUBTRACT
Remarques:
identifier-1 peut être une série de variables ou de constantes numériques.
Les options ROUNDED et ON SIZE ERROR ne sont pas obligatoires.
END-SUBTRACT ne s’applique que si les options SIZE ERROR sont utilisées.
Exemple :
SUBTRACT V1 V2 12 FROM TOTAL. (TOTAL = TOTAL – (V1 + V2 + 12))
SUBTRACT V1 V2 12 FROM TOTAL GIVING SOUSTOT.
(SOUSTOT = TOTAL – (V1 + V2 + 12))
Dans le 1er cas TOTAL doit être un numérique de travail, dans le 2ème cas SOUSTOT peut être un numérique d’édition car il n’intervient pas dans le calcul.
LA MULTIPLICATION – MULTIPLY
Format 1 :
|Identifier-1|
MULTIPLY|
| BY identifier-2 ROUNDED
| littéral-1 |
ON SIZE ERROR
ordre-impératif
-1
NOT ON SIZE ERROR ordre-impératif-2
END-MULTIPLY
Format 2 :
|Identifier-1|
|Identifier-2|
| MULTIPLY
|
BY
|
| | littéral-1 |
| littéral-2 |
GIVING identifier-3
ROUNDED ON SIZE ERROR
ordre-impératif
-1
NOT ON SIZE ERROR ordre-impératif-2
END-MULTIPLY
Exemple : MULTIPLY 12 BY V1.
( V1 = V1 * 12)
MULTIPLY V1 BY V2 GIVING V3. ( V3 = V1 * V2)
LA DIVISION – DIVIDE
Format 1 :
|Identifier-1| DIVIDE
|
| INTO
identifier-2 ROUNDED
| littéral-1 |
ON SIZE ERROR
ordre-impératif
-1
NOT ON SIZE ERROR ordre-impératif-2
END-DIVIDE
Format 2 :
|Identifier-1|
|Identifier-2||
INTO|
|
|DIVIDE
|
||
| | littéral-1 |
|
BY |
| littéral-2 |
GIVING identifier-3
ROUNDED ON SIZE ERROR
ordre-impératif
-1
NOT ON SIZE ERROR ordre-impératif-2
END-DIVIDE
Format 3 :
|Identifier-1|
|Identifier-2||
INTO|
|
|DIVIDE
|
||
| | littéral-1 |
|
BY |
| littéral-2 |
GIVING identifier-3
REMAINDER identifier-4
ROUNDED
ON SIZE ERROR
ordre-impératif
-1
NOT ON SIZE ERROR ordre-impératif-2
END-DIVIDE
Exemple : DIVIDE 10 INTO V1. (V1 = V1 / 10)
DIVIDE V1 BY V2 GIVING V3. ( V3 = V1 / V2)
DIVIDE V1 BY V2 GIVING V3 REMAINDER RESTE.
(V3 = V1 / V2) et RESTE = V1 – (V2 * V3)
le tout en entier sans quoi il n’y a pas de reste
L’INSTRUCTION – COMPUTE
|expression-arithmétique|
COMPUTE nom-item-1 = |
constante
|
|nom-item
|
Les symboles arithmétiques valides sont :
+ pour l’addition
– pour la soustraction
* pour la multiplication
/ pour la division
** pour l’exposant
Un symbole arithmétique doit être précédé et suivi par au moins un espace.
Format : COMPUTE identifier-1 ROUNDED = expression
ON SIZE ERROR ordre-impératif-1
NOT ON SIZE ERROR ordre-impératif-2
END-COMPUTE
L’expression : doit être composée de constantes et de variables numériques séparées par des opérateurs arithmétiques.
Les opérateurs sont : + – * / ** ( )
Avec + pour addition, – pour la soustraction, * pour la multiplication, le / pour la division et ** pour un exposant.
Exemple :
COMPUTE RESULTAT = A + (B – 3) * (G / 4) + ( E ** 2).
L’expression est analysée de la gauche vers la droite en tenant compte des priorités suivantes :
d’abord les exposants **, ensuite les * et / puis les + et -.
Il faut autant de ( gauches que de ) droites.