Vous êtes sur la page 1sur 43

Département

Mathématiques et
Informatique

Algorithmique et programmation langage C

Chapitre 4 : LES EXPRESSIONS, LES ENTREES/SORTIES


ET LES OPERATEURS EN C

ASMAE OUHMIDA
UNIVERSITÉ HASSAN II
ECOLE NORMALE SUPÉRIEURE
D’ENSEIGNEMENT TECHNIQUE
PLAN

 GENERALITES
 LES ENTRÉES ET LES SORTIES
 LES OPÉRATEURS
GENERALITES

 Une expression est obtenue à partir d'opérateurs, de variables, de constantes, de


fonctions et de parenthèses
 Une expression retourne toujours un résultat – c’est la valeur de l'expression-
 Une expression a un type
 La valeur retournée peut être affectée, testée ou utilisée comme opérande d'une
autre expression
 5 a f1() a+b 3*(f1() + 5) sont des expressions valides
LES ENTRÉES ET LES SORTIES

 scanf( )

Permet d’acquérir en mémoire centrale une valeur

Cette valeur sera placée dans une variable (type simple ou dans un composant
d’une variable de type structuré)

Le format précise le type de valeur qui doit être saisi et affecté dans la variable

Syntaxe : scanf (“format”, &variable)


LES ENTRÉES ET LES SORTIES

 scanf( )

Le tableau ci-dessous présente les formats associés aux différents types étudiés précédemment.

Type Format

int ou short %d

long %D

float ou double %f

char %c
LES ENTRÉES ET LES SORTIES

 scanf( )

Par exemple : scanf (“ %d ”,&I)

Permet d’acquérir un entier et de le stocker dans la variable I de type “ int ”

L’expression “ &I ” correspond à l’adresse de la variable

C’est le contenu de cette adresse qui sera valorisée par la fonction scanf( )
LES ENTRÉES ET LES SORTIES

 printf( )

Permet d’afficher à l’écran un message pouvant intégrer des expressions faisant


référence à des variables (de type simple ou à des composants de variables de type
structuré)

Le format précise le type de la valeur contenue dans la variable citée

Il peut prendre de nombreuses valeurs mais on se limitera aux mêmes valeurs que
pour l’instruction scanf()

Syntaxe : printf (“Message format”, variable ou expression)


LES ENTRÉES ET LES SORTIES

 printf( )
Par exemple : printf( “ le double de %d est %d\n ”, I, I*2)

affiche le message le double de 5 est 10 si le contenu de la variable I est 5

Le caractère “ \n ” provoque un retour à la ligne après l’affichage du

message
LES ENTRÉES ET LES SORTIES
Exercice : Ecrire le programme C qui calcule et affiche la surface et le périmètre d’un
rectangle dont on saisi la longueur et la largeur. On suppose que ces valeurs sont des entiers

