14/03/16
Programmation en langage C EL Moukhtar ZEMMOURI ENSAM – Meknès Version 1.0 – 2015 / 2016
What is C
"C is a general-purpose programming language which features economy of expression, modern control flow and data structures, and a rich set of operators. C is not a "very high level" language, nor a "big" one, and is not specialized to any particular area of application." Kernighan & Richie, 1978
E. Zemmouri,
ENSAM - Meknès
1
14/03/16
Sommaire • Généralités • Éléments de base de C o
Identificateurs
o
Mots clés
o
Commentaires
o
Les types
• Lecture / écriture • Structures de contrôle
E. Zemmouri,
ENSAM - Meknès
Un peu d'histoire … • Le C a été conçu en 1972 par Dennis Richie et Ken Thompson o
Deux chercheurs au Bell Labs
o
Objectif : développer un système d'exploitation UNIX
• En 1978, Brian Kernighan et Dennis Richie publient la définition classique du C o
Première édition du livre "The C programming language"
• En 1983, l'ANSI décida de normaliser le langage o
1989 la définition de la norme ANSI C (ou C89)
o
Deuxième édition de "The C programming language"
• L'ISO à repris la même norme en 1990 (ou C90) E. Zemmouri,
ENSAM - Meknès
2
14/03/16
La compilation • C est un langage compilé o
Par opposition au langages interprétés (Python, Matlab, …)
• è Un programme C écrit dans un fichier source est traduit en totalité en langage machine avant exécution. • Quatre phases : o
Traitement par le préprocesseur
o
Compilation
o
Assemblage
o
Édition de liens
• Exemples de compilateurs o
GCC du projet GNU
o
MinGW (Minimalist GNU for Windows)
E. Zemmouri,
ENSAM - Meknès
La compilation Ficher source
Messages d'erreurs Préprocesseur
Compilateur Code assembleur
Assemblage Ficher objet Librairies de fonctions
Editeur de liens
Messages d'erreurs
Fichier exécutable
E. Zemmouri,
ENSAM - Meknès
3
14/03/16
Éléments de base du langage
Premier programme • À éditer à l'aide d'un éditeur de texte o
Fichier source hello.c
• Compiler o
gcc hello.c
• Puis exécuter J
E. Zemmouri,
ENSAM - Meknès
4
14/03/16
Composants élémentaires du C • Six catégories de composants élémentaires : o
Les identificateurs
o
Les mots clés
o
Les opérateurs
o
Les constantes
o
Les chaines de caractères
o
Les signes de ponctuation
• Les commentaires sont enlevés par le préprocesseur
E. Zemmouri,
ENSAM - Meknès
Identificateurs • Servent pour identifier (donner des noms) aux entités du programme : o
variables, fonctions, types, …
• Suite de caractères parmi : o
les lettres (minuscules ou majuscules, non accentuées),
o
les chiffres,
o
le “blanc souligné _
• Commence par une lettre (ou _ ) • Ne doit pas être un des mots clés du langage. E. Zemmouri,
ENSAM - Meknès
5
14/03/16
Mots clés • 32 mots clefs de la l'ANSI C •
int
float
double
char
void
short
long
signed
unsigned struct enum union •
const volatile static auto register extern typedef
•
if
else
for
while
do
switch
case
default
break
continue goto •
return sizeof
E. Zemmouri,
ENSAM - Meknès
Les commentaires • Les commentaires permettent de documenter un programme. o
Améliorer la lisibilité du programme
• Un commentaire en C commence par /* et se termine par */ o
•
Exemple /* ceci est un commentaire */
// permet un commentaire sur une seule ligne
• N.B. Les commentaires ne peuvent pas être imbriqués
E. Zemmouri,
ENSAM - Meknès
6
14/03/16
Les types de base • Le C est un langage typé : o
è Toute variable, constante ou fonction est d’un type précis
• Le type définit la représentation mémoire d'un objet • Les types de base en C concernent o
les entiers
o
les flottants (nombres réels)
o
les caractères
E. Zemmouri,
ENSAM - Meknès
Les types entiers •
Le type entier représente l'ensemble des entiers relatifs (positifs et négatifs)
•
Plusieurs sous types : Type
Taille
Valeurs
Intervalle
char
8 bits
caractères
[–128 , 127]
short
16 bits
Entiers courts
[–32768 , 32767]
int
32 bits
Entiers
[–231 , 231 – 1]
long
64 bits
Entiers long
[–263 , 263 – 1]
unsigned char
8 bits
caractères
[0 , 255]
unsigned short
16 bits
Entiers courts non signés
[0 , 65536]
unsigned int
32 bits
Entiers non signés
[0 , 232 – 1]
unsigned long
64 bits
Entiers long non signés
[0 , 264 – 1]
N.B. La taille mémoire des types en C dépend de la machine ! E. Zemmouri,
ENSAM - Meknès
7
14/03/16
Les types entiers • Exercice : o
E. Zemmouri,
Ecrire un programme qui donne d'intervalle des nombres représentés par les types : char, short, int, et long, signed et unsigned.
ENSAM - Meknès
Les types flottants • 3 types correspondant à différentes précisions : Type
Taille
Valeurs
float
32 bits
Flottants simple précision
double
64 bits
Flottants double précision
long double
128 bits
Flottants précision étendue
• Erreur de troncature : o
Quelle que soit la machine utilisée, on est assuré que cette erreur (relative) ne dépassera pas 10-6 pour le type float et 10-10 pour le type long double. N.B. La taille mémoire des types en C dépend de la machine !
E. Zemmouri,
ENSAM - Meknès
8
14/03/16
Les types flottants • Exercice : o
E. Zemmouri,
Ecrire un programme qui donne le plus grand nombre et le plus petit nombre proche de zéro (epsilon) qu'on peut représenter avec le type float.
ENSAM - Meknès
Le type des caractères • Le type char représente le jeu de caractères de la machine • Un char en C est codé sur un octet (8 bits) • Un caractère est encodé en utilisant un entier avant sa représentation binaire en mémoire. • Plusieurs encodages sont utilisés: o
ASCII (American Standard Code for Information Interchange) • Vesrion originale (1960) représente 128 caractères avec les nombres de 0 à 127 sur 7 bits. • Version étendue (1980) représente 256 sur 8bits
o
E. Zemmouri,
Unicode (1990) représente 65 536 sur 16 bits ENSAM - Meknès
9
14/03/16 Standard Code for Information Interchange.) In the 1960s, the original ASCII set Delannoy Livre.book Page 22 Mercredi, 6. mai 2009 4:26 16each keyboard character and several control characters using the inteencoded gers from 0 through 127. An example of a control character is Control+D, which is the command to terminate a shell window. As new function keys and some international characters were added to keyboards, the ASCII set doubled in size to 256 distinct values in the mid-1980s. Then, when characters and symbols were added from languages other than English, the Unicode set was created to support 65,536 values in the early 1990s. Programmer en langage C
Le type des caractères
•
Table 2.5 shows ASCII the mapping of characteroriginale) values to the first 128 ASCII L'ensemble des caractère (Version codes. The digits in the left column represent the leftmost digits of an
o
ASCII andligne the digits in the top row rightmostpar digits. Thus, Comment lire : code, R sur 8 colonne 2 are esttheencodé 82.
the ASCIIde code of the character at row 8, celle columnde 2 iscaractère 82. Par ailleurs, la notion caractère en C'R' dépasse imprimable, c’est-à-dire auquel est obligatoirement associé un graphisme (et qu’on peut donc imprimer ou afficher sur 0 qu’il 1 existe 2 certains 3 4 5 7 8 de 9ligne, de tabulation, un écran). C’est ainsi caractères de6changement 0 alarme NUL SOH STX ETX EOT ENQ ACKd’ailleurs BEL BS déjà HT utilisé le premier d’activation d’une sonore (cloche),... Nous avons CR SO SI DLE DCI DC2 DC3 (sous la forme \n1). LF VT FF 2
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC FS
3
RS
US
SP
!
“
#
$
%
&
4
(
)
*
+
,
-
.
/
0
1
5
2
3
4
5
6
7
8
9
:
;
6
<
=
>
?
@
A
B
C
D
E
7
F
G
H
I
J
K
L
M
N
O
U
V
W
X
Y
9
Z
[
\
]
^
_
‘
a
b
c
GS
D e tels caractères sont souvent nommés « caractères de contrôle ». Dans` le code ASCII (restreint ou non), ils ont des codes compris entre 0 et 31.
P Q R S T 4.2 Notation des 8constantes caractères
Les constantes de10type « caractère », lorsqu’elles correspondent à des caractères imprimables, d e f g h i j k l m se notent de façon classique, enp écrivant entre apostrophes (ou quotes) le caractère voulu, 11 n o q r s t u v w comme dans ces 12 exemples : x y z { | } ~ DEL E. Zemmouri,
[TABLE 2.5] The original ASCII character set'+' ENSAM - Meknès 'a' 'Y'
'$'
Certains caractères non imprimables possèdent une représentation conventionnelle utilisant le caractère « \ », nommé « antislash » (en anglais, il se nomme « back-slash », en français, on le nomme aussi « barre inverse » ou « contre-slash »). Dans cette catégorie, on trouve également quelques caractères (\, ’, " et ?) qui, bien que disposant d’un graphisme, jouent un rôle particulier de délimiteur qui les empêche d’être notés de manière classique entre deux apostrophes. Le type des caractères [ 56 ] CHAPTER 2 Software Development, Data Types, and Expressions Voici la liste de ces caractères. Copyright 2011 Cengage Learning. All Rights Reserved. May not be copied, scanned, or duplicated, in whole or in part. Due to electronic rights, some third party content may be suppressed from the eBook and/or eChapter(s). Editorial review has deemed that any suppressed content does not materially affect the overall learning experience. Cengage Learning reserves the right to remove additional content at any time if subsequent rights restrictions require it.
• Les caractères nonCaractères imprimables : disposant d’une notation spéciale NOTATION EN C \a \b \f \n \r \t \v \\ \' \" \?
E. Zemmouri,
22
CODE ASCII (hexadécimal) 07 08 0C 0A 0D 09 0B 5C 2C 22 3F
ABRÉVIATION SIGNIFICATION USUELLE BEL cloche ou bip (alert ou audible bell) BS Retour arrière (Backspace) FF Saut de page (Form Feed) LF Saut de ligne (Line Feed) CR Retour chariot (Carriage Return) HT Tabulation horizontale (Horizontal Tab) VT Tabulation verticale (Vertical Tab) \ ' " ?
ENSAM - Meknès
© Éditions Eyrolles
10
14/03/16
Le type booléen • Le type booléen n'est pas prédéfini en C. • On utilise le type int o
0 est faux
o
Toute valeur différente de 0 est vraie, en particulier 1.
E. Zemmouri,
ENSAM - Meknès
Les constantes en C •
Une constante est une valeur qui apparaît littéralement dans le code source d’un programme o
•
Exemples : 123, 'A', "Hello", 1.5, …
La manière avec laquelle on écrit une constante détermine implicitement son type
E. Zemmouri,
ENSAM - Meknès
11
14/03/16
Les constantes en C Catégorie
Entiers
Représentation Décimale Hexa Octale Long unsigned
Habituelle : 123 Commence par 0x : 0x1F4 è 500 Commence Par 0 : 0377 è 255 Se termine par l ou L : 123L Se termine par u ou U : 123U
A virgule Exponentielle
Habituelle : 12.5 1. .5 Avec e ou E : 12.4E-5 1e-6 1.5E10 Le type par défaut est double Pour le type float on ajoute F/f : 1.5F Pour le type long double on ajoute L/l : 1.5L
Caractère Chaine
Entre apostrophes : 'A' '\n' '1' Entre guillemets : "Hello world"
Réels
Caractères
E. Zemmouri,
Notation et exemples
ENSAM - Meknès
Définition de constantes symboliques • Définition à l'aide de la directive : o
#define
NOM
Valeur
• Demande au préprocesseur de remplacer NOM par Valeur dans la suite du fichier source. • Exemples : o
#define
PI
3.14
o
#define
N
100
o
#define
MIN
0
o
#define
MAX
100
o
#define
AVG
E. Zemmouri,
(MIN + MAX)/2
ENSAM - Meknès
12
14/03/16
Déclaration • Déclaration de variables : o
type identificateur;
o
//déclaration et initialisation
o
type identificateur = valeur;
• Déclaration de constantes: • On utilise le mot clé const o
const type identificateur = valeur;
• Exemple: o
E. Zemmouri,
const double pi = 3.14
ENSAM - Meknès
Les opérateurs en C
Catégorie
Opérateurs
Affectation + *
Comparaison
E. Zemmouri,
variable = expression; • Ne pas confondre avec ==
=
arithmétiques
<
<= ==
/
Syntaxe et remarques
%
> >= !=
• Division entière et réelle : si les deux opérandes sont entières, / produira une division entière (quotient de la division). Exemple : float x; x = 3/2; è x = 1.0 x = 3.0/2; è x = 1.5 • Pas d'opérateur de puissance en C. on utilise la fonction pow(x,y) de math.h expression1 op expression2 • Le résultat est de type int (pas de type booléen en C): 1 si vrai, et 0 sinon.
ENSAM - Meknès
13
14/03/16
Les opérateurs en C
Catégorie Logiques booléens
E. Zemmouri,
Opérateurs
Syntaxe et remarques
&& (le ET) || (le OU) ! (le NON)
• Le résultat est de type int: 1 si vrai, et 0 sinon. • L’évaluation d'une expression se fait de gauche à droite et s’arrête dès que le résultat final est déterminé. Exemple: int i,j, n; if (i!=j && i
ENSAM - Meknès
Les opérateurs en C
Catégorie Logiques bit à bit (bitwise operators)
E. Zemmouri,
Opérateurs & | ^ ~ << >>
Syntaxe et remarques Exemple et signification: unsigned char a = 103, b = 41; expr -----a b a & b a | b a ^ b ~a a >>2 a <<3
//sur 8 bits
binaire déc signification --------- ----- -----------------0110 0111 103 valeur de a 0010 1001 41 valeur de b 0010 0001 33 et bit à bit 0110 1111 111 ou bit à bit 0100 1110 78 ou exclusif 1001 1000 152 complément à 1 0001 1001 25 décalage à droite 0011 1000 56 décalage à gauche
ENSAM - Meknès
14
14/03/16
Les opérateurs en C
Catégorie
Opérateurs
Incrémentation Décrémentation
++ --
Affectation composée
E. Zemmouri,
+= *=
• ++ ajoute 1 à son opérande • -- soustrait 1 à son opérande • S'utilisent en suffixe (var++ et var--) et en préfixe (++var et --var). Exemple: int x, n; n = 5; • x = n++; incrémentation après affectation è x = 5 puis n = 6 • x = ++n; incrémentation avant affectation è n = 6 puis x = 6
-= /=
Syntaxe et remarques
%=
variable op= expression; Équivalent à: variable = variable op expression;
ENSAM - Meknès
Les opérateurs en C
Catégorie Opérateur conditionnel ternaire
Opérateurs ? :
Syntaxe et remarques Condition ? Expression1 : Expression2 • Le résultat est Expression1 si la condition est vraie et Expression2 sinon. • C'est l'équivalent d'un if – else. Exemple : int a, b, max, min; min = (a<=b) ? a : b; max = (a>=b) ? a : b; float x; x = (x>=0) ? x : (-x);
E. Zemmouri,
ENSAM - Meknès
15
14/03/16
Les opérateurs en C
Catégorie Opérateur de conversion explicite de type (cast)
Opérateur d'adresse Opérateur de taille
E. Zemmouri,
Opérateurs (type)
&
sizeof
Syntaxe et remarques (type)expression • Permet de modifier explicitement le type d'un objet. Exemple : int a = 3, b = 2; float x; x = a/b; è x = 1.0 x = (float)a/b; è x = 1.5; &variable • Appliqué à une variable retourne l’adresse mémoire de cette variable. sizeof(expression) • expression est un type, une variable, … • Le résultat est le nombre d’octets nécessaires pour stocker l'expression.
ENSAM - Meknès
Les opérateurs en C •
Ordre de priorité des opérateurs o
E. Zemmouri,
En cas de doute, on utilise les parenthèses
ENSAM - Meknès
16
14/03/16
Les entrées sorties standards
Fonctions d'E/S • Il s’agit des fonctions de la librairie standard stdio.h utilisées avec les unités classiques d’entrées / sorties: o
le clavier et l’écran.
• Pour les utiliser : o
E. Zemmouri,
#include <stdio.h>
ENSAM - Meknès
17
14/03/16
Fonction d'affichage • La fonction printf o
C'est une fonction d’impression formatée
o
è les données sont converties selon le format choisi avant impression.
• Syntaxe: o
printf ("chaine de caractères", expression1, …, expressionN);
o
La chaîne de caractères contient le texte à afficher et les spécifications de format correspondant à chaque expression.
E. Zemmouri,
ENSAM - Meknès
Fonction d'affichage •
30 Spécificateurs de format pour printfChapitre 1. format %d %ld %u %lu %o %lo %x %lx %f %lf %e %le %g %lg %c %s
E. Zemmouri,
conversion en int long int unsigned int unsigned long int unsigned int unsigned long int unsigned int unsigned long int double long double double long double double long double unsigned char char*
ENSAM - Meknès
Les bases de la programmation en C
´ecriture d´ecimale sign´ee d´ecimale sign´ee d´ecimale non sign´ee d´ecimale non sign´ee octale non sign´ee octale non sign´ee hexad´ecimale non sign´ee hexad´ecimale non sign´ee d´ecimale virgule fixe d´ecimale virgule fixe d´ecimale notation exponentielle d´ecimale notation exponentielle d´ecimale, repr´esentation la plus courte parmi %f et %e d´ecimale, repr´esentation la plus courte parmi %lf et %le caract`ere chaˆıne de caract`eres
Tab. 1.5 – Formats d’impression pour la fonction printf
Exemple : #include <stdio.h> main() { int i = 23674; int j = -23674;
18
14/03/16
Fonction de lecture • La fonction scanf o
permet de saisir des données au clavier les convertir selon les formats spécifiés puis les stocker en mémoire.
• Syntaxe o
E. Zemmouri,
scanf ("formats", adresse1, adresse2, … , adresseN);
ENSAM - Meknès
Fonction de lecture Chapitre 1. Les bases de la programmation en C
32
•
Format pour scanf
E. Zemmouri,
ENSAM - Meknès
format %d %hd %ld %u %hu %lu %o %ho %lo %x %hx %lx %f %lf %Lf %e %le %Le %g %lg %Lg %c %s
type d’objet point´e int short int long int unsigned int unsigned short int unsigned long int int short int long int int short int long int float double long double float double long double float double long double char char*
repr´esentation de la donn´ee saisie d´ecimale sign´ee d´ecimale sign´ee d´ecimale sign´ee d´ecimale non sign´ee d´ecimale non sign´ee d´ecimale non sign´ee octale octale octale hexad´ecimale hexad´ecimale hexad´ecimale flottante virgule fixe flottante virgule fixe flottante virgule fixe flottante notation exponentielle flottante notation exponentielle flottante notation exponentielle flottante virgule fixe ou notation exponentielle flottante virgule fixe ou notation exponentielle flottante virgule fixe ou notation exponentielle caract`ere chaˆıne de caract`eres
Tab. 1.6 – Formats de saisie pour la fonction scanf
1.11.3
Impression et lecture de caract` eres
Les fonctions getchar et putchar permettent respectivement de lire et d’imprimer des caract`eres. Il s’agit de fonctions d’entr´ees-sorties non format´ees. La fonction getchar retourne un int correspondant au caract`ere lu. Pour mettre le caract`ere lu dans une variable caractere, on ´ecrit caractere = getchar();
19
14/03/16
Les structures de contrôle
Bloc d'instructions • Pour délimiter un bloc d'instructions on utilise les { } o
Deux instructions ou plus.
• Les blocs peuvent être imbriqués:
Ligne d'entête { Instruction 1 Instruction 2 ... Instruction N }
Ligne d'entête { Instruction Instruction Ligne d'entête { Instruction Instruction } Instruction Instruction }
E. Zemmouri,
ENSAM - Meknès
20
14/03/16
La sélection •
Utilisée pour l'exécution conditionnelle
•
Sélection simple :
if (expression) { Bloc d'instructions 1 } else{ Bloc d'instructions 2 }
if (expression){ Bloc d'instructions }
False
expr expr
True
Instructions
E. Zemmouri,
True
False
Instructions 2
Instructions 1
ENSAM - Meknès
La sélection •
Sélection multiple switch
False
switch (expression){ case constante1 : { instructions 1 break; }
False
. . .
case constante2 : { instructions 2 break; } ... case constanteN : { instructions N break; } default : { instructions break; }
= cste2
False
Instructions
= csteN
= cste1 True
True
Instructions 1
Instructions 2
True
Instructions N
} E. Zemmouri,
ENSAM - Meknès
21
14/03/16
La répétition • La boucle for o
Permet de répéter un bloc d'instructions un nombre prédéfini de fois for (expr1; expr2; expr3){ Instruction 1 ... Instruction N }
expr1
expr2
False
True
Instructions 1 ... Instruction N
expr3 E. Zemmouri,
ENSAM - Meknès
La répétition • La boucle while o
Tant que une condition est vraie, on répète l'exécution des instructions
o
On teste, puis on exécute. expr while (expression){ Instruction 1 ... Instruction N }
E. Zemmouri,
False
True
Instructions 1 ... Instruction N
ENSAM - Meknès
22
14/03/16
La répétition • La boucle do - while o
Répéter un bloc d'instructions tant que une condition est vraie
o
On exécute, puis on teste. Instructions 1 ... Instruction N
do { Instruction 1 ... Instruction N }while (expression); True
expr False
E. Zemmouri,
ENSAM - Meknès
break et continue • Utilisées dans une boucle for ou while ou do - while o
break : permet de sortir de la boucle (ou de switch aussi)
o
continue : permet de passer à l'itération suivante de la boucle
E. Zemmouri,
ENSAM - Meknès
23
14/03/16
break et continue
E. Zemmouri,
ENSAM - Meknès
24