Vous êtes sur la page 1sur 71

Le langage C

Catherine Jazzar
2016-2017
LE LANGAGE C
N en 1972 dans les laboratoires Bell AT&T
Auteurs : Brian KERNIGHAN et Dennis RITCHIE

Conu pour lcriture du systme dexploitation UNIX

Langage de programmation

Normalis en 1989 par lANSI


(American National Standards Institute)

2
CARACTERISTIQUES
Structur
Modulaire: peut tre dcoup en modules qui peuvent tre
compils sparment
Universel: n'est pas orient vers un domaine d'application
particulier
Typ: tout objet C doit tre dclar avant dtre utilis
Portable: sur n'importe quel systme en possession d'un
compilateur C
...

3
Premier Programme
/* exemple de programme C : En C le programme principal
- calcul somme des nb entiers de 1 20 et affichage de la s'appelle toujours main
valeur
- idem de 1 10 */ dclarations de variables de
#include <stdio.h> type entier (cases mmoire
main () pouvant contenir un entier)
{
int somme; int i;
somme = 0; instruction d'affectation de
for (i = 1; i <= 20; i++) valeur la variable somme
{
somme = somme + i; instructions excutes
} en squence
printf ("%d\n", somme);
somme = 0;
for (i = 1; i <= 10; i++) affiche l'cran la valeur de
{ l'entier contenu dans somme
somme = somme + i;
} l'instruction entre accolades
printf ("%d\n", somme); est excute pour les valeurs
} de i allant de 1 10 4
COMPILATION / EXECUTION
Compilation du programme prog.c

cc prog.c -o Cette commande compile le


prog fichier
prog.c et produit un excutable
ou (fichier excutable) appel prog
make prog

Excution du programme

Pour excuter le programme il


prog suffit de
taper le nom du programme

5
ELEMENTS DE BASE
Structures de donnes
Notion de type : entiers, rels, caractres, ...
Notion de variables

Instructions
Affectation de variable
Instructions Conditionnelles : if et switch
Boucles: while , do ... while, et for

6
DONNEES
Les informations traites par un programme
Ces informations sont contenues dans :
des variables
des constantes
Variables :
doivent tre dclares
leur contenu peut tre lu et/ou modifi pendant lexcution du
programme
Constantes:
doivent aussi tre dclares
initialises par une valeur
leur contenu ne peut tre modifi
elles peuvent tre lues 7
NOTION DE VARIABLE
Association dun identificateur des cases
mmoires qui doivent tre dclares avant
utilisation
Toute dclaration contient :
un identificateur : nom qui servira dsigner la
case mmoire
un type : ensemble des informations possibles
que pourra contenir la variable
8
DECLARATION DE
VARIABLE
Syntaxe:
<type> <variable>;
Exemple:
char rep;
int compteur;
float longueur, largeur;
int i=0, j=0;
9
INTERET DES VARIABLES
main()
{ int x;
allocation en mmoire
effectue par le compilateur
x = 3;
3
}
machine

Intrt :
le programmeur na pas se soucier de lallocation
prcise des cases mmoires (repres par des adresses)
lemploi didentificateurs significatifs amliore la
lisibilit du programme
10
CONSTANTES (1)

4 types de base pour une constante:


entiers
rels
caractres
chanes de caractres

Syntaxe:
#define <nom constante> <texte de remplacement>

Exemples (de dclarations) : Attention: pas de ;


#define MAX 99
#define PI 3.14
#define CHAINE "langage C"
11
CONSTANTES (2)
Exemples (dutilisation) :

float f = PI;
char tab[MAX];

Linstruction MAX = 3; est illgale :


une constante est dfinie une fois pour toutes
suite sa dclaration et sa valeur ne peut tre
modifie

12
NOTION DE TYPE
dfinit :
un ensemble de valeurs
un ensemble doprations applicable ces valeurs
dtermine :
la taille de la mmoire qui sera alloue aux variables de ce type
le codage des valeurs

Diffrents types peuvent tre utiliss :


types simples : entiers, rels, caractres, numrs,
types composites : tableaux, structures
pointeurs

13
TYPES DE C
void scalaires fonctions union composites

pointeurs arithmtiques tableaux structures

discrets rels(flottants)

entiers numrs

caractres

14
LES ENTIERS
Les entiers sont rangs dans des cases mmoire
de taille fixe : 8, 16, 32, 64 bits,

Ces cases sont rserves par les dclarations de


variables
Rsultats des oprations parfois non reprsentables:
dbordement (overflow)

