COBOL/Opérations arithmétiques
Affectation
[modifier | modifier le wikicode]L'instruction MOVE
permet d'affecter la valeur d'une variable ou d'un littéral à une ou plusieurs variables :
Cette instruction va associer la valeur de x à chacune des variables situées après le TO
et séparées par des espaces.
Calcul et affectation
[modifier | modifier le wikicode]Il est permis d'affecter des expressions plus complexes à des variables après un calcul. Pour cela, nous utilisons l'instruction COMPUTE
, dont le format est le suivant :
COMPUTE {identificateur [ROUNDED]} ... = expression arithmétique
[SIZE ERROR instructions]
[END-COMPUTE].
Les expressions arithmétiques intervenant dans un COMPUTE
peuvent utiliser les opérateurs suivants : + (addition) - (soustraction) * (multiplication) / (division) ** ou ^ (exponentiation).
La valeur calculée de l’expression arithmétique à droite du signe d'égalité sera affectée à chaque variable situé à gauche de ce signe. Chacune de ces variables peut éventuellement être suivie de ROUNDED
, qui arrondit arithmétiquement la valeur obtenue.
La clause optionnelle SIZE ERROR
intercepte une erreur de dépassement de capacité du résultat. Si une telle erreur se produit, les instructions suivant cette clause sont exécutées.
L'instruction COMPUTE
est utile pour des évaluations complexes, mais si vous n'avez pas besoin de cette "puissance", COBOL met à votre disposition d'autres instructions, plus spécialisées, qui consomment moins de ressources que COMPUTE
.
Addition
[modifier | modifier le wikicode]L'instruction ADD
permet d'ajouter une liste de valeurs à une liste de variables :
Dans ce cas, une somme intermédiaire a1 + a2 + ... sera calculée puis ajoutée à chaque variable placée après le TO
(chacune pouvant éventuellement être arrondie).
Soustraction
[modifier | modifier le wikicode]L'instruction SUBTRACT
permet de soustraire une liste de valeurs d'une liste de variables :
SUBTRACT a1 a2 ... FROM {identificateur [ROUNDED]} ...
[SIZE ERROR instructions]
[END-SUBTRACT].
Dans ce cas, une somme intermédiaire a1 + a2 + ... sera calculée puis soustraite à chaque variable placée après le FROM
.
Multiplication
[modifier | modifier le wikicode]L'instruction MULTIPLY
permet de multiplier une valeur à une liste de variables :
Dans ce cas, chacune des variables placées après le BY
est multipliée par x. Il est également possible de stocker le résultat de cette multiplication dans d'autres variables, pour cela, nous utilisons le format suivant :
MULTIPLY x BY y GIVING {identificateur [ROUNDED]} ...
[SIZE ERROR instructions]
[END-MULTIPLY].
Dans ce cas, le produit de x par y sera affecté à chaque variable placée après le GIVING
.
Division
[modifier | modifier le wikicode]Ici aussi, nous avons 2 formats possibles. Voici le premier :
DIVIDE diviseur INTO {identificateur [ROUNDED]} ...
[SIZE ERROR instructions]
[END-DIVIDE].
Dans ce cas, chaque variable située après INTO sera divisée par la valeur placée avant INTO
. La division effectuée est une division euclidienne, ou division entière : on ne garde que la partie entière du quotient, le reste de cette division n’est pas récupéré.
Il est également possible de stocker le résultat de cette division dans d'autres variables, pour cela nous utilisons le second format de l'instruction DIVIDE
:
DIVIDE x BY y GIVING {identificateur [ROUNDED]} ...
[REMAINDER reste]
[SIZE ERROR instructions]
[END-DIVIDE].
Dans ce cas, le résultat de la division de x par y sera affecté à toutes les variables situées après GIVING
. Si la clause REMAINDER
est présente, alors une seule variable pourra stocker ce résultat. Le reste de la division sera stocké dans la variable suivant le REMAINDER
.
Une division par zéro déclenche la clause SIZE ERROR
.
Exemple : une calculatrice basique
[modifier | modifier le wikicode]Voici un programme récapitulatif qui reprend toutes ces notions. Cette mini-calculatrice vous demande de saisir deux opérandes et un opérateur, puis vous affichera le résultat du calcul ou un message d'erreur. Essayez de refaire ce programme vous-mêmes pour vous exercer ou améliorez-le.
000001 IDENTIFICATION DIVISION.
000002 PROGRAM-ID. calculatrice.
000003
000004 DATA DIVISION.
000005 WORKING-STORAGE SECTION.
000006 77 a PIC 99.
000007 77 b PIC 99.
000008 77 op PIC X.
000009 77 result PIC S9999 VALUE 0.
000010
000011 PROCEDURE DIVISION.
000012 saisie.
000013 DISPLAY "1er opérande : " NO ADVANCING ACCEPT a.
000014 DISPLAY "Opérateur : " NO ADVANCING ACCEPT op.
000015 DISPLAY "2nd opérande : " NO ADVANCING ACCEPT b.
000016 evaluation.
000017 EVALUATE op
000018 WHEN "+" ADD a b TO result
000019 WHEN "-"
000020 MOVE a TO result SUBTRACT b FROM result
000021 WHEN "*" MULTIPLY a BY b GIVING result
000022 WHEN "/" DIVIDE a BY b GIVING result
000023 WHEN "^" COMPUTE result = a ^ b
000024 WHEN "%"
000025 DIVIDE a BY b GIVING result REMAINDER result
000026 WHEN OTHER DISPLAY "Opérateur incorrect !"
000027 END-EVALUATE.
000028 affichage.
000029 DISPLAY a SPACE op SPACE b " = " result.
000030 STOP RUN.
000031 END PROGRAM calculatrice.