Les opérations et calculs en langage Pascal
- Opérations sur les nombres
- Opérations sur du texte
- Opérations logique (initiés/experts)
- Opérations Booléennes (initiés)
- Opérations sur les ensembles
- Résumé
Opérateurs de base
Comme dans tout langage de programmation, le pascal utilise 4 opérations de base :- + : L'addition (ou somme)
- - : La soustraction (ou différence)
- * : La multiplication (ou produit)
- / : La division (ou quotient)
Program Moncalcul;
Begin
writeln('Résultat de 241+38 = ',241+38);
writeln('Résultat de 38-241 = ',38-241);
writeln('Résultat de 241*38 = ',241*38);
writeln('Résultat de 241/38 = ',241/38);
writeln('Résultat de 35/5 = ',35/5);
readln;
end.
Note : La fonction Readln a été ajoutée afin que l'affichage de l'écran reste visible tant qu'on n'a pas appuyé sur la touche "entrée" du clavier.L'exécution de ce programme affichera :
Résultat de 241+38 = 279
Résultat de 38-241 = -203
Résultat de 241*38 = 9158
Résultat de 241/38 = 6.342105263157895E+0000
Résultat de 35/5 = 7.0000000000000000E+0000
Comme vu lors du cours sur la sortie écran, un affichage de nombre réel s'effectuera toujours, par défaut, en mode scientifique avec 16 chiffres après la virgule.On peut faire quelques remarques :
- Les nombres donnés sont des entiers
- Les résultats des 3 premières opérations sont des entiers
- Le résultat d'une division d'entiers par l'opérateur /, sera réel (affiché sous forme scientifique), même quand le résultat est entier!
Pour confirmer cela, le résultat de l'opération
writeln('Résultat de 241+38.0 = ',241+38.0);
Donnera
2.790000000000000000E+0002
et non pas 279, simplement parce que vous avez écrit une des opérandes sous forme de nombre à virgule!
Division entière et modulo
Il est possible que pour diverses raisons (par exemple, convertir un nombre décimal en hexadécimal) vous ayiez besoin d'effectuer des divisions entières, donnant à la fois le résultat entier d'une division et le reste. Pour cela, il existe 2 opérateurs :
- div : résultat de la division entière
- mod : résultat de la division entière
Ainsi en reprenant l'opération de division du premier code de ce chapitre :
writeln('Résultat entier de 241/38 = ',
241 div 38,
', reste de la division : ',
241 mod 38);
Affichera
Résultat entier de 241/38 = 6, reste de la division : 13
Exercice
- Il y a 2857 noix à partager entre 13 personnes. Ecrire le code indiquant le nombre de noix qu'aura chaque personne ainsi que le nombre de noix restant
Priorité des opérateurs
En mathématiques, il existe une règle de priorité appelé PEDMAS (ou PEMDAS etc) indiquant la priorité des opérateurs les un sur les autres. Les règles prioritaires en Pascal sont indiqués sur cette page du site web.
writeln('Résultat entier de 241/38 = ',
241 div 38,
', reste de la division : ',
241 mod 38);
Résultat entier de 241/38 = 6, reste de la division : 13
Pour mettre en application cette règle, essayez le code suivant :
writeln('Résultat de 8+5*7', 8+5*7);
writeln('Résultat de (8+5)*7', (8+5)*7);
Le premier résultat sera 46 tandis que le second sera 91. En effet, la multiplication (ou division) est prioritaire sur l'addition ou la soustraction. En revanche, lorsque vous avez à faire une multiplication et une division (ou vice versa), l'ordre des opérations se fera de gauche à droite, puisque les opérateurs ont la même priorité.
Opérateur Unaire
En Pascal, vous pouvez précéder tout nombre du signe + ou - pour indiquer la valeur positive ou négative d'un nombre. Cet opérateur prévaut sur tous les autres!Autres opérateur ?
Contrairement au C qui inclut également l'opérateur puissance (**), le Pascal ne fournit pas cet opérateur qui sera traité dans une fonction (n'existant pas de base dans Pure Pascal/Turbo Pascal mais que j'ai écrite ici).L'opérateur "+" est l'opérateur chargé de cette opération en Langage Pascal. En informatique on parle de SURCHARGE d'OPERATEUR lorsqu'un opérateur peut effectuer une opération sur diverses types de valeurs/variables. On verra par la suite (dans ce chapitre) que cet opérateur existe également pour un autre type de variable n'existant dans aucun autre langage de programmation (Mais chut... c'est un secret).
Un exemple d'utilisation de la concaténation pour mieux comprendre comment elle fonctionne
writeln('La concaténation de ''3'' et ''2'' donne ' +'3'+'2');
Cette opération liera les chaines '3' et '2' au texte initial et ne donnera pas 5. Le résultat sera:
La concaténation de '3' et '2' donne 32
La liste des opérateurs logiques en Pascal (OU, ET, NOT, XOR, décalage à droite et à gauche) est donnée sur cette page du site internet. Comme vous le voyez, il y a une différence de synthaxe entre le Pascal (utilisant des "mots") et le C / Java / PHP (Utilisant des signes particuliers) mais le résultat est le même. Cependant en Pascal, on n'utilise pas de parenthèse...
Exemples
writeln('8 et 5 = ', 8 and 5);
writeln('8 ou 5 = ', 8 or 5);
writeln('8 xor 12 = ', 8 xor 12); {OU exclusif}
writeln('Non 8 = ', not 8);
writeln('8 décalé de 2 à droite = ', 8 shr 2); {2 puissance 2 = 4}
writeln('5 décalé de 4 à gauche = ', 5 shl 4); {2 puissance 4 = 16}
Important : quand vous souhaitez effectuer une multiplication ou une division entière par un nombre qui est une puissance de 2 (1, 2, 4, 8, 16, 32 etc), l'opération de décalage à gauche (multiplication) avec l'opérateur shl ou à droite (division) avec l'opérateur shr par la puissance de 2 (0, 1, 2, 3 etc) en question, est une opération sensiblement plus rapide effectuée par le microprocesseur que les fonctions de multiplications ou divisions implémentée. Ces opérations de décalage sont de l'ordre de 15 à 30 fois plus rapides pour les anciens microprocesseurs 16 ou 32 bits que les opérations de multiplication et division. Cependant avec les processeurs 64 bits (Pentium, 68060 etc), l'écart est beaucoup plus faible (de 2 à 4 fois). Quoiqu'il en soit, les compilateurs effectuent le bon choix d'instructions machine suivant le microprocesseur cible... Cependant il faut garder à l'esprit qu'une opération de décalage de bits consomme beaucoup moins d'énergie qu'une opération de multiplication ou division!
Exemples
writeln('True et False = ', True and False); {= 0}
writeln('True ou False = ', True or False);{= 1}
writeln('False ou non true = ', boolean(false or not true)); {false}
Lorsqu'on exécute ces commandes, avec les variables booléennes, le résultat sorti est soit 1 (vrai) ou 0 (faux). En revanche quand on convertit ces valeurs en booléens avec la fonction "Boolean(), le résultat est une valeur booléenne (true ou false). Le langage Pascal attribue une valeur 1 à un résultat vrai et 0 à un résultat faux. La fonction "boolean" est ce qu'on appelle un "convertisseur de type". Les convertisseurs de types ne peuvent s'effectuer qu'entre valeurs de même nature de type (soit entier, réel ou caractère/chaine)
En dehors des opérateurs booléens, il y a également les opérateurs de comparaison. Ces opérateurs donnent tous des résultats également booléens.
Exemples
writeln('4 < 4 : ', 4 < 4); {false}
writeln('4 <= 4 : ', 4 <= 4); {True}
writeln('4 = 4 : ', 4 = 4); {True}
writeln('4 <> 4 : ', 4 <> 4); {False}
writeln('4 in [3..5] : ', 4 in [3..5]); {True}
writeln('4 in [3..2] : ', 4 in [3..2]); {False}
Dans ces exemples, la commande renverra comme résultat soit true ou false (écrit ainsi). Explications:
- 4 n'est pas strictement inférieur à 4, donc False
- 4 est bien inférieur ou égal à 4 (puisqu'égal), donc True
- 4 est bien égal à 4, donc True
- 4 n'est pas différent de 4, donc False
- 4 est bien compris entre 3 et 5, donc True
- 4 n'est pas compris entre 3 et 2, donc False
Exercices
- Utiliser la commande write avec les opérateurs de comparaisons < et = entre les chaines 'Bonjour' et 'Au revoir'
- Même question avec les caractères "B" et "b"
- Peut-on utiliser les opérateurs de comparaisons pour les chaînes de caractères ? Si oui,indiquez comment sont comparés lesdites chaines ?
Dans ce type de données, on peut effectuer des opérations d'Union, Intersection et Différence.
Exemple
Pour utiliser ce type d'opération, il est nécessaire de définir un type "Ensemble" avant d'effectuer des opérations. Soit le programme suivant :
Program Calcul_Ensembles;
TYPE
chiffre = set of char;
VAR
chiffres1, chiffres2, chiffres3 : chiffre;
i:char;
Begin
chiffres1 := ['0', '1', '2', '4', '5', '7'] ;
chiffres2 := ['2', '3', '4', '9'];
write('Union de chiffres1 et chiffres2 = ');
chiffres3 := chiffres1 + chiffres2;
for i:='0' to '9' do
if i in chiffres3 then
write (i,', ');
writeln;
write('Intersection de chiffres1 et chiffres2 = ');
chiffres3 := chiffres1 * chiffres2;
for i:='0' to '9' do
if i in chiffres3 then
write (i,', ');
writeln;
write('différence de chiffres1 et chiffres2 = ');
chiffres3 := chiffres1 - chiffres2;
for i:='0' to '9' do
if i in chiffres3 then
write (i,', ');
readln;
END.
Les résultats des opérations fournissent bien les résultats attendus entre les ensembles ['0', '1', '2', '4', '5', '7'] et ['2', '3', '4', '9'] à savoir :
- ['0','1', '2', '3', '4', '5', '7', '9'] pour l'Union
- ['2', '4'] pour l'Intersection
- ['0', '1', '5', '7'] pour la différence
- De nouvelles instructions TYPE, VAR, FOR et IN apparaissent (nous verrons leurs signification dans d'autres chapitres de tutoriel)
- En Pascal, TOUT type ordinal (entier, caractère) peut servir d'indice dans un tableau
- Pour les débutants, ce programme contient beaucoup d'éléments nouveaux : le but de ce programme est de donner les résultats d'opérations (Union, Intersection,et Différence) entre 2 ensembles
D'autre part, on peut utiliser des opérateurs de comparaison (Booléen) sur les ensembles. On peut ainsi, en une seule commande Pascal, déterminer si un ensemble est un sous-ensemble d'un autre. Si on exécute les instructions suivantes :
writeln('[0,1,3,7] est il un sous-ensemble de [0,1,3,5,7,9] ? ', [0,1,3,7] <= [0,1,3,5,7,9]);
writeln('[0,1,3,5,7,9] est il un sous-ensemble de [0,1,3,7] ? ', [0,1,3,5,7,9] <= [0,1,3,7]);
writeln('[0,1,3,5,7,9] et [0,1,3,7] sont-il identiques ? ', [0,1,3,7] = [0,1,3,5,7,9]);
Les résultats donnent True, False et False aux 3 opérations de comparaisons, comme attendus.
Notions vues dans ce cours
- Les 4 opérations de base (+, -, *, /)
- Division entière (div) et modulo (mod)
- Norme mathématique PEDMAS
- Opérateurs Unaire
- Opérateurs de concaténation de texte
- Opérateurs Logique (OU, ET, XOR, NOT et décalage de bits)
- Opérateurs de décalage de bits en remplacement de multiplications ou divisions par des puissances de 2
- Opérateurs Booléens (OU, ET, XOR, NOT)
- Opérateurs de comparaison : résultats booléens
- Opérateurs sur les ensembles (Exclusivité du langage Pascal) : Intersection, Union, Différence et opérateurs de comparaison.