Exemple:
231+ 231= 0 si les entiers non signs sont reprsents
sur 32 bits
15
TYPES ENTIERS
Entiers: reprsentent les nombres entiers
positfs/ngatifs
Type Description Min Max Nbr Octets
short entier court -32768 32767 2
unsigned short entier court non sign 0 65535 2
int entier -2147483648 2147483647 4
unsigned int entier non sign 0 4294967295 4
long int entier long -2147483648 2147483647 4
unsigned long entier long non sign 0 4294967295 4

Exemples de dclarations de variables:


int x; 16
unsigned long y;
OPERATEURS SUR LE TYPE
ENTIER
Oprateurs arithmtiques:

+ - * / %
/ division entire: 6 / 9 vaut 0
% modulo (reste de la division entire) 6 % 9 vaut 6
Oprateurs relationnels:

> >= < <= == !=


== teste l'galit
!= teste la diffrence
... 17
LITTERAUX ENTIERS EN C
Entier : signe optionnel suivi dune squence de chiffres

Un entier en C peut sexprimer en


Base 10 : la squence commence par un chiffre non 0
Base 8 (octale) : la squence commence par un 0
Base 16 (hexadcimale) : la squence commence par 0x

- 0xF = - 15 = - 017

Base16 Base10 Base8 18


PRINCIPES DE CODAGE DES
CARACTERES
-> Interprtation des caractres comme un code
entier non sign (i.e. 8 correspond au code 5610) :
la relation dordre entre les codes des caractres respecte
lordre alphabtique :
les codes des lettres sont conscutifs :
les codes des chiffres sont conscutifs :

caractres caractres caractres


ASCII ASCII ASCII
A 65 a 97 0 48
B 66 b 98 1 49

Y 89 y 121 8 56
Z 90 z 122 9 5719
LE TYPE CARACTERE EN C
char : type caractre en C
occupe 8 bits (1 octet)
trait comme un entier sign

Un littral caractre est indiqu laide de


a : caractre petit a
. : caractre point
5: caractre 5 et non le chiffre 5

8 - 0 = 8 pourquoi?
20
CARACTERE
Reprsente un caractre parmi lensemble des caractres du
jeu de caractres de la machine (gnralement les codes
ASCII)
Type Description Min Max Nbr Octets
char caractre -128 127 1
unsigned char caractre non sign 0 255 1

char rep;
rep = a ; rep = rep + 3; rep vaut d
Oprateurs arithmtiques: + * - / %
Oprateurs relationnels: > >= < <= == !=
21
TYPES REELS
Rel: reprsente les nombres en virgule flottante
Type Description Min Max Nb Octets

float rel 1,17 E-38 3,4 E+38 4


double rel double 2,22 E-308 1,7 E+308 8

float longueur, largeur;


double masse_atomique;
Oprateurs arithmtiques: + - * /
Oprateurs relationnels: > >= < <= == !=
22
OPERATEURS
ARITHMETIQUES
oprateur opration
- moins unaire
+ plus unaire
* multiplication
/ division
+ addition
- soustraction
% modulo: reste de la division entire
Remarques
Si les oprandes sont des entiers, loprateur / ralisera la division entire
Sinon il ralisera la division relle :
7 / 2 vaut 3 et 7.0 / 2 vaut 3.5
Les oprandes doivent tres des entiers pour loprateur % (modulo)
23
OPERATEURS
RELATIONNELS
oprateur opration
== test si galit
!= test si diffrent
< test si infrieur
<= test si infrieur ou gal
> test si suprieur
>= test si suprieur ou gal

Le rsultat de la comparaison entre deux expression vaut:


0 si le rsultat de la comparaison est faux
1 si le rsultat de la comparaison est vrai

Exemple:
24
if (x >= 0) teste si x est positif
EXPRESSIONS BOOLEENNES
Le type boolen nexiste pas en C
Convention utilise:
la valeur boolenne dune expression est
fausse si elle est gale zro
vraie si elle diffrente de zro

Exemples :
0 est une expression toujours fausse
16 est une expression toujours vraie
x == 16 vraie si x est gal 16
fausse sinon 25
OPERATEURS BOOLEENS
oprateur opration
&& ET Logique
|| OU Logique
! NEGATION

Exemples
1 && 2 !3 0 || ! (2 > 0)
vraie fausse fausse

26
AUTRES OPERATEURS
Oprateurs dauto-incrmentation (++, - -), arithmtiques tendus

x = e++; est quivalent x = e; x = e - -; x = e;


e = e + 1; e = e - 1;

x = ++e; est quivalent e = e + 1; x = - - e; e = e - 1;


x = e; x = e;

x += 1; est quivalent x ++; (et x = x + 1;)


