PROGRAMMATION
19 mai 2021
2
SRT - Licence2
1 INTRODUCTION 5
4 LES OBJETS 10
5 Les Instructions 18
6 Les Expressions 19
7 Les Opérateurs 20
1 INTRODUCTION
Le langage C a été créé par Dennis Ritchie aux Laboratoires Bell de Téléphonie entre 1970 et
1972. L’objectif du langage était de développer le système d’exploitation UNIX (Multipostes et
Multitâche) déjà présent sur de nombreux ordinateurs. Très tôt, le langage se révéla puissant et
souple, d’où sa facile adoption par les programmeurs professionnels.
– Une grande bibliothèque de fonctions : Le C, suivant les machines utilisées, dispose d’un
grand nombres de fonctions, que ce soit des fonctions mathématiques, de gestion de fichiers ou
d’entrées & sorties.
– Proche de la machine : Le C est très proche de la machine en pouvant accéder aux adresses
des variables.
– Très rapide : Aucun contrôle de débordement n’est effectué, ce qui apporte une plus grande
vitesse.
Pour faire un programme en langage C (comme dans d’autres langages), une logique fondamen-
tale serait de :
Les différentes étapes de développement d’un programme C la création du code source, la compi-
lation et la création du fichier exécutable.
Exemple 1
] include <stdio.h>
main()
{
Le code source sera sauvegardé dans un fichier dont le nom aura l’extension .c
L’ordinateur ne peut pas comprendre le code source C. Il ne comprend que des instructions binaires
(langage machine). Le code source devra alors être transmis au compilateur qui le transforme
en langage machine.On parle de compilation. Le résultat de la compilation est l’obtention d’un
code objet qui sera rangé dans un fichier d’extension .o(ici premier.o). Le code objet contiendra
les mêmes instructions que le code source.
Le fichier objet n’est pas directement exécutable ; son contenu n’est pas complet. On le complète par
l’incorporation des modules objets des routines et fonctions prédéfinies que le programme utilise.
Un compilateur C dispose de routines ou fonctions telle que printf(), réalisant rapidement les
opérations les plus fréquentes. L’opération d’incorporation est réalisée par un programme dit de
chaînage (linker) ou d’édition des liens, qui combine les instructions de programmes présentes dans
le fichier objet avec les routines fournies par le compilateur, pour aboutir enfin au code exécutable.
On obtiendra alors un fichier exécutable de même nom que le fichier objet mais d’extension .exe(ici
premier.exe).
Figure 1 –
L’instruction d’appel (directive) ] include indique au compilateur C qu’il doit inclure le contenu
d’un fichier dans le programme pendant la compilation. Ce fichier inclus (fichier entête) contient
des informations destinées au programme ou au compilateur.Ces fichiers inclus, livrés avec le com-
pilateur, ne sont pas à modifier, et ont tous une extension .h.
La fonction main()
Dans les deux exemples donnés,on remarque la présence de la fonction main() (principale)qui est
le seul bloc obligatoire d’un programme C. L’exécution d’un programme C débute à la première
instruction de () et se termine avec la dernière instruction de cette fonction.
La définition de variable
Une variable est un nom donné à une zone mémoire. Le programme a besoin de mémoire pour
stocker ses données en cours d’exécution. En C, une variable doit être déclarée avant d’être utilisée.
La déclaration d’une variable précise son nom et son type. Par exemple, la ligne 3 de l’exemple 2
définit trois variables nommées , b et c, qui contiendront chacune une variable entière.
Déclaration de fonction
Les instructions
Elles constituent le travail réalisé par le programme. On peut avoir les instructions d’affichage,
de lecture (au clavier), d’appel de fonction, d’opérations mathématiques,d’affectation etc. Chaque
instruction occupe généralement(pas obligatoire) une ligne et se termine par un point virgule.
– L’instruction printf() :c’est une fonction de bibliothèque qui envoie des informations à l’écran.
Elle peut être utilisée pour afficher n’importe quel message texte qui sera encadré par des guille-
mets (double quottes). C’est le cas des lignes 8 et 11 par exemple. A la ligne 15, on a fournit
à la fonction printf() des arguments de type entier dont les premiers sont les formats %d qui
précisent comment seront affichées les informations contenues dans les variables entières a, b et
c. %d indique que ce qui suit n’est pas du texte mais un code de format qui précise qu’on affiche
la valeur reçue en argument (ici a, bet c). Toujours à la ligne 15, on remarque \n le caractère
de fin de ligne qui provoque le passage à la ligne suivante.
– L’instruction scanf() :c’est une autre fonction de bibliothèque qui lit les données entrées au
clavier et les attribue à des variables du programme. Dans l’exemple 2, on peut la retrouver aux
lignes 9 et 12. La fonction scanf() possède en argument un (code de) format %d qui correspond
à une valeur entière. L’argument &a indique à la fonction, l’adresse mémoire de rangement de
la valeur de a. Remarque : Sans l’opérateur & (adresse de), les informations lues seront rangées
dans des emplacements aléatoires et aucune erreur de compilation ne sera détectée.
– L’instruction return : celle de la fonction addition() renvoie le résultat de la somme de x et y
au programme appelant. Celle de la fonction principale (main) ne retourne aucune valeur ; elle
peut être facultative.
La définition de fonction
Une fonction est une portion de code indépendante qui effectue une certaine tâche. La fonction
addition() est une fonction utilisateur c’est-à-dire écrite par le programmeur.
/* ... ...*/ désigne un commentaire et est ignoré lors de la compilation. On ne doit pas imbriquer
les commentaires car cela peut provoquer des erreurs de compilation.
Les accolades{}
Les lignes de programme des fonctions en C sont encadrées par des accolades. Tout bloc d’instruc-
tions doit aussi être entre accolades.
4 LES OBJETS
Taxe_annuelle ⇒ correct
Taxe-mensuelle ⇒ incorrect (-)
Z39_hdyd ⇒ correct
_taxe#juin ⇒ incorrect (#)
_taxe_60 ⇒ correct
double ⇒ incorrect (mot clé)
int ⇒ incorrect (mot clé)
6_taxe ⇒ incorrect (6)
Le Turbo C ne fixe pas de limite à priori en ce qui concerne la longueur des identificateurs (noms des
variables ou des fonctions). Cependant, seuls les 32 premiers caractères (norme ANSI : 8 premiers)
sont pris en compte.
Remarque
L’utilisateur peut fixer luimême le nombre de caractères significatifs d’un identificateur à l’aide de
la commande : Option/Compiler/Source/Identifier length.
Les mots suivants sont réservés. Leur fonction est prévue par la syntaxe de C et ils ne peuvent pas
être utilisées dans un autre but. Dans le tableau 1, vous avez quelques exemples de mots clés
Nombres entiers
Anonymes
Petites tailles
singés char
non signés unsigned char
Tailles moyennes
singés short
non signés unsigned short
Grandes tailles
singés long
non signés unsigned long
Nommés
enum
nombres flottants
Simples float
Grande précision double
Très grande précision long double
Types de dérivés
Tableau []
Pointeur *
Fonction ()
Structure struct
Union union
Le tableau ci-dessus présente l’ensemble des types connus du compilateur C. L’organisation générale
de cet ensemble est évidente : on dispose de deux sortes de types de base, les nombres entiers et les
nombres flottants, et d’une famille infinie de types dérivés obtenus en appliquant quelques procédés
récursifs de construction, soit à des types fondamentaux, soit à des types dérivés définis de la même
manière.
Caractère char 1
Entier int 2
Entier court short 2
Entier long long 4
Caractère non signé unsigned char 1
Entier non signé unsigned int 2
Entier court non signé unsigned short 2
Entier long non signé unsigned long 4
Remarque :
On remarque que short et int sont identiques, mais peuvent être différents sur d’autres types
machines. En principe, le type int correspond à la taille d’entier la plus efficace, c’est-à-dire la plus
adaptée à la machine utilisée. Sur certains systèmes et compilateurs int est synonyme de short,
sur d’autres il est synonyme de long.
Le type int peut donc poser un problème de portabilité : le même programme, compilé sur deux
machines distinctes, peut avoir des comportements différents. D’où un conseil important : n’utilisez
le type int que pour des variables locales destinées à contenir des valeurs raisonnablement petites
(inférieures en valeur absolue à 32767). Dans les autres cas il vaut mieux expliciter char, short ou
long selon le besoin.
Un type énuméré, ou énumération, est constitué par une famille finie de nombres entiers, chacun
associé à un identificateur qui en est le nom.
Exemple :
Les variables à virgule flottante contiennent des valeurs pouvant avoir des chiffres après la virgule
(nombres réels). On distingue principalement trois (norme ANSI) types flottants : f loat (simple
précision), double (double précision) et long double (précision étendue).
Typiquement, sur des systèmes de taille moyenne, un f loat occupe 4 octets et un double 8, ce qui
donne par exemple des f loat allant de -1.2 E-38 à 3.4 E+38 avec 7 chiffres décimaux significatifs,
et des double allant de -2.2 E-308 à 1.4 E+308 avec au moins 15 chiffres décimaux significatifs.
La fonction d’affichage Elle permet d’afficher des messages et/ou des valeurs de variables sous
différents formats.
Syntaxe :
Type Format
Entier décimal %d
Entier octal %o
Entier Hexadécimal %x
Entier Non Signé %u
Caractère %c
Chaîne de Caractère %s
Flottant %f
Scientifique %e
Long Entier %ld
Long Entier non Signé %lu
Long Flottant %lf
La fonction de saisie
Elle permet de saisir des valeurs de variables formatées à partir du clavier. Comme printf elle
est composée des formats et des identificateurs de variables à saisir. A la différence de printf , le
format ne peut contenir de texte, il est juste composé du format des valeurs à saisir.
Syntaxe : scanf("Format1, ...., Format n",identificateur 1, ...., identificateur n) ;
Remarque : Le symbole & est obligatoire devant les identificateurs car scanf attend des adresses
et non des valeurs, sauf devant un identificateur de chaîne de caractères.
Les codes d’affichage pour printf deviennent les codes d’entrée pour scanf.
NB : Au début d’un programme utilisant les fonctions d’affichage et de saisie il est nécessaire
d’écrire #include <stdio.h>, car toutes ces fonctions sont déclarées dans ce fichier d’entête.
Exercice
Réaliser un programme qui affiche la taille des types de variables. Indication : on utilisera l’opéra-
teur sizeof (type).
Rappel : toute variable doit être déclarée avant son utilisation. La déclaration de variable indiquera
au compilateur le nom et le type de la variable. Si on utilise une variable non déclarée, alors le
compilateur génère un message d’erreurs. Syntaxe de la déclaration :
nom_type nom_variable
nom_type indique le type de la variable et doit faire partie des mots-clés répertoriés.
nom_variable est le nom de la variable déclarée.
Exemple :
int nombre, prix ;
float taux, note, moyenne ;
Remarque
Exemple :
réserve un emplacement mémoire pour une variable nommée nombre, mais de plus, elle y range la
valeur 10.
Remarque
Il ne faut initialiser une variable avec une valeur qui ne correspond pas au type déclarée. Le
programme pourra donner des résultats erronés sans détection d’erreurs par le compilateur. Les
deux initialisations suivantes sont incorrectes :
Exercice :
Réaliser un programme qui change les valeurs des initialisations des variables.
Conclure.
Remarque
Exemple :
La déclaration typedef int entier ; signifie que entier est "synonyme" de int, de sorte que les décla-
rations suivantes soient équivalentes :
int n, p ;
entier n, p ;
Remarque
typedef ne crée pas un nouveau type de donné ; il permet seulement d’utiliser un nom différent
pour un type de donnée déjà défini. typedef permet de faciliter la lecture des programmes et n’est
pas une simple substitution.
Exemple :
Une constante est un emplacement mémoire utilisé par un programme. Contrairement à une va-
riable, la valeur stockée dans une constante ne peut pas changer pendant l’exécution du programme.
Le langage C possède deux types de constante : les constantes littérales et les constantes symbo-
liques.
Une constante littérale est une valeur qui est introduite directement dans le code source.
Exemple : int nombre =10 ;
float taux =0.05 ;
10 et 0.05 sont des constantes littérales.
– Une constante avec virgule flottante est considérée par le compilateur C comme un nombre
double précision. Elle peut être représentée avec une notation décimale standard : 12.016, 20,
253.23
Une constante avec virgule flottante peut également être représentée en notation scientifique (ou
exponentielle)
2.31 E 2 (= 2.31*102 = 123)
8.04 e 6 (= 8.04*106 = 8040000)
0.53 e -4 (= 0.59*102 − 4 = 59 ∗ 106 = 0.000059)
26 e 13 (= 26*1013 )
– Une constante entière peut également se représenter sous trois formes :
Exemples : (1)
La constante symbolique est représentée par son nom (symbole) nom_constante et par sa valeur
litterale qui est une constante littérale.
L’instruction (1) crée (définit) une constante appelée nom_constante de valeur litterale . ] define
PI 3.14159
Convention : on écrira les noms des constantes symboliques en lettres majuscules et les noms des
variables en lettres minuscules.
L’instruction ]define X Y ne se termine pas par un point virgule ( ;).
Remarque
L’instruction ] define peut se trouver n’importe où dans le code, mais son effet reste limité à la
partie du code qui la suit.
(2)
const int nombre =20 ;
const float pi=3.14159 ;
const long compte =21 000 000 , float taux =.05 ;
nombre, pi, compte et taux sont des constantes symboliques. Si le programme essaie de modifier
une variable, alors le compilateur génère un message d’erreurs.
Remarque
Les différences entre ces deux constantes symboliques (]define et const) concernent les pointeurs
et la portée des variables.
5 Les Instructions
Une instruction représente une tâche à accomplir par l’ordinateur. Elle s’écrit sur une ligne et se
termine par un point-virgule (à l’exception de #define et #include).
Exemples :
Affectation :
x = 2 + 3; (1)
Affichage :
printf(" Apprentissage") ;
Saisie
scanf("%d", &a) ;
(1) équivaut à :
x=
2
+
3;
Cela signifie que le programme a une grande liberté pour la mise en page de son code.
Exception : pour une chaîne de caractère car le blanc est un caractère. Ainsi, l’instruction suivante
est correcte mais déconseillé :
printf(
"Bonjour, monsieur !"
);
printf("Bonjour,
monsieur !") ;
Pour continuer la chaîne de caractères sur la ligne suivante, on utilise l’antislash (\).
printf("Bonjour,\
monsieur !") ;
En plaçant un point-virgule seul sur une ligne, on crée une instruction nulle
Un bloc (ou instructions composées) est un groupe d’instructions entre accolades :
{ printf("Bonjour,") ;
printf("monsieur !") ; }
6 Les Expressions
définition
En langage C, on appelle expression tout ce qui représente une valeur numérique.
2. −2.51/16 + 5 ∗ taux ∗ taux/nombre est expression avec plusieurs opérateurs. Son évaluation
dépend de l’ordre dans lequel les opérations sont effectuées et des priorités des opérateurs.
Remarque : Une instruction d’affectation est elle-même une expression. Ainsi, on peut écrire :
y = x = a + b;
ou
x = 6 + (y = 4 + 5);
7 Les Opérateurs
définition
Un opérateur est un symbole qui décrit une opération ou une action à effectuer sur une ou plusieurs
opérandes.
Remarque : En langage C, les opérandes sont toujours des expressions.
Les opérateurs seront toujours classées en quatre catégories :
1. l’opérateur d’affectation ;
définition
Les opérateurs mathématiques de C réalisent des opérations mathématiques comme l’addition ou
la soustraction. On en distingue deux qui unaires et cinq binaires.
Remarque : Ces deux opérateurs ne peuvent être utilisées qu’avec des variables.
Les instructions
+ + x;
− − y;
x = x + 1;
y = y − 1;
L’opérateur peut être placé en avant (mode préfix) ou après (mode postfix) l’opérande :
1.
x = 90;
y = x + +;
2.
x = 90;
y = + + x;
Exécution :
x vaut 6 , y vaut 5 et a vaut 6 et b vaut 6
x vaut 4 , y vaut 5 et a vaut 4 et b vaut 4
Exercice : Réaliser un programme C qui met en exergue les 2 opérateurs unaires sous leurs différents
modes.
Exercice :
2. Réaliser un programme qui affiche les diviseurs premiers d’un nombre entier donné.
Remarque : A l’exception de l’opérateur % qui ne porter que sur des entiers, ces opérateurs peuvent
s’appliquer à tous les types numériques.
Lorsque plusieurs opérateurs apparaissent dans une même expression, il est important de savoir
dans quel ordre les opérations seront effectuées.
Remarque : En langage C, comme dans les autres langages, les règles sont souvent celles de l’Al-
gèbre traditionnelle pour ce qui concerne les opérateurs arithmétiques classiques.
Question naïve : Quel le résultat de y = 6 + 7 ∗ 5 ?
1. 25 − (2 ∗ (10 + 4))
2. 25 − (2 ∗ 14)
3. 25 − 28)
a ∗ b + c ⇐⇒ a + (b ∗ c)?
Une expression qui contient plusieurs opérateurs de même niveau de priorité est de gauche à droite.
Par exemple, dans l’expression
w ∗ x/y ∗ z
w est multiplié par x, le résultat de la multiplication est divisé par y et le résultat de la division
est multiplié par z.
Si l’expression contient plusieurs opérateurs de priorités différentes, l’ordre de traitement de gauche
à droite n’est plus garanti.
Exemple :
w ∗ x/y + z/y (2)
La multiplication et la division doivent être traitées avant l’addition. Les règles du langage ne
permettent pas de savoir si w ∗ x/y doit être calculé avant ou après z/y.
Si on transforme l’expression (2), le résultat sera différent selon l’ordre dans lequel seront évaluées
les sous expressions : w ∗ x/ + +y + z/y
ATTENTION : Il faut éviter ce genre d’expression indéterminée. Pour cela, utilisez les paren-
thèses pour que l’ordre ne soit pas ambigu.
Ils sont utilisés pour comparer des expressions. Le résultat de la comparaison vaut 1 si l’expression
est vrai ou 0 sinon.
Remarque :
Les opérateurs de comparaison sont principalement utilisés avec les instructions if et while.
Exemple d’utilisation de if :
#include<stdio.h>
main()
{int x, y ;
printf(" \n Entrer la valeur de x :") ;
scanf("%d", &x) ;
printf(" \n Entrer la valeur de y :") ;
scanf("%d", &y) ;
if (x==y)
if (x>y)
if (x<y)
return 0 ;
}
#include<stdio.h>
main()
{int x, y ;
printf(" \n Entrer la valeur de x :") ;
scanf("%d", &x) ;
printf(" \n Entrer la valeur de y :") ;
scanf("%d", &y) ;
if (x==y)
else
if (x>y)
else
return 0 ;
}
ATTENTION : L’erreur la plus courante avec les opérateurs de comparaison est d’utiliser l’opé-
rateur d’affectation (=) en lieu et place de l’opérateur (==).
Exemple :
x = 5;
if (x = 5)
printf(“x est égal à 5”) ;
Le message apparaîtra dans tous les cas, l’expression sera évaluée toujours comme vrai quelque
soit la valeur de x.
Les opérateurs de comparaison ont tous une priorité de traitement inférieure à celle des opérateurs
mathématiques. Ainsi si on écrit
if (x + 2 > y) (3)
Opérateurs Signification
&& et (conjonction)
|| ou (inclusif)
! non (négation)
prends la valeur 1 (vraie) si les 2 expressions a < b et c < d sont toutes deux vraies (de valeur 1),
la valeur 0 (faux) dans le cas contraire.
vaut la valeur 1 (vraie) si l’une au moins des deux 2 conditions a < b et c < d est vraie (valeur 1)
, 0 (faux) dans le cas contraire.
!(a < b)
prends la valeur 1 si la condition a < b est fausse et la valeur 0 sinon. Elle est équivalente à :
a >= b.
Remarque : Comme C ne possède pas de type logique, alors les opérateurs logiques produisent un
résultat de type int. Ainsi le compilateur accepte les expressions suivantes :
n&&p, n||p, !n
4. a < b||a < c&&c < d ⇐⇒ a < b||(a < c&&c < d)
Exemple :
#include<stdio.h>
int a=5, b=6, c=5 , d=1, x ;
main()
{
x=a<b || a<c && c<d ;
printf(" \n L’expression sans parenthèse vaut %d",x) ;
x=(a<b || a<c) && c<d ;
printf(" \n L’expression avec les parenthèses vaut %d",x) ;
}
Ils permettent d’associer une opération mathématique binaire avec une opération d’affectation.
x+ = 5; ⇐⇒ x = x + 5;
syntaxe générale :
exp1 op = exp2 (4)
1. x = y ? 1 : 100; signifie que x prend la valeur 1 si y est vraie (= 1), sinon x prend la valeur
100.
5 signifie que si exp1 est vraie (6= 0), alors l’expression complète prendra la valeur de exp2, sinon
l’expression complète prendra la valeur de exp3
Ces opérateurs portent exclusivement sur des types entiers (y compris les caractères qui sont aussi
des entiers de tailles petites).
On en distingue cinq (5) qui sont (opérateurs) binaires et un qui unaire. Ils permettent de travailler
directement sur le motif binaire.
opérande X 0 0 1 1
opérande Y 0 1 0 1
1. X&Y 0 0 0 1
X|Y 0 1 1 1
X ∧Y 0 1 1 0
L’opérateur unaire ∼ inverse chacun des bits de son unique opérande (0 donne 1 et 1 donne
0).
∼
X = 1 1 0 0
∼
Y = 1 0 1 0
Remarque : Le qualificatif de “signed/unsigned” des opérandes n’a pas d’incidence sur le
motif binaire crée par ces opérateurs.
n 1 0 1 0 1 1 0 1 1 1 0 1 1 1 1 0
q 1 0 1 0 1 1 0 1 1 1 0 1 1 1 1 0
n2 1 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0
n3 1 1 1 1 0 1 0 1 1 0 1 1 1 0 1 1
q3 0 0 0 1 0 1 0 1 1 0 1 1 1 0 1 1
syntaxe
Xn
Xn
Chacun de ces opérateurs décalent les bits de la variable X de n positions dans la direction cor-
respondante.
Intérêt : Ces opérateurs permettent dans certains cas de multiplier ou de diviser une ariable entière
par une puissance de 2. En décalant un entier de n positions vers la gauche, on obtient une multi-
plication par 2n à condition de ne “perdre” bit significatif dans cette opération. Ce même décalage
vers la droite permet d’obtenir une division entière par 2n puisqu’on perd la fraction décimale du
résultat.
#include<stdio.h>
main()
{
unsigned int y, x = 255 ;
int compte ;
printf("Valeur Décimale \t Décalage à gauche \t Résultats \n") ;
for (compte = 1 ; compte < 8 ; compte++)
{
y = x « compte ;
printf("%d\t\t\t\t %d\t\t %d\n", x, compte, y) ;
}
printf("Valeur Décimale \t Décalage à droite \t Résultats \n") ;
for (compte = 1 ; compte < 8 ; compte++)
{
y = x » compte ;
printf("%d\t\t\t\t %d\t\t %d\n", x, compte, y) ;
}
return 0 ;
}
Remarque : Ne pas confondre l’opérateur séquentiel avec la virgule utilisée (même priorité) comme
séparateur dans une liste d’arguments.
Exemple :
Exercice : Faire un programme qui demande deux nombres au clavier et qui affiche ?divisible ? si
le premier est divisible par le deuxième.
Exemple :
#include <stdio.h>
main ()
{
char operation ;
int r, a, b ;
printf("Entrez un signe d’opération : ") ;
scanf("%c", &operation) ;
a=273 ; b=158 ; r=0 ;
if (operation==’+’ || operation==’p’)
r = a + b;
else if (operation==’-’ || operation==’m’)
r = a - b;
else if (operation==’*’ || operation==’f’)
r = a * b;