Académique Documents
Professionnel Documents
Culture Documents
Cours
Programmation en langage C
2
Contenu du cours
Introduction au langage C
Les fonctions
Les fichiers,...
3
Chapitre 1
INTRODUCTION AU LANGAGE C
4
Préliminaire
1978 : une 1ère définition du langage est apparue avec l’ouvrage de Ritchie
et Kernighan « The C programming language »
Le C est l’un des langages de programmation les plus célèbres et les plus
utilisés au monde
s 6
Caractéristiques du langage C
7
Étapes de la programmation en C
C est un langage compilé ( par opposition aux langages interprétés)
Un programme C est décrit par un fichier texte, appelé fichier source traduit en
langage machine (langage binaire). Cette opération est effectuée par le compilateur
C
Préprocesseur : transformation
purement textuelle (inclusion
d’autres fichiers sources…)
Compilation : traduit le fichier pour
générer un code en assembleur
Assemblage : transforme le code
assembleur en un fichier binaire (
fichier objet)
Edition de liens : liaison des
différents fichiers objets et
production de l’exécutable
8
Compilateur C
9
Exemple d’une fenêtre Dev-C++
10
Composantes d’un programme en C
Début du programme
} Fin du programme 11
Composantes d’un programme en C
1. main()
{}
2. void main()
{}
3. int main()
{}
4. int main (int argc, char * argv[])
{}
12
Remarques sur ce premier programme
13
Chapitre 2
14
Les variables
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)
15
Les identificateurs
Le choix d’un identificateur (nom d’une variable ou d’une fonction) est soumis à
quelques règles :
• La longueur des identificateurs n'est pas limitée, mais C distingue seulement les
31 premiers caractères
• Doit être différent des mots réservés du langage : auto, break, case, char,
const, continue default, do, double, else, enum, extern, float, for,
goto, if, int, long, register, return, short, signed, sizeof, static,
struct, switch, typedef, union, unsigned, void, volatile, while, …
Remarque :
Un type définit l'ensemble des valeurs que peut prendre une variable, le
nombre d'octets à réserver en mémoire et les opérateurs que l'on peut
appliquer dessus
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 (structures)
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 zéro équivaut à faux)
17
Types de base (2/2)
Remarques :
Un caractère char est un nombre entier (il s'identifie à son code ASCII). Par
conséquent, une variable de type char peut contenir une valeur entre -128 et
127 et elle peut subir les mêmes opérations que les variables du type short, int
ou long
Si on ajoute le préfixe unsigned à un entier, alors on manipule des entiers non
signés [de 0 à 2n-1 avec n représente le nombre de bits occupés dans la
mémoire]. Exemple : unsigned char, unsigned short,, … 18
Déclaration des variables
Les déclarations introduisent les variables qui seront utilisées, fixent leur type
et parfois aussi leur valeur de départ (initialisation lors de la déclaration)
Exemple
int i, j, nb; char c = 'a';
float pi = 3.14; double r = 6.2879821365;
19
Définition d’une constante
En utilisant l'attribut const, la valeur d'une variable ne change pas au cours
de l’exécution du programme (avec une réservation d’espace mémoire) :
Exemples
Exemples
Par défaut, une constante numérique entière est de type int et, si sa valeur
est trop grande pour le type int, elle prend celle du type « plus grand »
suffisant.
On distingue 2 notations :
22
Opérateurs, Expressions & Instructions
Une expression est un calcul qui donne une valeur comme résultat et ayant
un type
23
Les opérateurs (1/10)
Opérateur d’affectation simple =
a =b = c = 5 c = 5, b = c et ensuite a = b a=5
b=(a = 5 + 3)+1 a = 8 et b = 9
Exemple : a = a + b s'écrit a += b
24
Les opérateurs (2/10)
Opérateurs Arithmétiques
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 au moins l’un des opérandes est un
réel (5.0 / 2 2.5)
25
Les opérateurs (3/10)
Conversions implicites
• 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
n * p + x
* multiplication par p
+ addition
27
Les opérateurs (5/10)
Opérateurs Relationnels et logiques : Exemple
a = (6==5)
a = (2!=3)
a = (6<=3)
a =((3==3) || (6<=3))
a =((3==3) && (6<=3))
a =4*(2<7) + 2*(4>=7)
28
Les opérateurs (6/10)
Incrémentation et décrémentation : incrémentation (++), décrémentation (--)
Post-incrémentation <var>++; équivalente à <var>=<var>+1;
Post-décrémentation <var>--; équivalente à <var>=<var>-1;
Dans une expression, la valeur de la variable <var> est d'abord utilisée telle
quelle, puis incrémentée (ou décrémentée)
Exemple :
int a, b;
a = b++; équivalent à a = b, b = b+1;
30
Les opérateurs (8/10)
Opérateur séquentiel ( , ) <expr1> , <expr2>,…, <exprN>
• Exemples :
x = 5 , x + 6; // l’instruction a pour valeur 11
31
Les opérateurs (9/10)
Opérateur conditionnel (? :) <expression> ? <expr1> : <expr2>
• <expression> est évaluée. Si sa valeur est non nulle, alors la valeur de <expr1> est
retournée. Sinon, c'est la valeur de <expr2> qui est renvoyée
• Exemple :
c=a>b?a:b
32
Les opérateurs (10/10)
Opérateur de forçage de type (cast)
• Exemple 1 :
int n, p ;
(double) (n / p); convertit l’entier n / p en double
Les opérateurs dans une même ligne ont le même niveau de priorité. Dans ce cas
l’ordre d’évaluation est définie par le sens de la flèche
Priorité Catégorie Opérateurs Associativité
1 référence () [] -> .
2 unaire ++ -- (Pré) ! (cast) sizeof
3 arithmétique * / %
4 arithmétique + -
5 décalage << >>
6 relationnel < <= > >=
7 relationnel == !=
8 manip. de bits &
9 manip. de bits ^
10 manip. de bits
11 logique &&
12 logique
13 conditionnel ?:
14 affectation = += -= *= /= %= &= ^= |= <<= >>=
15 séquentiel , 34
Priorité et associativité des opérateurs (2/2)
Exemples :
• Remarque : en cas de doute il vaut mieux utiliser les parenthèses pour indiquer les
opérations à effectuer en priorité. Exemple : (2 + 3) * 7 vaut 35
a *= ( b += 5 )
a *= ( b = b + 5 )
a *= ( b = 9 )
a *= 9
a = a * 9 a = 27
35
Exercice
C:i=?n=?
i=15; n=i+=3;
D:i=?j=?n=?
i=3; j=5; n=i*=--j;
E:i=?j=?n=?
}
36
Chapitre 3
37
Les instructions de lecture et d’écriture
38
Ecriture formatée de données: printf () (1/5)
• format : est une chaîne de caractères qui peut contenir du texte, des
caractères de contrôle (‘\n’ , ‘\t’ , …) et des spécificateurs de format
• expr1, expr2,… : sont les variables et les expressions dont les valeurs
sont à représenter
39
Affichage de la valeur d’une variable (2/5)
Spécificateurs de format :
41
Ecriture formatée de données: printf () (4/5)
Exemple 1
int a = 120 ;
int b = 60 ;
printf("%i plus %i est %i\n", a, b, a + b) ;
// Affiche sur l'écran : 120 plus 60 est 180
Exemple 2
42
Ecriture formatée de données: printf () (5/5)
Action sur le gabarit d’affichage
• Les entiers sont affichés par défaut sans espaces avant ou après
• Les flottants avec six chiffres après le point. Mais, on peut préciser le nombre de chiffres
après le point décimal
• Pour agir sur l’affichage, un nombre est placé après % et précise le nombre de
caractères minimum à utiliser
Quelques exemples : %[format][width ][. precision][modifier]<type>
printf("%.2f" , x );
printf("%3d" , n ); printf("%f" , x ); x = 1.2345 1.23
n = 20 ^20 x = 1.2345 1.234500 printf("%3.0f" , x );
n=3 ^^3 x = 12.3456789 12.345678 x = 1.2345 ^^1
n = 2358 2358 printf("%10f" , x ); //cadrage à droite printf("%#3.0f" , x );
n = -5200 -5200 x = 1.2345 ^^1.234500 x = 1.2345 ^1.
printf("%-10f" , x );//cadrage à gauche printf("%6.2f" , x );
printf("%+d" , x ); x = 1.2345 1.234500^^ x = 1.2345 ^^1.23
x = 10 +10 printf("%010f",x ); printf("%-6.2f" , x );
x = -10 -10 x = 1.2345 001.234500 x = 1.2345 1.23^^
printf("%-010f",x ); printf("%.0f" , x );
printf("%05d" , x );
x = 1.2345 1.234500^^ x = 1.5345 2
x = 10 00010
43
Lecture formatée de données: scanf () (1/2)
Remarques :
int n = scanf("format de lecture", &variable1, &variable2, … ); avec n
représente le nombre de valeurs entrées avec succès.
44
Lecture formatée de données: scanf () (2/2)
Exemple
#include <stdio.h>
main()
{ int n, p; //déclaration des variables
//affichage de la valeur de n
printf("Merci pour %d\n", n);
//affichage de la valeur de p
printf("Merci pour %d\n",p);
}
45
Affichage d’un caractère
Exemple :
char c = 'a' ;
char b = '\n' ;
putchar('x') ;
/* affiche la lettre x */
putchar('?') ;
/* affiche le symbole ? */
putchar(b) ;
/* retour à la ligne */
putchar(65) ;
/* affiche le caractère de code ASCII = 65, c-à-d. la lettre A */
putchar(c) ;
/* affiche le caractère a */
46
Lecture d’un caractère
Exemple :
printf("donner une valeur pour le caractère c ");
char c =getchar(); // équivalent à scanf("%c",&c);
47
Chapitre 4
STRUCTURES DE CONTROLE
48
Structures de contrôle
49
Structures de choix (1/3)
50
Structures de choix (2/3)
Exemple :
int a=0;
while(a<4) //tant que a<4 j’exécute les instructions suivantes
{
a++;
printf ("La valeur de a :%d \n", a);
}
53
Structures itératives (2/3)
Exemple :
int a=0;
do //faire les instructions suivantes
{
a++; // j’incrémente a de 1
printf ("La valeur de a :%d \n", a);
}
while(a<4); //tant que a<4
54
Structures itératives(3/3)
int a; Remarques :
for( a=0 ; a<4 ; a++ ) En pratique, exp1 et exp3 contiennent
{ souvent plusieurs initialisations
printf ("La valeur de a :%d \n", a); (instructions) séparées par des virgules
} Les expressions exp1 et exp3 peuvent
être absentes (les points virgules doivent
cependant apparaître) : for ( ; exp2 ; )
55
Instructions break et continue (1/2)
Instruction break
L’instruction break peut être employée à l’intérieur de n’importe quelle boucle
(for ; while ; do-while ; switch)
Elle permet l’abandon de la boucle et le passage à la première instruction qui
suit la boucle
En cas de boucles imbriquées, break fait sortir de la boucle la plus interne
Instruction continue
L’instruction continue peut être employée à l’intérieur d’une structure de type
boucle (for ; while ; do-while )
Elle permet l’abandon de l’itération courante et fait passer directement à
l’itération suivante d’une boucle
L’instruction continue concerne la boucle la plus interne
Exemple
Valeurs Affichage
int i, j ;
i=2 et j=3 i : 2 et j : 3
……//Initialisations i : 1 et j : 2
for ( ; i>0 && j>0; i--,j--)
i=6 et j=3 i : 6 et j : 3
{
i : 4 et j : 1
if(i == 5) continue;
printf("i : %d et j : %d\n", i, j) ; i=3 et j=5 i : 3 et j : 5
if(j == 5) break ;
}
57
Exercice
Correction
#include<stdio.h>
main()
{
int a, b, c;
int aide;
printf("entrer la valeur de a, b et c :\t");
scanf("%d %d %d", &a, &b, &c);
printf("a=%d \t b=%d\t c=%d\n", a, b, c);
aide= a , a=c , c=b , b=aide;
printf("a=%d \t b=%d\t c=%d\n", a, b, c);
}
58