x -= 3; x = x - 3;

Oprateurs de manipulation de bits (~, <<, >>, &, |, ^), oprateur


dexpression conditionnelle (?), oprateur virgule (,), ...

Tous ces oprateurs sappliquent avec des rgles de priorit


27
INSTRUCTIONS
Les instructions prescrivent les actions faire excuter
par lordinateur
INSTRUCTION SIMPLE
Syntaxe:
expression ;
Exemple: laffectation
x = 2;
racine = sqrt(x);
le ; appartient linstruction

28
LES INSTRUCTIONS DE
CONTROLE

if
while
do ... while
for
switch

29
if
Syntaxe Description
La valeur de <expression> est value
if ( <expression> ) et si elle est non nulle, <instruction1>
<instruction 1> est excute sinon cest <instruction2>
qui est excute (si elle existe)
[else
Remarque: <instruction> dsigne :
<instruction 2>] une instruction unique:
x = 5;
Exemple ou
un bloc dinstructions:
if (a > b) {
max = a; tmp=x;
else x=y;
y=tmp;
max = b; } 30
while
Syntaxe:
while (<expression>)
<instructions>
Description:
Exemple: Tant que <expression> fournit une
I = 0; valeur non nulle, <instructions>
while (I < 10) est excut
printf("%d\n", I++);
Remarque:
<expression> est value avant
chaque excution de <instructions>
31
do ...while
Syntaxe: Description:
do <instruction> est excut tant que
<instruction> <expression> fournit une valeur
while(<expression>) non nulle

Exemple: Remarque:
I = 0; <instruction> est excut
do au moins une fois
printf("%d\n", I++);
while (I<10);

32
for
Syntaxe:
for (<expression1>;<expression2>;<expression3>)
<instruction>
Description:
1- expression1 est value
2- <instruction> est excute tant que
<expression2> retourne une valeur
non nulle Exemple:
3- <expression3> est value aprs for (i=0; i<10; i++)
lexcution de <instruction> printf("%d", i);

33
for / while
La boucle for est quivalente la structure while
<expression1>;
for (<expression1>; while (<expression2>)
<expression2>; {
<expression3>) <instruction>
<instruction> <expression3>;
}
Remarques:
1- en gnral <expression1> sert initialiser, et <expression3> sert
incrmenter
2- toutes les expressions sont facultatives
3- Si <expression2> nexiste pas, elle sera suppose vraie
34
switch
SYNTAXE Description
switch (<expression>) 1- lvaluation de <expression> doit
retourne une valeur de type int.
{ 2- si la valeur de <expression> vaut
case e1: <instruction1> e1 ou e2... ... ... ou eN alors
break; l instruction correspondante
case e2: <instruction2> sera excute
break; sinon instruction_default sera
excute
... ... ... ... ... ...
case eN: <instructionN> Remarques
break; 1- <expression> doit rendre une
default: valeur de type int
2- e1, e2, eN doivent tre de type
<instruction_default>
int ou char
} 3- break permet de sortir du switch
35
switch (exemple)
switch (car)
{
case A:
case E:
case I:
case O: Remarque:
case U: voyelle++; si car est une voyelle et
break; break est absent,
case : espace++; alors espace sera incrment
break;
default : consonne++;
}
36
break (2) et continue
Quelle que soit la boucle,
on peut toujours for() ou while() ou
l'abandonner par break do
la recommencer par continue (en
abandonnant la fin de la boucle {
en cours)

if () continue;

if () break;

} 37
E/S de base : printf ET scanf

Les fonctions printf et scanf font partie de la


bibliothque standard dentres/sorties (stdio)

printf: criture formate sur la sortie standard


stdout (lcran, par dfaut)

scanf: lecture formate sur lentre standard


stdin (le clavier, par dfaut)
38
EXEMPLES
int x = 12; retour la ligne
aprs laffichage
float y = 28.08;
printf(" les valeurs sont: %d et %f \n", x, y);

int i; Pas de \n
float r; ici
printf("saisir un entier et un rel: ");
scanf("%d%f ", &i, &r);
39
adresse de i adresse de r
LES FORMATS dE/S
LA SORTIE AVEC FORMAT: printf
%d : largument est un entier et laffichage se fera en
dcimal
%c : largument est un caractre
%s : largument est une chane de caractres
%f : largument est un float

LENTREE AVEC FORMAT: scanf


%d : la donne est un entier saisi sous forme dcimale
%c : la donne est un caractre
%s : la donne est une chane de caractres
%f : la donne est un rel (float) 40
LES FONCTIONS
Les fonctions sont les constituants de base dun
programme C :

