Académique Documents
Professionnel Documents
Culture Documents
Langage C
© ESP, 2012 1
Plan (1/2)
1. Généralités
Historique du Langage C
Compilation en C : existence d’un préprocesseur
2. Les éléments constitutifs d’un programme source
Les identificateurs | Les mots clés | Les séparateurs | les commentaires …
3. Les types de base
4. Les Entrées-Sorties standard
5. Les opérateurs et les expressions
6. Les instructions de contrôles
L’instruction if
L’instruction switch
Les boucles en C (do…while | while | for )
L’instruction break
L’instruction continue
7. Les Tableaux et Les Pointeurs
© ESP, 2012 2
©Bull 2012 1
07/03/2017
Plan (2/2)
© ESP, 2012 3
1 Généralités
a- Historique du Langage C
b- Compilation en C : Existence d’un préprocesseur
© ESP, 2012 4
©Bull 2012 2
07/03/2017
a- Historique du Langage C
Mais ses qualités opérationnelles l’ont très vite fait adopter par une large
communauté de programmeurs.
© ESP, 2012 5
a- Historique du Langage C
© ESP, 2012 6
©Bull 2012 3
07/03/2017
© ESP, 2012 7
Le rôle de l’éditeur des liens est précisément de réunir les différents modules
objet et les fonctions de la bibliothèque standard afin de constituer un
programme exécutable.
© ESP, 2012 8
©Bull 2012 4
07/03/2017
Compilation en C
En C, la traduction d’un fichier source se déroule en deux étapes totalement
indépendantes :
– Un prétraitement,
– Une compilation à proprement dite.
© ESP, 2012 9
Compilation en C
L’étape du prétraitement consiste à une modification du texte d’un fichier
source, basée essentiellement sur l’interprétation d’instructions très
particulières dites directives à destination du préprocesseur ;
© ESP, 2012 10
©Bull 2012 5
07/03/2017
Compilation en C
La première est surtout utilisée pour incorporer le contenu de fichiers prédéfinis
dits fichiers en-tête (extension « .h »), indispensables à la bonne utilisation des
fonctions de la bibliothèque standard, la plus connue étant :
#include <stdio.h>
La seconde est très utilisée dans les fichiers en-tête prédéfinis. Elle est
également souvent exploitée par le programmeur dans les définitions de
symboles tels que :
© ESP, 2012 11
© ESP, 2012 12
©Bull 2012 6
07/03/2017
Les identificateurs
Comme dans la plupart des langages, un tel identificateur est formé d’une suite
de caractères choisis parmi les lettres, les chiffres ou le caractère « souligné »
(_);le premier d’entre eux étant nécessairement différent d’un chiffre.
D’autre part, les majuscules et les minuscules sont autorisés mais ne sont pas
équivalentes. Ainsi, en C, les identificateurs ligne et Ligne désignes deux objets
différents.
© ESP, 2012 13
Certains mots sont réservés par le langage C à un usage bien défini. On les
nomme des mots clés.
Un mot clé ne peut pas être employé comme un identificateur. Voici la liste des
mots clés classés par ordre alphabétique :
© ESP, 2012 14
©Bull 2012 7
07/03/2017
Les séparateurs
Dans notre langue écrite, les mots sont séparés par un espace, un signe de
ponctuation ou une fin de ligne. Il en va presque de même pour le langage C
dont les règles vont donc paraître naturellement.
© ESP, 2012 15
Les séparateurs
Les caractères séparateurs comprennent tous les opérateurs (+, -, *, =, +=, ==, …)
ainsi que les caractères dits de ponctuation :
( ) [ ] { } , ; : …
Par exemple, vous devez impérativement écrire (avec au moins un espace blanc
entre int et x) :
int x,y;
Et non
intx,y;
int n,compte,total,y;
Ou plus lisiblement
© ESP, 2012 16
©Bull 2012 8
07/03/2017
Les commentaires
© ESP, 2012 17
Les commentaires
/* commentaire s’étendant
sur plusieurs lignes
de programmes source */
/* =========================================
* commentaire quelque peu esthétique *
* et mis en boîte, pouvant servir, *
* par exemple, d’en-tête de programme *
========================================= */
© ESP, 2012 18
©Bull 2012 9
07/03/2017
© ESP, 2012 19
© ESP, 2012 20
©Bull 2012 10
07/03/2017
© ESP, 2012 21
– Le tableau qui suit récapitule les différentes manières de spécifier chacun de ces six types
(on parle de spécificateur de type), ainsi que la taille minimale et le domaine minimal que
leur impose la norme, quelle que soit l’implémentation concernée.
© ESP, 2012 22
©Bull 2012 11
07/03/2017
Les types entier (Tableau : Les six types entiers prévus par la norme)
Dénomination Spécificateurs de type Taille minimale Domaine minimal
usuelle possibles (en octets)
Entier court signé short 2 -32 767 à +32 767
short int
signed short
signed short int
Entier court non signé unsigned short 2 0 à 65 535
unsigned short int
Entier signé int 2 -32 767 à +32 767
signed int
Entier non signé unsigned int 2 0 à 65 535
unsigned
Entier long signé long 4 -2 147 483 647 à
long int +2 147 483 647
signed long
signed long int
Entier long non signé unsigned long 4 0 à 4 294 967 295
unsigned long int
© ESP, 2012 23
– N’utiliser les entiers non signés que lorsque cela est nécessaire
A taille égale, un type entier non signé permet de représenter des nombres deux fois
plus grands (environ) qu’un type signé. Dans ces conditions, certains programmeurs
sont tentés de recourir aux types non signés pour profiter de ce gain.
En fait, il faut être prudent dans la mesure où dès qu’on est amené à effectuer des
calculs, il est généralement difficile d’affirmer qu’on ne sera pas conduit, à un moment
ou un autre, à un résultat négatif non représentable dans un type non signé;
– Efficacité
En général, le type int correspond au type standard de la machine, de sorte que l’on
est quasiment assuré que c’est dans ce type que les opérations seront les plus rapides.
On pourra l’utiliser pour réaliser des programmes portables efficaces, pour peu qu’on
accepte les limitations correspondantes.
© ESP, 2012 24
©Bull 2012 12
07/03/2017
© ESP, 2012 25
© ESP, 2012 26
©Bull 2012 13
07/03/2017
– Cet attribut intervient essentiellement lorsqu’on utilise un type caractère pour représenter de petits
entiers. C’est la raison pour laquelle la norme définit, comme pour les types entiers, le domaine
(numérique) minimal des types caractères.
Caractéristiques Détails
Code associé à un caractère • indépendant de l’attribut de signe
• dépend de l’implémentation
Caractères existants • au moins le jeu minimal d’exécution
• ne pas oublier que certains caractères ne sont pas
imprimables
Influence de l’attribut de • en pratique, aucune, dans les simples manipulations de
signe variables (type conseillé : char ou unsigned char)
• importante si l’on utilise ce type pour représenter de
petits entiers (type conseillé signed char)
Manipulation d’octets • possible par le biais de ce type, compte tenu de
l’équivalence entre octet et caractère (type conseillé
unsigned char)
© ESP, 2012 28
©Bull 2012 14
07/03/2017
– Dans cette catégorie, on trouve également quelques caractères qui, bien que disposant d’un
graphisme, jouent un rôle particulier de délimiteurs, ce qui les empêche d’être notés de manière
classique entre deux apostrophes.
© ESP, 2012 29
© ESP, 2012 30
©Bull 2012 15
07/03/2017
– Exponentielle
La notation exponentielle utilise la lettre e (ou E) pour introduire un exposant entier (puissance de 10),
avec ou sans signe. La mantisse peut être n’importe quel nombre décimal ou entier (le point peut être
absent dès que l’on utilise un exposant). En voici quelques exemples corrects :
4.25E4 4.25e+4 54.27E-32 48.e13
© ESP, 2012 31
– On peut déclarer plusieurs variables dans une seule instruction ; par exemple :
unsigned int n, i ;
Est équivalente à :
unsigned int n ;
unsigned int i ;
© ESP, 2012 32
©Bull 2012 16
07/03/2017
© ESP, 2012 33
© ESP, 2012 34
©Bull 2012 17
07/03/2017
Priorité et associativité
– Lorsque plusieurs opérateurs apparaissent dans une même expression, il est nécessaire
de savoir dans quel ordre ils sont mis en jeu. En C comme dans les autres langages, on
utilise les règles de priorité qui permettent de définir exactement l’ordre dans lequel
doivent être évalués les opérateurs. Par exemple :
a + b * c /* * est prioritaire sur + : on fera donc
le produit de b par c avant d’ajouter a */
– Ces règles de priorité sont totalement naturelles dans le cas des opérateurs
arithmétiques ; elles rejoignent alors les règles de l’algèbre traditionnelle. Quant aux
priorités des autres opérateurs, elles ont été manifestement définies de manière à éviter
au maximum le recours aux parenthèses ; ces dernières pourront toutefois toujours être
utilisées pour éviter toute ambiguïté au lecteur du programme.
© ESP, 2012 35
Opérateurs arithmétiques
– On nomme opérateurs arithmétiques, les opérateurs permettant d’effectuer les
opérations arithmétiques classiques. A priori, ils portent sur des opérandes de type
numérique, mais l’addition et la soustraction pourront posséder des opérandes de type
pointeur.
– Tableau : les opérateurs numériques dans un contexte numérique
© ESP, 2012 36
©Bull 2012 18
07/03/2017
© ESP, 2012 37
Ce qui en C, a effectivement une signification, car les expressions a < b et c < d sont, finalement, des
quantités entières.
Tous ces opérateurs sont, comme la plupart des opérateurs, associatifs de gauche à droite. Cela signifie
que, si les règles de priorité et d’emploi de parenthèses ne suffisent pas à décider de l’ordre
d’application des deux opérateurs, on fait d’abord intervenir celui de gauche (comme on le fait avec les
opérateurs de l’algèbre traditionnelle).
© ESP, 2012 38
©Bull 2012 19
07/03/2017
– Dans ces conditions, plutôt que de restreindre leur valeur à 0 et 1, les concepteurs du
langage ont préféré donner une signification aux opérateurs logiques dans tous les cas,
en considérant simplement que seul 0 correspond à « faux », tandis que toute autre
valeur correspond à « vrai ».
© ESP, 2012 39
© ESP, 2012 40
©Bull 2012 20
07/03/2017
© ESP, 2012 41
© ESP, 2012 42
©Bull 2012 21
07/03/2017
d’évaluer d’abord l’expression j = 5 avant d’en affecter la valeur (5) à la variable i. bien
entendu la valeur finale de cette expression est celle de i après affectation, c’est-à-dire 5.
© ESP, 2012 43
© ESP, 2012 44
©Bull 2012 22
07/03/2017
© ESP, 2012 45
© ESP, 2012 46
©Bull 2012 23
07/03/2017
© ESP, 2012 47
– Il y a une manière simple d’afficher un message (ou plus généralement une chaîne de
caractères, voir plus loin) par la fonction puts :
puts ("coucou !") ;
© ESP, 2012 48
©Bull 2012 24
07/03/2017
© ESP, 2012 49
© ESP, 2012 50
©Bull 2012 25
07/03/2017
© ESP, 2012 51
Lecture au clavier
– Comme dans le cas de l’affichage, des fonctions telles que getchar (qui permet de lire
un caractère) ou autres permettent de lire des données texte.
– La fonction scanf permet de lire des données avec les formats suivants (liste non
exhaustive) :
%d pour le type int ;
%u pour le type unsigned int ;
%f pour le type float ;
%lf pour le type double ;
%c pour le type char ;
%s pour le type chaîne (étudié plus loin)
Attention !!!
1. Ne pas oublier le & devant chaque variable dans scanf, cela provoquera une erreur
mémoire (erreur de segmentation)/
2. Contrairement aux erreurs sur le format d’affichage, qui provoquent en général un
affichage incompréhensible, un mauvais format dans scanf peut provoquer une
erreur mémoire. Notamment, dans scanf, les formats %f et %lf sont incompatibles
et dépendent strictement du type de données (float ou double)
© ESP, 2012 52
©Bull 2012 26
07/03/2017
a- L’instruction if
b- L’instruction switch
c- Les boucles en C (do…while | while | for )
d- L’instruction break
e- L’instruction continue
© ESP, 2012 53
a- L’instruction if
L’instruction if permet de programmer une structure dite de choix (ou sélection ou
alternative), permettant de choisir entre deux instructions, suivant la valeur d’une
expression numérique jouant le rôle de condition.
La seconde partie, introduite par le mot clé else, est facultative, de sorte que l’instruction
if présente deux formes.
Cette instruction évalue l’expression mentionnée à la suite de if. Si elle est non nulle, on
exécute instruction_1 ; si elle est nulle, on exécute instruction_2 si cette dernière est
présente. Puis, dans tous les cas, on passe à l’instruction suivant cette instruction if.
© ESP, 2012 54
©Bull 2012 27
07/03/2017
a- L’instruction if
Exemples d’utilisation
1. if ( a < b ) max = a ;
else max = b ;
2. if ( a < b ) {
max = a ;
printf ( "Le maximum en a") ;
}
else {
max = b ;
printf ( "Le maximum en b") ;
}
3. max = b ;
if ( a > b ) max = a ;
printf ("Maximum : %d", max ) ;
© ESP, 2012 55
b- L’instruction switch
La principale vocation de l’instruction switch est de permettre de programmer ce que l’on
nomme usuellement une structure de choix multiple (ou sélection multiple), c’est-à-dire un
choix entre plusieurs possibilités, chaque possibilité s’exprimant par une ou plusieurs
instructions.
© ESP, 2012 56
©Bull 2012 28
07/03/2017
b- L’instruction switch
Lors de l’exécution, l’expression est évaluée et il y a branchement à l’étiquette case xxx
correspondante si elle existe ; dans le cas contraire, il y a branchement à l’étiquette default
si elle existe, à la suite de l’instruction switch sinon.
Exemple d’utilisation
#include <stdio.h>
main ()
{
int n ;
printf ("Donnez un entier : ") ;
scanf ("%d", &n );
switch ( n )
{
case 0 : printf ("nul\n") ;
case 1 :
case 2 : printf ("petit\n") ; break ;
case 3 : printf ("moyen\n") ; break ;
case 4 :
case 5 : printf ("grand\n") ; break ;
default : printf ("hors norme\n") ;
break ; /* facultatif mais bonne précaution */
}
}
© ESP, 2012 57
b- L’instruction switch
© ESP, 2012 58
©Bull 2012 29
07/03/2017
L’instruction do… while permet de réaliser des boucle de type faire… tantque,
mais la richesse de la notion d’expression en C peu amener à la dénaturer
quelque peu.
© ESP, 2012 59
© ESP, 2012 60
©Bull 2012 30
07/03/2017
Exemple d’utilisation
© ESP, 2012 61
L’instruction while permet de réaliser des boucles de type tant que, mais la
richesse de la notion d’expression en C peut la dénaturer quelque peu.
L’instruction while
while (expression)
instruction
instruction instruction quelconque : simple,
structurée ou bloc
expression expression quelconque de type nommée parfois « expression de
scalaire (numérique ou pointeur) contrôle de la boucle » ou
condition de poursuite.
Contrairement à ce qui se passe pour do… while, la syntaxe n’impose ici aucun
point virgule.
© ESP, 2012 62
©Bull 2012 31
07/03/2017
© ESP, 2012 63
Exemple d’utilisation
© ESP, 2012 64
©Bull 2012 32
07/03/2017
la boucle for permet de réaliser des boucles avec compteur mais sa nature
même, jointe à la richesse de la notion d’expression en C peu la dénaturer très
profondément.
Cependant, par sa nature même, for est en réalité une boucle de type tant que
(analogue à while), dans laquelle on peut préciser, par le biais d’expressions
appropriées :
– les actions à réaliser avant l’entrée dans la boucle ;
– les actions à réaliser à la fin de chaque tour ;
– la condition de poursuite
© ESP, 2012 65
L’instruction for
for ( [ expression_1 ] ; [ expression_2 ] ; [ expression_3 ] )
instruction
instruction instruction quelconque : simple,
structurée ou bloc
expression_1 et expressions de type quelconque pas nécessairement scalaire ici.
expression_3
expression_2 expression de type scalaire si cette expression est omise,
(numérique ou pointeur) tout se passe comme si elle
avait pour valeur 1 (vrai)
© ESP, 2012 66
©Bull 2012 33
07/03/2017
© ESP, 2012 67
expression_1 ;
while ( expression_2 )
{
instruction
expression_3 ;
}
© ESP, 2012 68
©Bull 2012 34
07/03/2017
d- L’instruction break
Couramment utilisée avec l’instruction switch, l’instruction break permet
également de provoquer la fin prématurée d’une boucle.
L’instruction break
break ;
Cette instruction peut être utilisée dans deux contextes différents, avec des rôles
semblables.
– Dans une instruction switch, elle met fin à l’exécution de l’instruction ; elle est quasiment
indispensable pour faire du simple aiguillage induit par switch un véritable choix
multiple.
– Dans une instruction de boucle (for, while ou do… while), elle provoque la sortie
(prématurée) de la boucle.
L’usage de break est naturellement bien plus répandu dans la première situation
que dans la seconde
En cas d’imbrication d’instructions de boucles ou d’instructions switch, break ne
met fin qu’à l’instruction la plus interne le contenant. On notera que l’instruction
structurée if n’est pas concernée par break.
© ESP, 2012 69
d- L’instruction continue
Alors que break permet de mettre fin prématurément à une boucle, continue
permet de forcer le passage au tour suivant.
L’instruction continue
continue ;
Cette instruction ne s’utilise que dans une boucle et son exécution force
simplement le passage au tour suivant, en ignorant les instructions situées entre
continue et la fin de la boucle.
Elle ne concerne que la boucle de niveau le plus interne la contenant.
© ESP, 2012 70
©Bull 2012 35
07/03/2017
© ESP, 2012 71
A- Les Tableaux
0 1 2 3 4 5
tab
Tab[0] Tab[1] Tab[2] Tab[3] Tab[4] Tab[5]
La déclaration
int mois [12] = { 31,28,30,31,30,31,30,31,30,31,30,31 }
définit un tableau de type int de taille 12. Les douze composantes sont
initialisées par les valeurs 31, 28, ... , 30, 31. On peut accéder à la première
composante du tableau par mois[0], à la deuxième par mois[1],..., à la dernière
par mois[11].
© ESP, 2012 72
©Bull 2012 36
07/03/2017
A- Les Tableaux
© ESP, 2012 73
A- Les Tableaux
La commande de lecture scanf doit être informée du type exact des données à
lire. (Ici: %d ou %i pour lire des valeurs du type int)
© ESP, 2012 74
©Bull 2012 37
07/03/2017
A- Les Tableaux
Un tableau tab à 2 dimensions sur 4 Lignes et 6 Colonnes. Les éléments du tableau sont
accessibles en faisant tab [ i ][ j ] où i représente l’indice de la ligne et j l’indice de la
colonne de la cellule concernée.
Déclaration : int tab [ 4 ][ 6 ] ;
Accès en lecture
printf ("%d",tab[0][2]); {L’information contenue en ligne 1 colonne 3 est affichée à l’écran}
Accès en écriture
tab][3] = 36;
scanf ( "%d", &tab[1][3] ) ; { La valeur fournie est enregistrée en ligne 2 colonne 4}
© ESP, 2012 75
A- Les Pointeurs
Lorsque l’on déclare une variable, par exemple un entier i, l’ordinateur réserve
un espace mémoire pour y stocker les valeurs de i.
L’emplacement de cet espace dans la mémoire est nommé adresse
Un pointeur est tout simplement une variable spéciale qui permet de stocker
l’adresse d’une autre variable.
Par exemple si nous déclarons une variable entière i (initialisée à 10) et que l’on
déclare un pointeur p dans lequel on range l’adresse de i (on dit que p pointe sur
i ), on a par exemple le schéma suivant :
© ESP, 2012 76
©Bull 2012 38
07/03/2017
A- Les Pointeurs
Si un pointeur P contient l'adresse d'une variable A, on dit que 'P pointe sur A'.
Les pointeurs et les noms de variables ont le même rôle: Ils donnent accès à un
emplacement dans la mémoire interne de l'ordinateur. Il faut quand même bien
faire la différence:
– Un pointeur est une variable qui peut 'pointer' sur différentes adresses.
– Le nom d'une variable reste toujours lié à la même adresse.
© ESP, 2012 77
A- Les Pointeurs
int *PtrNum ;
peut être interprétée comme suit:
– "*PtrNum est du type int" ou
– "PtrNum est un pointeur sur int" ou
– "PtrNum peut contenir l'adresse d'une variable du type int
© ESP, 2012 78
©Bull 2012 39
07/03/2017
A- Les Pointeurs
Remarque
Lors de la déclaration d'un pointeur en C, ce pointeur est lié explicitement à un
type de données. Ainsi, la variable PtrNum déclarée comme pointeur sur int ne
peut pas recevoir l'adresse d'une variable d'un autre type que int.
Exemple :
main () {
int n, m ;
int *p ; /* déclaration d’une variable de type
pointeur sur un entier */
n = 20 ; m = 10 ;
p = &n ; /*p pointe sur n ou p reçoit l’adresse de n */
*p = m ;
return 0 ;
}
© ESP, 2012 79
A- Les Pointeurs
Pointeurs et Tableaux
Le nom d'un tableau est un pointeur constant sur le premier élément du tableau.
En d'autre termes:
&tableau[0] et tableau sont une seule et même adresse.
En déclarant un tableau A de type int et un pointeur P sur int,
int A[10];
int *P;
L'instruction :
P = A ;
est équivalente à :
P = &A[0] ;
Si P pointe sur une composante quelconque d'un tableau, alors P+1 pointe sur la
composante suivante. Plus généralement,
P + i pointe sur la i-ième composante derrière P et
P - i pointe sur la i-ième composante devant P.
© ESP, 2012 80
©Bull 2012 40
07/03/2017
A- Les Pointeurs
Pointeurs et Tableaux
Le nom d'un tableau est un pointeur constant sur le premier élément du tableau.
En d'autre termes:
&tableau[0] et tableau sont une seule et même adresse.
En déclarant un tableau A de type int et un pointeur P sur int,
int A[10];
int *P;
L'instruction :
P = A ;
est équivalente à :
P = &A[0] ;
Si P pointe sur une composante quelconque d'un tableau, alors P+1 pointe sur la
composante suivante. Plus généralement,
P + i pointe sur la i-ième composante derrière P et
P - i pointe sur la i-ième composante devant P.
© ESP, 2012 81
© ESP, 2012 82
©Bull 2012 41
07/03/2017
Introduction
Il n'existe pas de type spécial chaîne ou string en C. Une chaîne de caractères est
traitée comme un tableau à une dimension de caractères. Il existe quand même
des notations particulières et une bonne quantité de fonctions spéciales pour le
traitement de tableaux de caractères.
Exemples
char NOM [20];
char PRENOM [20];
char PHRASE [300];
© ESP, 2012 83
Espace à réserver
Lors de la déclaration, nous devons indiquer l'espace à réserver en mémoire
pour le stockage de la chaîne. La représentation interne d'une chaîne de
caractères est terminée par le symbole '\0' . Ainsi, pour un texte de n caractères,
nous devons prévoir n+1 octets.
© ESP, 2012 84
©Bull 2012 42
07/03/2017
Observation
Pour la mémorisation de la chaîne de caractères "BONJOUR !", C a
besoin de dix(!!) octets.
'a' est un caractère constant, qui a une valeur numérique :
Exemple : 'a' a la valeur 97 dans le code ASCII.
"a" est un tableau de caractères qui contient deux caractères :
– la lettre 'a' et le caractère NUL : '\0'
'x' est codé dans un octet
"x" est codé dans deux octets
© ESP, 2012 85
La bibliothèque « string.h »
Certaines fonctions seront étudiées en TP.
© ESP, 2012 86
©Bull 2012 43
07/03/2017
9 Les Fonctions
© ESP, 2012 87
Les fonctions
Cela se justifie par le fait que : Un programme écrit d’un seul tenant devient
difficile à comprendre dès qu’il atteint plus de deux pages de texte.
Elle permet le partage d’outils communs qu’il suffit d’avoir écrits et mis au point
une seule fois.
© ESP, 2012 88
©Bull 2012 44
07/03/2017
Les fonctions
Par exemple
© ESP, 2012 89
Les fonctions
Définition
Dans la définition d'une fonction, nous indiquons :
– le nom de la fonction
– le type, le nombre et les noms des paramètres de la fonction
– le type du résultat fourni par la fonction
– les données locales à la fonction
– les instructions à exécuter
© ESP, 2012 90
©Bull 2012 45
07/03/2017
10 Le type STRUCTURE
© ESP, 2012 91
Une structure est un type qui permet de stocker plusieurs données, de même
type ou de types différents, dans une même variable de type structure.
Une structure est constitué de plusieurs champs, chaque champ correspondant à
une donnée.
Exemple : Voici la déclaration d’une structure point qui contient trois champs x,
y, z de type float.
struct point
{ /* déclaration de la structure */
float x, y ; /* trois champs x, y , z */
float z ; /* les champs se déclarent comme des variables */
/* mais on ne peut pas initialiser les valeurs */
}
La déclaration d’une variable de type struct point se fait ensuite comme pour
une autre variable
struct point P ;
© ESP, 2012 92
©Bull 2012 46
07/03/2017
Ces données P.x, P.y et P.z de type float sont traitées comme n’importe quelle
autre donnée de type float dans le programme.
Notons que l’on pourrait rajouter d’autres données de types que l’on souhaite à
la suite des données x, y et z dans la structure.
© ESP, 2012 93
La déclaration d’une variable de type struct point se fait ensuite comme pour
une autre variable
Point3D P ;
© ESP, 2012 94
©Bull 2012 47
07/03/2017
© ESP, 2012 95
© ESP, 2012 96
©Bull 2012 48
07/03/2017
Voici classée par ordre alphabétique, la liste de tous les fichiers en-tête prévus
par la norme.
© ESP, 2012 97
© ESP, 2012 98
©Bull 2012 49
07/03/2017
© ESP, 2012 99
La compilation séparée
– Le langage C offre la possibilité d’éditer le code source en plusieurs fichiers (fichiers
sources C). Cela pour une meilleure organisation du travail et en vue de garantir
également une bonne maintenabilité du code.
– De ce fait, chaque fichier du projet est compilée séparément.
©Bull 2012 50
07/03/2017
– La directive #define offre deux possibilités à savoir la définition de symboles d’une part,
la définition de macros d’autres part.
– Dans le cas de la définition d’une macros, intervient, un peu comme dans une fonction
la notion de paramètres.
– Certes, le préprocesseur réalise ici encore une substitution mais celle-ci n’est pas
systématique puisqu’elle dépend des valeurs effectives des différents paramètres.
©Bull 2012 51
07/03/2017
– int n = NBMAX :
– float tab [NBMAX]=[2*NBMAX];
– int n = 5:
– float tab [5][10];
Définitions de macros
– Une directive suivante:
– #define carre(a) a*a
– ressemble aux différentes, avec une différence que le symbole à substituer se présente
sous la forme d’un identificateur suivi d’un paramètre entre parenthèses ; elle demande
au préprocesseur de remplacer dans la suite du fichier source tous les texte de la forme :
– carre(a) dans lequel a représente en fait un texte quelconque par :
– a*a
– Par exemple :
– carre(z) deviendra z*z
– carre(valeur) deviendra valeur*valeur
©Bull 2012 52
07/03/2017
Définitions de macros
– La directive #define pour la définition de macros
#define^identificateur(liste_de_paramètres) liste_de_remplacement
identificateur Formé suivant les règles
habituelles concernant les
identificateurs
^ Représente un ou plusieurs On peut y trouver des espaces
espaces blancs autres que fin de blancs
ligne et/ou commentaire
liste_de_paramètres Liste de zéro, un ou plusieurs
identificateurs, obligatoirement
différents les uns des autres
séparés par des virgules
Liste_de_remplacement Texte quelconque qui sera
substitué, dans la suite du
fichier source, à un appel de
macro de la forme
identificateur(…)
16 La compilation conditionnelle
©Bull 2012 53
07/03/2017
16 La compilation conditionnelle
la directive #ifdef
#ifdef^identificateur[^] #ifdef^identificateur[^]
Lignes_1 Lignes_1
#else[^] #endif[^]
Lignes_2
#endif[^]
^ Représente un ou plusieurs espaces
blancs(autres que la fin de ligne)
et/ou un ou plusieurs commentaires
Lignes_1 et Lignes_2 0, 1 ou plusieurs lignes de contenu
quelconque
16 La compilation conditionnelle
la directive #undef
– Elle permet de supprimer la définition d’un symbole
la directive #ifndef
– Elle joue le même rôle que #ifdef, en inversant simplement les instructions incorporées
ou ignorées.
#ifndef^identifateur[^] #ifndef^identifateur[^]
Lignes_1 Lignes_1
#else[^] #endif[^]
Lignes_2
#endif[^]
^ Représente un ou plusieurs espaces
blancs(autres que la fin de ligne)
et/ou un ou plusieurs commentaires
Lignes_1 et Lignes_2 0, 1 ou plusieurs lignes de contenu
quelconque
©Bull 2012 54
07/03/2017
16 La compilation conditionnelle
Exemple d’utilisation des macros et d’une compilation conditionnelle
fichier main.c initial fichier main.c destiné à la compilation à
proprement dite
#define NMAX 6 int main ()
#define TOTO {
#define afficher printf int x, y, z, i ;
#define calcul(a,b,c) a*b+c x = 6– 1;
#define debut { y = 2*6;
#define fin } z = 6;
for (i=0;i<6;i++)
int main () Prétraitement printf("Calcul N%d = %d", x*y+z);
debut par le return 0;
int x, y, z, i ; préprocesseur }
x = NMAX – 1;
y = 2*NMAX;
z = NMAX;
for (i=0;i<NMAX;i++)
#ifdef TOTO
afficher("Calcul N%d = %d", calcul(x,y,z));
#else
afficher("Calcul N%d = %d", calcul(y,z,x));
#endif
return 0;
fin
– NB : Le fichier main.c généré par le préprocesseur n’est pas visualisable. Il passe directement à la
compilation à proprement dite.
© ESP, 2012 109
©Bull 2012 55
07/03/2017
En ligne de commande
– L’exécution d’un programme en ligne de commande nécessite le lancement de l’invite de
commandes windows disponible dans le Menu Démarrer …
– Section détaillée en TP (Consultez le fichier de LAB)
©Bull 2012 56