Académique Documents
Professionnel Documents
Culture Documents
Module I132 :
Algorithmique et programmation 2
Pr. A. OUSSOUS
ahmed.oussous@fstm.ac.ma
Parcours MIP (S3)
19 septembre 2022
1
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
La programmation modulaire
(les fonctions)
2
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Introduction
3
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Introduction
4
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Exemples de dénition et d'utilisation des fonctions
La fonction mathématique suivante
f : R × R −→ R
(x, y ) −→ x + y
est dénie en langage c par :
main () {
float f ( float , float ) ; /* D é claration de f */
float z ;
z = f (5 ,4) ; /* Appel de la fonction f */
printf ( " % f " ,z ) ;
}
/* D é finition de la fonction f */
float f ( float x , float y ) {
float r ;
r = x+y;
return r ;
}
5
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Exemples de dénition et d'utilisation des fonctions
si x ≥ 0
(
x
x −→
−x sinon
7
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Exemples de dénition et d'utilisation des fonctions
2ème méthode :
float absolue ( float x ) {
if (x >=0)
return x ;
else
return -x ;
}
L'instruction return peut apparaître à plusieurs reprises dans une
fonction.
L'instruction return peut mentionner n'importe quelle expression.
Exemple : la fonction f dénie plus haut peut être dénie comme
suit :
float f ( float x , float y ) {
return x + y ;
}
8
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Exemples de dénition et d'utilisation des fonctions
En plus de retourner la valeur, return interrompt également l'exécu-
tion de la fonction en revenant dans la fonction qui l'a appelée.
float absolue ( float x ) {
if (x >=0) {
return x ;
printf ( " Positif " ) ;
}
else {
return -x ;
printf ( " N é gatif " ) ;
}
}
I Les instructions printf("Positif") et printf("Négatif") ne seront
jamais éxecutées. D'où la dénition suivante :
float absolue ( float x ) {
if (x >=0) return x ;
return -x ;
9
}
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Exemples de dénition et d'utilisation des fonctions
Fonction sans valeur de retour et sans arguments :
void Bienvenue () { /* Message de bienvenue */
printf ( " Bienvenue chers clients " ) ;
Fonction avec arguments et sans valeur de retour :
void Bienvenue ( int n ) { /* Bienvenue n fois */
int i ;
for ( i =1; i <= n ; i ++)
printf ( " Bienvenue chers clients \ n " ) ;
}
Fonction avec valeur de retour et sans arguments :
double pi () { /* Valeur approximative de pi */
return 3 ,141592653589793238462643383279;
}
Remarque : main est une fonction sans argument et sans valeur
de retour. Elle devrait donc avoir pour en-tête void main(void).
Certains compilateurs fournissent un warning sinon. 10
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les variables globales
Les variables globales sont des variables déclarées à l'extérieur de
toute fonction.
Elles ne sont connues que dans la partie du programme source
suivant leur déclaration.
Elles sont partagées par plusieurs fonctions.
Exemple :
int n ;
main () {
I La variable n peut être utilisée dans toutes
....
} les fonctions.
int p ; I La variable p ne peut être utilisée que dans
void f () { les fonctions f et g .
....
}
void g () {
....
}
11
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les variables locales
Les variables locales sont des variables déclarées au sein d'une fonc-
tion (qui pouvait être main).
Elles ne sont connues qu'à l'intérieur de la fonction où elles
sont déclarées.
I Leur portée est donc limitée à cette fonction.
Elles n'ont aucun lien avec d'autres variables locales d'autres
fonctions.
Exemple :
I La variable p de main n'a aucun rapport
int n ; avec la variable p de f .
main () {
I La variable n de f n'a aucun rapport avec
int p ;
.... la variable globale n.
} I Il impossible d'utiliser la variable global n
void f () { dans f .
int p ;
int n ;
}
12
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les variables locales : exemple
Les variables locales ont une durée de vie limitée à celle d'une
exécution de la fonction dans laquelle elles gurent.
Un nouvel espace mémoire leur est alloué à chaque entrée dans la
fonction et libéré à chaque sortie.
⇒ Les valeurs des variables locales ne sont pas conservées d'un
appel au suivant. Classe d'allocation automatique
I Pour conserver la valeur d'une variable locale d'un appel au sui-
vant, il sut de la déclarer à l'aide du mot-clé static .
⇒ Les variables locales de classe statique sont, par défaut,
initialisées à zéro.
14
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les variables locales statiques
Ecrire :
- une fonction, nommée f1, se contentant d'acher "bonjour" (elle
ne possédera aucun argument ni valeur de retour),
- une fonction, nommée f2, qui ache "bonjour" un nombre de fois
égal à la valeur reçue en argument (int) et qui ne renvoie aucune
valeur,
- une fonction, nommée f3, qui fait la même chose que f2, mais qui,
de plus, renvoie la valeur (int) 0.
Ecrire un petit programme appelant successivement chacune de ces
trois fonctions, après les avoir convenablement déclarées sous forme
d'un prototype
16
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Solution
void f1 ( void )
{ printf ( " bonjour \ n " ) ;
}
void f2 ( int n )
{ int i ;
for ( i =0 ; i < n ; i ++)
printf ( " bonjour \ n " ) ;
}
int f3 ( int n )
{ int i ;
for ( i =0 ; i < n ; i ++)
printf ( " bonjour \ n " ) ;
return i ;
}
17
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Solution
main ()
{
void f1 ( void ) ;
void f2 ( int ) ;
int f3 ( int ) ;
f1 () ;
f2 (3) ;
f3 (3) ;
}
18
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Exercice
19
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Exercice
20
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Solution
23
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Solution
/* ou bien */
24
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les fonctions récursives
(−→ N
fact : N long fact ( long n ) {
1 si n = 0 if ( n ==0)
n −→ return 1;
n × fact(n − 1) sinon return n * fact (n -1) ;
}
25
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les fonctions récursives et itératives
U0 = 2
(
Un = Un−1 + 3 si n 1
Fonction itérative :
int u ( int n ) {
int i , s ;
s =2;
for ( i =1; i <= n ; i ++)
s = s +3 ;
return s ;
}
26
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les fonctions récursives et itératives
Un = Un−1 + 3 si n 1
Fonction récursive :
int u ( int n ) {
if ( n ==0)
return 2 ;
return u (n -1) +3 ;
}
27
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les fonctions récursives et itératives
30
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les fonctions
Les fonctions récursives et itératives : exercice
int main () {
int a = 3;
printf ( " la somme de la suite est % d " , somme (
a));
return 0;
}
31
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
32
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Déclaration :
int t [20] ;
I Cette déclaration réserve l'emplacement pour 20 éléments de type
int dont chaque élément est repéré par sa position dans le tableau,
nommée indice .
I La première position porte le numéro 0. Ici, donc, les indices vont
de 0 à 19.
I Le premier élément du tableau sera désigné par t[0], le troisième
par t[2], le dernier par t[19].
I Attention au débordement d'indice : Désigner un indice au delà
du tableau implique un accès à un emplacement situé avant ou après
le tableau.
34
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux
36
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux
Exemple :
# include < stdio .h >
main () {
int i , som ;
float moy ;
int t [5] ;
/* Lecture des notes */
for ( i =0 ; i <5 ; i ++) {
printf ( " Note No % d : " , i +1) ;
scanf ( " % d " , & t [ i ]) ;
}
/* Calcul de la somme des notes */
for ( i =0 , som =0 ; i <5 ; i ++)
som += t [ i ] ;
moy = som /5 ; /* Calcul de la moyenne */
printf ( " Moyenne classe : %.2 f \ n " , moy ) ;
}
37
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux
Supposons que le nombre d'étudiant a changé ⇒ plusieurs modi-
cations à faire, d'ou l'intérêt d'utiliser les constantes.
# include < stdio .h >
# define N 10
main () {
int i , som ;
float moy ;
int t [ N ] ;
/* Lecture des notes */
for ( i =0 ; i < N ; i ++) {
printf ( " Note No % d : " , i +1) ;
scanf ( " % d " , & t [ i ]) ;
}
/* Calcul de la somme des notes */
for ( i =0 , som =0 ; i < N ; i ++) som += t [ i ] ;
moy = som / N ; /* Calcul de la moyenne */
printf ( " Moyenne classe : % f \ n " , moy ) ;
} 38
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux à plusieurs indices (Les matrices)
Déclaration :
int M [4][3];
I Cette déclaration réserve un tableau de 12 (4 x 3) entiers.
I Un élément de ce tableau est repéré par deux indices comme dsuit :
M [ indice_ligne ][ indice_colonne ]
I Attention au débordement d'indice.
Exemples :
int i =2 , j =1;
12 3 43
M [0][0] ; --> 12
M [ i + j ][0] ; --> 8
7 5 6
4 13 1
M [ j ][ i ] ; --> 6
M [ i + j ][ i ] ; --> 9 8 16 9
39
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Initialisation des tableaux à un indice
40
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux : exemple
41
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux : exemple
42
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Initialisation des tableaux à deux indices
44
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux - Solution
return 0;
}
46
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux - Exerice
47
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux - solution
48
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux - solution
49
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les pointeurs : L'opérateur &
Nous avons déjà rencontré l'opérateur & dans la fonction scanf pour
désigner l'adresse d'une variable.
D'une manière générale, il est possible de manipuler des adresses par
l'intermédiaire de variables nommées pointeurs.
Exemple :
int * ad ; /* D é claration du pointeur ad */
int n ;
n = 20;
ad = & n ; /* Affectation de l ' adresse de n à ad */
* ad = 10 ;
Stocker la valeur 10 dans l'emplacement réservé pour n.
51
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les pointeurs
Exemples :
Soient les déclarations suivantes :
int * ad1 , * ad2 ;
int n = 10 , p = 20 ;
ad1 = &n ;
ad2 = &p ;
Les instructions suivantes sont équivalentes :
* ad1 = * ad2 + 2 ; ⇔ n = p + 2 ;
* ad1 ++ ; ⇔ n ++ ;
* ad1 = * ad2 ; ⇔ n = p ;
Aectation de pointeurs :
ad1 = ad2
* ad1 = 40 ; ⇔ p = 40 ;
* ad2 = 40 ; ⇔ p = 40 ;
52
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
exemple
Quelles seront les valeurs des variables i, j et p après exécution des
instructions suivantes ?
53
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
exemple
54
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les pointeurs : Incrémentation de pointeurs
Il faut noter qu'un pointeur est déni à la fois par une adresse en
mémoire et par un type (nombre d'octets pointés).
Soit la déclaration suivante :
int * ad1 , * ad2 ;
int n ;
L'expression suivante à un sens en langage c :
ad1 = & n ;
ad2 = ad1 + 1;
En eet, ad 1 est un pointeur sur un entier (4octets), l'expression
ad 1 + 1 (ad 2) représente l'adresse de l'entier suivant.
55
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les pointeurs : Incrémentation de pointeurs
56
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les pointeurs- Exercice
57
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les pointeurs- Solution
58
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Transmission des arguments d'une fonction : transmission par valeur
1 main () {
2 void echange ( int , int ) ;
3 int n =10 , p =20 ;
4 printf ( " avant appel : n =% d p =% d \ n " , n , p ) ;
5 echange (n , p ) ;
6 printf ( " apr è s appel : n =% d p =% d " , n , p ) ;
7 }
8 void echange ( int a , int b ) {
9 int aux ;
10 printf ( " d é but echange : a =% d b =% d \ n " , a , b ) ;
11 aux = a ;
12 a = b ;
13 b = aux ;
14 printf ( " fin echange : a =% d b =% d \ n " , a , b ) ;
15 }
avant appel : n=10 p=20
début echange : a=10 b=20
fin echange : a=20 b=10
après appel : n=10 p=20 59
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Transmission des arguments d'une fonction : transmission par adresse
1 main () {
2 void echange ( int , int ) ;
3 int n =10 , p =20 ;
4 printf ( " avant appel n =% d p =% d \ n " , n , p ) ;
5 echange (& n , & p ) ;
6 printf ( " apr è s appel n =% d p =% d " , n , p ) ;
7 printf ( " \ n \ n " ) ;
8 }
9 void echange ( int * ad1 , int * ad2 ) {
10 int aux ;
11 aux = * ad1 ;
12 * ad1 = * ad2 ;
13 * ad2 = aux ;
14 }
avant appel n=10 p=20
après appel n=20 p=10
60
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Transmission des arguments d'une fonction : transmission par valeur VS adresse
- Dans le passage par valeur,une copie des arguments réels est trans-
mise aux arguments formels respectifs.
- Dans le passage par adresse, l'emplacement (adresse) des argu-
ments réels est transmis à des arguments formels, toute modication
apportée aux arguments formels se reétera également dans les ar-
guments réels.
61
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Le nom de tableau est un pointeur constant : cas des tableaux à un indice
62
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Le nom de tableau est un pointeur constant : cas des tableaux à un indice
66
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Solutions
75
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les tableaux et les pointeurs
Les tableaux transmis en argument : cas des tableaux à plusieurs indices
Exemple : Somme de deux matrices : Le formalisme tableau
# include < stdio .h >
# define N 3
# define M 4
void somme ( int A [ N ][ M ] , int B [ N ][ M ] , int C [ N ][ M ])
{
int i , j ;
for ( i =0; i < N ; i ++)
for ( j =0; j < M ; j ++)
C [ i ][ j ]= A [ i ][ j ]+ B [ i ][ j ];
}
main () {
int A [ N ][ M ]={{6 ,3 ,8 ,2} ,{4 ,9 ,7 ,2} ,{5 ,3 ,6 ,1}};
int B [ N ][ M ]={{8 ,2 ,5 ,2} ,{5 ,8 ,3 ,4} ,{6 ,1 ,9 ,2}};
int C [ N ][ M ];
somme (A ,B , C ) ;
}
76
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les algorithmes de tri et de
recherche
77
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les algorithmes de tri et de recherche
Recherche sequentielle
79
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les algorithmes de tri et de recherche
Recherche dichotomique
80
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les algorithmes de tri et de recherche
Tri à bulles
⇒ Le principe du tri à bulles est de comparer deux à deux les éléments
adjacents et les permuter s'ils ne sont pas dans le bon ordre. On
répète le processus jusqu'à ce qu'il n'y ait plus de permutation.
void tri_bulle ( int * T , int n ) {
int i =0 , trie , aux , l = n ;
do { | 4 | 1 | 5 | 2 | 3 |
trie =1; | 1 | 4 | 5 | 2 | 3 |
for ( i =0; i <l -1; i ++) | 1 | 4 | 5 | 2 | 3 |
if ( T [ i ] > T [ i +1]) { | 1 | 4 | 2 | 5 | 3 |
aux = T [ i ]; | 1 | 4 | 2 | 3 | 5 |
T [ i ]= T [ i +1]; | 1 | 4 | 2 | 3 | 5 |
T [ i +1]= aux ; | 1 | 2 | 4 | 3 | 5 |
trie =0; | 1 | 2 | 3 | 4 | 5 |
}
l - -;
} while ( trie ==0) ;
}
81
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les algorithmes de tri et de recherche
Tri à bulles
82
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les algorithmes de tri et de recherche
Tri par sélection
84
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
85
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
C'est cette convention qu'utilise le compilateur pour représenter les
constantes chaîne sous des notations de la forme :
" bonjour "
Une telle notation sera traduite par le compilateur en un pointeur
(de type char ∗) sur la zone mémoire correspondante.
Exemple :
# include < stdio .h >
main () {
char * adr ;
adr = " Bonjour " ;
while (* adr ) {
printf ( " % c " , * adr ) ;
adr ++ ;
}
}
Bonjour
86
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Tableaux de caractères
87
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Tableaux de caractères
Remarque :
Comme pour les tableaux numériques, il n'est pas autorisé d'initialiser
une chaîne de caractères par une déclaration comme dans l'exemple
suivant :
char ch [20] ;
ch = " bonjour " ;
En eet, ch est une adresse constante.
88
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Tableaux de pointeurs sur des chaînes
Comme une chaîne de caractères est traduite par le compilateur en
un pointeur qui contient son adresse, il est possible de généraliser ce
principe à un tableau de pointeurs comme dans l'exemple suivant :
char * jour []={ " lundi " ," mardi " ," mercredi " ," jeudi
" ," vendredi " ," samedi " ," dimanche " };
Cette déclaration réalise donc à la fois la création des 7 chaînes
constantes correspondant aux 7 jours de la semaine et l'initialisation
du tableau jour avec les 7 adresses de ces 7 chaînes.
89
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Tableaux de pointeurs sur des chaîne
90
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Lecture et écriture de chaînes
91
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Lecture et écriture de chaînes
93
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Les fonctions strcpy et strncpy
94
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Les fonctions strcpy et strncpy
Exemple :
# include < stdio .h >
# include < string .h >
main () {
char ch1 []= " *************** " ;
char ch2 []= " Bonjour " ;
char ch3 []= " *************** " ;
char ch4 []= " Bonjour " ;
95
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Les fonctions strcmp et strncmp
96
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Les fonctions strcmp et strncmp
Exemple :
# include < stdio .h >
# include < string .h >
main () {
char * s1 , * s2 , * s3 ;
s1 = " ABCD " ;
s2 = " EFGHIJ " ;
s3 = " ABCDEFGHIJK " ;
printf ( " % d \ n " , strcmp ( s3 , s1 ) ) ; ---> 69
printf ( " % d \ n " , strcmp ( s1 , s3 ) ) ; ---> -69
printf ( " % d \ n " , strncmp ( s1 , s3 ,4) ) ; ---> 0
printf ( " % d \ n " , strcmp ( s1 , s1 ) ) ; ---> 0
}
97
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Les fonctions strcat et strncat
98
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Les fonctions strcat et strncat
Exemple :
# include < stdio .h >
# include < string .h >
main () {
char ch1 [50] = " Bonjour " ;
char * ch2 = " Monsieur " ;
char ch3 [50] = " Bonjour " ;
99
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Les fonctions strchr et strrchr
100
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Exercices
101
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chaînes de caractères
Solution
int main () {
int nbCar ;
char tNom [30];
nbCar = 0;
while ( tNom [ nbCar ] != ' \0 ') {
nbCar ++;
}
return 0;
}
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
103
Les structures
104
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Introduction
105
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Déclaration
Exemple :
struct complexe {
float re ;
float im ;
};
Celle-ci dénit un modèle de structure mais ne réserve pas de
variables correspondant à cette structure.
Ce modèle s'appelle ici complexe et il précise le nom et le type de
chacun de ses "champs" (re , im).
Exemple de déclarations :
struct complexe z1 , z2 ;
Cette instruction réserve un emplacement nommé z 1 et z 2 de type
complexe.
Initialisation d'une structure :
struct complexe z = {2.3 , 5.4};
106
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Utilisation d'une structure
107
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Utilisation d'une structure
De même pour :
typedef int * pointeur ;
signie que pointeur est synonyme de int∗. de sorte que les déclara-
tions suivantes sont équivalentes :
int * p1 , * p2 ; ⇔ pointeur p1 , p2 ;
109
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Synonymes avec typdef
110
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Exemple
111
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Exemple
typedef struct {
char nom [ 10 ];
int heures ;
float salaire ;
} Employe ;
Création des variables de type "structure" :
struct employe dupont ; // ( instruction qui cr é e
la variable dupont de type employe )
112
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Structure comportant des tableaux
typedef struct {
char nom [30] ;
char prenom [30] ;
float notes [5] ; /* Notes d ' un é tudiant */
int age ;
} Etudiant ;
Etudiant E1 , E2 ;
Cette déclaration réserve les emplacements pour deux structures
nommées E 1 et E 2. Ces dernières comportent trois champs :
nom qui est un tableau de 30 caractères,
pr nom qui est un tableau de 30 caractères,
notes qui est un tableau des 5 notes obtenues par l'étudiant.
age qui de type entier
Exemples d'utilisation :
E1 . notes [1]; /* deuxi è me note de E1 */
E2 . nom [4]; /* cinqi è me caract è re du nom de E2 */
113
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Tableau de structures
typedef struct {
int x ;
int y ;
} point ;
point courbe [50] ;
La structure point représente un point d'un plan et qui est déni par
ses deux coordonnées x et y .
la notation :
courbe [ i ]. x ;
désigne la valeur du champ x de l'élément de rang i du tableau
courbe.
Par ailleurs :
courbe [4] ;
représente la structure de type point correspondant au cinquième
élément du tableau courbe. 114
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Imbrication de structures
115
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Pointeur sur une structure : l'opérateur −→
typedef struct {
float re ;
float im ;
} complexe ;
complexe somme ( complexe z1 , complexe z2 ) {
complexe z ;
z . re = z1 . re + z2 . re ;
z . im = z1 . im + z2 . im ;
return z ;
}
void afficher ( complexe z ) {
printf ( " %.2 f + i %.2 f " ,z . re , z . im ) ;
}
main () {
complexe c1 ={3.5 ,6.5} , c2 ={4.2 ,7.9} , c ;
c = somme ( c1 , c2 ) ;
afficher ( c ) ; --> /* 7.70 + i 14.40 */
}
118
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Exemples
120
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Solution
struct point {
float x ;
float y ;};
int main () {
struct point A , B ;
float dist ;
printf ( " Entrez les coordonn é es du point A :\ n " ) ;
scanf ( " % f % f " ,& A .x ,& A . y ) ;
printf ( " Entrez les coordonn é es du point B :\ n " ) ;
scanf ( " % f % f " ,& B .x ,& B . y ) ;
dist = sqrt ( ( A .x - B . x ) *( A .x - B . x ) + ( A .y - B . y ) *( A
.y - B . y ) ) ;
printf ( " La distance entre les points A et B est
: %.2 f \ n " , dist ) ;
}
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
121
Les structures
Exercices
122
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les structures
Solution
typedef struct {
int jour ;
char mois [10];
int annee ;
} DATE ;
DATE date ;
date = LireDate () ;
AfficheDate ( date ) ;
return 0;
124
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers
125
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers
Introduction
Un chier est un ensemble d'informations stockées sur une mémoire
de masse (disque dur, clé USB, disquette, CD-ROM, etc).
⇒ Types de chiers :
Les chiers textes : les informations sont stockées sous forme
de caractères lisibles par tout éditeur de texte.
Les chiers binaires : les informations sont stockées en binaire
et ne peuvent être lues qu'avec le logiciel adéquat (image,
vidéo, son, etc).
⇒ Modes d'accès aux chiers :
Accès séquentiel : consiste à traiter les informations
"séquentiellement", c'est-à-dire dans l'ordre où elles
apparaissent dans le chier.
Accès direct : consiste à se placer immédiatement sur
l'information souhaitée, sans avoir à parcourir celles qui la
précèdent
126
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers
Introduction
127
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers texte
Ouverture
Cette fonction renvoie un pointeur sur le chier ouvert. Elle est dénie
dans le bibliothèque stdio.h.
nom : est une chaîne de caractères contenant le nom ou le
chemin du chier.
mode : désigne le type de traitement des données
"r" (read) : lecture (si le chier existe)
"w" (write) : écriture (le chier est crée s'il n'existe pas, sinon
il est écrasé)
"a" (append) : écriture (le chier est crée s'il n'existe pas) à la
n d'un chier existant.
128
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers texte
Ouverture
129
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers texte
Fermeture
130
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers texte : Ecriture dans un chier
La fonction fputc
131
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers texte : Ecriture dans un chier
La fonction fputs
132
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers texte : Ecriture dans un chier
La fonction fprintf
136
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers texte : Lecture d'un chier
La fonction fscanf
⇒ Lit dans un chier qui doit être écrit d'une manière bien précise.
⇒ Lit une suite de nombres séparés par des espaces.
# include < stdio .h >
main () {
FILE * fichier ;
int a ,b , c ;
fichier = fopen ( " test . txt " , " r " ) ;
fscanf ( fichier , " % d % d % d " , &a ,& b ,& c ) ;
printf ( " % d % d % d " ,a ,b , c ) ;
fclose ( fichier ) ;
}
137
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers texte
Positionnement dans un chier : la fonction fseek
⇒ Les diérentes fonctions d'entrées-sorties permettent d'accéder à
un chier en mode séquentiel, autrement-dit, les données du chier
sont lues ou écrites les unes à la suite des autres.
⇒ Il est possible d'accéder à un chier en mode direct, c'est-à-dire
que l'on peut se positionner à un endroit précis du chier.
Syntaxe : La fonction seek
fseek ( FILE * fichier , long deplacement , int
origine )
139
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers binaires
Ouverture
140
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Les chiers binaires
Lecture et Ecriture dans un bloc de données en binaire
# define N 100
void main () {
char * src = " test . bin " ;
int i , A [ N ] , B [ N ];
FILE * fichier ;
/* Remplissage du tableau */
for ( i =1; i < N ; i ++) A [ i ]= i ;
/* Ecriture du fichier au format binaire */
fichier = fopen ( src , " wb " ) ;
fwrite (A , sizeof ( int ) ,N , fichier ) ;
fclose ( fichier ) ;
/* Lecture du fichier */
fichier = fopen ( src , " rb " ) ;
fread (B , sizeof ( int ) ,N , fichier ) ;
fclose ( fichier ) ;
/* Affichage du tableau */
for ( i =0; i < N ; i ++) printf ( " % i " ,B [ i ]) ;
}
142
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
Gestion dynamique de la
mémoire
143
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
La gestion dynamique de la mémoire
144
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
La gestion dynamique de la mémoire
La fonction malloc
Exemple 1 :
char * adr ;
.....
adr = ( char *) malloc (50) ;
.....
for ( p = adr ; p < adr +50 ; p ++) * p = 'a ' ;
L'appel :
malloc (50)
alloue un emplacement de 50 octets et en fournit l'adresse en retour.
Ici, cette dernière est placée dans le pointeur adr .
145
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
La gestion dynamique de la mémoire
La fonction malloc
Exemple 2 :
long * adr , * p ;
.....
adr = ( long *) malloc (100 * sizeof ( long ) ) ;
.....
for ( p = adr , i =0 ; p < adr +100 ; p ++ , i ++) * p = i ;
Cette fois, nous avons alloué une zone de 100 * sizeof(long) octets.
Toutefois, nous l'avons considérée comme une suite de 100long . Pour
ce faire, on a placé le résultat de malloc dans un pointeur sur des
éléments de type long.
p ++
correspond à l'adresse contenue dans p, augmentée de sizeof (long ).
146
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2
La gestion dynamique de la mémoire
La fonction free dénie dans <stdlib.h>
L'un des intérêts essentiels de la gestion dynamique est de pouvoir
récupérer des emplacements dont on n'a plus besoin. Le rôle de la
fonction free est de libérer un emplacement préalablement alloué.
Exemple :
# include < stdio .h >
# include < stdlib .h >
main () {
float * note ;
int N , k ;
float s =0;
printf ( " entrer le nombre de notes : " ) ;
scanf ( " % d " ,& N ) ;
note =( float *) malloc ( N * sizeof ( float ) ) ;
for ( k =0; k < N ; k ++) scanf ( " % f " , note + k ) ;
for ( k =0; k < N ; k ++) s = s +*( note + k ) ;
printf ( " somme des notes est :% f " ,s ) ;
free ( note ) ; /* Lib é ration de l 'é space m é moire */
} 147
Pr. A. OUSSOUS ahmed.oussous@fstm.ac.ma Module I132 : Algorithmique et programmation 2