elles permettent de dcouper un programme en


parties plus petites et plus faciles mettre au
point

une fonction est un sous-programme qui effectue


un travail bien prcis, laquelle on passe
gnralement des donnes et qui retourne
ventuellement une valeur
41
MISE EN UVRE DUNE
FONCTION
Lutilisation dune fonction ncessite trois tapes:

la dclaration de la fonction

la dfinition de la fonction

lappel de la fonction

42
DECLARATION DUNE
FONCTION
La dclaration d'une fonction se fait par un
prototype qui indique :
le nom de la fonction
le type de chaque paramtre
le type du rsultat retourn

Intrt :
un prototype indique comment appeler une fonction
plac avant le point dappel, il permet au compilateur de
vrifier la cohrence de lappel

43
PROTOTYPE

SYNTAXE:
type identificateur (parametres_formels);

Exemple:
float puissance(int, int);
ou encore
float puissance(int p, int n);

44
DEFINITION DUNE
FONCTION
SYNTAXE: type identificateur (parametres_formels)
{
dclarations
instructions
}
type: type de la valeur retourne par la fonction (int par
dfaut); le type void prcise que la fonction ne retourne pas
de valeur
identificateur: nom de la fonction
parametres_formels: (donnes) liste des paramtres formels;
leur dure de vie est gale la dure dexcution de la
fonction
45
EXEMPLE
type de la valeur nom de la fonction liste des paramtres
retourne formels

float puissance(int x, int n)


{
int i, p=1; dclarations des
variables locales
for (i=1; i<=n; i++)
instructions p = p * x;
return p;
}
46
APPEL DUNE FONCTION
Lappel dune fonction est ralis en invoquant le nom
de la fonction suivi de la liste des paramtres effectifs
Exemple:
int main(void)
appel de la fonction puissance
{
float puiss;
puiss = puissance(2, 5);
printf("%f\n", puiss);
return 0; paramtres effectifs
}
47
LINSTRUCTION RETURN
SYNTAXE:
return expression; /* ou return (expression); */

permet la fonction de retourner la valeur expression


linstruction appelante
provoque une sortie immdiate de la fonction

EXEMPLE:
return puiss;

48
INSTRUCTION RETURN
(suite)
Une fonction peut ne pas retourner de valeur
-> type de retour : void

EXEMPLE:
void affiche_float (float x)
{
printf ("%f \n", x);
return; facultatif
}
49
LES PARAMETRES

Les paramtres permettent les changes de


donnes entre les fonctions

Les paramtres (formels) d'une fonction sont


simplement des variables locales qui sont
initialises par les valeurs obtenues lors de
l'appel (paramtres effectifs)

Le passage de paramtre ne se fait que par


valeur
50
EXEMPLE COMPLET
#include<stdio.h>
float puissance(int x, int n); prototype de la fonction puissance

int main(void)
{
float puiss;
appel de la fonction puissance avec deux
puiss = puissance(2, 5); paramtres effectifs : 2 et 5
printf("%f\n", puiss);
return 0;
}

float puissance(int x, int n)


{
int i, p=1; dfinition de la fonction puissance avec
for (i = 1; i <= n; i++) deux parametres formels : x et n
p = p * x;
return p; x et n prennent les valeurs 2 et 5 lappel
51
}
LES POINTEURS

NOTION D'ADRESSE
POINTEURS
POINTEURS ET FONCTIONS
Passages de paramtres
Exemples

52
NOTION D'ADRESSE

DEFINITION:
L'adresse d'une variable est une valeur qui
indique sa localisation en mmoire

En C, pour exprimer une adresse, on


dispose de l'oprateur &
Exemple: adresses correspondantes
int i; &i
char c; &c
float val; &val
53
NOTION D'ADRESSE

int i=123;
adresses

i vaut 123
1004 123
&i vaut 1004
1008
1012
1016

54
POINTEURS

