Académique Documents
Professionnel Documents
Culture Documents
ET DE LA RECHERCHE SCIENTIFIQUE
UNIVERSITE DE LABÉ
FACULTE DES SCIENCES ET TECHNIQUES
DEPARTEMENT INFORMATIQUE
Page 1
1. VECTEURS& TABLEAUX
1.1. Notions de vecteur
En plus des variables de types simples, il arrive très souvent que l’on soit amené à
considérer un ensemble de variables de même type, auxquelles on accède soit
directement par leur numéro d’ordre, soit en les parcourant toutes dans l’ordre.
1.1.1. Définitions formelles
Soient :
- un ensemble quelconque : appelé ensemble des valeurs, noté par E,
- un entier n appelé nombre d’éléments du vecteur,
- un intervalle I de N tel que I=[1…n], avec n>=0.
Définition 1 : on appelle vecteur, une application V de I dans E où I est appelé ensemble
des indices.
Les éléments de E peuvent être des valeurs de type simple (entier, caractère, booléen et
chaîne de caractères). Mais ils peuvent être aussi de valeurs de type structuré,
composées de valeurs de type simple ou structuré.
Exemple 1 :
Type
tdate : structure
Jour, mois, an : entier ;
Fin structure ;
tpersonne : structure
Nom : chaîne(20) ;
Adresse : chaîne(20) ;
Naissance : tdate ;
Marié : booléen ;
Nb_enfants : entier ;
Finstructure ;
On vient de définir :
- un type tdate composé de trois nombres (jour, mois et an ) ,
- un type tpersonne composé d’un nom, d’une adresse(chaîne de 20 caractères au plus),
- une variable naissance de type tdate,
- une variable booléenne marié,
- une variable Nb-enfants, indiquant le nombre d’enfants de la personne.
On dit que personne comporte cinq champs : Nom, Adresse, Marié et Nb_enfants.
Pour sélectionner un champ on utilise la notation suivante :
nom de variable .nom du champ ;
Par exemple si Pers est une variable de type tpersonne, on écrira : Pers.Nom, Pers.
Adresse, Pers.Marié, Pers.Nb_enfants pour accéder aux différents champs de la variable
structurée Pers. Pour acceder aux sous-champs tdate , on écrit Pers.Naissance.an si nous
voulons accéder à l’année.
Page 2
Les variables Pers. Nom, Pers.Adresse … sont utilisées comme des variables
élémentaires de type donné.
Les éléments de E peuvent aussi être eux-mêmes des vecteurs et l’on pourra ainsi définir
des ensembles à plusieurs dimensions par exemple des matrices.
L’ensemble des indices I peut être vide (n=0), le vecteur est alors vide. L’indice le plus
petit (ici 1) s’appelle borne inférieure et le plus grand (ici n ) s’appelle borne supérieure.
La taille d’un vecteur est le nombre d’éléments de ce vecteur ou le nombre d’éléments
de l’ensemble des indices. Si I=[1…n], la taille du vecteur est égale à n.
1.1.2. Notations
- un vecteur est noté par le nom de la variable de type vecteur. Soit par exemple V.
- un élément d’un vecteur est noté V( i ) avec i[1…n].
- Schématiquement on représente un vecteur par :
Indice 1 2 3 n
V V( 1 ) V( 2 ) V( 3 ) ……………………
1.1.3. Indiçage
Soit un vecteur V[1…n] :
- pour tout indice ou index i [1…n ], l’opération d’indiçage notée V( i ) délivre la
valeur de l’élément d’indice i du vecteur ; cette valeur peut être affectée à une variable.
Par exemple
A V( i ). De même on peut ranger une valeur A dans le i-ème élément par affectation
V( i ) A.
- le résultat de V( i ) est indéfini si i [1…n].
Exemple 2 :
Indice 1 2 3 4 5 6
V A B Z A C D
A B A et alors B
Vrai Vrai Vrai
Vrai Faux Faux
Faux Non examiné Faux
Page 8
A B A ou sinon B
Vrai Non examiné Vrai
Faux Vrai Vrai
Faux Faux Faux
La valeur de l’opération C A ou sinon B est équivalente à celle que donnerait la
séquence :
Si A
Alors C Vrai
Sinon C B
Fsi
Remarques
1. la loi de Morgan peut s’écrire pour ces opérations :
non ( A et alors B ) = ( non A ) ou sinon ( non B )
non ( A ou sinon B ) = ( non A ) et alors ( non b ).
2. De nombreux langages de programmation implémentent ces opérations soit
directement ( « and then » et « or else » de ADA ; « && » et « » de C ) soit sous
forme d’options d’évaluation accélérée ( certains compilateurs de pascal ). S’ils
n’existent pas, on est amené à les simuler au moyen de valeurs booléennes.
L’algorithme s’écrit alors :
Fonction Accès( E V: vect ; E elem :t ) : booléen ;
Var i :entier ; trouve :booléen ;
Début
I 1 ; trouve : faux ;
Tant que (in) et alors ( V( i ) elem ) faire
I i +1
Fin tant que
Si i n
Alors trouve Vrai ;
Fsi ;
Accès trouve ;
Finfonction ;
1.2.3.2 Recherche d’un élément dans un vecteur ordonné ( trié )
Si tous les éléments consécutifs d’un vecteur vérifient la relation d’ordre
V( i – 1 ) V( i ) on dit que le vecteur est trié par ordre croissant. Dans la suite du
cours, sauf avis contraire, on appellera vecteur trié ou ordonné, un vecteur trié par ordre
croissant.
On admettra que le vecteur vide et que le vecteur ne contenant qu’un seul élément sont
triés.
D’où la définition :
- un vecteur vide ( n=0 ) est ordonné,
Page 9
- un vecteur contenant un seul élément ( n=1 ) est ordonné,
- un vecteur V( 1…n ) (n>1) est ordonné si i [2….n], V( i-1 ) V( i ).
1.2.3.2.1 L’algorithme vérifiant qu’un vecteur est trié.
Raisonnement : il suffit de comparer tous les couples de deux éléments consécutifs en
s’arrêtant dès qu’un couple ne vérifie pas la relation d’ordre V(i-1 ) V( i ). On peut
remarquer que cet algorithme est très semblable à celui de l’accès séquentiel Accès, mais
que la valeur retournée est « vrai » si et seulement si on a bien atteint i > n. Notons que
les cas n=0 et n=1 sont correctement traités puis que la valeur initiale de i est supérieure
à n dans ces cas.
Hypothèse : V( 1…i-1 ) est trié,
I > n+1 V( 1…n ) est trié résultat = vrai
I n, deux cas sont possibles :
- V( i – 1 ) > V( i ) V n’est pas trié résultat = faux,
- V( i - 1 ) V( i ) i = i+1 Hypothèse
D’où
- l’itération : tant que ( i n ) et alors ( V( i -1 ) V( i )) faire ….
- l’initialisation : i 2 ; Hypothèse.
- D’où la fonction :
- Fonction trié( E V(1….n ) : vect ) : booléen ;
- Var i : entier ;
Début
I2;
Tant que ( i n) et alors (V( i – 1 ) V( i )) faire
Ii+1;
Fin tant que
Si i > n
Alors trié vrai
Sinon trié faux
Fsi
Finfonction ;
1.2.3.2.2 Accès à un élément dans un vecteur trié.
On cherche un indice i [1…n ] tel que V( 1..i – 1 ) < elem V( i…n ) soit une
assertion.
Ensuite ne reste-t-il plus qu’à vérifier l’égalité elem = V( i ) pour savoir si elem est
présent ou non dans le vecteur trié.
Hypothèse : V( 1…i – 1 ) < elem ;
I = n + 1 elem V résultat = faux ;
I n ; deux cas sont possibles :
- V( i ) elem V( 1…i – 1 ) < elem V( i…n ), elem V elem = V( i ),
résultat = ( elem = V( i ));
- V( i ) < elem ii + 1 ; Hypothèse
Page 10
L’itération : tant que ( in ) et alors (V( i ) < elem ) faire ….
L’initialisation : i 1 ; Hypothèse.
D’où la fonction :
Fonction Accès_trié( E V : vect ; E elem :t ) : booléen
Var i :entier ;
Début
I 1;
Tant que ( in ) et alors V( i ) < elem faire
I i+1
Fin tant que
Si ( i n) et alors (V( i ) = elem)
Alors Accès_trié vrai
Sinon Accès_trié faux
Fsi
Finfonction ;
1.2.3.2.3 Recherche dichotomique
On cherche à écrire une fonction d’en-tête :
Fonction dicho( E V : vect ; E elem :t ) : booléen ;
Supposons le vecteur V( 1…n ) trié ( sans répétition et n 1 ) c’est à dire i [ 2…n ]
on a V( i-1 ) V( i ).
On va partitionner le vecteur V en trois sous vecteurs V( 1…m-1 ), V( m), V( m+1…n )
triés. Cette partition vérifie la relation : V( 1…m-1) V(m) V(m+1…n). En
comparant elem à V( m ), on peut décider , si elem n’est pas égal à V( m ), à quel sous
vecteur il appartient :
- à V( 1…m-1 ) si elem <V(m)
- à V(m+1…n) si elem > V(m).
on n’est alors amené au problème de recherche d’un élément dans un vecteur trié soit
V(1…m-1) soit V(m+1…n). Par contre si elem = V(m ), l’algorithme est terminé.
On n’est donc amené à déterminer une suite de sous vecteurs : V1, V2, …, Vk telle
que chaque sous vecteur Vi a un nombre d’éléments ( taille ) strictement inférieur à la
taille du sous vecteur précédent Vi-1. La suite des tailles est décroissante et bornée
inférieurement par zéro. Elle est donc convergente. Cette convergence se produit en
un nombre fini de pas puis que la suite est bornée par n-1.
En conclusion:
- soit on a trouvé un indice m tel que elem = V( m ) et l’algorithme est terminé.
- soit on a trouvé, en un nombre fini de pas, un sous vecteur vide, elem V et
l’algorithme est terminé.
En général, on choisit un indice m tel que la taille des deux sous vecteurs
V( 1…m-1 ) et V( m+1…n ) soit la même ( à un élément près ).
Page 11
La taille des vecteurs de la suite V1, V2, …., Vk est divisée par deux à chaque pas : n,
n/2, …., n/2k-1, on aura donc au plus « partie entière de log2(n) » sous vecteurs non
vides.
Exemple : si V est un vecteur de 9000 éléments, le nombre maximum de sous vecteurs
non vides sera égal à 13 ( 213 = 8192).
Construction de l’algorithme
Après un certain nombre de pas, on dispose d’un sous vecteur V( inf…sup) tel que
V(1 … inf – 1) < elem < V(sup +1….n)
1 inf m sup n
<elem ? ? ? ? ? >elem
on a deux cas :
- inf > sup ( inf = sup + 1 ) et comme V( 1… inf – 1 ) < elem < V( sup + 1 …. n )
alors inf =sup+1 elem V et l’algorithme est terminé.
- inf sup, on exécute l’action : m ( inf + sup ) div 2
Et ( V( inf … m –1) V( m ) V( m+1 … sup) est examiné. Ensuite on a trois
possibilités :
- elem = v( m ), l’algorithme terminé, elem V.
- elem < V( m ), on doit poursuivre la recherche dans V( inf … m – 1 ) ; on exécute
alors l’action sup m – 1 ; qui préserve l’assertion : elem < V( sup +1 … n)
- elem > V( m ), on doit poursuivre la recherche dans V( m+1… sup ) ; on exécute
alors l’action infm + 1 ; qui préserve l’assertion : V( 1… inf – 1 ) < elem.
L’assertion V( 1…inf – 1 ) < elem < V( sup +1 …n ) est donc bien préservée dans tous
les cas où l’on continue.
Initialisation : l’exécution des actions inf1 ; supn ; permet à V(1… inf – 1) < elem <
V( sup + 1 … n ) d’être un invariant.
Pour écrire l’itération, nous emploierons une variable booléenne « trouvé » initialisée à
« faux », qui deviendra « vrai » dès que nous aurons trouvé m tel que V( m ) = elem.
En résumé, le raisonnement est le suivant :
Hypothèse : V( 1…inf – 1 ) < elem < V( sup +1…n), non trouvé.
O n a deux cas :
- inf = sup +1 elem V résultat = faux et l’algorithme est terminé.
- Inf sup, on exécute l’action : m( inf + sup ) div 2 et trois possibilités peuvent
se présenter :
- V( m ) = elem elem V, trouvé vrai résultat vrai et l’algorithme est
terminé.
- V( m ) > elem sup m – 1 ; hypothèse ;
- V( m ) < elem inf m + 1 ; hypothèse.
Itération : tant que ( inf sup ) et non trouvé faire …
Initialisation : inf 1 ; sup n ; trouvé faux, Hypothèse.
L’algorithme est le suivant :
Page 12
Fonction dicho(E V : vect ; E elem :t ) : booléen
Var inf, sup, m :entier ; trouvé faux ;
Début
Inf 1 ; sup n ; trouvé faux ;
Tant que ( inf sup) et non trouvé faire
m ( inf + sup ) div 2 ;
si V( m ) = elem alors
trouvé vrai
sinon si V( m ) < elem alors
inf m + 1
sinon sup m – 1
fsi
fsi
fin tant que ;
dicho trouvé ;
finfonction ;
On peut également accélérer l’exécution de cet algorithme en ajoutant un test initial pour
savoir si elem est bien compris entre les deux éléments extrêmes du vecteur ; d’où :
Fonction dichobis( E V : vect ; E elem : t) : booléen ;
Var inf, sup, m :entier, trouvé : booléen ;
Début
Trouve : faux;
Si ( elemV( 1 )) et (elem V( n ))
Alors
Inf 1 ;
Sup n ;
Tant que( inf <= sup) et non(trouve) faire
M ( inf + sup )div 2 ;
Si V( m) = elem
Alors trouve vrai
Sinon si V( m)< elem
Alors inf m+1 ;
Sinon sup m – 1 ;
Fsi ;
Fsi ;
Fin tant que ;
Fsi ;
Dichobis trouvé;
Finfonction ;
Page 13
1.3 Tri des vecteurs
Soit un vecteur V(1…n) à valeurs dans un ensemble E de valeurs muni d’une relation
d’ordre notée <.
Trier un vecteur V consiste à construire un vecteur V’(1…n) tel que
- V’(1…n) soit trié
- V’ et V contiennent les mêmes éléments.
Le plus souvent V et V’ sont le même vecteur. On construit V’ en permutant entre eux
des éléments de V.
1.3.2 Tri par remplacement
Il consiste à sélectionner des minimums successifs dans le vecteur d’origine et à les
ranger au fur et à mesure dans un nouveau vecteur que l’on construit.
1.3.2.1 Méthode : on veut construire un vecteur Vtrié(1…n) à partir de
v(1…n) tel que Vtrié(i – 1) Vtrié(i), i [2..n].
Pour i = 2 , on a donc Vtrié(1) Vtrié(2…n), Vtrié(1) est donc égal à :
minimum(V(1…n)). Il faut maintenant substituer dans V, à la valeur du minimum
trouvé, une valeur qui ne sera plus atteinte par la suite, lors de la recherche d’un nouveau
minimum. Il suffit de prendre comme valeur de remplacement un majorant de V(1…n)..
Nous prenons à titre d’exemple le maximum des éléments de V(1…n) ;
Hypothèse : Vtrié(1…i-1) est trié, Vtrié(1…i-1) V(1…n), max=maximum(V(1…n)) ;
On a deux cas :
- i = n Vtrié(1..n) est trié, Vtrié(1…n-1) V(1…n), il suffit donc d’exécuter
Vtrié(n) max.
- i < n ; soit j tel que V(j) = minimum(V(1.n)) Vtrié(i) V(j) ; V(j) max ;
i i+1 ; hypothèse ;
itération : tant que i < n faire …
initialisation : i 1 ; max maximum(V(1…n)) ; Hypothèse.
Il faut donc écrire un algorithme de tri qui utilise deux fonctions ; :
- une fonction qui retourne la place de l’élément minimum du vecteur V ;
- une fonction qui retourne la valeur du plus grand élément de V .
1.3.2.2 algorithmes
1.3.2.2.1 La fonction indice minimum.
Raisonnement par récurrence:
Hypothèse : j [1…i – 1 ], V(j) V(1…i – 1) ;
- i = n+1 j [1…n], V(j) V(1…n) résultat = j ;
- in
- V(j) > V(i), j i ; i i+1 ; Hypothèse
- V(j) V(i) ; i i+1 ; Hypothèse
Itération : tant que i n faire
Initialisation : j 1 ; i 2 ; Hypothèse ; d’où la fonction :
Page 14
Fonction indmin(E V: vect) : entier ;
Var i, j :entier ;
Début
J 1 ; i 2 ;
Tant que i<= n faire
Si V(j) > V(i)
Alors j i
Fsi
I i +1 ;
Fin tant que
indminj ;
Fin fonction ;
1.3.2.2.2 La fonction maximum.
Le raisonnement par récurrence est très proche du précédent.
Hypothèse : max V(1…i-1), max V(1…i-1) ;
- i= n+1 maxV(1…n), max V(1…n) résultat = max.
- in
V(i) > max max V(i) ; i i +1 ; Hypothèse
V(i) max i i+1 ; Hypothèse
Itération : tant que i n faire …
Initialisation max V(1); i 2 ; Hypothèse ; d’où la fonction :
Fonction maximum( E V: vect) :t ;
Var i : entier ; max : t ;
Début
Max V(1) ; i 2 ;
Tant que i n faire
Si V(i) > max
Alors max V(i)
Fsi
I i+1 ;
Fin tant que
Maximum max ;
Fin fonction ;
Page 15
1.3.2.2.3 la procédure tri remplacement ;
Page 16
Fonction indmin(E V: vect) : entier ;
Var k, j : entier ;
Début
Ji ; k i+1
Tant que k n faire
Si V(j) > V(k)
Alors j k
Fsi
K k+1 ;
Fintant que
Indmin j ;
Fin fonction ;
1.3.3.2.1 procédure permutation :
procédure permut( E/S a,b : t) ;
var aux : t ;
Début
Aux a ; a b ; b aux ;
Fproc ;
1.3.3.2.2 procédure tri permutation :
procédure tripermutation( E/S V: vect) ;
var i, j :entier ;
Début
I1 ;
Tant que i < n faire
J indmin( V( i…n )) ;
Si j> i
Alors permut( V( i ), V( j ))
Fsi
I i+1 ;
Fin tant que
Fin procédure ;
1.3.4.2 Algorithmes
L’algorithme de remontée s’écrit :
J n ;
Tant que j > i faire
Si V( j – 1 ) > V( j )
Alors permut( V( j ), V( j – 1 ))
Fsi
J j – 1 ;
Fin tant que
Le raisonnement du tri complet sera alors :
Hypothèse : V(1…i – 1 ) trié, V( 1…i – 1 ) V( i…n ), V( i…n ) non traité ;
- I = n V( 1…n – 1 ) trié, V( 1… n – 1 ) V(n) V(1…n ) trié.
- i < n permutation (bulles) de telle sorte que le minimum de V(i… n) soit placé en
V(i ), puis i i + 1 ; hypothèse, d’où
l’itération tant que i < n faire…
l’initialisation : i1 ;
Hypothèse.
On peut donc écrire maintenant l’algorithme complet du tri par la méthode des bulles.
Page 18
Procédure tribulles( E/S V: vect) ;
Var i, j : entier ;
Début
I 1 ;
Tant que i < n faire
J n ;
Tant que j > i faire
Si V( j – 1) > V( j )
Alors permut( V( j- 1 ), V( j ))
Fsi
J j – 1 ;
Fin tant que
I i+1 ;
Fin tant que
Fin procédure
1.4 Algorithmes de mise à jour d’un vecteur
Nous nous limitons la plus part du temps à des algorithmes d’insertion et de suppression
d’un seul élément dans un vecteur. Et nous supposerons que l’insertion est toujours
possible d’un point de vue physique, c’est à dire qu’il y a assez de places dans le vecteur
pour ajouter un élément (n< nmax).
1.4.2 Insertion d’un élément dans un vecteur non trié.
S’il n’y a aucun critère d’insertion, il suffit d’ajouter le nouvel élément à la fin du
vecteur et de ne pas oublier de mettre à jour le nombre d’éléments du vecteur.
Procédure inserfin ( E/S V :vect ; E elem :t) ;
Début
nn+1 ;
V( n ) elem ;
Finporcédure ;
Si au contraire, on veut ajouter un élément à la k ième place, ou après ( ou avant )
l’occurrence d’une valeur, alors les algorithmes sont de même type que celui de
l’insertion d’une valeur dans un vecteur trié que nous présentons ci-dessous.
1.4.3 Insertion d’un élément dans un vecteur trié.
Il s’agit d’ajouter au vecteur trié Vtrié ( 1…n), l’élément elem pour obtenir un nouveau
vecteur trié Vtrié(1…n+1) contenant tous les éléments de Vtrié(1…n) plus l’élément
elem.
Nous proposons ici une méthode qui consiste à :
- chercher la place de l’élément à insérer
- effectuer l’insertion de cet élément.
L’algorithme d’insertion sera donc le suivant :
Page 19
Procédure insertion(E/S Vtrié:vect ; E elem : t) ;
Var p : entier ;
Début
Si n = 0
Alors
Vtrié(1) elem ;
n 1
Sinon
p posit(Vtrié(1…n), elem) ;
Inserplace( Vtrié(1…n), elem, p) ;
Fsi ;
Finprocédure ;
Où posit est une fonction qui délivre la place de l’élément elem et inserplace une
procédure d’insertion de elem à la place p.
1.4.3.1 Recherche de la place de l’élément à insérer.
On cherche un indice p [1…n+1] tel que la relation suivante soit vérifiée :
Vtrié(1…p-1) elem <Vtrié(p…n).
En effet, on cherche une place le plus « à droite possible » afin d’avoir à effectuer le
moins possible de décalages pour l’insertion.
On remarquera que pour p=1, la relation se réduit à elem <Vtrié(1…n) et que pour p=
n+1 elle se réduit à Vtrié(1…n) elem.
Cette recherche peut être effectuée par une méthode séquentielle ou par une méthode
dichotomique. Nous proposons la méthode séquentielle.
On commence par chercher si p=1 ; sinon il reste à chercher p dans l’intervalle [2…n].
Pour cela, on effectue un parcours de droite à gauche :
Hypothèse Vtrié(1) elem <Vtrié(i…n+1)
- Vtrié(1) elem p i+1.
- Vtrié(i) > elem i i-1 ; Hypothèse
Itération : tant que Vtrié( i ) > elem faire …
Initialisation
- Vtrié(1) > elem p 1 .
- Vtrié(1) elem i n Hypothèse
L’algorithme est alors le suivant :
Page 20
Fonction posit (E Vtrié :vect ; elem : t) : entier ;
Var p, i : entier ;
Début
Si Vtrié(1) > elem
Alors p 1
Sinon
i n ;
tant que Vtrié(i) > elem faire
ii – 1
fintant que
pi+1
fsi
positp ;
finfonction ;
1.4.3.2 Insertion de l’élément à sa place.
On connaît maintenant la place p de l’élément à insérer. Le nouveau vecteur
Vtrié(1…n+1) est égal à la concaténation de trois sous vecteurs, que nous noterons :
Vtrié( 1…p-1) elem Vtrié(p+1..n+1) où Vtrié(p+1…n+1) est identique à
Vtrié(p…n).
Il suffit donc d’effectuer une translation à droite d’une position des éléments de
Vtrié(p…n) et ensuite d’affecter elem à Vtrié(p).
Procédure inserplace( E/S Vtrié : vect ; E elem : t ; E p :entier) ;
Début
Pour i = n à p faire
Vtrié(i+1) Vtrié(i)
Finpour
N n+1 ;
Vtrié(p) elem
Finprocédure ;
1.4.4 Suppression d’un élément dans un vecteur.
Le problème est analogue à celui de l’insertion d’une nouvelle valeur. Toute fois, la
valeur n’appartient pas obligatoirement au vecteur V(1…n), dans ce cas la suppression
est impossible. On définira une variable booléenne « possible » permettant de savoir si
la suppression a été possible ou non. Nous nous intéressons à la suppression d’un
élément dans un vecteur trié. Pour la recherche d’une occurrence, on adoptera la
convention suivante : on cherche l’indice p (le plus grand possible) tel que p [1…n],
Vtrié(p) = elem. Si la valeur elem est inexistante on donne par convention à la variable p
la valeur zéro.
Page 21
Procédure suppr(E/S Vtrié(1…n) :vect ; E elem : t ; S possible : booléen) ;
Var p : entier ;
Début
Possible faux ;
P posit(Vtrié(1…n), elem) ;
Si p > 0
Alors
Tasser( Vtrié(1…n), p) ;
Possible vrai ;
Fsi
Finprocédure ;
1.4.4.1 Recherche de la place de l’élément.
On cherche un indice p tel que : d’une part p [0…n] et d’autre part elem Vtrié[1…n],
p =0 ou bien Vtrié(p) = elem, elem < Vtrié(p+1…n), p [1…n].
Comme l’élément elem n’appartient pas obligatoirement au vecteur Vtrié(1…n), on
cherche d’abord p tel que vtrié(1…p) elem < vtrié(p+1…n), ensuite, il suffit de vérifier
si Vtrié(p)=elem pour conclure que l’élément est présent ou non ÿÿns lÿÿvecteur. On est
doÿÿ ramené à un algorithme semblable au précédent que l’on peut écrire avec une
méthode séquentielle ou dichotomique. Avec la méthode séquentielle, on effectue un
parcours de droite à gauche.
Raisonnement par récurrence
Hypothèse : Vtrié(1) elem <Vtrié(i+1…n)
- Vtrié(1) > elem p=0 .
- Vtrié(i) = elem p = i.
- Vtrié(i) > elem i =i – 1 ; Hypothèse. D’où
L’itération tant que Vtrié(i) > elem faire…
L’initialisation : Vtrié(1) > elem p 0 ; Vtrié(1) elem i n ; Hypothèse.
L’algorithme est alors le suivant :
Fonction positsup(E Vtrié(1…n) :vect ;E elem : t) : entier ;
Var p, i : entier ;
Début
P 0 ;
Si Vtrié(1) elem
Alors
I n ;
Tant que Vtrié(i) > elem faire
I i- 1 ;
Fintant que
Si Vtrié(i) = elem
Alors p i
Page 22
Fsi
Fsi
Positsup p ;
Finfonction ;
1.4.4.2 Écriture de la procédure tasser
Pour supprimer un élément d’indice p, il suffit de retasser tous les éléments ayant un
indice supérieur à p, cela revient à considérer que le nouveau vecteur Vtrié est la
concaténation de Vtrié(1…p – 1) et Vtrié(p+1…n).
Procédure tasser( E/S vtrié(1…n) :vect ; E p :entier) ;
Var j : entier
Début
Pour j = p +1 à n faire
Vtrié( j – 1 ) Vtrié(j) ;
Fin pour
nn – 1 ;
Finprocédure ;
On remarquera que la translation ou le décalage à gauche se fait à partir du premier
élément à gauche. Si le décalage était effectué à partir de la droite, toutes les valeurs de
Vtrié(p…n –1)seraient identiques à Vtrié(n).
T.D.1
1) Écrire une procédure qui affiche les éléments d’un vecteur dans l’ordre decroissant
des indices.
2) Écrire une fonction qui calcule le maximum des éléments d’un vecteur V(1…n).
3) Écrire une fonction qui calcule le nombre d’occurrences de la valeur « val » daans un
vecteur V(1…n).
4) On appelle bigramme une suite de deux lettres. Écrire une fonction qui calcule le
nombre d’occurrences d’un bigramme donné dans un vecteur de caracyères.
5) Écrire une fonction qui calcule le produit des éléments d’un vecteur V(1…n)
d’entiers
( penser au cas où un élément sera nul).
6) Écrire plusieurs manières différentes une fonction entière qui délivre l’indice de la
valeur « val » dans V(1…n) si « val » appartient au vecteur V(1…n) et 0 si « val »
n’appartient pas à V(1…n). Préciser dans chaque cas, si c ‘est la première ou la
dernière occurrence que l’on a trouvée.
7) Écrire une fonction entière qui retourne la place de la première occurrence de la
valeur « val » dans un vecteur trié Vtrié(1…n) si « val » appartient à Vtrié(1…n) et 0
dans le cas contraire.
8) Écrire une fonction de recherche qui délivre la place d’un élément « elem » dans le
vecteur Vtrié(1…n) par la méthode dichotomique. Cette fonction délivrera la place
de « elem » s’il y figure et 0 s’il n’y figure pas. ( On supposera que « elem » ne
Page 23
figure pas plus d’une fois dans Vtrié(1…n), on dira que le vecteur est trié sans
répétition).
9) Écrire une fonction entière qui retourne la dernière occurrence de la valeur « val »
dans le vecteur trié Vtrié(1…n) si « val » appartient à Vtrié(1…n) et 0 dans le cas
contraire.
10) Modifier les tri remplacement, permutation et bulles pour qu’ils trient les
éléments de V(1…n) dans l’ordre décroissant ( deux solutions différentes pour
chaque méthode de tri).
Page 24
1.5 TABLEAUX
1.5.1 Objectif
Il s’agit de réunir dans un même objet, des éléments de même nature pour alléger la
description de l’algorithme.
Pour cela faut-il enrichir le vocabulaire algorithmique par un nouveau type adéquat
correspondant à une collection d’objet de même type et pouvant subir les mêmes
traitements.
Cette opération revient à :
- réserver plusieurs objets de même nature par une seule déclaration ;
- les identifier par un nom commun : « nom du tableau » et par un indice séquentiel :
« indice »
- les manipuler en spécifiant le nom du tableau et l’indice.
1.5.2 Syntaxe
Type nomtableau = tableau ( interv ) de typelt ;
Où nomtableau est le nom du tableau ; interv : un intervalle ; typelt : type commun à
tous les éléments du tableau.
Chaque élément sera désigné d’une manière non ambiguë par le nom du tableau
auquel il appartient et par une position appelée indice : nom-tab(indice) ; où nom-
tab est le nom du tableau ; indice est une valeur qui, une fois évaluée doit être
comprise dans l‘intervalle de son type de définition.
L’affectation peut être réalisée globalement entre deux tableaux de même type. Les
opérations de saisie et d’affichage sur les tableaux sont définis au niveau d’un élément.
Remarques :
1. Il faut utiliser des tableaux chaque fois qu’il faut manipuler plusieurs objets de même
type.
2. Les opérations sur un tableau T comme la lecture ou l’écriture sont définies au niveau
élémentaire. Ainsi peut-on dire Afficher ( T(i)) sous reserve de connaître la valeur de i.
3. Lorsque l’on utilise T(i), il faut toujours vérifier que i est dans l’intervalle de
définition du tableau. L’erreur correspondante est appelée « débordement du tableau »
4. La boucle « Pour…FinPour » permet de parcourir exactement une fois tous les
éléments du tableau en gérant automatiquement l’indice de contrôle.
1.5.3 Sémantique
On appelle tableau, toute collection d’objets de même type. Ces objets sont regroupés
sous le même nom et peuvent être désignés par un indice relatif à cette collection.
Si interv est un intervalle d’entiers délimité par inf et sup, le nombre d’éléments du
tableau est : sup – inf +1.
1.5.4 Tableau à une dimension
1.5.4.1 Tableau de constantes
Comme pour les constantes élémentaires, il est possible d’utiliser des constantes de type
tableau. Elles seront soumises à la même contrainte d’invariabilité du contenu.
Syntaxe est : Const nom-tab : typtab(v1,v2,….,vn) ; où vi est la valeur de la ième
constante
Page 25
1.5.4.2 Tableau de variables
Comme pour les variable élémentaires, il est possible de donner des valeurs initiales à
chaque objet de la collection et cela, lors de la déclaration de l’objet de type tableau. Il
est bien entendu que toutes les valeurs peuvent être modifiées à volonté dans
l’algorithme. Il s’agit là d’un tableau initialisé de variables et non d’un tableau constant.
Syntaxe est :Var nom-tab : typtab(init(v1,v2,…,vn)) ; où nom-tab est le nom du
tableau vi : expression définie de type compatible à celui des éléments du tableau ;
typtab est la description du tableau dont les éléments sont tous de type typelt.
1.5.5 Les tableaux à plusieurs dimensions
1.5.5.1 Nécessité
On se propose de généraliser les notions abordées lors de la présentation des tableaux à
une dimension aux tableaux à deux puis à trois … dimensions.
Cette généralisation est indispensable car beaucoup de traitements vont nécessiter la
manipulation de tels tableaux.
Par exemple, on veut calculer la moyenne annuelle sur 5 notes pour 24 étudiants d’une
classe ainsi que les moyennes de classe par note.
A l’état actuel des connaissances on a le choix entre les solutions suivantes :
- soit avec 5 tableaux à une dimension de 24 notes,
- soit avec 24 tableaux à une dimension de 5 notes.
Les éléments des différents tableaux étant du même type, on est tenté de les regrouper
dans un même objet qui aurait le même rôle qu’une famille de classeur de notes gérée
par le service de scolarité.
1.5.5.2 Objectif
Il faut se donner les moyens algorithmiques pour déclarer et utiliser des tableaux à
plusieurs dimensions. Il s’agit de généraliser les notions précédentes. Pour cela il faut :
- identifier le nouvel objet par un nom ;
- donner le type commun des éléments ;
- associer un indice à chaque dimension.
Syntaxe
type typtab : tableau( int1 [, int2, int3, ….]) de typelt ;
où typtab est le nom du type de tableau ; int1, int2,… sont des intervalles ; typelt est le
type commun à tous les éléments du tableau.
1.5.5.3 Sémantique
Le type typtab est un nouveau type construit par le programmeur, il pourra l’utiliser par
la suite pour déclarer des objets de type typtab, c’est à dire des tableaux dont les
éléments sont tous du type typelt.
Pour accéder aux éléments d’un tableau à plusieurs dimensions, il faut associer un indice
à chaque dimension. Cet indice ne peut varier que sur son intervalle de définition.Toutes
les valeurs prises doivent être compatibles à ce type.
On écrit l’accès à un élément d’un tableau à plusieurs dimensions par nom-tab(i,j,k,…) ;
Où nom-tab est le nom du tableau.
- i est un élément dans l’intervalle int1, pointant sur le ième plan ;
Page 26
- j est un élément dans l’intervalle int2, pointant sur la jième ligne ;
- k est un élément dans l’intervalle int3, pointant sur la kième colonne et ainsi de suite
pour les indices suivants.
1.5.5.4 Tableaux de constantes
syntaxe Const nom-tab : typtab( liste) ;
les valeurs de la liste sont affectées aux éléments du tableau en partant du niveau le plus
global et en allant vers celui le plus bas.
Si par exemple, un tableau est composé de dix lignes et de 5 colonnes, les 5 premières
valeurs iront dans la première ligne, les 5 suivantes dans la deuxième ligne etc…
1.5.5.5 Tableaux de variables
Syntaxe var nom-tab : typtab[init(liste)] ;
L’affectation des valeurs aux éléments du tableau se fait comme pour un tableau
constant ; nom-tab est le nom du tableau ; liste est une suite de données organisées
par niveau.
Par exemple pour un tableau à 3 dimensions on a : liste-plan ; à deux dimensions,
liste-ligne. Où
Liste-plan = ( liste-ligne1, liste-ligne2, …., liste-lignep) ;
Liste-ligne = ( liste-val1, liste-val2, …., liste-valn ) ;
Liste-vali = ( v1, v2, …,vm) ; vi sont des expressions définies du type déclaré ;
P est le nombre de plans ; n le nombre de lignes ; m le nombre de colonnes.
Remarque : une erreur fréquente consiste à adresser un élément du tableau avec,
pour l’un des indices, une valeur qui sort du domaine de définition. Pour se
prémunir de ce risque, lorsque l’on veut parcourir tous les éléments d’un tableau, on
peut utiliser les boucles Pour …FinPour emboîtées.
T.D. 2
1. écrire un algorithme qui calcule la moyenne annuelle sur 5 notes pour 24
étudiants d’une classe ainsi que les moyennes de classe par note.
2. Ecrire un algorithme qui réalise l’initialisation des éléments de 3 tableaux de 10
entiers de la façon suivante :
0 0 0 0 0 0 0 0 0 0
1 2 3 4 5 6 7 8 9 10
20 18 16 14 12 10 8 6 4 2
1 2 3 4 5
1 2 3 4 5
Page 27
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
0 0 0 0 0
1 0 0 0 0
2 2 0 0 0
3 3 3 0 0
4 4 4 4 0
Page 28
2 Les fichiers :
2.1 Notions de fichier
Les objets que nous avons décrits jusqu’ici n’ont qu’une durée brève, leur existence est
limitée à la période d’exécution du programme dont ils constituent l’environnement.
Pourtant il y a de très nombreuses applications pour lesquelles les informations traitées
doivent être conservées bien au-delà de la durée d’exécution du programme de
traitement. Si non comment une banque par exemple pourrait-elle envisager sa gestion si
les informations relatives aux comptes de ses clients n’existaient plus après le traitement
de mise à jour de ces comptes ?
Très tôt en informatique est apparu le besoin de conserver des informations, en dehors
de la mémoire centrale de l’ordinateur sur un support permanent.
Par ailleurs, le volume de certaines données interdit de les représenter ensemble dans
l’espace disponible en mémoire centrale. On est alors conduit, pour le traitement de ces
données, à les fractionner en unités plus petites : un programme qui calcule la paye
d’une entreprise traite l’ensemble des informations relatives au personnel de l’entreprise,
mais, à un instant donné, n’a besoin que des données qui concernent l’employé dont il
prépare le bulletin de paye.
La notion de fichier est conçue pour répondre aux deux impératifs que nous venons
d’évoquer :
- Stockage permanent de l’information ;
- Rassemblement d’un gros volume d’informations pouvant être fractionnées
pour le traitement
Définitionun fichier est une collection d’informations, structurée en unités d’accès
appelées article ou enregistrement qui sont tous de même type, en général composé.
Par exemple le fichier des résultats à un examen comprendra un article par étudiant,
chaque article étant composé de 4 champs :
- Nomprenom de type chaine (30)
- Numinscrit de type entier ;
- Datenaissance de type tdate ;
- Note de typeréel ;
Un fichier est toujours enregistré sur un support externe à la mémoire centrale et tout
programme de traitement échangera des informations avec le fichier, l’unité d’accès
étant l’article : on lira le fichier article par article, on l’écrira article après article. A un
instant donné, les informations extraites du fichier par le programme sont celles d’un
article et non celles du fichier tout entier.
2.2 Supports séquentiels et supports adressables :
On distingue deux catégories de supports :
2.2.1 Les supports séquentiels, sur lesquels les informations sont écrites les unes à la
suite des autres et qui sont tels que l’accès àune information i nécessite le
passage sur toutes les informations qui précédenti sur le support ;
Page 29
2.2.2 Les supports adressablessont structurés en surfaces d’enregistrement
individuellement adressables : les informations qui y sont enregistrées peuvent être
retrouvées directement grâce à leur adresse, sans que l’on ait à passer par des
enregistrements intermédiaires.
La bande magnétique est un type classique de supportséquentiel : les enregistrements
sont disposés de manière consécutive sur le ruban magnétique et, pour retrouver un
enregistrement donné on devra faire défiler devant la tête de lecture, toute la partie du
ruban qui précède l’enregistrement.
Les disques sont les supports adressables les plus utilisés. Une unité de disques
comprend une ou plusieurs surfaces circulaires de lecture / écriture. Sur chaque surface,
les informations sont enregistrées sur des pistes concentriques. Les pistes sont souvent
divisées en secteurs et une adresse est, en général l’association d’un numéro de piste et
d’un numéro de secteur. Le dispositif de lecture / écriture peut se déplacer au dessus des
surfaces d’enregistrement pour accéder rapidement à une adresse donnée.
2.3 Organisation et accès :
2.3.1 Accès :Selon les impératifs du traitement, on utilise
deux techniques d’accès aux articles d’un fichier :
- avec l’accès séquentiel, on accède aux fichiers dans l’ordre d’enregistrement
des articles.
- Avec l’accès sélectif, on accède directement à un article particulier sans passer
par des articles intermédiaires. Cet accès n’est possible qu’avec des supports
adressables.
2.3.2 L’organisation d’un fichier, définit la manière dont les
articles du fichier sont disposés sur le support. On
distingue trois organisations principales :
- L’organisation séquentielle qui ne permet que l’accès séquentiel ;
- L’organisation directe conçue pour l’accès sélectif ;
- L’organisation séquentielle indexée qui permet l’accès séquentiel et l’accès
sélectif.
2.4 Association d’un fichier à un programme :
Un fichier f est identifié, de manière unique, par un nom externe qui lui est attaché. Il
peut exister plusieurs programmes de traitement de f et, dans l’environnement de chacun
d’eux, f est décrit avec un nom interne et qui n’a en général aucun rapport avec le nom
externe.
Au moment de traiter un fichier, un programme doit s’assurer le contrôle de ce fichier à
l’aide d’une primitive d’ouverture de fichier. Le rôle d’une telle action est :
- D’établir la correspondance entre le nom interne et le nom externe.
- D’assurer au programme le contrôle du fichier ;
- D’effectuer le positionnement initial du dispositif de lecture / écriture sur le
support de fichier.
Si f est le nom interne du fichier, nous noterons ouvrir (f) la primitive qui doitdébuter le
traitement de f.
Page 30
Enfin de traitement, le programme indiquera qu’il n’a plus besoin du fichier f en
effectuant la fermeture de f au moyen de primitive fermer (f). L’exécution d’une telle
primitive :
- complète le fichier par une marque de fin de fichier dans le cas où le traitement
était une création de fichier.
- Abandonne le contrôle du fichier en indiquant au processeur que le programme
n’a plus besoin du fichier et que ce dernier est donc disponible pour être traité
par d’autres programmes.
- L’exécution des primitives d’ouverture et de fermeture est en général
accompagnée par des commandes, extérieures aux programmes et
particulièrement au système d’exploitation utilisé qui précisent le nom externe
et la localisation du fichier.
Pour les fichiers que nous étudierons, tous les articles seront de même type.
Si f est le nom d’un fichier d’articles de type t et si dans l’environnement d’un
algorithme, v est une variable du même type t, nous noterons :
1) écrire (nom de fichier, v) ou écrire (f, v), l’action qui ajoute un nouvel article au
fichier f, en recopiant dans cet article la valeur de v.
2) lire (f, v), l’action primitive qui lit un article du fichier f, en affectant la valeur de
cet article à la variable v.
Variable
V Environnements
Ecrire (f, v)
////////////////// ------------------------------
Disque ou disquette
Algorithme
2.5 Les fichiers séquentiels :
2.5.1 Définition : soient :
- un ensemble X quelconque dit « des valeurs » du fichier séquentiel
- un ensemble P fini, totalement ordonné, dit ’ensemble des places du fichier
séquentiel.
Un fichier séquentiel à valeurs dans X est une application f de P dans X.
Remarques :
a) un fichier peut être vide ;
b) dans les algorithmes décrits, nous supposons les valeurs de X quelconques.
c) Pour un fichier, toutes les valeurs sont de même type.
2.5.2 Notations
Page 31
Dans la suite, un fichier séquentiel, défini à partir des ensembles P et X est noté
fonctionnellement (P, f, X) ou simplement f.
Un fichier séquentiel est représenté pratiquement par la suite ordonnée de ses éléments,
notée : < x1, x2, x3, …., xn> (xiX)
Exemple : f = < ‘A’, ‘BCI’, ‘DEHK’, ‘D’> ; f = < x1, …, xi, xi+1, …., xn>où xi X
2.5.3 Sous fichiers :
a) Définition : soit un fichier (P, f, X). nous appelons sous fichier la restriction
de f à un intervalle de P (suite d’éléments consécutifs)
Exemple : si f = <5, 7, 59, 67, -1, 0, 18, > alors < 5, 7, 59 >, < 67, -1, 0, 18> sont des
sous fichiers de f. par contre, < 5, 59, 18> n’est pas un sous fichier.
a) Notation : on note un sous fichier d’un fichier (P, f, X), fi j si fi j est la restriction de f
à l’intervalle [i….j]. On note un sous fichier par la suite ordonnée de ses éléments : fij
= < xi … xj>
b) Remarques:
Fi+ 1i est un fichier vide, de même fij est vide si i > j
Le fichier fconsidère comme un sous fichier est note f1n
Tout fichier vide sera note <>
2.5.4 Concaténation de deux fichiers :
Cette opération est une loi de composition interne définie sur l’ensemble des fichiers
à valeurs dans un ensemble X.
Si f1 = < x1, x2, x3, …., xn> ; f2 = < y1, y2, y3, …., ym> xi , yj X alors f = f1 f2
est égal à : f = < x1, x2, x3, …., xn, y1, y2, y3, …., ym>
Ainsi peut-on décomposer tout fichier f en k sous-fichiers f1, f2, ….., fk tels
que : f = f1 f2….. fk
Si f comporte n éléments, lesfi sont vides pour i > n. Cette opération de concaténation
est associative mais n’est pas commutative.
2.5.5 Somme d’un fichier et d’une valeur :
Soit un fichier f à valeurs dans X et une valeur val X, on appelle somme du fichier
f et de la valeur val que l’on note (f val), le fichier g défini par
g = f’ « val »
f’’ avec f = f’f’ .
Exemple : soient f = < 5, 10, 3, 9 > et val = 12 ; le fichier g = f val peut être égal
à :< 5, 10, 3, 12, 9 > ou < 5, 12, 10, 3, 9 > ou < 12, 5, 10, 3, 9 > ou ………………
Page 32
2.5.7 Autres Notations :
Soient un fichier f (f = < x1, x2, x3, …., xn> ) à valeurs dans un ensemble ordonné X (xi
X) et une valeur a X, on définit les notations suivantes :
a < f signifie que i [1…n], a < xi
- af signifie que i [1…n], a = xi
- a f signifie que i [1…n], a ≠ xi
- a=f signifie que i [1…n], a = xi
- a≠f signifie que i [1…n], a ≠ xi
La définition ensembliste d’un fichier n’est pas suffisante pour son traitement en
informatique, car nous disposons du graphe fini d’une application (ensemble fini
d’exemplaires de valeurs) mais suivant la manière dont on va pouvoir accéder à chacun
de ses éléments, les caractéristiques algorithmiques de l’ensemble fini vont différer. Ce
sont pratiquement ces accès qui vont caractériser la structure d’information : fichier.
Pour un fichier ces accès vont être définis en tenant compte du fait que l’ensemble P est
totalement ordonné et fini.
2.5.9 Actions primitives d’accès :
Pour donner un modèle du comportement dynamique d’un fichier, nous allons définir
des actions élémentaires dites « primitives d’accès » à la valeur de chaque élément.
2.5.9.1 Interpréteur associé à un fichier séquentiel :
Nous supposons que tout fichier peut être schématisé par un ruban défilant devant une
tête de lecture/écriture. On n’a accès à une valeur que lorsque l’élément correspondant
(appelé élément accessible ou élément courant) est en face de la tête de lecture-écriture.
Un fichier étant une suite finie, on introduit une marque sur le ruban (notée ┤) qui
permet au mécanisme d’interprétation de détecter la fin du fichier. Un fichier n’est défini
que s’il comporte une marque.
X1 X2 X3 X4 ................. Xn f
X1 X2 X3 X4 ................. Xn f
f+
f – est vide, X1 est l’élément courant donc accessible et fdf (f) prend la valeur faux (on
écrit :
fdf (f) ).
Dans le cas du fichier vide :
Tête de lecture
fdf (f)
f
fdf (f) prend la valeur vrai (on écrit : fdf (f) ).
L’entête est le suivant :
Procédure relire (E/S f : fichier de t) ;
Spécification {} {fdf (f), f - = <>, f + = f, f ≠ <>) ou
(fdf (f), f - = <>, f + = <>)}
Page 34
2.5.9.4 Primitive d’accès à l’élément courant : lire (nom fichier, val)
Cette primitive permet d’accéder à la valeur de l’élément courant et de sélectionner
l’élément suivant. Elle réalise dans l’ordre :
- La copie de l’élément courant (lecture) pour la mettre dans val
- L’avancement du ruban d’une position. Si la marque de fin de fichier est
sélectionnée alors fdf (nom-fic) prend la valeur vrai sinon fdf (nom-fic)
conserve la valeur faux.
Cette primitive ne peut pas être utilisée si le prédicat fdf a la valeur vrai avant
l’activation de l’action lire
L’entête est le suivant :
Procédure lire (E/S f : fichier de t ; E val : t) ;
Spécification {f - = f1i-1 ; f + = fin ; fdf (f)}{val= xi, f -= f1i ; f + = fi+ 1n (fdf (f),
f + ≠ <>) ou (fdf (f), f + = <>)}
On constate qu’après l’appel de l’action lire, val = Df – où Df – désigne le dernier
élément du fichier f - . On peut schématiser l’action lire par :
Avant :
Tête de lecture
fdf (f) Sens du défilement
X1 X2 ….. Xi ................. Xn
Xi Val
f - f+
Xn Val
f-
< f + vide>
Page 35
Notation f - -
–- –
On utilisera aussi la notation f - -définie par f - = f - - val. f est donc le fichier f
avant l’exécution de l’action lire (f, val).
Exemple de lecture d’un fichier avec f=<24,-10,53>
Page 36
- Avancement du ruban d’une position, afin de positionner la tête de lecture /
écriture sur la marque de fin de fichier ;
Après exécution, le prédicat fdf a toujours la valeur vrai. On peut schématiser cette
primitive par :
Avant Sens du défilement Xn Val
-1-
fdf (f) X1 X2 ….. Xi Xi+1 . . . . . . . . . . . . . . . 1- Xn-1
Page 37
Procédure maximum (E f : fichier de t ; S maxi :t) ;
Var max, c : t ;
Debut
Relire(f) ;
Lire (f, max) ;
Tant que ┐fdf (f) faire
Lire(f,c) ;
Si max < c
Alors max c
Fsi ;
Ftq ;
Maxi max ;
Fproc ;
On peut également écrire cet algorithme sous forme de fonction :
Fonction maxi (E f : fic de t) : t ;
Var max, c : t ;
Debut
Relire(f) ;
Lire (f, max) ;
Tant que ┐fdf (f) faire
Lire(f,c) ;
Si max < c
Alors max c
Fsi ;
Ftq ;
Maxi max ;
Ffonc ;
2.5.10.1 Accès à un élément d’un fichier :
Ce problème fondamental est formulé habituellement de deux manières :
Soit on connaît le rang k de l’élément que l’on cherche dans le fichier et on
cherche alors le kième élément du fichier ;
Soit on ne connaît pas ce rang, mais on connaît la valeur de l’élément que l’on
cherche et l’on cherche le 1er élément qui correspond à cette valeur (c'est-à-dire la
première occurrence).
On parle alors de recherche ou d’accès :
Par position dans le 1er cas
Par valeur ou associatif dans le second cas
Page 38
2.5.10.1.1 Accès par position (accès au kième élément) :
2.5.10.1.2 Accès à un élément par valeur dans un fichier Ordonné (fichier trié) :
2.5.10.1.2.1 Définition :
Supposons que l’ensemble des valeurs d’un fichier soit muni d’une relation d’ordre
définie comme précédemment. Si tous les éléments consécutifs d’un fichier vérifient la
relation d’ordre (Xi ≤ Xi+1), on dit que le fichier est trié par ordre croissant. Dans la
suite, sauf avis contraire, on appellera fichier trié (ou ordonné) un fichier ordonné par
ordre croissant. On admettra que le fichier vide et le fichier ne contenant qu’un seul
élément sont triés.
En d’autres termes on donne la définition du fichier trié :
Fichier trié :
Un fichier vide est trié ;
Un fichier comportant un seul élément est trié ;
Soit un fichier f = < x1, x2, …., xn>, avec n > 1, le fichier f est trié si i Є [1..n-
1], la relation (Xi ≤ Xi+1) est vraie.
2.5.10.1.2.2 Algorithme vérifiant qu’un fichier est trié :
Page 39
Fonction trié (E f : fic de t) :booléen ;
var c, precedent : t ; est_trie :booléen ;
Debut
relire (f) ;
si fdf (f)
alors
est_trie vrai
sinon
lire (f, precedent)
si fdf (f)
alors
est_trie vrai
sinon
lire (f, c) ;
tant que ( ┐fdf (f)) et ( precedent ≤ c ) faire
precedent c ;
lire (f, c) ;
ftq ;
est_trie (precedent ≤ c) ;
fsi ;
fsi ;
trie est_trie ;
Ffonc ;
Ou encore :
fonction trié (E f : fic de t) :booléen ;
var c, precedent : t ; est_trie :booléen ;
Debut
relire (f) ;
si fdf (f)
alors
est_trie vrai
sinon
lire (f, precedent) ;
c precedent ;
tant que ( ┐fdf (f)) et ( precedent ≤ c ) faire
precedent c ;
lire (f, c) ;
ftq ;
est_trie (precedent ≤ c) ;
fsi ;
trie est_trie ;
ffonc ;
Page 40
2.5.10.1.2.3 Algorithme d’accès à un élément dans un fichier trié :
Dans le cas d’un accès associatif, la relation d’ordre définie sur l’ensemble des valeurs
permet d’éviter un parcours complet des éléments du fichier pour conclure à la non
appartenance d’un élément. En général, l’accès associatif dans un fichier ordonné est
plus rapide que dans le cas d’un fichier non ordonné. On s’efforce, dans la pratique,
d’utiliser, chaque fois que cela est possible, un fichier trié.
Page 41
Procédure copie (E f : fic de t ; S g : fic de t) ;
var c : t ;
Debut
Réecrire (g) ;
Relire (f) ;
Tant que ┐fdf (f) faire
lire (f, c) ;
ecrire (g, c) ;
Ftq ;
Fproc ;
Page 44
On détecte la fin d’une monotonie lorsque la relation d’ordre (≤) n’est plus vérifiée. Il
suffit donc de garder deux valeurs consécutives pour pouvoir prendre une décision.
Pour choisir le fichier f1 ou f2, il suffit, comme dans l’algorithme précédant, de
disposer d’une variable booléenne « un » qui prend la valeur vrai ou faux permettant
l’écriture de la valeur de l’élément de f dans f1 ou f2. Cette variable booléenne change
de valeur (bascule) à chaque changement de monotonie.
On a donc :
Xi f, i < n, xi ≤ xi+1 « un » garde sa valeur ;
Xi f, i < n, xi > xi+1 « un » change de valeur ;
« un » implique f1 = f1 // xi+1 ; « ┐ un » implique f2 = f2 II xi+1
Afin de pouvoir comparer deux éléments consécutifs, il faut sauvegarder l’élément
précédent dans une variable que l’on appelle précédent. Ainsi comparer xi et xi+1
revient à comparer le contenu des variables « précédent » et « c » élément courant.
On suppose f non vide.
L’algorithme est le suivant :
Procedure monotonie (E f : fic de t ; S f1, f2 : fic de t) ;
Var c, precedent : t ; un : booléen ;
Debut
Relire (f) ;
Réécrire (f1) ;
Réécrire (f2) ;
Un vrai ;
Lire (f, precedent) ;
Ecrire (f1, precedent) ;
tant que ( ┐fdf (f)) faire
lire (f, c) ;
siprecedent > c
alorsun non un ;
fsi ;
si un
alors ecrire ((f1, c)
sinon écrire (f2, c)
fsi ;
precedent c ;
ftq ;
fin.
2.5.11.3.4Fusion de plusieurs fichiers en un seul
Ce problème consiste à construire à partir de plusieurs fichiers séquentiels, un seul
fichier suivant un certain critère de fusion. Nous prenons comme exemple celui de
l’interclassement de deux fichiers triés.
Page 45
Interclassement (ou fusion) de deux fichiers triés : soient deux fichiers triés f et g à
valeurs dans un même ensemble V et munis de la même relation d’ordre. On veut
construire un fichier h trié contenant tous les éléments de f et de g.
Page 46
tant que ( ┐fdf (g)) faire
ecrire (h, cg) ;
lire (g, cg) ;
ftq ;
Dans le 2ème cas, on crée d’abord un autre fic par copie du fic f ; puis on ajoute la
valeur valinsert à la fin. On obtient alors :
Procedure insertfin (E valinsert : t ; E f : fic de t ; S g : fic de t) ;
Var c : t ;
Debut
Réécrire (g) ;
Relire (f) ;
tant que ( ┐fdf (f)) faire
lire (f, c) ;
écrire (g, c) ;
ftq ;
ecrire (g, valinsert) ;
fin.
Page 48
si k [1 .. n+1], on obtient le fic cherché ;
si k = 1 on insert au debut (f1k-1 est vide) ;
si k = n+1, on insert à fin (fkn est vide),
si k > n +1, le problème d’insertion n’a plus son sens et il faut signaler cette
impossibilité dans le résultat de l’algo. On utilisera une variable booléen
« possible » qui prend vrai ou faux suivant que l’insertion a été ou non réalisée.
L’algorithme est le suivant :
Procédure insertk (E f : fic de t ; E valinsert : t ; E k : entier ; S g : fic de t, S
possible :booléen) ;
Var i :entier ; c : t ;
Debut
Relire (f) ;
Réecrire (g) ;
i1;
tant que ( ┐fdf (f))et (i< k) faire
lire (f, c) ;
ecrire (g, c) ;
i i+1 ;
ftq ;
si i = k
alors
ecrire (g, valinsert) ;
tant que ( ┐fdf (f)) faire
lire (f, c) ;
écrire (g, c) ;
ftq ;
possible vrai ;
sinon
possible faux ;
fsi ;
fpro ;
Page 49
On peut comme précédemment, donner plusieurs solutions. L’insertion est
impossible dans le cas où la valeur val est absente du fic f.
sinon
ecrire (g, c) ;
écrire (g, valinsert) ;
fsi ;
tant que ( ┐fdf (f)) faire
lire (f, c) ;
écrire (g, c) ;
ftq ;
fsi ;
fproc ;
Page 52
2.5.12.2.2 Suppression associative
Nous nous limitons au cas de la suppression de la 1ère occurrence de l’élément val dans
un fichier non vide. En appliquant les raisonnements précédents, on peut dire que le fic
résultat est la concaténation de deux sous fichiers f’ et f’’ tels que f = f’ // < val > // f’’,
val Є f.
La suppression n’est possible que si val Є f. on définit donc, comme précedement, une
variable booléenne « possible » qui indiquera si la suppression a été effectuer ou non.
Procedure supprimeval (E f : fic de t ; E val : t ; S g : fic de t ; S possible :
booléen) ;
Var c : t ;
Debut
Relire (f) ; Réecrire (g) ; possible faux ;lire (f, c) ;
tant que ( ┐fdf (f) et (c ≠ val) faire
écrire (g, c) ;
lire (f, c) ;
ftq ;
sic = val
alors
possible vrai;
tant que ┐fdf (f) faire
lire (f, c) ;
écrire (g, c) ;
ftq ;
sinon écrire (g, c)
fsi
fproc
T.D. 3
1. Écrire un algorithme qui délivre le nombre d’éléments d’un fichier. On écrira cet
algorithme sous forme de procédure et de fonction.
2. écrire une fonction qui délivre la somme des éléments de rang pair d’un fichier de
nombres entiers.
3. écrire une fonction qui délivre la différence entre la somme des éléments de rang
impair et la somme des éléments de rang pair : (x1 – x2 + x3 – x4 + ….).
Écrire une deuxième version à l’aide d’une bascule.
4. écrire une fonction qui délivre la valeur du dernier élément du fichier
Page 53
5. écrire une fonction qui délivre la somme du premier élément et du dernier
élément du fichier (par convention, si le fichier ne contient qu’un seul élément x1,
le résultat sera égal à 2x1)
6. écrire une fonction qui calcule le nombre d’occurrences ‘une valeur « val » dans
un fichier
7. écrire une fonction qui calcule le rang de la dernière occurrence de la valeur
« val » dans un fichier
8. écrire une fonction qui délivre le nombre d’occurrences de la valeur « val » dans
un fichier trié.
9. écrire une fonction qui délivre le rang de la première occurrence de la valeur
« val » dans un fichier trié
10. écrire une procédure d’intersection de deux fichiers triés sans répétitions (le
fichier obtenu doit être trié sans répétition).
11. écrire une procédure d’insertion de la valeur « valinsert » après chaque
occurrence de la valeur « val » dans le fichier f.
12. écrire une procédure de suppression de toutes les occurrences de la valeur « val »
dans le fichier trié f.
Page 54
Thème des Projets
I-A) On vous demande de réaliser un agenda numérique portant les informations
suivantes :
N° ordre, Nom, Prenom, Adresse, Téléphone, année de naissance, age.
Pour arrêter la saisie, taper * comme N° d’ordre.
a) Faites une déclaration possible de cet agenda ;
b) Ecrire la procedure de création et d’affichage des éléments de cet
agenda.
c) Ecrire une procédure qui n’affiche que les détenteurs de numéro de
téléphone ;
d) Ecrire une procédure qui affiche ceux qui ont l’âge supérieur à 70 ans.
e) Ecrire une procédure de : récherche d’un élément par le prénom, de tri
par le prénom, d’insertion d’un élément dans l’agenda trié et de
supression d’un élément par le numéro d’ordre;
Pour une bonne manipulation de ce programme, faire un menu qui
présente les différentes tâches citées ci-haut.
I-B) Pour une sauvegarge permanante des informations, utiliser les fichiers.
Ecrire une procédure de :
a) création du fichier
b) lecutre du fichier de telle sorte que les informations soient triées par le
prénom ;
c) Ecrire une procédure qui éclate le fichier principal en fichiers des détenteurs de
numéro de téléphone et ceux qui ne détiennent pas de numéro puis une
procédure qui affiche chacun des deux fichiers ;
d) Ecrire une procédure de récherche d’un élément dans le fichier par le prénom
e) Ecrire une procédure qui supprime ceux dont l’âge est supérieur à 70 ans dans
le fichier ;
f) Ecrire une procédure d’insertion d’un élément dans le fichier trié.
Page 55
Faire un menu qui contiendra les différentes tâches demandées.
II-A)Il vous est soumis de gérer une salle de classe de capacité 100 élèves.
Chaque élève dispose des informations suivantes : matricule (8 car),
Prénom (20 car) et nom (15 car), les trois notes variant de 0 à 10 de coéfficient
respectif 1,2,3, la moyenne qui égale au produit de la somme des notes multipliées
par leur coéfficient respectif divisée par la somme des coéfficients et la mention
(10 car).
Dans le champ mention, on affichera ‘Excellent’ si la moyenne est supérieure ou
égale à 9.00 ;
‘TBien’ si lamoyenne est entre 7.00 et 8.99 ;
‘Bien’ si la moyenne est entre 6.00 et 6.99 ;
‘Passable’ si la moyenne est entre 5.00 et 5.99 ;
‘Redouble’ si la moyenne est inférieure à 5.00.
On convient de taper * comme matricule pour arrêter la saisie.
f) Faites une déclaration possible cette gestion ;
g) Ecrire la procedure de création et d’affichage des étudiants de cette
salle.
h) Ecrire une procédure qui n’affiche que les moyennants ;
i) Ecrire une procédure qui affiche ceux qui ont la mention Bien.
j) Ecrire une procédure de : récherche d’un étudiant par le matricule, de tri
par ordre du mérite, d’insertion d’un élément dans la fiche triée et de
supression d’un étudiant par le matricule;
Pour une bonne manipulation de ce programme, faire un menu qui
présente les différentes tâches citées ci-haut.
II-B) Pour une sauvegarge permanante des informations, utiliser les fichiers.
Ecrire une procédure de :
a) création du fichier
Page 56
b) lecutre du fichier de telle sorte que les informations soient triées par le
prénom ;
c) Ecrire une procédure qui éclate le fichier principal en fichiers des étudiants
qui ont la moyenne et ceux qui n’ont pas puis une procédure qui affiche
chacun des deux fichiers ;
d) Ecrire une procédure de récherche d’un élément dans le fichier par le
prénom
e) Ecrire une procédure qui supprime les redoublants dans le fichier ;
f) Ecrire une procédure d’insertion d’un étudiant dans le fichier trié.
Faire un menu qui contiendra les différentes tâches demandées.
III-A) Le Directeur d’une entreprise vous demande de faire la gestion de son
personnel en vous fournissant les informations suivantes :
Matricule (3 car) ; Nom (20 car), année d’engagement, salaire de base, durée (à
calculer), nombre d’enfants et salaire net (à calculer).
Une prime de 80000FG par enfantest accordé au personnel de l’entrepise et une
augmentation de 25% du salaire de base est accordée à tous ceux qui ont fait plus
de 5ans de service.
Ainsi, le salaire net sera égal au salaire de base+ les avantages accordés.
a) Faites une déclaration possible pour cette gestion ;
b) Ecrire la procedure de création et d’affichage du personnel de cette
entreprise.
c) Ecrire une procédure qui n’affiche que les détenteurs de numéro de
téléphone ;
d) Ecrire une procédure qui affiche les employés qui ont fait plus de
5ans de service.
e) Ecrire une procédure de : récherche d’un employé par le matricule,
de tri par le prénom, d’insertion d’un employé dans la fiche triée et
de supression d’un employé par le matricule;
Page 57
Pour une bonne manipulation de ce programme, faire un menu qui
présente les différentes tâches citées ci-haut.
III-B) Pour une sauvegarge permanante des informations, utiliser les fichiers.
Ecrire une procédure de :
g) création du fichier
h) lecutre du fichier de telle sorte que les informations soient triées par le
prénom ;
i) Ecrire une procédure qui éclate le fichier principal en fichiers des employés
ayant fait plus de 50ans de service et ceux qui n’ont pas fait plus de 10ans puis
une procédure qui affiche chacun des deux fichiers ;
j) Ecrire une procédure de récherche d’un élément dans le fichier par le matricule
k) Ecrire une procédure qui supprime ceux qui ont fait 50ans de service au sein
de l’entreprise dans le fichier ;
l) Ecrire une procédure d’insertion d’un employé dans le fichier trié.
Faire un menu qui contiendra les différentes tâches demandées.
BONNE CHANCE
Page 58