Vous êtes sur la page 1sur 94

Langage C

Prsentation gnrale
et instructions de base

2007/2008

Info2, 1re anne SM/SMI

Langage C




Cr en 1972 (D. Ritchie et K. Thompson), est un


langage rapide et trs populaire et largement utilis.
Le C++ est un langage orient objet cr partir du C en
1983.
Le langage C a inspir de nombreux langages :

C++, Java, PHP, ... leurs syntaxes sont proches de celle de C

Le Langage C est un bon acquis pour apprendre


dautres langages

2007/2008

Info2, 1re anne SM/SMI

Premier programme en C
#include <stdio.h>
void main()

bibliothque
Point d'entr du programme

{
printf(Mon programme !\n");

Instruction

2007/2008

Info2, 1re anne SM/SMI

Langage C : G
Gnralit
ralits


Chaque instruction en C doit se terminer par ;

Pour introduire un texte en tant que commentaire, il


suffit de prcder la ligne par // ( le texte est alors ignor
par le compilateur de C)

Il est aussi possible d'crire des commentaires sur


plusieurs lignes en utilisant les symboles (/* ..*/)
/* exemple sur ligne 1
exemple sur ligne 2 */

2007/2008

Info2, 1re anne SM/SMI

Langage C : nom et type des variables




Le nom d'une variable peut tre une combinaison de lettres et de


chiffres, mais qui commence par une lettre, qui ne contient pas
d'espaces et qui est diffrente des mots rservs du langage C
Les principaux types dfinis en C sont :

char (caractres),
int (entier),
short (entiers courts),
long (entiers longs),
float (rel),
double (rel grande prcision),
long double (rel avec plus de prcision),
unsigned int (entier non sign)

2007/2008

Info2, 1re anne SM/SMI

Langage C : nom et type des variables




Dclaration d'une variable

Exemple:

Type nom_de_la_variable [= valeur] ;


int nb;
float pi = 3.14;//dclaration et initialisation
char c = x';
long a, b, c;
double r = 7.1974851592;

2007/2008

Info2, 1re anne SM/SMI

Langage C: l'affectation


Le symbole d'affectation se note en C avec


=
exemple : i= 1; j= i+1;

Attention : en C, le test de lgalit est


effectue par loprateur ==
a==b ; est une expression de type logique
(boolean) qui est vrai si les deux valeurs a et b
sont gales et fausse sinon

2007/2008

Info2, 1re anne SM/SMI

Langage C : affichage d
dune variable

printf("format de laffichage", var) permet d'afficher la valeur de la


variable var (c'est l'quivalent de crire en pseudo code).

printf("chaine") permet d'afficher la chane de caractres qui est entre


guimets " "
int a=1, b=2; printf("a vaut :%d et b vaut:%d \n ", a, b);
a vaut 1 et b vaut 2

float r= 7.45; printf(" le rayon =%f \n ",r);


Autres formats :

%c : caractre
%lf : double
%s : chaine de caractres
%e : rel en notation scientifique

2007/2008

Info2, 1re anne SM/SMI

Langage C : affichage d
dune variable

Affichage de la valeur d'une variable en


C++

cout <<chane 1 <<variable 1<<chane 2 <<variable 2;


Exemple
int i =2; int j = 20;
cout <<"i vaut:" << i <<"j vaut:"<<j <<'\n';
float r = 6.28;
cout<<"le rayon
2007/2008

= "<< r <<'\n';

Info2, 1re anne SM/SMI

Langage C : lecture d
dune variable


Lecture dune variable n de type entier:

Syntaxe : scanf("%d ",&n); lit la valeur tap par lutilisateur


au clavier et elle la stocke dans la variable n.
Comme pour printf, le premier argument est une chaine de
caractres qui donne le format de la lecture. Cette chaine
ne peut contenir que des formats, pas de messages.
Attention : notez la prsence du caractre & devant n
(adresse associe la variable n) et ce nest pas quivaut
scanf("%d", n);

2007/2008

Info2, 1re anne SM/SMI

10

Langage C : lecture d
dune variable

lecture d'une variable en C++

cin>>var;
Exemple
int i ;
cout <<"entrez i "<<'\n';
cin>>i;
float r ;
cout<<"entrez le rayon
cin>>r;
2007/2008

r " <<'\n';

Info2, 1re anne SM/SMI

11

Langage C : oprateurs


Instructions de base

oprateurs de base

+, -, *, /  oprateurs arithmtique de base


%  reste d'une division entire
==  test d'galit
!= test de diffrence
<, >, <=, >= test de comparaison
!  ngation
||  ou logique pour valuer une expression
&&  et logique pour valuer une expression

2007/2008

Info2, 1re anne SM/SMI

12

Langage C : syntaxe des tests


criture en pseudo code

Traduction en C

Si condition alors
instructions
Finsi

if (condition) {
instructions;
}

Si condition alors
instructions1
Sinon
instructions2
Finsi

if (condition) {
instructions1;
} else {
instructions2;
}

2007/2008

Info2, 1re anne SM/SMI

13

Langage C : syntaxe des tests


criture en pseudo code
cas o v vaut
v1 : action1
v2 : action2
...
vn : actionn
autre : action autre
Fincas

2007/2008

Traduction en C
switch(v){
case v1 : action1; break;
case v2 : action2; break;

case vn: actionn ;break;


default : action autre; break;
}

Info2, 1re anne SM/SMI

14

Langage C : syntaxe des boucles


criture en pseudo code

Traduction en C

TantQue condition
Instructions
FinTantQue

while( condition) {
instructions;
}

Pour i allant de v1 v2 par pas p


instructions
FinPour

for( i=v1;i<=v2;i=i+p){
instructions;
}

Rpter
instructions
Jusqu condition

do{

2007/2008

instructions;
} while(condition)

Info2, 1re anne SM/SMI

15

Fonctions et proc
procdures

2007/2008

Info2, 1re anne SM/SMI

16

Les procdures et les fonctions




Par exemple, pour rsoudre le problme suivant :


crire un programme qui affiche en ordre croissant les
notes dune classe suivies de la note la plus faible, de la
note la plus leve et de la moyenne.
revient rsoudre les sous problmes suivants :
- Remplir un tableau de naturels avec des notes saisies par
lutilisateur
- Afficher un tableau de naturels
- Trier un tableau de naturel en ordre croissant
- Trouver le plus petit naturel dun tableau
- Trouver le plus grand naturel dun tableau
- Calculer la moyenne dun tableau de naturels
2007/2008

Info2, 1re anne SM/SMI

17

Les procdures et les fonctions


Chacun de ces sous-problmes devient un nouveau problme
rsoudre.
Si on considre que lon sait rsoudre ces sous-problmes, alors on
sait quasiment rsoudre le problme initial.
Donc crire un programme qui rsout un problme revient toujours
crire des sous-programmes qui rsolvent des sous parties du
problme initial.
En algorithmique il existe deux types de sous-programmes :
- Les fonctions
- Les procdures
2007/2008

Info2, 1re anne SM/SMI

18

Fonctions et proc
procdures


Un programme long est souvent difficile crire et comprendre. Cest


pourquoi, il est prfrable de le dcomposer en des parties appeles
sous-programmes ou modules

Les fonctions et les procdures sont des modules (groupe


d'instructions) indpendants dsigns par un nom. Elles ont plusieurs
avantages :

permettent dviter de rcrire un mme traitement plusieurs fois. En effet,


on fait appelle la procdure ou la fonction aux endroits spcifis.
permettent dorganiser le code et amliorent la lisibilit des programmes
facilitent la maintenance du code (il suffit de modifier une seule fois)
ces procdures et fonctions peuvent ventuellement tre rutilises dans
d'autres programmes

2007/2008

Info2, 1re anne SM/SMI

19

Fonctions


Le rle d'une fonction en programmation est similaire celui d'une


fonction en mathmatique : elle retourne un rsultat au programme
appelant

Une fonction s'crit en dehors du programme principal sous la forme:


Fonction nom_fonction (paramtres et leurs types) : type_fonction
Variables // variables locales
Dbut
Instructions constituant le corps de la fonction
retourne //la valeur retourner
FinFonction





Le nom_fonction est un identificateur


type_fonction est le type du rsultat retourn
L'instruction retourne sert retourner la valeur du rsultat

2007/2008

Info2, 1re anne SM/SMI

20

Caract
Caractristiques des fonctions


Une fonction ne modifie pas les valeurs de ses arguments


en entre
Elle se termine par une instruction de retour qui rend un
rsultat et un seul
Une fonction est toujours utilise dans une expression
(affectation, affichage,)

2007/2008

Info2, 1re anne SM/SMI

21

Fonctions : exemples


La fonction max suivante retourne le plus grand des deux


rels x et y fournis en arguments :
Fonction max (x : rel, y: rel ) : rel
variable z : rel
Dbut z y
si (x>y) alors z x finsi
retourne (z)
FinFonction

La fonction Pair suivante dtermine si un nombre est pair :


Fonction Pair (n : entier ) : boolen
Debut retourne (n%2=0)
FinFonction

2007/2008

Info2, 1re anne SM/SMI

22

Utilisation des fonctions




L'utilisation d'une fonction se fera par simple criture de son nom


dans le programme principale. Le rsultat tant une valeur, devra tre
affect ou tre utilis dans une expression, une criture, ...

Exepmle: Algorithme exepmleAppelFonction


variables c : rel, b : boolen
Dbut
b Pair(3)
c 5*max(7,2)+1
crire("max(3,5*c+1)= ", max(3,5*c+1))
Fin
Lors de l'appel Pair(3) le paramtre formel n est remplac par le
paramtre effectif 3

2007/2008

Info2, 1re anne SM/SMI

23

Procdures





Dans le cas o une tche se rpte dans plusieurs endroits du


programme et elle ne calcule pas de rsultats ou quelle calcule
plusieurs rsultats la fois alors on utilise une procdure au lieu
dune fonction
Une procdure est un sous-programme semblable une fonction
mais qui ne retourne rien
Une procdure s'crit en dehors du programme principal sous la
forme :
Procdure nom_procdure (paramtres et leurs types)
Variables //locales
Dbut
Instructions constituant le corps de la procdure
FinProcdure
Remarque : une procdure peut ne pas avoir de paramtres
2007/2008

Info2, 1re anne SM/SMI

24

Appel d'une procdure




Pour appeler une procdure dans un programme principale ou


dans une autre procdure, il suffit dcrire une instruction indiquant
le nom de la procdure :
Procdure exempleProcedure ()

FinProcdure
Algorithme exepmleAppelProcdure
Dbut
exempleProcedure ()

Fin

Remarque : contrairement l'appel d'une fonction, on ne peut pas


affecter la procdure appele ou l'utiliser dans une expression.
L'appel d'une procdure est une instruction autonome
2007/2008

Info2, 1re anne SM/SMI

25

Paramtres d'une procdure




Les paramtres servent changer des donnes entre le programme


principale (ou la procdure appelante) et la procdure appele

Les paramtres placs dans la dclaration d'une procdure sont


appels paramtres formels. Ils sont des variables locales la
procdure.

Les paramtres placs dans l'appel d'une procdure sont appels


paramtres effectifs. ils contiennent les valeurs pour effectuer le
traitement

Le nombre de paramtres effectifs doit tre gal au nombre de


paramtres formels. L'ordre et le type des paramtres doivent
correspondre

2007/2008

Info2, 1re anne SM/SMI

26

Transmission des paramtres


Il existe deux modes de transmission de paramtres dans les langages
de programmation :


La transmission par valeur : les valeurs des paramtres effectifs sont


affectes aux paramtres formels correspondants au moment de
l'appel de la procdure. Dans ce mode le paramtre effectif ne subit
aucune modification

La transmission par adresse (ou par rfrence) : les adresses des


paramtres effectifs sont transmises la procdure appelante. Dans
ce mode, le paramtre effectif subit les mmes modifications que le
paramtre formel lors de l'excution de la procdure

Remarque : le paramtre effectif doit tre une variable (et non une
valeur) lorsqu'il s'agit d'une transmission par adresse

En pseudo-code, on va prciser explicitement le mode de transmission


dans la dclaration de la procdure
2007/2008

Info2, 1re anne SM/SMI

27

Transmission des paramtres :


exemples
Procdure incrementer1 (x : entier par valeur, y : entier par adresse)
x x+1
y y+1
FinProcdure
Algorithme Test_incrementer1
variables n, m : entier
Dbut
n3
m3
incrementer1(n, m)
rsultat :
crire (" n= ", n, " et m= ", m)
n=3 et m=4
Fin
Remarque : l'instruction x x+1 n'a pas de sens avec un passage par
valeur
2007/2008

Info2, 1re anne SM/SMI

28

Transmission par valeur, par


adresse : exemples
Procdure qui calcule la somme et le produit de deux entiers :
Procdure SommeProduit (x, y: entier par valeur, som, prod : entier par
adresse)
som x+y
prod x*y
FinProcdure
Procdure qui change le contenu de deux variables :
Procdure Echange (x : rel par adresse, y : rel par adresse)
variables z : rel
zx
xy
yz
FinProcdure
2007/2008

Info2, 1re anne SM/SMI

29

Variables locales et globales




On peut manipuler 2 types de variables dans un module


(procdure ou fonction) : des variables locales et des
variables globales. Elles se distinguent par ce qu'on appelle
leur porte (leur "champ de dfinition", leur "dure de vie")

Une variable locale n'est connue qu' l'intrieur du module ou


elle a t dfinie. Elle est cre l'appel du module et dtruite
la fin de son excution

Une variable globale est connue par l'ensemble des modules


et le programme principale. Elle est dfinie durant toute
lapplication et peut tre utilise et modifie par les diffrents
modules du programme

2007/2008

Info2, 1re anne SM/SMI

30

Variables locales et globales




La manire de distinguer la dclaration des variables locales et


globales diffre selon le langage

En gnral, les variables dclares l'intrieur d'une fonction ou


procdure sont considres comme variables locales

En pseudo-code, on va adopter cette rgle pour les variables


locales et on dclarera les variables globales dans le
programme principale

Conseil : Il faut utiliser autant que possible des variables


locales plutt que des variables globales. Ceci permet
d'conomiser la mmoire et d'assurer l'indpendance de la
procdure ou de la fonction

2007/2008

Info2, 1re anne SM/SMI

31

Fonctions et procdures en langage C




En C, une fonction prends N arguments et retourne une valeur de


type.
Syntaxe : type arg_ret nom_f(type arg1, type arg2, type argn)
{ ensemble instructions
}
- arg_ret est l'argument renvoy par la fonction (instruction return)
- nom_f est le nom de la fonction
- arg1 argn sont les arguments envoys la fonction.
Une procdure est une fonction renvoyant void, dans ce cas return
est appel sans paramtre.

2007/2008

Info2, 1re anne SM/SMI

32

Fonctions et procdures en C


L'ordre, le type et le nombre des arguments doivent


tre respects lors de l'appel de la fonction
L'appel d'une fonction doit tre situe aprs sa
dclaration ou celle de son prototype
Si la fonction ne renvoie rien alors prciser le type void
(cette fonction est considre comme une procdure)

2007/2008

Info2, 1re anne SM/SMI

33

Fonctions en C : exemple
int min(int a, int b);
void main()
{ int c;
/* entrez les valeurs de a et b */
c= min(a, b) ;
printf("le min de %d et %d est : %d \n", a, b, c);
}
int min(int a, int b)
{
if (a <b) return a;
else return b;
}
2007/2008

Info2, 1re anne SM/SMI

34

Rcursivit


Un module (fonction ou procdure) peut s'appeler lui-mme: on


dit que c'est un module rcursif

Tout module rcursif doit possder un cas limite (cas trivial) qui
arrte la rcursivit

Exemple : Calcul du factorielle


Fonction fact (n : entier ) : entier
Si (n=0) alors
retourne (1)
Sinon
retourne (n*fact(n-1))
Finsi
FinFonction

2007/2008

Info2, 1re anne SM/SMI

35

Fonctions rcursives : exercice




crivez une fonction rcursive (puis itrative) qui calcule le terme n


de la suite de Fibonacci dfinie par :
U(0)=U(1)=1
U(n)=U(n-1)+U(n-2)
Fonction Fib (n : entier ) : entier
Variable res : entier
Si (n=1 OU n=0) alors
res 1
Sinon
res Fib(n-1)+Fib(n-2)
Finsi
retourne (res)
FinFonction

2007/2008

Info2, 1re anne SM/SMI

36

Fonctions rcursives : exercice


Une fonction itrative pour le calcul de la suite de Fibonacci :
Fonction Fib (n : entier ) : entier
Variables i, AvantDernier, Dernier, Nouveau : entier
Si (n=1 OU n=0) alors retourne (1)
Finsi
AvantDernier 1, Dernier 1
Pour i allant de 2 n
Nouveau Dernier+ AvantDernier
AvantDernier Dernier
Dernier Nouveau
FinPour
retourne (Nouveau)
FinFonction
Remarque: la solution rcursive est plus facile crire


2007/2008

Info2, 1re anne SM/SMI

37

Procdures rcursives : exemple




Une procdure rcursive qui permet d'afficher la


valeur binaire d'un entier n
Procdure binaire (n : entier )
Si (n<>0) alors
binaire (n/2)
crire (n mod 2)
Finsi
FinProcdure

2007/2008

Info2, 1re anne SM/SMI

38

Les fonctions rcursives




Le processus rcursif remplace en quelque sorte la


boucle, cest--dire un processus itratif.

Il est noter que l'on traite le problme lenvers : on part


du nombre, et on remonte rebours jusqu 1, pour
pouvoir calculer la factorielle par exemple.

Cet effet de rebours est caractristique de la


programmation rcursive.

2007/2008

Info2, 1re anne SM/SMI

39

Les fonctions rcursives : remarques




la programmation rcursive, pour traiter certains problmes,


peut tre trs conomique, elle permet de faire les choses
correctement, en trs peu de lignes de programmation.

en revanche, elle est trs coteuse de ressources machine.


Car il faut crer autant de variable temporaires que de "tours"
de fonction en attente.

toute fonction rcursive peut galement tre formule en


termes itratifs ! Donc, si elles facilitent la vie du
programmeur, elle ne sont pas indispensable.

2007/2008

Info2, 1re anne SM/SMI

40

Les tableaux

2007/2008

Info2, 1re anne SM/SMI

41

Tableaux : introduction


Supposons que l'on veut calculer le nombre dtudiants ayant une note
suprieure 10 pour une classe de 20 tudiants.

Jusqu prsent, le seul moyen pour le faire, cest de dclarer 20


variables dsignant les notes N1, , N20:

La saisie de ces notes ncessite 20 instructions lire.


Le calcul du nombre des notes>10 se fait par une suite de tests de 20
instructions Si :
nbre 0
Si (N1 >10) alors nbre nbre+1 FinSi

Si (N20>10) alors nbre nbre+1 FinSi

cette faon nest pas trs pratique




Cest pourquoi, les langages de programmation offrent la possibilit de


rassembler toutes ces variables dans une seule structure de donne
appele tableau qui est facile manipuler
2007/2008

Info2, 1re anne SM/SMI

42

Tableaux


Un tableau est un ensemble d'lments de mme type dsigns par


un identificateur unique

Une variable entire nomme indice permet d'indiquer la position


d'un lment donn au sein du tableau et de dterminer sa valeur

La dclaration d'un tableau s'effectue en prcisant le type de ses


lments et sa dimension (le nombre de ses lments)

En pseudo code :

variable tableau identificateur[dimension] : type

Exemple :

variable tableau notes[20] : rel


On peut dfinir des tableaux de tous types : tableaux d'entiers, de
rels, de caractres, de boolens, de chanes de caractres,
2007/2008

Info2, 1re anne SM/SMI

43

Les tableaux


Les tableaux une dimension ou vecteurs :


variable tableau tab[10] : entier

0
45




1
54

2
1

3
4
5
-56 22 134

6
49

7
12

8
90

9
-26

Ce tableau est de longueur 10, car il contient 10 emplacements.


Chacun des dix nombres du tableau est repr par son rang, appel
indice
Pour accder un lment du tableau, il suffit de prciser entre
crochets l'indice de la case contenant cet lment.
Pour accder au 5me lment (22), on crit : tab[4]
Pour accder au ime lment, on crit tab[i-1] (avec 0<i<=10)
2007/2008

Info2, 1re anne SM/SMI

44

Tableaux : remarques


Selon les langages, le premier indice du tableau est soit 0, soit 1. Le


plus souvent c'est 0 (c'est ce qu'on va utiliser en pseudo-code). Dans
ce cas, tab[i] dsigne l'lment i+1 du tableau notes

Il est possible de dclarer un tableau sans prciser au dpart sa


dimension. Cette prcision est faite ultrieurement.




Par exemple, quand on dclare un tableau comme paramtre d'une


procdure, on peut ne prciser sa dimension qu'au moment de l'appel
En tous cas, un tableau est inutilisable tant quon na pas prcis le
nombre de ses lments

Un grand avantage des tableaux est qu'on peut traiter les donnes
qui y sont stockes de faon simple en utilisant des boucles
Les lments dun tableau sutilisent comme des variables
2007/2008

Info2, 1re anne SM/SMI

45

Tableaux : accs et modification




Les instructions de lecture, criture et affectation


s'appliquent aux tableaux comme aux variables.

Exemples :
x tab[0]
La variable x prend la valeur du premier lment du
tableau (45 selon le tableau prcdent)
tab[6] 43
Cette instruction a modifie le contenu du 7me lment
du tableau (43 au lieu de 49)
2007/2008

Info2, 1re anne SM/SMI

46

Tableaux : exemple 1


Pour le calcul du nombre d'tudiants ayant une note


suprieure 12 avec les tableaux, on peut crire :

Constante
N=20 : entier
Variables
i ,nbre : entier
tableau notes[N] : rel
Dbut
nbre 0
Pour i allant de 0 N-1
Si (notes[i] >12) alors
nbre nbre+1
FinSi
FinPour
crire ("le nombre de notes suprieures 12 est : ", nbre)
Fin

2007/2008

Info2, 1re anne SM/SMI

47

Tableaux : exemple 2


Le programme suivant comporte la dclaration dun tableau de 20 rels (les


notes dune classe), on commence par effectuer la saisie des notes, et en suite
on calcul la moyenne des 20 notes et on affiche la moyenne :

Constante Max =200 : entier


variables tableau
Notes[Max],i,somme,n : entier
moyenne : rel
dbut
ecrire("entrer le nombre de notes :") lire(n)
/* saisir les notes */
pour i allant de 0 n-1 faire
ecrire("entrer une note :")
lire(Notes[i])
finpour
/* effectuer la moyenne des notes */
somme 0
pour i allant de 0 n-1 faire
somme somme + Notes[i]
finPour
moyenne = somme / n
/* affichage de la moyenne */
ecrire("la moyenne des notes est :",moyenne)
fin
2007/2008

Info2, 1re anne SM/SMI

48

Tableaux : saisie et affichage




Saisie et affichage des lments d'un tableau :


Constante Max=200 : entier
variables
i, n
: entier
tableau Notes[max] : rel
ecrire("entrer la taille du tableau :")
lire(n)
/* saisie */
Pour i allant de 0 n-1
crire ("Saisie de l'lment ", i + 1)
lire (T[i] )
FinPour
/* affichage */
Pour i allant de 0 n-1
crire ("T[",i, "] =", T[i])
FinPour

2007/2008

Info2, 1re anne SM/SMI

49

Les tableaux : Initialisation

Le bloc dinstructions suivant initialise un un tous


les lments d'un tableau de n lments :
InitTableau
dbut
pour i de 0 n-1 faire
tab[i] 0
fpour
fin

2007/2008

Info2, 1re anne SM/SMI

50

Tableaux : Exercice
Que produit lalgorithme suivant ?
Variable Tableau F[10], i : entier
dbut
F[0] 1
F[1] 1
crire(F[0],F[1])
pour i allant de 2 9 faire
F[i] F[i-1]+F[i-2]
crire(F[i])
finpour
fin
2007/2008

Info2, 1re anne SM/SMI

51

Tableaux : syntaxe en C


En langage C, un tableau se dclare comme suit :

type nom_tableau[dimension];
dimension : doit tre une constante


Exemple : int t[100] ;


La taille nest pas obligatoire si le tableau est initialis sa cration.
Exemple : int dixPuissance[ ] = { 0, 1, 10, 100, 1000, 10000 } ;

Dclaration dun tableau de plusieurs dimensions

type nom_tableau[dim1][dim2][dimn];
Exemple: char buffer[20][80];

2007/2008

Info2, 1re anne SM/SMI

52

Tableaux deux dimensions




Les langages de programmation permettent de dclarer des tableaux


dans lesquels les valeurs sont repres par deux indices. Ceci est
utile par exemple pour reprsenter des matrices

En pseudo code, un tableau deux dimensions se dclare ainsi :


variable tableau identificateur[dimension1] [dimension2] : type

Exemple : une matrice A de 3 linges et 4 colonnes dont les lments sont


rels

variable tableau A[3][4] : rel





A[i][j] permet d'accder llment de la matrice qui se trouve


lintersection de la ligne i et de la colonne j
Les tableaux peuvent avoir n dimensions.

2007/2008

Info2, 1re anne SM/SMI

53

Les tableaux deux dimensions




La matrice A dans la dclaration suivante :


variable tableau A[3][7] : rel
peut tre explicite comme suit : les lments sont ranges dans un
tableau deux entres.

0
1
2

0
12
23
43

1
28
36
21

2
44
51
55

3
2
11
67

4
76
38
83

5
77
54
41

6
32
25
69

Ce tableau a 3 lignes et 7 colonnes. Les lments du tableau sont


reprs par leur numro de ligne et leur numro de colonne dsigns
en bleu. Par exemple A[1][4] vaut 38.
2007/2008

Info2, 1re anne SM/SMI

54

Exemples : lecture d'une matrice




La saisie des lments d'une matrice :

Constante N=100 :entier


Variable
i, j, n, m : entier
tableau A[N][N] : rel
Dbut
ecrire("entrer le nombre de lignes et le nombre de colonnes :")
lire(n, m)
Pour i allant de 0 n-1
crire ("saisie de la ligne ", i + 1)
Pour j allant de 0 m-1
crire ("Entrez l'lment de la ligne ", i + 1, " et de la colonne ", j+1)
lire (A[i][j])
FinPour
FinPour
Fin
2007/2008

Info2, 1re anne SM/SMI

55

Exemples : affichage d'une matrice




Affichages des lments d'une matrice :

Constante N=100 : entier


Variable
i, j, n,m : entier
tableau A[N][N], B[N][N], C[N][N] : rel
Dbut
ecrire("entrer le nombre de lignes et le nombre de colonnes :")
lire(n, m)
Pour i allant de 0 n-1
Pour j allant de 0 m-1
crire ("A[",i, "] [",j,"]=", A[i][j])
FinPour
FinPour
Fin

2007/2008

Info2, 1re anne SM/SMI

56

Initialisation de matrice
Pour initialiser une matrice on peut utiliser par
exemple les instructions suivantes :
T1[3][3]
T2[3][3]
T3[4][4]
T4[4][4]

2007/2008

=
=
=
=

{{1,2,3}, {4,5,6}, {7,8,9}};


{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
{{1,2,3}, {4,5,6}, {7,8,9}};
{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Info2, 1re anne SM/SMI

57

Exemples : somme de deux matrices




Procdure qui calcule la somme de deux matrices :


Constante N =100 :entier
Variable
i, j, n : entier
tableau A[N][N], B[N][N], C[N][N] : rel
Dbut
ecrire("entrer la taille des matrices :")
lire(n)
Pour i allant de 0 n-1
Pour j allant de 0 m-1
C[i][j] A[i][j]+B[i][j]
FinPour
FinPour
Fin

2007/2008

Info2, 1re anne SM/SMI

58

Exemples : produit de deux


matrices
constante N=20 : entier
variables Tableau A[N][N],B[N][N],C[N][N],i,j,k,n,S : entier
dbut
crire("donner la taille des matrices(<20) :")
lire(n)
/* lecture de la matrice A */
pour i allant de 1 n faire
crire("donner les lments de la ",i," ligne:")
pour j allant de 1 n faire
lire(A[i][j])
finpour
finpour
/* lecture de la matrice B */
pour i allant de 1 n faire
crire("donner les lments de la ",i," ligne:")
pour j allant de 1 n faire
lire(B[i][j])
finpour
finpour
2007/2008

Info2, 1re anne SM/SMI

59

Exemples : produit de deux


matrices (suite)
/* le produit de C = A * B */
pour i allant de 0 n-1 faire
pour j allant de 0 n-1 faire
S0
pour k allant de 0 n-1 faire
S S + A[i][k]*B[k][j]
finpour
C[i][j] S
finpour
fipour
/* affichage de la matrice de C */
pour i allant de 0 n-1 faire
pour j allant de 0 n-1 faire
crire(C[i][j]," ")
finpour
crire("\n")
/* retour la ligne */
finpour
fin

2007/2008

Info2, 1re anne SM/SMI

60

Notion de complexit


Lexcution dun algorithme sur un ordinateur consomme des


ressources:
en temps de calcul : complexit temporelle
en espace-mmoire occup : complexit en espace

Seule la complexit temporelle sera considre pour valuer


lefficacit de nos programmes.
Le temps dexcution dpend de plusieurs facteurs :

Les donnes (trier 4 nombre ce nest pas trier 1000)


Le code gnr par le compilateur
La nature de la machine utilise
La complexit de lalgorithme.

Si T(n) dnote le temps dexcution dun programme sur un


ensemble des donnes de taille n alors :
2007/2008

Info2, 1re anne SM/SMI

61

Complexit dun algorithme




T(n)=c.n2 (c est une constante) signifie que lon estime


c.n2 le nombre dunits de temps ncessaires un
ordinateur pour excuter le programme.

Un algorithme "hors du possible" a une complexit


temporelle et/ou en espace qui rend son excution
impossible
exemple: jeu dchec par recherche exhaustive de
tous les coups possibles
1019 possibilits, 1 msec/poss. = 300 millions dannes

2007/2008

Info2, 1re anne SM/SMI

62

Complexit : exemple
crire une fonction qui permet de retourner le plus grand diviseur dun
entier.

Fonction PGD1( n: entier) : entier


Variables i :entier
Debut
in-1
Tantque (n%i !=0)
ii-1
finTantque
Retourner i

Fin

Fonction PGD2( n: entier) : entier


Variables i :entier
Debut
i2
Tantque ((i<sqrt(n))&&(n%i !=0))
ii+1
finTantque
si(n%i == 0) alors retourner (n/i)
sinon retourner (1)
finsi
Fin

Pour un ordinateur qui effectue 106 tests par seconde et n=1010 alors le
temps requis par PGD1 est dordre 3 heures alors que celui requis par
PGD2 est dordre 0.1 seconde
2007/2008

Info2, 1re anne SM/SMI

63

Complexit : notation en O


La complexit est souvent dfinie en se basant sur le pire des cas ou


sur la complexit moyenne. Cependant, cette dernire est plus
dlicate calculer que celle dans le pire des cas.
De faon gnral, on dit que T(n) est O(f(n)) si c et n0 telles que
nn0, T(n) c.f(n). Lalgorithme ayant T(n) comme temps dexcution
a une complexit O(f(n))
lim
T(n)/ f(n) <= c
n -> +

La complexit croit en fonction de la taille du problme


Lordre utilis est lordre de grandeur asymptotique
Les complexits n et 2n+5 sont du mme ordre de grandeur
n et n2 sont dordres diffrents
2007/2008

Info2, 1re anne SM/SMI

64

Complexit : rgles


1- Dans un polynme, seul le terme de plus haut degr


compte.

Exemple : n3+1006n2+555n est O(n3)

2- Une exponentielle lemporte sur une puissance, et cette


dernire sur un log. Exemple: 2n+n100 est O(2n) et 300lg(n)+2n est
O(n)

3- Si T1(n) est O(f(n)) et T2(n) est O(g(n)) alors


T1(n)+T2(n) est O(Max(f(n),g(n))) et T1(n).T2(n) est
O(f(n).g(n))

Les ordres de grandeur les plus utilises :

O(log n), O(n), O(n log n), O(nk), O(2n)

2007/2008

Info2, 1re anne SM/SMI

65

La complexit asymptotique
Supposons que lon dispose de 7 algorithmes dont les complexits dans le
pire des cas sont dordre de grandeur 1, log2n, n, nlg2n, n2, n3, 2n et un
ordinateur capable deffectuer 106 oprations par seconde. Le tableau suivant
montre lcart entre ces algorithmes lorsque la taille des donnes croit :
Complexit

log2n

n
log2n

n2

n3

2n

N=102

1s 6.6s

0.1ms 0.6ms 10ms 1s

4.1016a

N= 103

1s 9.9s

1ms

N=104

9.9ms 1s

16.6mn

! (>10100)

1s 13.3s 10ms

0.1s

100s

11.5j

N= 105

1s 16.6s 0.1s

1.6s

2.7h

31.7a

N= 106

1s 19.9s 1s

19.9s

11.5j

31.7103a !

2007/2008

Info2, 1re anne SM/SMI

66

Tableaux : recherche dun lment




Pour effectuer la recherche dun lment dans un tableau, deux


mthodes de recherche sont considres selon que le tableau est tri
ou non :

La recherche squentielle pour un tableau non tri


La recherche dichotomique pour un tableau tri

La recherche squentielle
Consiste parcourir un tableau non tri partir du dbut et
sarrter ds quune premire occurrence de llment sera
trouve. Le tableau sera parcouru du dbut la fin si llment ny
figure pas.

2007/2008

Info2, 1re anne SM/SMI

67

Recherche squentielle : algorithme




Recherche de la valeur x dans un tableau T de N lments :


Variables i: entier, Trouve : boolen

i0 , Trouve Faux
TantQue (i < N) ET (not Trouve)
Si (T[i]=x) alors
Trouve Vrai
Sinon
ii+1
FinSi
FinTantQue
Si Trouve alors // c'est quivalent crire Si Trouve=Vrai alors
crire ("x est situ dans la "+i+ "eme position du
tableau ")
Sinon
crire ("x n'appartient pas au tableau")
FinSi

2007/2008

Info2, 1re anne SM/SMI

68

Recherche squentielle : complexit




Dans le pire des cas on doit parcourir tout le tableau.


Ainsi, la complexit est de lordre de O(n).

Si le te tableau est tri la recherche squentielle peut


sarrter ds quon rencontre un lment du tableau
strictement suprieur llment recherch.

Si tous les lments sont plus petits que llment


recherch lensemble du tableau est parcouru. Ainsi la
complexit reste dordre O(n)

2007/2008

Info2, 1re anne SM/SMI

69

Recherche dichotomique


Dans le cas o le tableau est tri (ordonn), on peut amliorer


l'efficacit de la recherche en utilisant la mthode de recherche
dichotomique

Principe : diviser par 2 le nombre d'lments dans lesquels on


cherche la valeur x chaque tape de la recherche. Pour cela on
compare x avec T[milieu] :

Si x < T[milieu], il suffit de chercher x dans la 1re moiti du


tableau entre (T[0] et T[milieu-1])

Si x > T[milieu], il suffit de chercher x dans la 2me moiti du


tableau entre (T[milieu+1] et T[N-1])
On continue le dcoupage jusqu un sous tableau de taille 1

2007/2008

Info2, 1re anne SM/SMI

70

Recherche dichotomique


On utilise lordre pour


anticiper labandon dans une recherche linaire,
guider la recherche : recherche par dichotomie.
0
petit

Oui !
Chercher X dans
[ 0 .. (n-1)/2- 1 ]

(n-1)/2

n-1

moyen

grand

X < moyen

Non !
Chercher X dans
[ (n-1)/2 .. n-1 ]

X
2007/2008

Info2, 1re anne SM/SMI

71

Recherche dichotomique :
algorithme
inf0 , supN-1, Trouve Faux
TantQue (inf <=sup) ET (not Trouv)
milieu(inf+sup) div 2
Si (x<T[milieu]) alors supmilieu-1
Sinon Si (x>T[milieu]) alors infmilieu+1
Sinon Trouve Vrai
FinSi
FinSi
FinTantQue
Si Trouve alors crire ("x appartient au tableau")
Sinon
crire ("x n'appartient pas au tableau")
FinSi

2007/2008

Info2, 1re anne SM/SMI

72

Recherche dichotomique : exemple




Considrons le tableau T :

Si la valeur cherch est 16 alors les indices inf, sup et milieu vont voluer
comme suit :
inf
0 5 5 6

sup

12 15

17 27 29 37

milieu 4

Si la valeur cherch est 9 alors les indices inf, sup et milieu vont voluer
comme suit :
inf
0 0 2
sup

2007/2008

milieu 4

Info2, 1re anne SM/SMI

73

Recherche dichotomique : complexit








A chaque itration, on divise les indices en 3 intervalles :


[inf, milieu-1]
milieu
[milieu+1, sup]
Cas 1 : milieu-inf (inf+sup)/2 - inf (sup-inf)/2
Cas 3 : sup-milieu sup -(inf+sup)/2 (sup-inf)/2
On passe dons successivement un intervalle dont le nombre
dlments n/2, puis n/4, puis n/8, A la fin on obtient un intervalle
rduit 1 ou 2 lments.
Le nombre dlments la k ime itration est : ()k-1n donc 2k n soit
k log2n
Il y a au plus log2n itrations comportant 3 comparaisons chacune.
La recherche dichotomique dans un tableau tri est dordre O(log2n)

2007/2008

Info2, 1re anne SM/SMI

74

Tri d'un tableau




Le tri consiste ordonner les lments du tableau


dans lordre croissant ou dcroissant

Il existe plusieurs algorithmes connus pour trier les


lments dun tableau :

Le tri par slection-change


Le tri par insertion
Le tri rapide

Nous verrons dans la suite les trois algorithmes de


tri. Le tri sera effectu dans l'ordre croissant

2007/2008

Info2, 1re anne SM/SMI

75

Tri par slection-change




Principe : Cest daller chercher le plus petit lment du tableau pour le mettre
en premier, puis de repartir du second, daller chercher le plus petit lment
pour le mettre en second etc
Au i-me passage, on slectionne le plus petit lment parmi les positions i..n
et on l'change ensuite avec T[i].

Exemple :

9 6

tape 1: on cherche le plus petit parmi les 5 lments du tableau. On lidentifie en


troisime position, et on lchange alors avec llment 1 :

2 6

tape 2: on cherche le plus petit lment, mais cette fois partir du deuxime
lment. On le trouve en dernire position, on l'change avec le deuxime:

2 5

2 5

tape 3:

2007/2008

Info2, 1re anne SM/SMI

76

Tri par slection-change : algorithme




Supposons que le tableau est not T et sa taille N


Pour i allant de 0 N-2
Fin n-2 !
indice_ppe i
Pour j allant de i + 1 N-1
Chercher lindice du
Si T[j] <T[indice_ppe] alors
plus petit partir de i.
indice_ppe j
Finsi
FinPour
temp T[indice_ppe]
T[indice_ppe] T[i]
Echange, mme si i = indice_ppe.
T[i] temp
FinPour

2007/2008

Info2, 1re anne SM/SMI

77

Tri par slection-change : complexit





On fait n-1 fois, pour i de 0 n-2 :


Un parcours de [i..n-1].
Il y a donc un nombre de lectures qui vaut :

(n-i) = 0 (n2)

i=0..n-2

Tri en complexit quadratique.

2007/2008

Info2, 1re anne SM/SMI

78

Tri par insertion


la ime tape :
 Cette mthode de tri insre le ime lment T[i-1] la bonne
place parmi T[0], T[2]T[i-2].
 Aprs ltape i, tous les lments entre les positions 0 i-1
sont tris.
 Les lments partir de la position i ne sont pas tris.

Pour insrer llment T[i-1] :





Si T[i-1] T[i-2] : insrer T[i-1] la ime position !


Si T[i-1] <T[i-2] : dplacer T[i-1] vers le dbut du tableau
jusqu la position j i-1 telle que T[i-1] T[j-1] et linsrer en
position j.
2007/2008

Info2, 1re anne SM/SMI

79

Tri par insertion


Valeurs
Plus grand :
insr en position i !

Non tries et
quelconques

Tries

0
2007/2008

i-1

Info2, 1re anne SM/SMI

n-1

80

Tri par insertion


Valeurs

Non tries et
quelconques

Tries

0
2007/2008

i-1

n-1
Plus petit :
Linsrer gauche.

Info2, 1re anne SM/SMI

81

Tri par insertion : exemple

tape 1: on commence partir du 2 ime lment du tableau


(lment 4). On cherche linsrer la bonne position par
rapport au sous tableau dj tri (form de llment 9) :
9 4

4 9

tape 2: on considre llment suivant (1) et on cherche


linsrer dans une bonne position par rapport au sous tableau
tri jusqu ici (form de 4 et 9):
4 9

1 4

tape 3:

1 4

tape 4:

1 3

7 9

2007/2008

Info2, 1re anne SM/SMI

82

Tri par insertion : algorithme




Supposons que le tableau est not T et sa taille N


Pour i allant de 1 N-1
le premier lment est
decaler vraie; j i
forcment sa place
Tantque ((j >0) et (decaler))
Si T[j] <T[j-1] alors temp T[j] On change aussi
T[j] T[j-1] longtemps que cela
T[j-1] temp est possible
sinon decaler faux
Finsi
jj-1;

FinTantque
FinPour
2007/2008

Info2, 1re anne SM/SMI

83

Tri par insertion : la complexit





On fait n-1 fois, pour i de 1 n-1 :


Jusqu i changes au maximum (peut-tre moins).
Le nombre dchanges peut donc atteindre :

i = 0 (n2)

i=1..n-1

Tri en complexit quadratique.

2007/2008

Info2, 1re anne SM/SMI

84

Tri rapide


Le tri rapide est un tri rcursif bas sur l'approche "diviser pour rgner"
(consiste dcomposer un problme d'une taille donne des sous
problmes similaires mais de taille infrieure faciles rsoudre)

Description du tri rapide :

1) on considre un lment du tableau qu'on appelle pivot

3) on rpte rcursivement ce partitionnement sur chacun des


sous tableaux cres jusqu' ce qu'ils soient rduits un seul
lment

2) on partitionne le tableau en 2 sous tableaux : les lments


infrieurs ou gaux au pivot et les lments suprieurs au pivot. on
peut placer ainsi la valeur du pivot sa place dfinitive entre les
deux sous tableaux

2007/2008

Info2, 1re anne SM/SMI

85

Procdure Tri rapide


Procdure TriRapide(tableau T : rel par adresse, p, r: entier par
valeur)
variable q: entier
Si p <r alors
Partition(T,p,r,q)
TriRapide(T,p,q-1)
TriRapide(T,q+1,r)
FinSi
Fin Procdure
A chaque tape de rcursivit on partitionne un tableau T[p..r] en deux sous
tableaux T[p..q-1] et T[q+1..r] tel que chaque lment de T[p..q-1] soit
infrieur ou gal chaque lment de A[q+1..r]. L'indice q est calcul
pendant la procdure de partitionnement
2007/2008

Info2, 1re anne SM/SMI

86

Procdure de partition
Procdure Partition(tableau T :rel par adresse, p, r: entier par valeur,
q: entier par adresse )
Variables i, j: entier
pivot: rel
pivot T[p], ip+1, j r
TantQue (i<=j)
TantQue (i<=r et T[i] <=pivot) i i+1 FinTantQue
TantQue (j>=p et T[j] >pivot ) j j-1 FinTantQue
Si i <j alors
Echanger(T[i], T[j]), i i+1, j j-1
FinSi
FinTantQue
Echanger(T[j], T[p])
qj
Fin Procdure
2007/2008

Info2, 1re anne SM/SMI

87

Tri rapide : la complexit




Le tri rapide a une complexit moyenne dordre O(n log2n).

Dans le pire des cas, le tri rapide reste dordre O(n2)

Le choix du pivot influence largement les performances du tri


rapide

Le pire des cas correspond au cas o le pivot est chaque choix


le plus petit lment du tableau (tableau dj tri)

diffrentes versions du tri rapide sont proposs dans la littrature


pour rendre le pire des cas le plus improbable possible, ce qui
rend cette mthode la plus rapide en moyenne parmi toutes celles
utilises

2007/2008

Info2, 1re anne SM/SMI

88

Tri : Analyse de complexit




Tri insertion ou Tri


slection sont dordre
O(N2)

Si N=106 alors N2 = 1012


Et si on peut effectuer 106
oprations par seconde
alors lalgorithme exige
11,5 jours

2007/2008

Tri rapide est dordre


O(Nlog2N)

Si N=106 alors Nlog2N = 6N


Et si on peut effectuer 106
oprations par seconde
alors lalgorithme exige 6
secondes

Info2, 1re anne SM/SMI

89

Enregistrements


Les langages de programmation offrent, en plus des types de base


(entier, rel, boolen), dautres types de donnes appels
enregistrements.
Un enregistrement est un regroupement de donnes qui doivent tre
considrs ensemble.
Exemple: les fiches dtudiants. Chaque fiche est caractrise par :
un nom et prnom, numro dinscription, ensemble de notes
En pseudo-code : enregistrement FicheEtudiant
Debut nom, prenom : chaine de caractres
numero : entier
tableau notes[10] : rel
Fin
2007/2008

Info2, 1re anne SM/SMI

90

Enregistrements
Un enregistrement est un type comme les autres types.
 Ainsi la dclaration suivante :
f, g : FicheEtudiant
dfinit deux variables f et g enregistrements de type FicheEtudiant
 Lenregistrement FicheEtudiant contient plusieurs parties (champs), on
y accde par leur nom prcd dun point "." :
 f.nom dsigne le champ (de type chaine) nom de la fiche f
 f.notes[i] dsigne le champ (de type rel) notes[i] de la fiche f
 Pour dfinir les champs dun enregistrement, on crit :
f: FicheEtudiant
f.nom "XXXXX" f.prenom "YYYYY" f.numero 1256
f.notes[2] 12.5
 Les affectations entre enregistrement se font champ par champ


2007/2008

Info2, 1re anne SM/SMI

91

Utilisation des enregistrements


Procedure affiche(FicheEtudiant v)
debut
crire("No:",v.numero, "-",v.prenom)
Pour i allant de 0 v.notes.taille() faire
crire(v.notes[i], " ")
FinPour
finProcedure


Enregistrement Complexe
Debut re : rel
im: rel
Fin
2007/2008

Info2, 1re anne SM/SMI

92

Enregistrements : exemple
Fonction add( z1, z2 :Complexe par valeur) : Complexe
Debut Variable z: Complexe
z.re=z1.re+z2.re
z.im=z1.im+z2.im
retourne(z)
FinFonction
Programme principale
Variables u, v, w: Complexe
a, b, c, d : rel
Debut ecrire("Entrez 4 valeurs relles :")
lire(a,b,c,d)
u.re a u.im b
v.re c
v.im d
ww add(u,v)
ecrire("Somme( ,) = :", w.re,w.im)
Fin
2007/2008

Info2, 1re anne SM/SMI

93

Structures en C
Dclaration :
struct personne {
char nom[20];
char prenom[20];
int no_employe;
}
 Ce type de structure est utilis pour dclarer des variables de la
manire suivante : struct personne p1, p2;
 Accs aux membres : p1.nom="XAAA";p2.no_employe=20;
 Initialisation : struct personne p={"AAAA", "BBBB", 5644};
 Tableau de structure : struct personne T[100];


2007/2008

Info2, 1re anne SM/SMI

94

Vous aimerez peut-être aussi