Toute machine capable de manipuler des informations binaires peut être qualifiée d'ordinateur.
Le type d'ordinateur le plus présent sur le marché est le PC (Ordinateur personnel), toutefois il existe d'autres types d'ordinateurs (n'étant pas des PC).
Pour effectuer une tâche, quelle qu’elle soit, un ordinateur a besoin d’un programme informatique.
Or, pour fonctionner, un programme informatique doit indiquer à l’ordinateur ce qu’il doit faire avec précision étape par étape.
L’ordinateur exécute ensuite le programme, en suivant chaque étape de façon automatique pour atteindre l’objectif.
Or, il faut aussi dire à l’ordinateur comment faire ce qu’il doit faire. C’est le rôle de l’algorithme informatique.
Un algorithme est composé de trois (3) parties principales :
L’entête : Cette partie sert à donner un nom à l’algorithme. Elle est précédée par le mot algorithme, ce nom n’influe en rien le bon déroulement de l’algorithme. En général, il faut donner des noms qui permettent au lecteur d’avoir une idée de ce que fera l’algorithme qu’il lira.
La partie déclarative : Dans cette partie, on déclare les différents objets que l’algorithme utilise (constantes, variables, etc.)
Le corps de l’algorithme : Il est composé d’une séquence d'actions faisant appel à des opérations de base de l'ordinateur. Il est délimité par les mots DÉBUT et FIN.
Compilateur :
Traduit une fois pour toutes, les programmes dans leur ensemble :tout le programme est fourni au compilateur pour la traduction et son résultat sera un nouveau fichier autonome, c'est-à-dire qui n'aura plus besoin d’un programme autre que lui pour s'exécuter; on dit d'ailleurs que ce fichier est exécutable peut être soumis au processeur pour traitement.
Un langage de programmation pour lequel un compilateur est disponible est appelé un langage compilé.
L’algorithmique est la science des algorithmes. Elle s’intéresse à l’art de construire des algorithmes ainsi qu’à déterminer leur validité, leur robustesse, leur réutilisabilité, leur complexité ou leur efficacité.
L’algorithmique permet ainsi de passer d’un problème à résoudre à un algorithme qui décrit la démarche de résolution du problème.
Par conséquent, la programmation consiste à traduire un algorithme dans un langage « compréhensible » par l’ordinateur afin qu’il puisse être exécuté automatiquement.
1. Nous formons les experts de demain
ECOLE SUPERIEURE D’INGENIERIE ET D’INNOVATION TECHNOLOGIQUE
Reproduction interdite
Nous formons les experts de demain
ECOLE SUPERIEURE D’INGENIERIE ET D’INNOVATION
TECHNOLOGIQUE
PROGRAMMATION EN LANGAGE C
Licence Professionnelle Informatique
1ère année Tronc commun
2. Nous formons les experts de demain
ECOLE SUPERIEURE D’INGENIERIE ET D’INNOVATION TECHNOLOGIQUE
Reproduction interdite
Nous formons les experts de demain
ECOLE SUPERIEURE D’INGENIERIE ET D’INNOVATION
TECHNOLOGIQUE
Présentation DE L’ENSEIGNANT
M. Olyvier NZIGHOU
Master 2 Gestion de Projets Informatiques de l’Université de
Strasbourg.
Enseignant vacataire à l’IST, EPL, IAI, SUP’MANAGEMENT
Tél. : 066049840 / 077684285
3. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Objectifs du cours
3
Initier les étudiants à la programmation impérative à
travers le langage C.
Ce module vient compléter le cours d’algorithmes et
structures de données vu au 1er semestre..
6. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Contenu du cours
6
1. Introduction
2. Types, opérateurs et expressions
3. Les entrées-sorties (printf, scanf, …)
4. Les structures de contrôle
5. Les tableaux
6. Les pointeurs
7. Les fonctions
8. Les chaînes de caractères
9. Les structures
8. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Langages informatiques
8
Un langage informatique est un outil permettant de
donner des ordres (instructions) à la machine.
A chaque instruction correspond une action du
processeur.
Intérêt : écrire des programmes (suite consécutive
d’instructions) destinés à effectuer une tache donnée.
Exemple: un programme de gestion de comptes
bancaires.
Contrainte : être compréhensible par la machine.
9. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Langage machine
9
Langage binaire : l’information est exprimée et manipulée
sous forme d’une suite de bits.
Un bit (binary digit) = 0 ou 1 (2 états électriques)
Une combinaison de 8 bits = 1 Octet 28 = 256 possibilités
qui permettent de coder tous les caractères alphabétiques,
numériques, et symboles tels que ?,*,&, …
Le code ASCII (American Standard Code for Information
Interchange) donne les correspondances entre les
caractères alphanumériques et leurs représentation
binaire,
Ex. A = 01000001, ? = 00111111
Les opérations logiques et arithmétiques de base (addition,
multiplication, … ) sont effectuées en binaire
10. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
L’ASSEMBLEUR
10
Problème : le langage machine est difficile à comprendre par
l'humain
Idée : trouver un langage compréhensible par l'homme qui
sera ensuite converti en langage machine
Assembleur : exprimer les instructions élémentaires de
façon symbolique
+ : déjà plus accessible que le langage machine
- : dépend du type de la machine (n’est pas portable)
- : pas assez efficace pour développer des applications
complexes
11. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Langages haut niveau
11
Intérêts multiples pour le haut niveau :
proche du langage humain « anglais »
(compréhensible)
permet une plus grande portabilité (indépendant du
matériel)
Manipulation de données et d’expressions complexes
(réels, objets, a*b/c, …)
Nécessité d’un traducteur (compilateur/interpréteur),
exécution plus ou moins lente selon le traducteur
12. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Compilateur/interpréteur
12
Compilateur : traduire le programme entier une fois pour
toutes
+ plus rapide à l’exécution
+ sécurité du code source
- il faut recompiler à chaque modification
13. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Compilateur/interpréteur
13
Interpréteur : traduire au fur et à mesure les instructions
du programme à chaque exécution
+ exécution instantanée appréciable pour les débutants
- exécution lente par rapport à la compilation
15. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Historique du C
15
Le langage C a été conçu en 1972 dans «Bell Laboratories» par
Dennis Ritchie avec l’objectif d’écrire un système
d'exploitation (UNIX).
En 1978, une première définition rigoureuse du langage C
(standard K&R-C) a été réalisée par Kernighan et Ritchie en
publiant le livre «The C Programming Language ».
Le succès du C et l’apparition de compilateurs avec des
extensions particulières ont conduit à sa normalisation.
En 1983, l’organisme ANSI (American National Standards
Institute) chargeait une commission de mettre au point une
définition explicite et portable pour le langage C. Le résultat
est le standard ANSI-C.
16. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Caractéristiques du C
16
Universel : n'est pas orienté vers un domaine d'application
particulier (applications scientifiques, de gestion, …)
Près de la machine : offre des opérateurs qui sont proches
de ceux du langage machine (manipulations de bits,
d’adresses, …) efficace.
Modulaire: peut être découpé en modules qui peuvent être
compilés séparément
Portable: en respectant le standard ANSI-C, il est possible
d'utiliser le même programme sur plusieurs systèmes
(hardware, système d'exploitation)
Remarque : Une programmation efficace et compréhensible en
C n’est pas facilement accessible à des débutants
17. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Programme source, objet et exécutable
17
Un programme écrit en langage C forme un texte qu’on
nomme programme ou code source, qui peut être formé de
plusieurs fichiers sources
Chaque fichier source est traduit par le compilateur pour
obtenir un fichier ou module objet (formé d’instructions
machine)
Ce fichier objet n’est pas exécutable tel quel car il lui
manque les instructions exécutables des fonctions
standards appelées dans le fichier source (printf, scanf,
…) et éventuellement d’autres fichiers objets
18. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Programme source, objet et exécutable
18
L’éditeur de liens réunit les différents modules objets
et les fonctions de la bibliothèque standard afin de
former un programme exécutable
Remarque : la compilation est précédée par une phase de
prétraitement (inclusion de fichiers en-tête) réalisé par le
préprocesseur
20. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Compilateurs C
20
Pour pouvoir écrire des programmes en C, vous avez besoin
d’un compilateur C sur votre machine.
Il existe plusieurs compilateurs respectant le standard ANSI-
C. Une bonne liste est disponible sur :
c.developpez.com/compilateurs/
Nous allons utiliser l'environnement de développement Dev-
C++ avec le système d’exploitation Windows.
Vous pouvez télécharger Dev-C++ librement, par exemple
sur le site www.bloodshed.net
21. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Cycle de développement
21
Étape 1 : Utilisez un éditeur pour créer le code source.
Par convention, ce fichier doit avoir l’extension .c (par
exemple, monprog.c, database.c, etc.).
Étape 2 : Compilez votre programme. Si le
compilateur ne rencontre pas d’erreur dans votre code
source, vous obtenez un fichier objet du même nom
que votre fichier source avec une extension .obj ou .o
(par exemple, monprog.c est compilé en monprog.o). Si
le code source contient des erreurs, le compilateur
échoue et vous les affiche pour correction.
22. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Cycle de développement
22
Étape 3 : Exécutez la liaison. Si aucune erreur
n’apparaît, vous obtenez un programme exécutable dans
un fichier du même nom que le fichier objet (avec une
extension .exe sur Windows par exemple, monprog.obj
devient monprog.exe).
Étape 4 : Exécutez votre programme. Contrôlez les
résultats obtenus et recommencez à l’étape 1 si des
modifications sont nécessaires dans le fichier source.
25. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Composantes d’un programme C
25
Directives du préprocesseur
inclusion des fichiers d'en-tête (fichiers avec extension
.h)
définitions des constantes avec #define
déclaration des variables globales
définition des fonctions (En C, le programme principal et
les sous-programmes sont définis comme fonctions )
Les commentaires : texte ignoré par le compilateur, destiné
à améliorer la compréhension du code
27. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Remarques sur ce premier programme
27
#include<stdio.h> informe le compilateur d’inclure le
fichier stdio.h qui contient les fonctions d’entrées-sorties
dont la fonction printf
La fonction main est la fonction principale des
programmes en C : Elle se trouve obligatoirement dans
tous les programmes. L'exécution d’un programme
entraîne automatiquement l'appel de la fonction main.
28. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Remarques sur ce premier programme
28
L’appel de printf avec l’argument "notre premier programme
Cn" permet d’afficher : notre premier programme C et n
ordonne le passage à la ligne suivante
En C, toute instruction simple est terminée par un point-
virgule ;
Un commentaire en C est compris entre // et la fin de la
ligne ou bien entre /* et */
30. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Les variables
30
Les variables servent à stocker les valeurs des données
utilisées pendant l’exécution d’un programme
Les variables doivent être déclarées avant d’être
utilisées, elles doivent être caractérisées par :
un nom (Identificateur)
un type (entier, réel, …)
une valeur
31. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Les identificateurs
31
Le choix d’un identificateur (nom d’une variable ou d’une
fonction) est soumis à quelques règles :
doit être constitué uniquement de lettres, de chiffres et
du caractère souligné (‘_’) (Eviter les caractères de
ponctuation et les espaces)
Correct : PRIX_HT, prixHT
incorrect : PRIX-HT, prix HT, prix.HT
doit commencer par une lettre (y compris le caractère
souligné)
correct : _A1,
incorrect : 1A
32. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Les identificateurs
32
doit être différent des mots réservés du langage :
Remarque : C distingue les majuscules et les minuscules. NOMBRE et
nombre sont des identificateurs différents
33. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Les types de base
33
Le type d’une variable détermine l’ensemble des valeurs qu’elle
peut prendre et le nombre d'octets à lui réserver en mémoire
En langage C, il n’y a que deux types de base les entiers et les
réels avec différentes variantes pour chaque type
Remarques :
Un type de base est un type pour lequel une variable peut
prendre une seule valeur à un instant donné contrairement
aux types agrégés
34. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Les types de base
34
Le type caractère apparaît en C comme cas particulier
du type entier (un caractère est un nombre entier, il
s’identifie à son code ASCII)
En C il n'existe pas de type spécial pour chaînes de
caractères. Les moyens de traiter les chaînes de
caractères seront présentés aux chapitres suivants
Le type booléen n’existe pas. Un booléen est représenté
par un entier (un entier non nul équivaut à vrai et la
valeur zero équivaut à faux)
35. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Types Entier
35
4 variantes d’entiers :
char : caractères (entier sur 1 octet : -128 à 127)
short ou short int : entier court (entier sur 2 octets :
-32768 à 32767)
int : entier standard (entier sur 2 ou 4 octets )
long ou long int : entier long (entier sur 4 octets :
-2147483648 à 2147483648)
36. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Types Entier
36
Si on ajoute le préfixe unsigned à la définition d'un type
de variables entières, alors la plage des valeurs change :
unsigned char : 0 à 255
unsigned short : 0 à 65535
unsigned int : dépend du codage (sur 2 ou 4 octets)
unsigned long : 0 à 4294967295
Remarque : Une variable du type char peut subir les mêmes
opérations que les variables du type short, int ou long
37. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Types Réel
37
3 variantes de réels :
float : réel simple précision codé sur 4 octets de -3.4*1038 à
3.4*1038
double : réel double précision codé sur 8 octets de -1.7*10308
à 1.7*10308
long double : réel très grande précision codé sur 10 octets de
-3.4*104932 à 3.4*104932
38. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Déclaration des variables
38
Les déclarations introduisent les variables qui seront
utilisées, fixent leur type et parfois aussi leur valeur de
départ (initialisation)
Syntaxe de déclaration en C
<Type> <NomVar1>,<NomVar2>,...,<NomVarN>;
Exemple:
int i,j,k;
float x,y;
double z = 1.5; // déclaration et initialisation
short compteur;
char c = ‘A’;
39. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Déclaration des constantes
39
Une constante conserve sa valeur pendant toute
l’exécution d’un programme
En C, on associe une valeur à une constante en utilisant :
la directive #define :
#define <nom_constante> valeur
Ici la constante ne possède pas de type.
Exemple : #define PI 3.141592
40. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Déclaration des constantes
40
le mot clé const :
const type <nom> = expression;
Dans cette instruction la constante est typée
Exemple : const float PI = 3.141592;
Remarque : L’intérêt des constantes est de donner un nom
parlant à une valeur, par exemple NB_LIGNES, aussi ça facilite la
modification du code
41. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Constantes entières
41
On distingue 3 formes de constantes entières :
forme décimale : c’est l’écriture usuelle. Ex : 372, 200
forme octale (base 8) : on commence par un 0 suivi de
chiffres octaux. Ex : 0477
forme hexadécimale (base 16) : on commence par 0x (ou
0X) suivis de chiffres hexadécimaux (0-9 a-f).
Ex : 0x5a2b, 0Xa9f
42. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Remarques sur les constantes entières
42
Le compilateur attribue automatiquement un type aux
constantes entières. Il attribue en général le type le plus
économique parmi (int, unsigned int, long int, unsigned
long int)
On peut forcer la machine à utiliser un type de notre choix en
ajoutant les suffixes suivants :
u ou U pour unsigned int, Ex : 100U, 0xAu
l ou L pour long, Ex : 15l, 0127L
ul ou UL pour unsigned long, Ex : 1236UL, 035ul
43. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Constantes réelles
43
On distingue 2 notations :
notation décimale Ex : 123.4, .27, 5.
notation exponentielle Ex : 1234e-1 ou 1234E-1
Remarques :
Les constantes réelles sont par défaut de type double
On peut forcer la machine à utiliser un type de notre
choix en ajoutant les suffixes suivants :
f ou F pour le type float, Ex : 1.25f
l ou L pour le type long double, Ex : 1.0L
44. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Les constantes caractères
44
Se sont des constantes qui désignent un seul caractère,
elles sont toujours indiquées entre des apostrophes, Ex :
‘b’, ‘A’, ‘?’
La valeur d’une constante caractère est le code ASCII du
caractère
Les caractères constants peuvent apparaître dans des
opérations arithmétiques ou logiques
Les constantes caractères sont de type int
45. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Expressions et opérateurs
45
Une expression peut être une valeur, une variable ou une
opération constituée par des valeurs, des constantes et des
variables reliées entre eux par des opérateurs. Exemples : 1, b,
a*2, a+3*b-c, …
Un opérateur est un symbole qui permet de manipuler une ou
plusieurs variables pour produire un résultat. On distingue :
les opérateurs binaires qui nécessitent deux opérandes Ex : a
+ b
les opérateurs unaires qui nécessitent un seul opérande Ex :
a++
l'opérateur conditionnel ? : , le seul qui nécessite trois
opérandes
Une expression fournit une seule valeur, elle est évaluée en
respectant des règles de priorité et d’associativité
46. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateurs en C
46
Le langage C est riche en opérateurs. Outre les opérateurs
standards, il comporte des opérateurs originaux d’affectation,
d’incrémentation et de manipulation de bits
On distingue les opérateurs suivants en C :
les opérateurs arithmétiques : +, -, *, /, %
les opérateurs d’affectation : =, +=, -=,*=,/=,…
les opérateurs logiques : &&, ||, !
les opérateurs de comparaison : ==, !=, <, >, <=, >=
les opérateurs d’incrémentation et de décrémentation : ++, --
les opérateurs sur les bits : <<, >>, &, |, ~, ^
d’autres opérateurs particuliers : ?:, sizeof, cast
47. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateurs arithmétiques
47
binaires : + - * / et % (modulo) et unaire : -
Les opérandes peuvent être des entiers ou des réels sauf pour
% qui agit uniquement sur des entiers
Lorsque les types des deux opérandes sont différents il y’a
conversion implicite dans le type le plus fort
L’opérateur / retourne un quotient entier si les deux
opérandes sont des entiers (5 / 2 2). Il retourne un
quotient réel si l’un au moins des opérandes est un réel (5.0
/ 2 2.5)
48. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Conversions implicites
48
Les types short et char sont systématiquement convertis en int
indépendamment des autres opérandes
La conversion se fait en général selon une hiérarchie qui n'altère
pas les valeurs int long float double long double
Ex1 : n * x + p (int n,p; float x;)
exécution prioritaire de n * x : conversion de n en float
exécution de l'addition : conversion de p en float
Ex2 : p1 * p2 + p3 * x (char p1, short p2, p3; float x;)
p1, p2 et p3 d'abord convertis en int
p3 converti en float avant multiplication
49. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Exemple de conversion
49
Exemple : n * p + x (int n; long p; float x;)
n * p + x
long conversion de n en long
multiplication par p
n * p de type long
conversion de n * p en float
addition
résultat de type float
*
long
float
+
float
50. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateur d’affectation simple =
50
L’opérateur = affecte une valeur ou une expression à une
variable
Exemple : double x, y, z; x=2.5; y=0.7; z=x*y-3;
Le terme à gauche de l’affectation est appelé lvalue (left value)
L'affectation est interprétée comme une expression. La valeur
de l'expression est la valeur affectée
On peut enchainer des affectations, l’évaluation se fait de
droite à gauche
Exemple : i=j=k=5 (est équivalente à k=5, j=k et ensuite
i=j)
La valeur affectée est toujours convertie dans le type de la
lvalue, même si ce type est plus faible (ex : conversion de float
en int, avec perte d'information)
51. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateurs relationnels
51
Opérateurs
< : inférieur à <= : inférieur ou égal à
> : supérieur à >= : supérieur ou égal à
== : égal à != : différent de
Le résultat de la comparaison n’est pas une valeur booléenne,
mais 0 si le résultat est faux et 1 si le résultat est vrai
Les expressions relationnelles peuvent donc intervenir dans
des expressions arithmétiques
Exemple : a = 2, b = 7, c = 4
B == 3 0 (faux)
A != b 1 (vrai)
4 * (a < b) + 2 * (c >= b) 4
52. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateurs logiques
52
&& : ET logique || : OU logique !: NON logique
&& retourne vrai si les deux opérandes sont vrais (valent 1)
et 0 sinon
|| retourne vrai si l’une des opérandes est vrai (vaut 1) et
0 sinon
Les valeurs numériques sont acceptées : toute valeur non
nulle correspond à vraie et 0 correspond à faux
Exemple : 5 && 11 1
!13.7 0
53. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Évaluation de && et ||
53
Le 2ème opérande est évalué uniquement en cas de nécessité
a && b : b évalué uniquement si a vaut vrai (si a vaut faux,
évaluation de b inutile car a && b vaut faux)
A || b : b évalué uniquement si a vaut faux (si a vaut vrai,
évaluation de b inutile car a || b vaut vrai)
Exemples
if ((d != 0) && (n / d == 2)) : pas de division si d vaut 0
if ((n >=0) && (sqrt(n) < p)) : racine non calculée si n < 0
L’intérêt est d’accélérer l’évaluation et d’éviter les traitements
inappropriés
54. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Incrémentation et décrémentation
54
Les opérateurs ++ et -- sont des opérateurs unaires permettant
respectivement d'ajouter et de retrancher 1 au contenu de leur
opérande
Cette opération est effectuée après ou avant l'évaluation de
l'expression suivant que l'opérateur suit ou précède son opérande
k = i++ (post-incrémentation) affecte d'abord la valeur de i à
k et incrémente après (k = i++; ⟺ k = i; i = i+1;)
k = ++i (pré-incrémentation) incrémente d'abord et après
affecte la valeur incrémentée à k (k = ++i ; ⟺ i = i+1 ; k =
i;)
Exemple : i = 5 ; n = ++i - 5; i vaut 6 et n vaut 1
i = 5 ; n = i++ - 5; i vaut 6 et n vaut 0
Remarque : idem pour l’opérateur de décrémentation --
55. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateurs de manipulations de bits
55
Opérateurs arithmétiques bit à bit :
& : ET logique | : OU logique ^ : OU exclusif ~ : NON
logique
Les opérandes sont de type entier. Les opérations s'effectuent bit à
bit suivant la logique binaire
Ex : 14 = 1110, 9 = 1001 14 & 9 = 1000 = 8, 14 | 9 = 1111 = 15
56. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateurs de décalage de bits
56
Il existe deux opérateurs de décalage :
>> : décalage à droite << : décalage à gauche
L’opérande gauche constitue l’objet à décaler et l’opérande droit
le nombre de bits de décalage
Dans le cas d'un décalage à gauche les bits les plus à gauche sont
perdus. Les positions binaires rendues vacantes sont remplies
par des 0
Exemples : char x=14; (14=00001110) 14<<2 = 00111000 = 56
char y=-7; (-7=11111001) -7<<2 = 11100100 = -28
Remarque : un décalage à gauche de k bits correspond (sauf
débordement) à la multiplication par 2k
57. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateurs de décalage de bits
57
Lors d'un décalage à droite les bits les plus à droite sont perdus.
si l'entier à décaler est non signé, les positions binaires
rendues vacantes sont remplies par des 0
s'il est signé le remplissage dépend de l’implémentation (en
général le remplissage se fait par le bit du signe)
Ex : char x=14; (14=00001110) 14>>2 = 00000011 = 3
Remarque : un décalage à droite (n >> k) correspond à la
division entière par 2k si n est non signé
58. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateurs d’affectation combinés
58
Soit un opérateur de calcul op et deux expressions exp1 et exp2.
L’expression exp1 = exp1 op exp2 peut s’écrire en général de
façon équivalente sous la forme exp1 op= exp2
Opérateurs utilisables :
+= -= *= /= %=
<<= >>= &= ^= |=
Exemples :
a=a+b s’écrit : a+=b
n=n%2 s’écrit : n%=2
x=x*i s’écrit : x*=i
p=p>>3 s’écrit : p>>=3
59. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateur de forçage de type (cast)
59
Il est possible d’effectuer des conversions explicites ou de forcer
le type d’une expression
Syntaxe : (<type>)<expression>
Exemple : int n, p ;
(double)(n/p); convertit l’entier n / p en double
Remarque : la conversion (ou casting) se fait après calcul
(double)(n/p) ≠ (double)n/p ≠ (double)(n)/(double)(p)
float n = 4.6, p = 1.5;
(int)n/(int)p = 4/1 = 4
(int)n/p = 4/1.5 = 2.66
n/(int)p = 4./1 = 4.6
n/p = 4.6/ 1.5 = 3.06
60. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateur conditionnel ? :
60
Syntaxe : exp1 ? exp2 : exp3
exp1 est évaluée, si sa valeur est non nulle c’est exp2 qui est
exécutée, sinon exp3
Exemple1 : max = a > b ? a : b
Si a>b alors on affecte à max le contenu de a càd a sinon on
lui affecte b
Exemple2 : a>b ? i++ : i--;
Si a>b on incrémente i sinon on décrémente i
61. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateur séquentiel ,
61
Utilité : regrouper plusieurs sous-expressions ou calculs en
une seule expression
Les calculs sont évalués en séquence de gauche à droite
La valeur de l’expression est celle de la dernière sous-
expression
Exemples
i++, i+j; // on évalue i++ ensuite i+j (on utilise la valeur
de i incrémentée)
i++, j=i+k, a+b; // la valeur de l’expression est celle de
a+b
for(i=1, k=0; …; …) { }
62. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Opérateur SIZEOF
62
Syntaxe : sizeof(<type>) ou sizeof(<variable>)
fournit la taille en octets d'un type ou d'une
variable
Exemples
int n;
printf("%d n",sizeof(int)); // affiche 4
printf("%d n",sizeof(n)); // affiche 4
63. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Priorité et associativité des opérateurs
63
Une expression est évaluée en respectant des règles de priorité et
d’associativité des opérateurs
Ex: * est plus prioritaire que +, ainsi 2 + 3 * 7 vaut 23 et non
35
Le tableau de la page suivante donne la priorité de tous les
opérateurs. La priorité est décroissante de haut en bas dans le
tableau.
Les opérateurs dans une même ligne ont le même niveau de
priorité. Dans ce cas on applique les règles d’associativité selon le
sens de la flèche. Par exemple: 13 % 3 * 4 vaut 4 et non 1
Remarque: en cas de doute il vaut mieux utiliser les parenthèses
pour indiquer les opérations à effectuer en priorité. Ex: (2 + 3) *
7 vaut 35
65. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LA COMPILATION
70
Le langage C est un langage compilé. Cela signifie que, pour
pouvoir exécuter un programme, vous devez d’abord traduire
sa forme lisible par un être humain (code source) en quelque
chose qu’une machine peut « comprendre » (code machine).
Cette traduction est effectuée par un programme appelé
compilateur.
Le compilateur est plutôt pointilleux sur la syntaxe ! Comme
tous les programmeurs, vous passerez beaucoup de temps à
chercher des erreurs dans du code.
Ce que le programmeur écrit est le code source (ou programme
source) et ce que l’ordinateur exécute s’appelle exécutable, code
objet ou code machine.
66. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LA COMPILATION
71
La plupart du temps, le code contient des erreurs ! Lorsque
vous coderez, le compilateur risque parfois de vous « agacer ».
Toutefois, il a généralement raison car vous avez certainement
écrit quelque chose qui n’est pas défini précisément par la
norme et qu’il empêche de produire du code objet.
Le compilateur est dénué de bon sens et d’intelligence (il n’est pas humain)
et il est donc très pointilleux. Prenez en compte les messages d’erreur et
analysez les bien.
67. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
ÉDITION DES LIENS
72
Un programme contient généralement plusieurs parties
distinctes, souvent développées par des personnes
différentes.
Ces parties distinctes doivent être liées ensemble pour
former un programme exécutable. Le programme qui lie ces
parties distinctes s’appelle un éditeur de liens (linker).
Le code objet et les exécutables ne sont pas portables
entre systèmes. Par exemple, si vous compilez pour
une machine Windows, vous obtiendrez un code
objet qui ne fonctionnera pas sur une machine Linux.
69. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
ÉDITION DES LIENS
74
Une bibliothèque n’est rien d’autre que du code (qui ne
contient pas de fonction « main »). Nous y accédons au
moyen de déclarations se trouvant dans un fichier d’en-tête.
Une déclaration est une suite d’instructions qui indique
comment une portion de code (qui se trouve dans une
bibliothèque) peut être utilisée.
Attention à ne pas confondre bibliothèques et
fichiers d’en-tête.
70. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
ÉDITION DES LIENS
75
Une bibliothèque dynamique est une bibliothèque qui contient
du code qui sera intégré au moment de l’exécution du
programme.
Les avantages sont que le programme est de taille plus
petite et qu’il sera à jour vis-à-vis de la mise à jour des
bibliothèques.
L’inconvénient est que l’exécution dépend de l’existence de
la bibliothèque sur le système cible.
Une bibliothèque dynamique, « Dynamic Link Library »
(.dll) pour Windows et « shared object » (.so) sous Linux,
est un fichier de bibliothèque logicielle utilisé par un
programme exécutable, mais n’en faisant pas partie.
71. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES ÉTAPES DE FABRICATION
76
Les différentes étapes de fabrication d’un programme sont :
1. Le préprocesseur (pré-compilation)
Traitement des directives qui commencent toutes par le
symbole dièse « # » ;
Inclusion de fichiers « .h » avec « #include » ;
Substitutions lexicales : les « macros » avec « #define ».
2. La compilation
Vérification de la syntaxe ;
Traduction dans le langage d’assemblage de la machine
cible.
72. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES ÉTAPES DE FABRICATION
77
3. L’assemblage
Traduction finale en code machine (appelé ici code
objet) ;
Production d’un fichier objet (.o ou .obj).
4. L’édition de liens
Unification des symboles internes ;
Étude et vérification des symboles externes
(bibliothèques .so ou .dll) ;
Production du programme exécutable.
73. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES ÉTAPES DE FABRICATION
78
Autrement dit :
La transformation d’un texte écrit en langage C en un
programme exécutable par l’ordinateur se fait en deux
étapes : la compilation et l’édition de liens.
La compilation est la traduction des fonctions écrites en C
en des procédures équivalentes écrites dans un langage
dont la machine peut exécuter les instructions.
Le compilateur lit toujours un fichier, appelé fichier source,
et produit un fichier, dit fichier objet.
74. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES ÉTAPES DE FABRICATION
79
Chaque fichier objet est incomplet, insuffisant pour être
exécuté, car il contient des appels de fonctions ou des
références à des variables qui ne sont pas définies dans le
même fichier.
Par exemple, le premier programme que vous écrirez
contiendra déjà la fonction printf que vous n’aurez
certainement pas écrite vous-même.
75. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES ÉTAPES DE FABRICATION
80
L’édition de liens est l’opération par laquelle plusieurs
fichiers objets sont mis ensemble pour se compléter
mutuellement : un fichier apporte des définitions de
fonctions et de variables auxquelles un autre fichier fait
référence et réciproquement.
L’éditeur de liens (ou linker) prend en entrée plusieurs
fichiers objets et bibliothèques (une variété particulière de
fichiers objets) et produit un unique fichier exécutable.
L’éditeur de liens est largement indépendant du langage de
programmation utilisé pour écrire les fichiers sources, qui
peuvent même avoir été écrits dans des langages différents.
76. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES ÉTAPES DE FABRICATION
81
Chaque fichier source entrant dans la composition d’un
programme exécutable est fait d’une succession d’un nombre
quelconque d’éléments indépendants, qui sont :
des directives pour le préprocesseur (lignes commençant
par #) ;
des constructions de types (struct, union, enum, typedef)
;
des déclarations de variables et de fonctions externes ;
des définitions de variables ;
des définitions de fonctions.
78. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES COMMENTAIRES
83
Les commentaires commencent par /* et se terminent par */.
/* Ce texte est un commentaire et sera donc ignoré par le
compilateur */
Les langages C et C++ cohabitant dans la plupart des
compilateurs actuels, ces derniers acceptent également
comme commentaire tout texte compris entre le signe // et la
fin de la ligne où ce signe apparaît :
// Ceci est un commentaire
79. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES MOTS-CLÉS
84
Les mots suivants sont réservés. Leur fonction est prévue
par la syntaxe du C et ils ne peuvent pas être utilisés dans un
autre but :
81. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES OPÉRATEURS
86
Tous ces symboles sont reconnus par le compilateur
comme des opérateurs.
Il est interdit d’insérer des caractères blancs à l’intérieur
d’un symbole composé.
En outre, il est conseillé d’encadrer par des blancs toute
utilisation d’un opérateur.
Dans certaines circonstances cette règle est plus qu’un
conseil, car sa non-observance crée une expression
ambigüe.
82. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CONSTANTES LITTÉRALES
87
Nombres entiers :
Les constantes littérales numériques entières ou réelles
suivent les conventions habituelles, avec quelques
particularités.
Les constantes littérales sont sans signe : l’expression −123
est comprise comme l’application de l’opérateur unaire −
à la constante 123; mais puisque le calcul est fait pendant
la compilation, cette subtilité n’a aucune conséquence
pour le programmeur.
Notez aussi qu’en C original, comme il n’existe pas
d’opérateur + unaire, la notation +123 est interdite.
83. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CONSTANTES LITTÉRALES
88
Les constantes littérales entières peuvent aussi s’écrire en
octal et en hexadécimal :
une constante écrite en octal (base 8) commence par 0
(zéro) ;
une constante écrite en hexadécimal (base 16) commence
par 0x ou 0X.
Voici par exemple trois manières d’écrire le même nombre :
27 033 0x1B
On ne doit pas écrire de zéro non significatif à gauche
d’un nombre : 0123 ne représente pas la même valeur
que 123.
84. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CONSTANTES LITTÉRALES
89
Le type d’une constante entière est le plus petit type dans
lequel sa valeur peut être représentée. Ou, plus
exactement :
si elle est décimale : si possible int, sinon long,
sinon unsigned long ;
si elle est octale ou hexadécimale : si possible int,
sinon unsigned int, sinon unsigned long.
85. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CONSTANTES LITTÉRALES
90
Nombres flottants :
Une constante littérale est l’expression d’un nombre flottant
si elle présente, dans l’ordre :
une suite de chiffres décimaux (la partie entière) ;
un point, qui joue le rôle de virgule décimale ;
une suite de chiffres décimaux (la partie fractionnaire)
;
une des deux lettres E ou e ;
éventuellement un signe + ou - ;
une suite de chiffres décimaux.
86. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CONSTANTES LITTÉRALES
91
Les trois derniers éléments forment l’exposant. Exemple :
123.456E-78.
On peut omettre :
la partie entière ou la partie fractionnaire, mais pas les
deux ;
le point ou l’exposant, mais pas les deux.
Exemples : .5e7, 5.e6, 5000000., 5e6
Une constante flottante est supposée de type double, à
moins de comporter un suffixe explicite :
les suffixes F ou f indiquent qu’elle est du type float ;
les suffixes L ou l indiquent qu’elle est du type long
double.
Exemples : 1.0L, 5.0e4f
87. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CARACTÈRES ET LES CHAÎNES DE CARACTÈRES
92
Une constante de type caractère se note en écrivant le
caractère entre apostrophes. Une constante de type chaîne
de caractères se note en écrivant ses caractères entre
guillemets.
Exemples, trois caractères : ’A’ ’2’ ’"’
Quatre chaînes de caractères : "A" "BTS SNIR" "" "'"
On peut faire figurer n’importe quel caractère, même non
imprimable, dans une constante caractère ou chaîne de
caractères en utilisant les combinaisons suivantes, appelées
séquences d’échappement :
88. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CARACTÈRES ET LES CHAÎNES DE CARACTÈRES
93
n nouvelle ligne (LF)
t tabulation (HT)
b espace-arrière (BS)
r retour-chariot (CR)
f saut de page (FF)
a signal sonore (BELL)
’ ’
" "
d3d2d1 le caractère qui a pour code le nombre
octal d3d2d1. S’il commence par un ou
deux zéros et si cela ne crée pas une
ambiguïté, on peut aussi le noter d2d1
ou d1 .
89. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CARACTÈRES ET LES CHAÎNES DE CARACTÈRES
94
Par exemple, la chaîne ci-dessous définit la suite des 9
caractères :
A, escape (de code ASCII 27), B, ”, C, saut de page, D, et E :
33B"CfDE"
Nous verrons que cette chaîne comporte un caractère de
plus qui en marque la fin.
En standard le langage C ne prévoit pas le codage
Unicode des caractères.
Une constante de type chaîne de caractères représente une
suite finie de caractères, de longueur quelconque.
90. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CARACTÈRES ET LES CHAÎNES DE CARACTÈRES
95
Le codage interne d’une chaîne de caractères est le suivant :
les caractères constituant la chaîne sont rangés en
mémoire, de manière contigüe, dans l’ordre où ils
figurent dans la chaîne ;
un caractère nul est ajouté immédiatement après le
dernier caractère de la chaîne, pour en indiquer la fin ;
la constante chaîne représente alors, à l’endroit où elle
est écrite, l’adresse de la cellule où a été rangé le premier
caractère de la chaîne.
91. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES CARACTÈRES ET LES CHAÎNES DE CARACTÈRES
96
Par conséquent, une constante chaîne de caractères a pour
type celui d’un tableau de caractères (c’est-à-dire « char[] »)
et pour valeur l’adresse d’une cellule de la mémoire.
Par caractère nul on entend le caractère dont le code interne
est 0 ; on peut le noter indifféremment 0, ’000’ ou ’0’
(mais certainement pas ’0’) ; il est utilisé très fréquemment
en C.
92. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES TYPES FONDAMENTAUX
97
TYPE DE BASE
Nombres entiers
Anonymes
Petite taille
- signés char
- non signés unsigned char
Taille moyenne
- signés short
- non signés unsigned short
94. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES TYPES FONDAMENTAUX
99
TYPE DE BASE
Nombres flottants
Simples float
Grande précision double
Précision encore plus grande long double
TYPES DÉRIVÉS
Tableaux []
Fonctions ()
pointeurs *
Structures struct
Union union
95. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
Les types du langage C
100
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.
Cette organisation révèle un trait de l’esprit de C : le
pragmatisme l’emporte sur l’esthétisme, parfois même
sur la rigueur.
96. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES INITIALISATIONS
101
Le langage C permet l'initialisation des variables dans la
zone des déclarations :
char c; est équivalent à char c = 'A';
c = 'A';
int i; est équivalent à int i = 50;
i = 50;
Cette règle s'applique à tous les nombres, char, int, float ...
97. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
LES TYPES FONDAMENTAUX
102
Dans d’autres langages, les caractères, les booléens, les
constantes symboliques, etc., sont codés de manière
interne par des nombres, mais ce fait est officiellement
ignoré par le programmeur, qui reste obligé de
considérer ces données comme appartenant à des
ensembles disjoints.
En C on a fait le choix opposé, laissant au
programmeur le soin de réaliser lui-même, à l’aide des
seuls types numériques, l’implantation des types de
niveau supérieur.
99. Reproduction interdite
Reproduction interdite
Reproduction interdite
Reproduction interdite
EXERCICE
104
1) Entourez la fonction principale, la zone de déclaration,
la zone de définition et la ou les directive(s) de
compilation sur le programme ci-dessus.
2) Que permet de faire le programme ci-dessus ?
3) Que retourne la fonction principale ?
4) Quel est l’intérêt d’utiliser/de déclarer une constante ?
5) Que signifie la 1ère ligne du programme ?