#include <stdio.h>
int main(void)
{
int surface, perimetre, longueur, largeur;
printf ("Saisir la longueur: ");
scanf ("%d",&longueur);
printf ("\n Saisir la largeur : ");
scanf ("%d",&largeur);
perimetre=2*(longueur+largeur);
surface=longueur*largeur;
printf("\n\n le périmétre est %d et la surface est
%d",perimetre,surface) ;
return 0 ;
}
LES OPÉRATEURS

 Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire
effectuer des opérations, les évaluer,...
 On distingue plusieurs types d'opérateurs:
les opérateurs de calcul (arithmétique)
les opérateurs d'assignation (affectation)
les opérateurs d'incrémentation
les opérateurs de comparaison
les opérateurs logiques (booléens)
les opérateurs bit-à-bit
les opérateurs de rotation de bit
LES OPÉRATEURS

 les opérateurs de calcul (arithmétique)


Opérateur Dénomination Effet Exemple Résultat (avec
x valant 7)
+ opérateur Ajoute deux x+3 10
d'addition valeurs
- opérateur de Soustrait x-3 4
soustraction deux valeurs
* opérateur de Multiplie x*3 21
multiplication deux valeurs
/ opérateur de Divise deux x/3 2.3333333
division valeurs
= opérateur Affecte une x=3 Met la valeur 3
d'affectation valeur à une dans la variable
variable x
LES OPÉRATEURS

 les opérateurs de calcul (arithmétique)


Tous ces opérateurs acceptent des opérandes pouvant être des entiers, des caractères
ou des réels (sauf l'opérateur modulo)

% : (modulo) reste de la division entière (entre entiers seulement)


Si un des opérandes est négatif, le signe du reste a le même signe que le dividende
Exemple :

printf("%d\n", -3 % 2 ); /* affichage de -1 */

printf("%d\n", 3 % 2 ); /* affichage de 1 */

printf("%d\n", 3 % -2 ); /* affichage de -1 */
LES OPÉRATEURS

 les opérateurs d’assignation


Elles permettent d'affecter dans une variable de type simple (ou dans un composant d'une
variable de type structuré) le résultat d'une expression

Le type de ce résultat doit être compatible avec le type de la variable.


LES OPÉRATEURS

Syntaxe : Variable+=Expression;

Elles permettent de simplifier des opérations telles que ajouter une valeur dans
une variable et stocker le résultat dans la variable

Une telle opération s'écrirait habituellement de la façon suivante : x=x+2

Avec les opérateurs d'assignation il est possible d'écrire cette opération sous
la forme suivante : x+=2

si la valeur de x était 7 avant opération, elle sera de 9 après...


LES OPÉRATEURS

 les opérateurs d’assignation


Les autres opérateurs du même type sont les suivants :
Opérateur Effet

+= addition deux valeurs et stocke le résultat


dans la variable (à gauche)

-= soustrait deux valeurs et stocke le résultat


dans la variable

*= multiplie deux valeurs et stocke le résultat


dans la variable

/= divise deux valeurs et stocke le résultat dans


la variable
LES OPÉRATEURS

 les opérateurs d'incrémentation/décrémentation

Ce type d'opérateur permet de facilement augmenter ou diminuer d'une unité une variable

Les deux opérateurs ++i ou i++ ajoute une unité à la variable i

Un opérateur de type x++ permet de remplacer des notations lourdes telles que x=x+1 ou bien
x+=1

Ces opérateurs sont très utiles pour des structures telles que des boucles, qui ont besoin d'un
compteur
LES OPÉRATEURS
 les opérateurs d'incrémentation/décrémentation

Opérateur Dénomination Effet Syntaxe Résultat (avec


x valant 7)

++ Incrémentation Augmente x++ 8


d'une unité la
variable
-- Décrémentation Diminue d'une x-- 6
unité la
variable

► Selon la position de l’opérateur par rapport à la variable (avant ou après) l’évaluation


de l’expression composant le membre droit de l’affectation prendra la valeur de la
variable avant qu’elle soit modifiée ou après
LES OPÉRATEURS
les opérateurs d'incrémentation/décrémentation

#include <stdio.h>
int main(void)
{
int i =2;
int j;
j=i++ ;
printf( " la valeur de j = %d et la valeur de i = %d \n", j,i);
i =2 ;
j=++i ;
printf( " la valeur de j = %d et la valeur de i = %d \n", j,i);
return 0
}
LES OPÉRATEURS
 les opérateurs d'incrémentation/décrémentation
#include <stdio.h>
int main(void)
{
int i =2; Je dois faire l’affectation et puis j’incrémentes le i
int j ; la valeur de j = 2 et la valeur de i = 3

j=i++ ;
printf( " la valeur de j = %d et la valeur de i = %d \n", j,i);
i =2 ;
j=++i ;
printf( " la valeur de j = %d et la valeur de i = %d \n", j,i);
return 0 J‘incrémentes le i et puis je dois faire l’affectation
} la valeur de j = 3 et la valeur de i = 3
LES OPÉRATEURS
 les opérateurs de comparaison (relationnels)
Le résultat de la comparaison entre 2 expressions vaut :
0 si le résultat de la comparaison est faux
1 si le résultat de la comparaison est vrai
Opérateur signification

== test si égalité
! = test si différent

< test si inférieur

<= test si inférieur ou égal


> test si supérieur

>= test si supérieur ou égal


LES OPÉRATEURS

 les opérateurs de comparaison (relationnels)

Exemples :
rep = (c > 5);
rep est égal à 1 si c est supérieur à 5, sinon rep est égal à 0

d = ( a == b )
d est égal à 1 si a est égal à b, sinon d est égal à 0

q = (c != 20);
q est égal à 1 si c est différent de 20 , sinon q est égal à 0
LES OPÉRATEURS

 les opérateurs logiques (booléens)

Il n'existe pas en C de type booléen. La convention suivante est utilisée :


Une expression est vraie si elle est non nulle
Une expression est fausse si elle est égale à zéro
Exemples :
5 est une expression toujours vraie
i = 5 est une expression toujours vraie (affectation)
i == 5 est une expression vraie si i est égal à 5
LES OPÉRATEURS

 les opérateurs logiques (booléens)

&& Réalise le "ET booléen" entre 2 expressions


Retourne 1 (vrai) si les 2 expressions sont non nulles, 0 sinon
|| Réalise le "OU booléen" entre 2 expressions
Retourne 1 (vrai) si l'une ou l'autre (ou les deux), des 2 expressions non nulles, 0 sinon
! Réalise la "négation booléenne" de son unique opérande (opérateur unaire)
Retourne 1 si la valeur de son opérande est 0 (faux), 0 sinon
LES OPÉRATEURS

 les opérateurs logiques (booléens)


Table de vérité des opérateurs booléens

op1 op2 op1 && op2 op1 || op2

0 0 0 0
0 non nul 0 1
non nul 0 0 1
non nul non nul 1 1

op1 ! op1

0 1
non nul 0
LES OPÉRATEURS

 les opérateurs logiques (booléens)

Exemples :
a >= 5 && a <= 10 ;
retourne 1 si a est compris entre 5 et 10 (du fait de la priorité plus forte des opérateurs >= et <=
par rapport à &&)
Cette expression est équivalente à : (a >= 5) && (a <= 10)
a > 5 || b == 0
retourne 1 si a est supérieur à 5 ou si b est égal à 0
l'expression b == 0 ne sera pas évaluée si a est supérieur à 5 (évaluation courte)

Remarques : L ’évaluation des expressions booléennes s'effectue de gauche à droite (sauf pour
l'opérateur !) et elle est stoppée dès que le résultat de l'expression devient définitif (short evaluation)
LES OPÉRATEURS

 les opérateurs bit à bit

Ce type d'opérateur traite ses opérandes comme des données binaires, plutôt
que des données décimales, hexadécimales ou octales

Ces opérateurs traitent ces données selon leur représentation binaire mais
retournent des valeurs numériques standards dans leur format d'origine

Les opérateurs suivants effectuent des opérations bit-à-bit, c'est-à-dire avec des
bits de même poids
LES OPÉRATEURS
 les opérateurs bit à bit
Opérateur Dénomi- Effet Syntaxe Résultat
nation
& ET Retourne 1 si les deux 9 & 12 8
bit-à-bit bits de même poids sont (1001 & (1000)
à1 1100)
| OU Retourne 1 si l'un ou 9 | 12 13
bit-à-bit l'autre des deux bits de (1001 | (1101)
même poids est à 1 (ou 1100)
les deux)
^ OU Retourne 1 si l'un des 9 ^ 12 5
exclusif deux bits de même poids (1001 ^ (0101)
bit-à-bit est à 1 (mais pas les 1100)
deux)
LES OPÉRATEURS

 les opérateurs de rotation de bit

