Les opérations
Introduction
Voici quelques questions pour vous aider à synthétiser et retenir des contenus qui nous paraissent essentiels dans cette section :
Quels sont les opérateurs arithmétiques ?
C’est quoi une affectation combinée ?
C’est quoi une post ou une préincrémentation ?
C’est quoi une post ou une prédécrémentation ?
Qu’est-ce qu’un cast ?
Quand utiliser un cast ?
Y a-t-il des priorités à l’exécution entre les opérateurs ?
La notion d’expression
Dans le code informatique tout élément ou ensemble d’éléments qui fait l’objet d’une évaluation numérique est appelé une expression :
a + b, a / b, a = b, &b, !b sont des expressions.
Dans ces expressions +, /, =, & et ! sont des opérateurs et les variables a et b sont les opérandes.
Ces combinaisons de variables avec des opérateurs sont appelées des expressions plutôt que des opérations car il n’y a pas que des opérateurs arithmétiques. De plus, une valeur constante, une variable ou un appel de fonction seuls sont également considérés comme des expressions. Ce sont des expressions élémentaires. Les expressions qui font appel à des opérateurs et plusieurs arguments sont dites expressions composées.
La valeur numérique d’une expression, composée ou élémentaire est le résultat de l’expression elle-même. S’il s’agit d’une opération arithmétique ou d’une affectation, la valeur numérique de l’expression est le résultat de cette opération. S’il s’agit d’un appel de fonction, c’est la valeur de retour de la fonction. L’expression vaut cette valeur, elle est cette valeur, et à ce titre une expression...
Opérations arithmétiques
1. Les opérateurs +, -, *, /, %
Les opérateurs arithmétiques sont les suivants :
+ plus :
le résultat de l'expression a+b est la somme
- moins :
le résultat de l'expression a-b est la soustraction
* multiplier :
le résultat de l'expression a*b est la multiplication
/ diviser :
le résultat de l'expression a/b est la division
% modulo :
le résultat de l'expression a%b est le reste de la division de a par b
Que donne le programme suivant ?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=10,b=20,c=0; // 1
c=a+b; // 2
a=b/c; // 3
b=a*c; // 4
printf("a=%d, b=%d, c=%d\n",a,b,c); // 5
printf("res=%d\n",c%4); // 6
printf("c=%d\n",c); // 7
return 0;
}
ligne 1 : a vaut 10, b vaut 20, c vaut 0
ligne 2 : a vaut 10, b vaut 20, c vaut 30
ligne 3 : a vaut 0, b vaut 20, c vaut 30 ...
Mise en pratique : opérations arithmétiques, cast
Exercice 1
Soient les déclarations :
char c ='\x01' ; /* '\xhh' pour un nombre hexadécimal
(0...9, a...f ou A...F) sur un octet max*/
short p=10;
Quels sont les types et les valeurs de chacune des expressions suivantes :
p + 3
c + 1
p + c
3 * p + 5 * c
6.8 /7 + 'a' * 560
Exercice 2
Soient les déclarations :
char c='\x05';
int n=5;
long p=1000;
float x=1.25;
double z=5.5;
Quels sont les types et les valeurs des expressions suivantes :
n + c + p
2 * x + c
(char) n + c
(float) z + n / 2
Exercice 3
Écrire un programme qui saisit un nombre entier, affiche son opposé et sa moitié exacte.
Exercice 4
Faire un convertisseur francs/euros... (un euro = 6,55957 francs)
-
quelles sont les étapes du programme ?
-
programmer
Exercice 5
Pour convertir des degrés Fahrenheit en degrés Celsius, on a la formule suivante :
C= 5/9 * (F-32)
Pour convertir des degrés Celsius en degrés Fahrenheit, on a :
F= ( (9*C ) / 5)+32
où F est une température en degrés Fahrenheit et C, la température correspondante en degrés Celsius.
-
Écrire un programme qui convertit en degrés Celsius une température entrée...
Obtenir des valeurs aléatoires
Voici quelques questions pour vous aider à synthétiser et retenir des contenus qui nous paraissent essentiels dans cette section :
Quelle fonction utiliser pour avoir un nombre aléatoire ?
Pour avoir des suites de nombres toujours différentes dans un programme : quelle fonction utiliser et comment ?
Comment obtenir un nombre aléatoire dans une fourchette de valeur ?
Comment obtenir un nombre aléatoire entre 0 et 1 ?
1. Principe du pseudo-aléatoire
La notion de hasard pose problème en mathématiques et l’aléatoire n’existe pas pour un ordinateur. Toutefois, il est possible de simuler de l’aléatoire avec un ordinateur en produisant des valeurs imprévisibles.
Le principe est de construire une suite de nombres. On prend un nombre comme point de départ, on lui applique un calcul bizarre qui produit une valeur impossible à prédire et à chaque fois on applique le même calcul sur le résultat obtenu. En fonction du point de départ et du calcul, on obtient une suite imprédictible de nombres comme s’ils étaient produits par hasard. Par exemple une suite peu prévisible peut être obtenue avec le calcul suivant : (x+3,14159)8.
À chaque étape il y a un nombre intuitivement improbable. Mais la suite sera toujours la même avec un nombre de départ et un calcul identiques. Pour avoir des suites différentes, le problème est de pouvoir obtenir un point de départ qui change.
Pour obtenir une suite de nombres (pseudo) aléatoires et initialiser la valeur de départ, la librairie standard stdlib.h fournit deux fonctions :
-
la fonction rand() s’occupe du calcul et renvoie un nombre imprédictible.
-
la fonction srand() initialise la valeur de départ.
2. La fonction rand()
Le calcul opéré par la fonction rand() ressemble à celui-ci, à partir de la variable etape de type unsigned long (ou int en 32 bits sur 4 octets) et par défaut initialisée à 1 au départ :
etape = etape * 1103515245 + 12345 ...
Mise en pratique : opérations et nombres aléatoires
Exercice 1
Choisir pile ou face dans sa tête, lancer un programme qui annonce au hasard 0 pour face et 1 pour pile... gagné ?
Exercice 2
Choisir dans sa tête un nombre entre 2 et 12 et lancer un programme qui simule un tirage avec deux dés à six faces... gagné ?
Exercice 3
Écrire un programme qui génère et affiche 7 nombres aléatoires selon les contraintes suivantes :
-
afficher un nombre aléatoire selon la plage maximum du générateur aléatoire.
-
afficher une valeur aléatoire comprise entre 0 et 367.
-
afficher un nombre aléatoire compris entre 0 et une valeur "seuil haut" entrée par l’utilisateur.
-
afficher un nombre aléatoire compris entre 678 et 7354.
-
afficher un nombre aléatoire compris entre une valeur "seuil bas" et une valeur "seuil haut" entrées par l’utilisateur.
-
afficher un nombre aléatoire compris entre 0 et 1.
-
afficher un nombre aléatoire à deux décimales compris entre 0 et 50.
Opérations bit à bit
En C nous avons six opérateurs qui permettent des opérations au niveau des bits. Ils s’utilisent uniquement avec les types entiers signés ou non : char, short, int, long.
1. ET : opérateur &
L’opérateur ET fonctionne bit à bit de la façon suivante :
i & 0 donne toujours 0
i & 1 donne i, c'est-à-dire soit 0 soit 1
Par exemple, le résultat de 12 & 10 donne 8 :
1 1 0 0 (12 en binaire)
& 1 0 1 0 (10 en binaire)
donne 1 0 0 0 (8 en binaire)
Il sert pour accéder à un ou plusieurs bits particuliers sur un entier. Pour ce faire, nous prenons une valeur de masque dans laquelle seuls les bits à 1 sont visibles, par exemple :
Pour connaître la valeur du premier bit d’un entier, masque à 1 :
10111001
& 00000001
donne 00000001
Pour connaître la valeur du second bit, masque à 2 :
10111001
& 00000010
donne 00000000
Pour connaître la valeur du troisième bit, masque à 4 :
10111001
& 00000100 ...
Mise en pratique : opérations bit à bit
Exercice 1
Qu’imprime le programme suivant ?
#include <stdio.h>
int main()
{
int x,y,y;
x = 3;
y = 2;
z = 1
printf("%d\n", x | y & z);
printf("%d\n", x | y & ~z);
printf("%d\n", x ^ y & ~z);
printf("%d\n", x & y & z);
x = 1;
y = -1;
printf("%d\n", ~x | x);
printf("%d\n", x & ~x);
printf("%d\n", x ^ x);
x <<= 3;
y <<= 3;
z >>= 3;
printf("%d, %d, %d\n",x,y,z);
}
Expérimentation : opérations arithmétiques, valeurs aléatoires
/*
2. OPERATIONS ARITHMETIQUES
*/
// des librairies de fonctions
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int a=90, b=10;
// les opérateurs arithmétiques sont +, -, *, /, %
//--------------------------------------------------------
// a+b est une expression
// la valeur numérique d'une expression est le résultat
// de l'opération (arithmétique ou non)
printf("%d\n",a+b);
//--------------------------------------------------------
// priorité des opérateurs arithmétiques :
printf("%d\n",a/2+b*8%3); // (a/2)+((b*8)%3)
//--------------------------------------------------------
// type d'une expression arithmétique :
// si les opérandes sont de types différents, l'expression
// est du type de l'opérande le plus...