Dfinition
Un pointeur est une variable destine contenir
une adresse (celle d'une autre variable)

Terminologie
Si p est un pointeur (variable pointeur), alors la
deuxime variable est dite pointe par p
55
POINTEUR/VARIABLE
POINTEE
La mise en uvre d'un pointeur se droule
en trois tapes (obligatoirement):

1: dclaration de la variable pointeur


2: affectation de la variable pointeur
3: utilisation de la variable pointe

56
DECLARATION DUN
POINTEUR
Syntaxe:
<type_variable_pointe> *<pointeur>;

Exemples:
int *pi;
char *pc;
float *pf;
........ 57
DECLARATION DUN
POINTEUR
Valeur initiale indtermine
adresses

#include<stdio.h>
1004 ? p
int main(void)
{ 1008
int *p; 1012
int i=23; 1016 23 i
.......
return 0;
} 58
AFFECTATION DUN
POINTEUR
adresses
#include<stdio.h>
int main(void)
{
1004 1016 p
int *p;
int i=23; 1008
p=&i; 1012
....... 1016 23 i *p

return 0;
}
59
UTILISATION DE LA
VARIABLE POINTEE
Elle se fait l'aide de l'oprateur * (lecture, modification)
#include<stdio.h>
int main(void)
{
int *p; /* dclaration */
int i=23, j;
p=&i; /* initialisation */
*p = 24; /* modification <=> i = 24 */
j = *p + 2; /* j prend la valeur 26 */
..........
60
return 0;
EXEMPLES D'UTILISATION
EXEMPLE 1
#include<stdio.h>
int main(void)
{ 1004 1016 p
int *p; 1008
int i=23; 1012
p=&i; 1016 149 i *p
1020
*p=149;
1024
...........
1028
return 0;
} 61
EXEMPLE 2
#include<stdio.h> adresses
int main(void)
{ 1004 1016 p
int *p, *q; 1008 1028 q
int i=23; 1012
int j=28;
p=&i; 1016 149 i *p
*p=149; 1020
q=&j;
1024
..........
1028 28 j *q
return 0;
}
62
EXEMPLE 3
adresses
#include<stdio.h>
int main(void)
{ 1004 1028 p
int *p, *q; 1008 1028 q
int i=23, j=28;
1012
p=&i;
*p=149; 1016 149 i
q=&j; 1020
p=q;
1024
return 0;
} 1028 28 j *q *p
63
EXEMPLE 4
#include<stdio.h>
adresses
int main(void)
{
1004 1016 p
int *p;
int *q; 1008 1028 q
int i=23; 1012
j=67;
p=&i; 1016 67 i *p
q=&j; 1020
*p=*q;
............ 1024
return 0; 1028 67 j *q
}
64
EXEMPLE 5
adresses
#include<stdio.h>
int main(void) 1016
1004 p
{ int *p, *q;
1008 ? q
int i=23;
p=&i; 1012
*p=149; 1016 149 i *p
*q=28; /* !!!!!!!! */
1020
/* ERREUR : pas d'initialisation
de la variable pointeur*/ 1024
............ 1028
}
65
POINTEURS ET PASSAGE DE
PARAMETRES
Problme
Ecrire une fonction qui permette d changer
les valeurs de deux variables entires.

Donnes: a=5 b=9


Rsultat attendu: a=9 b=5

66
PROGRAMME
FAUX_ECHANGE.C
#include <stdio.h> void echange(int x, int y);
void echange(int,int); {
int main(void) int tmp;
{ tmp = x;
int a=5, b=9; x = y;
echange(a,b); y = tmp;
printf("a=%d b=%d\n, a, b); }
return 0;
} Ce programme affiche:
a=5 b=9 et non a=9 b=5

67
Passage de paramtre par valeur
a 14982 5 a
14982 5
b 14986 9 b
14986 9 14990
14990
14994 14994
14998 14998
La fonction 15002
15002 manipule x et y
5 x 15006 9 x
15006
15010 9 y 15010 5 y
15014 15014
15018 5 tmp 15018 5 tmp
15022 15022

En entre de la fonction En sortie de la fonction


il y a recopie des valeurs de seuls x et y ont t
a et b dans x et y EEPS/03/FOU/00157Y Ind.A modifis
Passage de paramtre par adresse

Pour rsoudre ce problme d'change de


valeurs de variables

=> Solution par l'utilisation des pointeurs


(passage de paramtre par adresse)

69
PROGRAMME
VRAI_ECHANGE.C
#include <stdio.h> void echange(int *px, int* py)
{
void echange(int*,int*); int tmp;
tmp = *px;
*px = *py;
int main(void) *py = tmp;
{ }
int a=5, b=9;
echange(&a,&b); Ce programme affiche:
printf("a = %d b = % d\n, a, b);
a=9 b=5
return 0;
}
70
PASSAGE DE PARAMETRE PAR ADRESSE

14982 a a
5 14982 9
14986 Aprs 14986
9 b excution 5 b
14990 14990
14994 14994
14998 14998
15002 15002
15006 14982 px 15006 14982 px
15012 14986 py 15012 14986 py
15016 15016
15020 5 tmp 15020 5 tmp
15024 15024

EEPS/03/FOU/00157Y Ind.A

Vous aimerez peut-être aussi