Ce type d'opérateur traite ses opérandes comme des données binaires d'une longueur de
32 bits, plutôt que des données décimales, hexadécimales ou octales

Ces opérateurs traitent ces données selon leur représentation binaire mais retournent des
valeurs numériques standards dans leur format d'origine
Les opérateurs suivants effectuent des rotations sur les bits: décaler chacun des bits d'un
nombre de bits vers la gauche ou vers la droite
La première opérande désigne la donnée sur laquelle on va faire le décalage, la seconde
désigne le nombre de bits duquel elle va être décalée
LES OPÉRATEURS
 les opérateurs de rotation de bit
Opérateur Dénomi- Effet Syntaxe Résultat
nation
<< Rotation à Décale les bits vers la gauche 6 << 1 12
gauche (multiplie par 2 à chaque
(110 << (1100)
décalage). Les zéros qui
sortent à gauche sont perdus, 1)
tandis que des zéros sont
insérés à droite
>> Rotation à Décale les bits vers la droite 6 >> 1 3
droite avec (divise par 2 à chaque
(0110 >> (0011)
conservatio décalage). Les zéros qui
n du signe sortent à droite sont perdus, 1)
tandis que le bit non-nul de
poids plus fort est recopié à
gauche
>>> Rotation à Décale les bits vers la droite 6 >>> 1 3
droite avec (divise par 2 à chaque
(0110 (0011)
remplissage décalage). Les zéros qui
de zéros sortent à droite sont perdus, >>> 1)
tandis que des zéros sont
insérés à gauche
LES OPÉRATEURS
 les priorités
Lorsqu'on a plusieurs opérateurs dans une expression, il faut que le compilateur sache dans
quel ordre les traiter
voici donc dans l'ordre décroissant les priorités de tous les opérateurs :

( ) [ ]
-- ++ ! ~ -
* / %
+ -
< <= >= >
== !=
^
|
&& ||
? :
= += -= *= /= %= <<= >>= >>>= &= ^= |=
,
LES OPÉRATEURS

Remarque : Evaluation d'opérateurs de la même classe

► Dans chaque classe de priorité, les opérateurs ont la même priorité. Si nous avons
une suite d'opérateurs binaires de la même classe, l'évaluation se fait en
passant de la gauche vers la droite dans l'expression.
► Pour les opérateurs unaires (!,++,--) et pour les opérateurs d'affectation (=,+=,-
=,*=,/=,%=), l'évaluation se fait de droite à gauche dans l'expression.
:

LES OPÉRATEURS
Exemples

L'expression 10+20+30-40+50-60 sera évaluée comme suit:


10+20 ==> 30
30+30 ==> 60
60-40 ==> 20
20+50 ==> 70
70-60 ==> 10
Pour A=3 et B=4, l'expression A *= B += 5 sera évaluée comme suit:
LES OPÉRATEURS

Pour A=1 et B=4, l'expression !--A==++!B sera évaluée comme suit:


Caractères spéciaux

► Nous allons utiliser certains caractères de la table des codes ASCII qui permettent de
réaliser des affichages particuliers. Pour pouvoir les manipuler, le langage C utilise ce
que l'on appelle une « séquence d'échappement ». Cela veut simplement dire qu'ils
sont précédés d'une contre barre \.

► Cette dernière permet d'avertir le compilateur que le caractère qui suit la \ doit être
considéré de façon spéciale.

► Nous en avons déjà rencontré un : le ‘\n' qui effectue un saut de ligne puis un
positionnement au début de la ligne suivante.

► Les séquences sont utilisables avec la fonction printf() mais aussi dans d'autres
circonstances.
Caractères spéciaux
Voici la liste des séquences d'échappements

● \n : nouvelle ligne (NL=New Line)


● \r : retour chariot (CR= carriage return)
● \t : tabulation horizontale (HT= horizontale tabulation)
● \f : saut de page (FF= form feed)
● \v : tabulation verticale (VT= vertical tabulation)
● \a : signal d'alerte (un bip)
● \b : retour arrière (BS = BackSpace)
● \\ : caractère d'échappement (affiche l'antislash \)
● \YY affiche le caractère dont le code ASCII est représenté par sa valeur
hexadécimale. YY étant la valeur comprise entre 00 et FF.
● \YYY affiche le caractère de code octal YYY
Fonctions mathématiques (<math.h>)

Fabs valeur absolue


Fmod reste
Ceil plafond
Floor plancher
Modf parties entières et fractionnaires
Cos cosinus
Sin sinus
Tan tangente
Acos arc cosinus
Asin arc sinus
Atan arc tangente
Atan2 arc tangente de deux variables avec ajustement du cadrant
Fonctions mathématiques (<math.h>)

Exp exponentielle
Cosh cosinus hyperbolique
Sinh sinus hyperbolique
Tanh tangente hyperbolique
Log logarithme népérien
Log10 logarithme en base 10
Pow puissance
Sqrt racine carrée
Frexp décomposition en fraction normalisée en base 2
ldexp produit par une puissance de 2
Exercice:

1) Soit les déclarations suivantes :


int n = 10 , p = 4 ;
long q = 2 ;
float x = 1.75 ;
Donner le type et la valeur de chacune des expressions suivantes :
a) n + q
b) n + x
c) n % p +q
d) n < p
e) n >= p
f) n > q
g) q + 3 * (n > p)
h) q && n
i) (q-2) && (n-10)
j) x * (q==2)
k) x *(q=5)
Correction :

a) long 12
b) float 11,75
c) long 4
d) int 0
e) int 1
f) int 1
g) long 5
h) int 1
i) int 0
j) float 1,75
k) float 8,75
2) Quels seront les résultats fournis par ce programme ?
#include <stdio.h>
main ()
{ int n = 543 ;
int p = 5 ;
float x = 34.5678;
printf ("A : %d %f\n", n, x) ;
printf ("B : %4d %10f\n", n, x) ;
printf ("C : %2d %3f\n", n, x) ;
printf ("D : %10.3f %10.3e\n", x, x) ;
printf ("E : %*d\n", p, n) ;
printf ("F : %*.*f\n", 12, 5, x) ;
}
Correction

A : 543 34.567799
B : 543 34.567799
C : 543 34.567799
D : 34.568 3.457e+01
E : 543
F : 34.56780
2) Quelles seront les valeurs lues dans les variables n et p
(de type int), par l’instruction suivante ?
scanf ("%4d %2d", &n, &p) ;
lorsqu’on lui fournit les données suivantes (le symbole ^
représente un espace et le symbole @
représente une fin de ligne, c’est-à-dire une validation) ?
a) 12^45@
b) 123456@
c) 123456^7@
d) 1^458@
e) ^^^4567^^8912@
Correction:

a) n=12, p=45
b) n=1234, p=56
c) n=1234, p=56
d) n=1, p=45
e) n=4567, p=89