Académique Documents
Professionnel Documents
Culture Documents
Chapitre 1
Exercice 1.1
Définir le vocable variable.
Exercice 1.2
Choisir des identificateurs expressifs et écrire des instructions de déclaration
pour déclarer les variables suivantes :
(a) Prix de vente (b) Nombre de pages d’un livre
(c) Moyenne des notes (d) Age en années
(e) Lieu de naissance (f) Salaire net
(g) Note de contrôle continue (h) Date de naissance
(i) Numéro matricule (j) Nature du baccalauréat
(k) Année d’obtention du baccalauréat (m) Mention obtenue au baccalauréat
Exercice 1.3
Écrire un algorithme qui lit six nombres réels A, B, C, D, E et F et calcule la
solution du système d’équations
1
Dr Ndi Nyoungui André
Algorithmique et structures de données
Ax + By = C
Dx + Ey = F
en supposant que le système admet une solution unique (déterminant non nul).
C*E−C*F
x=
A*E−B*D
A*F−C*D
y=
A*E−B*D
{Calcul de la solution}
x ← detx/det;
y ← dety/det;
2
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 1.4
Écrire un algorithme pour lire deux nombres réels A et B (A différent de zéro)
puis calculer la solution de l’équation Ax + B = 0.
{Calcul de la solution}
x ← -B/A;
{Impression du résultat}
écrire('x = ', x);
fin ;
Exercice 1.5
Écrire un algorithme qui lit le rayon d’une sphère, calcule et affiche le volume de
la sphère.
3
Dr Ndi Nyoungui André
Algorithmique et structures de données
{Calcul de la solution}
Volume ← (4/3)*pi*Rayon*Rayon*Rayon;
{Impression du résultat}
écrire('Rayon : ', Rayon) ;
écrire('Volume : ', Volume);
fin ;
Exercice 1.6
Écrire un algorithme qui calcule et affiche la longueur de l’hypoténuse d’un
triangle rectangle connaissant les longueurs des côtés perpendiculaires.
{Calcul de la solution}
Hypoténuse ← sqrt(sqr(Côtés1) + sqr(Côté2));
{Impression du résultat}
écrireln('Premier côté : ', Coôté1) ;
écrireln('Deuxième côté : ', Côté2) ;
écrireln('Hypoténuse : ', Hypoténuse);
fin ;
Exercice 1.7
Écrire un algorithme qui lit la longueur et la largeur d’un rectangle, calcule et
affiche le périmètre et la surface du rectangle.
4
Dr Ndi Nyoungui André
Algorithmique et structures de données
lire(Largeur) ;
{Calcul de la solution}
Périmètre ← 2*(Largeur + Longueur) ;
Surface ← Largeur*Longueur ;
Exercice 1.8
Écrire un algorithme qui lit le nom et le prénom d’un employé, le nombre d’heures
de travail qu’il a effectuées et son taux horaire puis calcule et affiche, le nom, le
prénom et le salaire de l’employé.
{Calcul du salaire}
Salaire ← Taux*Heures ;
Exercice 1.9
5
Dr Ndi Nyoungui André
Algorithmique et structures de données
{Calcul de la moyenne}
Moyenne ← 0.3*Contrôle + 0.7*Synthèse ;
{Impression de la moyenne}
écrire('Contrôle continu : ', Contrôle) ;
écrire('Synthèse : ', Synthèse) ;
écrire('Moyenne : ', Moyenne)
fin ;
Exercice 1.10
Écrire un algorithme qui convertit les degrés Fahrenheit (F) en degrés Kelvin (K)
en utilisant la relation K = (5/9)(F – 32) + 273.
{Conversion}
K ← (5/9)*(F – 32) + 273 ;
{Impression du résultat}
écrire(F, 'degrés F = ', K, 'degrés K') ;
fin ;
6
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 1.11
Écrire un algorithme qui un montant exprimé en francs CFA puis calcule et
imprime ses équivalents en euros et en dollars américains.
{Calcul du résultat}
Euros ← TauxEuros*Montant ;
Dollars ← TauxDollars*Montant ;
Exercice 1.12
Une compagnie a quatre divisions qui vendent une variété de produits. La
direction de la compagnie veut connaître quel pourcentage des ventes totales est
généré par chaque division. Écrire un algorithme qui lit le montant des ventes
générées par chaque division et imprime le montant total des ventes ainsi que le
pourcentage des ventes de chacune des divisions.
7
Dr Ndi Nyoungui André
Algorithmique et structures de données
lire(Ventes3) ;
écrire('Quel est le montant des ventes de la division 4 ? ')
lire(Ventes4) ;
8
Dr Ndi Nyoungui André
Algorithmique et structures de données
Chapitre 2
La sélection
Exercice 2.1
Si une expression booléenne utilise des opérateurs logiques tels que ET et OU,
ainsi que des opérateurs relationnels, pourquoi doit on utiliser des parenthèses ?
Réponse
Exercice 2.2
Lesquelles des expressions booléennes suivantes sont logiquement équivalentes ?
p et q sont deux variables booléennes.
(a) p ≠ q (b) (p et non q) ou (non p et q)
(c) non(p = q) (d) (p ou q) ou non(p et q)
Réponse
Exercice 2.3
Réécrire chacune des instructions suivantes sans utiliser des conditions
composées.
(a)
si (x < y) ou (w < z) alors
Écrire('Bonjour')
sinon
Écrire('Bonsoir') ;
(b)
si ((a ≥ b) ou (c = 5)) et (d = 1) alors
Écrire('Bonjour')
sinon
Écrire('Bonsoir') ;
9
Dr Ndi Nyoungui André
Algorithmique et structures de données
(c)
si ((a ≥ b) et (c = 5)) ou (d = 1) alors
Écrire('Bonjour')
sinon
Écrire('Bonsoir') ;
(d)
si ((a ≥ b) et (c = 5)) et (d = 1) alors
Écrire('Bonjour')
sinon
Écrire('Bonsoir') ;
Réponse
(a)
si x < y alors
Écrire('Bonjour')
sinon
si w < z alors
Écrire('Bonjour')
sinon
Écrire('Bonsoir') ;
(b)
si a ≥ b alors
si d = 1 alors
Écrire('Bonjour')
sinon
Écrire('Bonsoir')
sinon
si c = 5 alors
si d = 1 alors
Écrire('Bonjour')
sinon
Écrire('Bonsoir') ;
(c)
si a ≥ b alors
si c = 5 alors
Écrire('Bonjour')
sinon
si d = 1 alors
10
Dr Ndi Nyoungui André
Algorithmique et structures de données
Écrire('Bonjour')
sinon
Écrire('Bonjour') ;
(d)
si a ≥ b alors
si c = 5 alors
si d = 1 alors
Écrire('Bonjour')
sinon
sinon
sinon
Écrire('Bonsoir') ;
Exercice 2.4
Les longueurs des côtés d’un triangle sont stockées dans les variables réelles a, b
et c. Pour que a, b et c soient effectivement correctes, la somme de deux
quelconque des trois nombres doit être strictement supérieure au troisième.
Écrire un algorithme qui lit trois nombres réels a, b et c et détermine si a, b et c
sont effectivement les côtés d’un triangle. Si oui, alors écrire le message « Les
nombres forment un triangle » dans le cas contraire écrire le message « Les
nombres de forment pas un triangle ».
Exercice 2.5
Une année est bissextile si son millésime est un multiple de 4, sauf les années de
début de siècle qui sont bissextiles si leur millésime est divisible par 400. Écrire
un algorithme qui lit un entier naturel et détermine si cet entier représente une
année bissextile.
11
Dr Ndi Nyoungui André
Algorithmique et structures de données
Première version
Algorithme Bissextile ;
variable
année : entier ;
début
écrire('Quelle année ? ') ;
lire(année) ;
Deuxième version
Algorithme Bissextile ;.
variable
année : entier ;
début
écrire('Quelle année ? ') ;
lire(année) ;
Exercice 2.6
Une boulangerie est ouverte de 7 heures à 13 heures et de 16 heures à 19
heures, sauf le dimanche après-midi et le lundi toute la journée. Écrire un
algorithme qui lit une heure (un entier naturel) et un jour (une chaîne de
caractère) et détermine si la boulangerie est ouverte le jour et à l’heure
indiqués.
12
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 2.7
Un entier positif est stocké dans une variable nombre. Utiliser une instruction
de sélection multiple pour imprimer un message indiquant si le nombre est paire
ou impaire.
13
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 2.8
Écrire un programme pour résoudre le système d’équations linéaires d’inconnues
x et y :
Ax + By = C
Dx + Ey = F
{Calcul de la solution}
si det ≠ 0 alors
début
x ← DETX/DET;
y ← DETY/DET;
écrire(‘x = ‘, x);
écrire('y = ', y) ;
fin
sinon
si (DETX = 0) et (DETY = 0) alors
écrire('Système indéterminé')
sinon
écrire('Système impossible') ;
fin ;
14
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 2.9
Écrire un algorithme qui lit un nombre représentant l’âge d’une personne et
affiche le message « vous êtes mineur » si son âge est inférieur à 18 ans et le
message « vous êtes majeur » dans le cas contraire.
Exercice 2.10
Écrire un algorithme qui lit le nom et le sexe d’une personne et affiche le
message « Bonjour, Monsieur … » si la personne est de sexe masculin et le
message « Bonjour, Madame … » si la personne est de sexe féminin.
Exercice 2.11
15
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 2.12
Écrire un algorithme qui lit trois nombres et imprime le plus grand des trois
nombres.
Première version
Algorithme max3;
variable
a, b, c : réel ;
début
écrire('Entrez les trois nombres') ;
lire(a, b, c) ;
si a > b alors
si a > c alors
écrire('Le plus grand est : ', a)
16
Dr Ndi Nyoungui André
Algorithmique et structures de données
sinon
écrire('Le plus grand est : ', c)
sinon
si b > c alors
écrire('Le plus grand est : ', b)
sinon
écrire('Le plus grand est : ', c) ;
fin.
Deuxième version
On peut éviter d’utiliser une imbrication très profonde des instructions si…alors
… sinon en utilisant une succession d‘instruction si…alors. L’algorithme devient
alors.
Algorithme max3;
variable
grand, a, b, c: réel ;
début
écrire('Entrez les trois nombres') ;
lire(a, b, c) ;
grand ← a ;
si b > grand alors
grand ← b ;
si c > grand alors
grand ← c ;
Troisième solution
Algorithme max3;
variable
grand, a, b, c: réel ;
début
écrire('Entrez les trois nombres') ;
lire(a, b, c) ;
si (a ≥ b) et (a ≥ c) alors
écrire('Le plus grand est : ', a) ;
17
Dr Ndi Nyoungui André
Algorithmique et structures de données
sinon
si (b ≥ a) et (b ≥ c) alors
écrire('Le plus grand est : ', b) ;
sinon
écrire('Le plus grand est : ', c) ;
fin.
Exercice 2.13
Écrire un algorithme qui lit quatre nombres et imprime le plus grand des quatre
nombres.
18
Dr Ndi Nyoungui André
Algorithmique et structures de données
On peut éviter d’utiliser une imbrication très profonde des instructions si…alors
… sinon en utilisant une succession d‘instruction si…alors. L’algorithme devient
alors.
Exercice 2.14
Écrire un algorithme qui lit deux nombres réels A et B puis calcule la solution
réelle de l’équation Ax + B = 0.
Exercice 2.15
Écrire un algorithme qui lit trois nombres réels a, b et c puis calcule les solutions
réelles de l’équation quadratique ax bxc=0 .
2
20
Dr Ndi Nyoungui André
Algorithmique et structures de données
21
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 2.16
Les tarifs d’affranchissement d’une lettre sont les suivants :
en-dessous de 20g : 280 FCFA,
à partir de 20g, mais en-dessous de 50g : 440 FCFA,
à partir de 50g : 670 FCFA.
Écrire un algorithme qui lit le poids d’une lettre et imprime le montant de
l’affranchissement de la lettre.
22
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 2.17
La variable réelle Hours contient un nombre compris entre 0 et 100. Écrire un
algorithme qui lit une heure et affiche le message correspondant comme indiqué
ci-dessous.
Hours Message
[0..30] Excessive absence
]30..50] Normal
]50..70] Excessive overtime
]70..100] Crazy
Exercice 2.18
23
Dr Ndi Nyoungui André
Algorithmique et structures de données
24
Dr Ndi Nyoungui André
Algorithmique et structures de données
Études de cas
Le problème est d’écrire un algorithme pour calculer le montant des impôts dus
par un contribuable, connaissant son revenu imposable. Pour calculer les impôts,
nous allons utiliser le barème présenté dans le tableau ci-dessous
Inférieur à 25000 F 0F
Ceci est un barème allégé pour l’objectif du problème. Il ne sera pas difficile de
le généraliser pour traiter un barème plus complet, c’est-à-dire traiter des
revenus supérieurs à 175000 F.
début
Lire le revenu imposable
Calculer le montant des impôts dus
Imprimer le revenu imposable et le montant des impôts dus
fin ;
25
Dr Ndi Nyoungui André
Algorithmique et structures de données
si possible alors
début
écrire('Revenu imposable : ', revenu) ;
écrire('Montant des impôts : ', impôt) ;
fin
sinon
écrire('Revenu trop grand') ;
L’instruction Calculer le montant des impôts dus a besoin d’être élaborée. Elle
nécessite que l’on utilise le barème des impôts pour faire le calcul. Pour faire
cela nous allons déterminer l’intervalle dans lequel se trouve le revenu imposable,
et ensuite utiliser le formule approprié pour calculer l’impôt du. Ceci peut être
fait en utilisant des instructions si…alors...sinon imbriquées. Noter que nous
initialisons la variable booléenne possible à vrai. Si on ne peut pas calculer l’impôt
on la met à faux.
possible ← vrai ;
si revenu ≤ 25000 alors
impôt ← 0
sinon
si revenu ≤ 35000 alors
impôt ← (revenu – 25000)*0.14
sinon
si revenu ≤ 45000 alors
impôt ← 500 + (revenu – 35000)*0.16
sinon
si revenu ≤ 65000 alors
impôt ← 750 + (revenu – 45000)*0.18
sinon
si revenu ≤ 85000 alors
impôt ← 1500 + (revenu – 65000)*0.19
sinon
si revenu ≤ 105000 alors
impôt ← 1750 + (revenu – 85000)*0.21
sinon
si revenu ≤ 125000 alors
impôt ← 2500 + (revenu – 105000)*0.24
sinon
26
Dr Ndi Nyoungui André
Algorithmique et structures de données
Algorithme IncomeTax ;
variable
revenu, impôt : réel ;
possible : booléen ;
début
écrire('Entrez le revenu imposable : ') ;
lire(revenu) ;
27
Dr Ndi Nyoungui André
Algorithmique et structures de données
possible ← faux ;
si possible alors
début
écrire('Revenu imposable : ', revenu) ;
écrire('Montant des impôts : ', impôt) ;
fin
sinon
écrire('Revenu trop grand') ;
fin.
2 7 1983
début
Entrer le mois, le jour et l’année
Calculer le jour de l’année
Imprimer le jour de l’année
fin.
sélection mois de
1 : DayOfYear ← jour ;
2 : DayOfYear ← 31 + jour ;
3 : DayOfYear ← 59 + jour ;
4 : DayOfYear ← 90 + jour ;
5 : DayOfYear ← 121 + jour ;
6 : DayOfYear ← 151 + jour ;
7 : DayOfYear ← 182 + jour ;
8 : DayOfYear ← 212 + jour ;
9 : DayOfYear ← 242 + jour ;
28
Dr Ndi Nyoungui André
Algorithmique et structures de données
Cette solution est cependant incomplète. Nous avons omis de prendre en compte
les années bissextiles. Le code suivant doit être ajouté à la suite de l’instruction
des sélection à choix multiple.
Algorithme YearDay ;
variable
jour, mois, année, DayOfYear : entier ;
valide : booléen ;
début
écrire('Entrez jour, mois et année') ;
lire(jour, mois, année) ;
valide ← (mois > 0) et (mois < 13) et (jour > 0) et (jour ≤ 31) et (année >
0) ;
si non valide alors
écrire('Mauvaise donnée. Veuillez corriger')
sinon
début
sélection mois de
1 : DayOfYear ← jour ;
2 : DayOfYear ← 31 + jour ;
3 : DayOfYear ← 59 + jour ;
4 : DayOfYear ← 90 + jour ;
5 : DayOfYear ← 121 + jour ;
6 : DayOfYear ← 151 + jour ;
7 : DayOfYear ← 182 + jour ;
8 : DayOfYear ← 212 + jour ;
9 : DayOfYear ← 242 + jour ;
10 : DayOfYear ← 273 + jour ;
11 : DayOfYear ← 303 + jour ;
29
Dr Ndi Nyoungui André
Algorithmique et structures de données
30
Dr Ndi Nyoungui André
Algorithmique et structures de données
Chapitre 3
La répétition
Exercice 3.1
Écrire pour lire une suite de n nombres réels et calculer la moyenne de ces n
nombres ; le nombre n de nombres devant être lu dans l’algorithme.
Exercice 3.2
Écrire un algorithme pour lire une suite de n nombres et détermine le plus grand
de ces n nombres ; le nombre n de nombres devant être lu dans l’algorithme.
31
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 3.3
Lesquelles des assertions suivantes s’appliquent à la structure faire … tantque
seule ? A la structure tantque … faire seule ? Aux deux à la fois ?
(a) le corps de la boucle est exécuté au moins une fois.
(b) l’expression logique qui contrôle la boucle est évaluée avant l’entrée de la
boucle.
(c) doit utiliser la construction début … fin si plusieurs instructions doivent
être répétées.
(d) le corps de la boucle peut ne pas être exécuté du tout.
(e) a une condition de terminaison.
(f) a une condition de répétition.
32
Dr Ndi Nyoungui André
Algorithmique et structures de données
Réponse
instruction
faire … tantque tantque …faire
(a) X
(b) X
(c) X X
(d) X
(e) X
(f) X
Exercice 3.4
Écrire un algorithme qui lit le nom et le sexe d’une personne et affiche le
message « Bonjour, Monsieur … » si la personne est de sexe masculin. Si la
personne est de sexe féminin, le programme lui demande si elle est mariée ou
non. Si la personne est mariée, le programme affiche le message « Bonjour,
madame … » sinon il affiche le message « Bonjour, Mademoiselle … ».
33
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 3.5
Écrire un algorithme qui va répéter le traitement ci-dessus pour un nombre
quelconque de personne. La répétition s’arrête lorsque l’utilisateur entre un nom
égal à ‘*’.
Exercice 3.6
Écrire un algorithme qui demande à l’utilisateur de donner son nom, son sexe, son
année de naissance et une année de référence puis affiche le message
« Monsieur … votre âge est de … ans » si la personne est de sexe masculin et le
message « Madame … votre âge est de … ans » si la personne est de sexe féminin.
34
Dr Ndi Nyoungui André
Algorithmique et structures de données
nom : chaîne ;
naissance, référence, âge : entier ;
sexe : caractère ;
début
écrire('Quel est votre nom ? ') ;
lire(nom) ;
écrire('Quel est votre sexe (M ou F)? ') ;
lire(sexe) ;
écrire('Quelle est votre année de naissance ? ') ;
lire(naissance) ;
écrire('Quelle année de référence ? ') ;
lire(référence) ;
âge ← référence – naissance ;
si sexe = 'M' alors
écrire('Monsieur ', nom, 'votre âge est de', âge, 'ans')
sinon
écrire('Madame ', nom, 'votre âge est de', âge, 'ans')
fin.
Exercice 3.7
Écrire un algorithme qui va répéter le traitement ci-dessus pour un nombre
quelconque de personne. La répétition s’arrête lorsque l’utilisateur entre un nom
égal ‘*’.
35
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 3.8
Écrire un algorithme qui va répéter le traitement ci-dessus pour n personnes au
plus (n lu). La répétition s’arrête lorsque l’utilisateur entre un nom égal à ‘*’ ou
que le nombre de personnes traitées devient supérieur à n.
36
Dr Ndi Nyoungui André
Algorithmique et structures de données
écrire('Monsieur ', nom, ' votre âge est de' , âge, '
ans')
sinon
écrire('Madame ', nom, 'votre âge est de' , âge, 'ans') ;
Exercice 3.9
Écrire un algorithme qui lit une suite de nombres positifs se terminant par –1 et
détermine le plus grand de ces nombres.
Exercice 3.10
Écrire un algorithme qui lit une suite de nombres positifs se terminant par –1 et
détermine le plus grand de ces nombres ainsi que sa position dans la liste.
37
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 3.11
Quelle sera la sortie du segment d’algorithme ci-dessous ?
38
Dr Ndi Nyoungui André
Algorithmique et structures de données
écrireln ;
fin ;
Réponse
1
11
111
1111
11111
Exercice 3.12
Quelle sera la sortie du segment d’algorithme ci-dessous ?
Réponse
100001
010010
001100
001100
010010
100001
Exercice 3.13
Écrire un algorithme qui calcule la somme des carrés des n premiers entiers
naturels non nuls.
39
Dr Ndi Nyoungui André
Algorithmique et structures de données
écrire(somme);
fin;
fin.
Exercice 3.14
Écrire un algorithme qui lit un entier positif et calcule le factoriel de ce entier.
écrire(factoriel);
fin;
fin.
Exercice 3.15
Le chercheur médiéval Leonardo (Fibonacci) da Pisa, a proposé la suite infinie
dans laquelle chaque terme est la somme des deux termes précédents. Le n ème
nombre de Fibonacci est défini récursivement de la manière suivante :
40
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 3.16
Écrire un algorithme qui calcule et imprime les rapports entre les 100 premières
paires de nombres de Fibonacci consécutifs.
41
Dr Ndi Nyoungui André
Algorithmique et structures de données
quotient ← premier/second ;
écrire(quotient) ;
somme ← premier + second ;
premier ← second ;
second ← somme ;
n←n+1;
fin ;
fin.
Exercice 3.17
En mathématiques et en sciences, on utilise fréquemment la constante
transcendentale e dont la valeur est approximativement égale à 2.718281. Les
étudiants de mathématiques savent que la série de Maclaurin ci-dessous peut
1 1 1
e=1 ⋯ ⋯
2! 3 ! n!
être utilisée pour représenter e :
42
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 3.18
Lorsqu’un capital est déposé dans une banque qui paie les intérêts une fois par
mois, et lorsque le capital initial et les intérêts restent en dépôt, les intérêts
sont dits composés. La formule de calcul du capital en dépôt P, lorsque un capital
A est déposé initialement et lorsque les intérêts sont payés à un taux d’intérêt I
pour N mois est :
P= A∗ 1I N
Études de cas
Algorithme GestionTransactions;
type
43
Dr Ndi Nyoungui André
Algorithmique et structures de données
44
Dr Ndi Nyoungui André
Algorithmique et structures de données
Examinons maintenant une application utilisant une boucle qui commence par une
valeur singulière et répète un ensemble d’opérations jusqu’à ce que la solution
désirée soit obtenue. Nous allons examiner un problème mathématique classique :
le calcul de la racine carrée d’un nombre. Il y a plusieurs algorithmes pour
calculer les racines carrées. Nous allons utiliser celui que l’on attribue à Isaac
Newton. La méthode de Newton utilise l’approche suivante : si r est une
approximation de la racine carrée d’un nombre x, alors (r + x/r)/2 est une
meilleure approximation de la racine carrée de x. On commence donc par une
approximation arbitraire, par exemple 1, et on répète le calcul de l’approximation
jusqu’à ce que la différence entre le carré de l’approximation et le nombre
devienne inférieure à un epsilon donné. Écrire un algorithme qui lit un nombre et
calcule sa racine carrée.
En considérant le fait que nous ne pouvons pas calculer la racine carrée d’un
nombre négatif, et que nous n’avons pas besoin de calculer une approximation de
la racine carrée de zéro, l’algorithme peut s’écrire de la manière :
Algorithme RacineCarrée ;
constante
epsilon = 0.0001 ;
variable
Racine, Nombre, Différence : réel ;
début
écrire('Entrez le nombre : ') ;
lire(Nombre) ;
si Nombre < 0 alors
écrire('Erreur de donnée – Valeur négative')
sinon
début
si Nombre = 0 alors
Racine ← 0
sinon
début
Racine ← 1 ;
répéter
Racine ← (Nombre/Racine + Racine)/2 ;
Différence ← Racine*Racine – Nombre ;
jusquà abs(Différence) > epsilon ;
écrire('La racine carrée de ’, Nombre, 'est : ', Racine) ;
fin ;
fin.
45
Dr Ndi Nyoungui André
Algorithmique et structures de données
Chapitré 4
Procédures et fonctions
Exercice 4.1
Écrire une fonction qui prend en entrée deux entiers positifs n et p et retourne
le nombre d’arrangements p à p de n éléments.
Exercice 4.2
Une année est bissextile si son millésime est un multiple de 4, sauf les années de
début de siècle qui sont bissextiles si leur millésime est divisible par 400.
Écrire une fonction booléenne qui reçoit en entrée un entier naturel et
détermine si cet entier représente une année bissextile.
Première version
bissextile ← faux
sinon
bissextile ← vrai ;
fin ;
Deuxième version
Exercice 4.3
Une boutique est ouverte de 7 heures à 13 heures et de 16 heures à 22 heures,
sauf le dimanche après-midi et le lundi toute la journée. Écrire un fonction
booléenne qui reçoit en entrée une heure (un entier naturel) et un jour (une
chaîne de caractère) et détermine si la boutique est ouverte le jour et à l’heure
indiqués..
47
Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
Deuxième version
Exercice 4.4
Les tarifs d’affranchissement d’une lettre sont les suivants :
en-dessous de 20g : 280 FCFA,
à partir de 20g, mais en-dessous de 50g : 440 FCFA,
à partir de 50g : 670 FCFA.
Écrire une fonction qui prend en entrée le poids d’une lettre et retourne le
montant de l’affranchissement de la lettre.
Exercice 4.5
Un entier positif est premier s’il est supérieur à deux et s’il n’est divisible que
par un et par lui-même. Écrire une fonction qui prend en entrée un entier positif
et détermine si cet entier est un nombre premier.
48
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 4.6
On souhaite calculer le montant des impôts dus par un contribuable en fonction
de son revenu imposable et de son nombre de parts fiscales. Les règles de calcul
sont les suivantes :
- le revenu par part fiscale est égale au quotient du revenu imposable par le
nombre de parts fiscales
- l’impôt par part fiscale est calculé selon le barème suivant :
• 0 si le revenu par part fiscale est inférieur à 50 000 F ;
• 10% sur la tranche du revenu par part comprise entre 50 000 F et 100
000 F ;
• 25% sur la tranche du revenu par part comprise entre 100 000 F et
200 000 F
• 50% sur le revenu par part fiscale est qui dépasse 200 000 F
- l’impôt total est égal au nombre de parts fiscales multiplié par l’impôt par
part fiscale
49
Dr Ndi Nyoungui André
Algorithmique et structures de données
début
revpart ← revimp/nbparts ;
Exercice 4.7
Lorsqu’un capital est déposé dans une banque qui paie les intérêts une fois par
mois et que le capital initial et les intérêts restent en dépôt, on dit que les
intérêts sont composés. La formule qui donne le capital courant P lorsque le
capital initial est A et que les intérêts sont payés au taux annuel I au bout de N
mois est :
P= A∗ 1I N
Écrire une fonction qui prend en entrée le capital initial A, le nombre d’années N
et calcule le capital courant P au bout des N mois.
50
Dr Ndi Nyoungui André
Algorithmique et structures de données
i←i+1;
fin ;
capital ← total ;
fin ;
Exercice 4.8
Écrire une procédure qui reçoit en entrée un entier naturel n, lit n nombre réels
et retourne le plus de ces nombres.
Exercice 4.9
Écrire une procédure qui prend en entrée un entier naturel n, lit n nombres et
retourne le plus grand de ces nombres ainsi que sa position dans la liste.
51
Dr Ndi Nyoungui André
Algorithmique et structures de données
nombre : réel ;
i : entier ;
début
si n ≤ 0 alors
écrire('La liste est vide')
sinon
début
écrire('Entrez un nombre') ;
lire(nombre) ;
grand ← nombre ;
i←1;
indice ← 1 ;
tantque i < n faire
début
écrire('Entrez un nombre') ;
lire(nombre) ;
i←i+1;
si nombre > grand alors
début
grand ← nombre ;
indice ← i ;
fin ;
fin ;
fin ;
fin ;
Exercice 4.10
Écrire une procédure qui prend en entrée un entier n, lit n nombres et retourne
le plus grand et le plus petit de ces nombres ainsi que leurs positions respectives
dans la liste.
52
Dr Ndi Nyoungui André
Algorithmique et structures de données
début
écrire('Entrez un nombre') ;
lire(nombre) ;
grand ← nombre ;
petit ← nombre ;
i←1;
indmax ← 1 ;
indmim ← 1 ;
tantque i < n faire
début
écrire('Entrez un nombre') ;
lire(nombre) ;
i←i+1;
si nombre > grand alors
début
grand ← nombre ;
indmax ← i ;
fin ;
sinon
si nombre < petit alors
début
petit ← nombre ;
indmin ← i ;
fin ;
fin ;
fin ;
fin ;
Exercice 4.11
Écrire une procédure qui teste si un nombre n, non négatif, est un carré parfait.
Cette procédure fournit deux résultats : un booléen qui est vrai si et seulement
si n est un carré parfait, et un entier égal à la partie entière de la racine carrée
de n.
53
Dr Ndi Nyoungui André
Algorithmique et structures de données
i←i+1;
si i*i = n alors
début
parfait ← vrai ;
racine ← i ;
fin ;
sinon
début
parfait ← faux ;
racine ← i - 1 ;
fin ;
fin ;
Exercice 4.12
Utiliser la procédure ci-dessus dans une autre procédure, qui, pour un nombre
entier, imprime la racine de sa racine carrée ou de la partie entière de sa racine
carrée, ou un message d’erreur si le nombre est négatif.
Exercice 4.13
Écrire une fonction qui calcule n^p, où p est un entier naturel et n un entier
quelconque.
54
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 4.14
Écrire une procédure qui prend en entrée trois nombres a, b et c et les permute
de telle sorte que l’on obtienne a ≤ b ≤ c.
55
Dr Ndi Nyoungui André
Algorithmique et structures de données
si a > b alors
permute(a, b) ;
fin ;
Exercice 4.15
Considérons la fonction suivante :
Exercice 4.16
Réécrire la fonction ci-dessus sous forme itérative.
Mystère ← somme ;
fin ;
Exercice 4.17
56
Dr Ndi Nyoungui André
Algorithmique et structures de données
Écrire une version itérative de la fonction qui calcule le plus grand diviseur
commun de deux entiers positifs.
Exercice 4.18
Écrire une version itérative de la fonction qui calcule le nième nombre de
Fibonacci.
57
Dr Ndi Nyoungui André
Algorithmique et structures de données
tanqtue (i ≤ n) faire
début
somme ← premier + second ;
premier ← second ;
second ← somme ;
i←i+1;
fin ;
Fibonacci ← somme ;
fin ;
fin.
Exercice 4.19
Écrire une version itérative de la fonction qui calcule les coefficients binomiaux.
Études de cas
58
Dr Ndi Nyoungui André
Algorithmique et structures de données
Dans le but de calculer les taxes, les biens économiques peuvent être dépréciés
en utilisant l’une de trois méthodes différentes. L’approche la plus simple est
appelée la dépréciation linéaire « straight-line depreciation ». En utilisant cette
méthode, la valeur du bien décroît de la même quantité chaque année sur la
période totale. Ainsi, si un article est déprécié sur une période de n années, 1/n
de la valeur totale est déprécié chaque année.
Une deuxième méthode utilise le « double-declining balance depreciation ». Dans
cette méthode, la dépréciation autorisée chaque année est égale à la valeur
courante multipliée par 2/n, où n est le nombre d’années au cours desquelles
l’article doit être déprécié.
Une troisième méthode, appelée la méthode de la somme des chiffres « sum-of-
the-digits method », fonctionne de la manière suivante : D’abord, la somme des
nombres de 1 à n est calculée, où n est le nombre d’années au cours desquelles le
bien est déprécié. Ensuite, la dépréciation autorisée à la i-ème année est égale à
la valeur originale multipliée par (n – i) + 1 divisée par la somme des nombres.
Écrire trois fonctions différentes pour calculer la dépréciation d’un article en
utilisant chacune des méthodes ci-dessus.
59
Dr Ndi Nyoungui André
Algorithmique et structures de données
k←k+1;
fin ;
doubledeclining ← valeur * facteur ;
fin ;
On veut écrire une procédure pour construire les n premières lignes du triangle
de Pascal. Le triangle de Pascal est un tableau de nombres dont les entrées sont
les coefficients binomiaux
p
n
=
n!
p ! n− p !
Les entrées du triangle sont telles que les nombres situés sur une ligne
correspondent à la même valeur de n tandis que les nombres situés sur une
colonne correspondent à la même valeur de p.
La construction du triangle de Pascal se fait ligne par ligne. On utilise pour cela
la fonction binôme que nous avons écrite dans le cours pour calculer les
coefficients binomiaux. Par exemple, les dix premières lignes du triangle de
Pascal correspondent au tableau de nombres suivants :
1
1 1
1 2 1
60
Dr Ndi Nyoungui André
Algorithmique et structures de données
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
61
Dr Ndi Nyoungui André
Algorithmique et structures de données
Chapitre 5
Exercice 5.1
Écrire des définitions d’articles ,pour représenter les données suivantes :
(a) Un employé ayant des champs pour le nom, le numéro matricule, le salaire
brute et le net à percevoir.
(b) Une équipe de football ayant les champs pour le nom de l’équipe, le nombre de
matchs joués, le nombre de matchs gagnés, le nombre de matchs perdus, le
nombre de matchs nuls et le pourcentage de matchs gagnés.
(c) Un compte bancaire ayant des champs pour le numéro de compte, le nom du
titulaire du compte, l’adresse du titulaire, le solde courant et les intérêts
cumulés.
(d) Un numéro de téléphone ayant des champs pour la code de région, le préfixe
et le numéro.
temployé = article
nom : chaîne ;
matricule : chaîne ;
SalaireBrute : réel ;
SalaireNet : réel ;
fin ;
téquipe = article
NomEquipe : chaîne ;
MatchsJoués : entier ;
MatchsGagnés : entier ;
MatchsPerdus : entier ;
MatchsNuls : entier ;
Pourcentage : réel ;
fin ;
tcompte = article
Numéro : chaîne ;
NomTitulaire : chaîne ;
62
Dr Ndi Nyoungui André
Algorithmique et structures de données
Adresse : chaîne ;
Solde : réel ;
Intérêts : réel ;
fin ;
ttéléphone = article
CodeRégion : entier ;
Préfixe : entier ;
Numéro : entier ;
fin ;
Exercice 5.2
Écrire des procédure pour lire et écrire des article de type temployé.
63
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 5.3
Définir un type d’article avec variantes qui pourrait être utilisée pour stocker les
informations concernant une figure géométrique. L’article doit stocker la forme
(carré, triangle, rectangle ou cercle) et les dimensions appropriées. Écrire
ensuite une procédure pour lire les informations sur une figure et une fonction
qui prend en entrée une figure géométrique et retourne sa surface.
type
tforme = (Carré, Triangle, Rectangle, Cercle) ;
tfigure = article
case forme : tforme de
Carré : (côté : réel) ;
Triangle : (base, hauteur : réel) ;
Rectangle : (longueur, largeur : réel) ;
Cercle : (rayon : réel) ;
fin ;
64
Dr Ndi Nyoungui André
Algorithmique et structures de données
65
Dr Ndi Nyoungui André
Algorithmique et structures de données
sinon
si figure.forme = Cercle alors
surface ← pi * figure.rayon * figure.rayon ;
surfacefigure ← surface ;
fin ;
Exercice 5.4
Soit le type article date, formé de trois nombres entiers qui indiquent
respectivement le jour, le mois et l’année.
type
tdate = article
Jour, mois, année : entier ;
fin ;
Écrire une fonction booléenne qui prend entrée deux dates date1 et date2 et
détermine si la date date1 vient avant la date date2.
Études de cas
Exercice 5.7
Le service informatique d’un centre touristique conserve les informations sur les
clients en utilisant la structure suivante :
66
Dr Ndi Nyoungui André
Algorithmique et structures de données
type
tdomaine = (Cinéma, Musique, Sport, Lecture) ;
tclient = article
Nom : chaîne20 ;
Sexe : (Féminin, Masculin) ;
domaine : ensemble de tdomaine ;
Age : entier ;
fin ;
1. Écrire une procédure qui lit les informations sur un nouveau client et crée
un article pour ce client.
2. Écrire une procédure qui imprime les informations d’un client.
3. Écrire une fonction booléenne qui vérifie que deux clients sont
compatibles. Pour être compatibles, les clients doivent être de sexe
opposé, avoir un écart d’âge de six ans au plus et avoir au moins deux
intérêts en commun.
4. Écrire une procédure qui prend en entrée les informations sur un client et
une liste de n clients puis imprime la liste des clients qui lui sont
compatibles.
67
Dr Ndi Nyoungui André
Algorithmique et structures de données
68
Dr Ndi Nyoungui André
Algorithmique et structures de données
début
compatible ← faux ;
si (client1.Sexe ≠ client2.Sexe) et (abs(client1.Age – client2.Age) ≤ 6)
alors
début
Commun ← client1.domaine * client2.domaine ;
compte ← 0 ;
pour choix ← Cinéma haut Lecture faire
si choix dans Commun alors
compte ← compte + 1 ;
si compte ≥ 2 alors
compatible ← vrai ;
fin ;
fin ;
constante
taillemax = 1000 ;
type
vclient = vecteur[1..taillemax] de tclient ;
Exercice 5.8
69
Dr Ndi Nyoungui André
Algorithmique et structures de données
On veut écrire une procédure pour imprimer tous les nombres premiers compris
entre 1 et un certain entier positif arbitraire, nombremax. Pour obtenir les
nombres premiers, nous allons utiliser un algorithme classique connu comme
l’algorithme d’Eratosthenes. L’algorithme peut être décrit de la manière
suivante :
1. Commencer avec l’ensemble des entiers consécutifs compris entre 1 et
nombremax.
2. Supprimer de cet ensemble tous les multiples de 2. Ceux-ci ne sont pas
certainement des nombres premiers.
3. Trouver le prochain entier restant dans l’ensemble supérieur à celui dont
les multiples viennent d’être supprimés et supprimer tous ses multiples.
Ceux-ci ne peuvent pas être des nombres premiers.
4. Répéter l’étape 3 jusqu’à ce que l’entier dont les multiples viennent d’être
supprimés soit supérieur ou égal à la racine carrée de nombremax. Cette
condition de terminaison pour la suppression des entiers non premiers est
basée sur le fait que les deux facteurs dans un produit ne peuvent pas
être tous les deux supérieurs à la racine carrée du produit.
5. Les nombres qui restent dans l’ensemble après le processus de suppression
sont les entiers premiers compris entre 1 et nombremax.
constante
taillemax = 100 ;
type
Nombres = ensemble de 2..taillemax ;
70
Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
pour i ← 2 haut nombremax faire
si i dans Sieve alors
écrire(i) ;
fin ;
71
Dr Ndi Nyoungui André
Algorithmique et structures de données
Chapitre 6
Les vecteurs
Exercice 6.1
Écrire une procédure qui affiche les éléments d’un vecteur dans l’ordre
décroissant des indices.
Exercice 6.2
72
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 6.3
Écrire une fonction qui calcule le nombre d’occurrences d’une valeur val dans un
vecteur de n éléments.
73
Dr Ndi Nyoungui André
Algorithmique et structures de données
compte ← 0 ;
pour i ← 1 haut n faire
si liste[i] = val alors
compte ← compte + 1 ;
effectifval ← compte;
fin ;
Exercice 6.4
On considère un vecteur de n entiers. Écrire une procédure qui imprime
uniquement les éléments de rang impaire.
Première version
On suppose que l’on dispose d’une fonction impair(nombre) qui retourne la valeur
vrai si nombre est impair et faux dans le cas contraire.
74
Dr Ndi Nyoungui André
Algorithmique et structures de données
écrire(liste[i]) ;
i←i+1;
bascule ← non bascule ;
fin ;
fin ;
Exercice 6.5
Écrire une procédure qui reçoit en entrée un vecteur de n entiers et remplace
chaque élément du vecteur par la somme des éléments qui le précèdent y compris
lui-même.
Exercice 6.6
On à demandé à n étudiants d’évaluer la qualité de la nourriture offerte à la
cafétéria sur une échelle de 1 à 10 (1 signifiant immangeable et 10, excellent).
75
Dr Ndi Nyoungui André
Algorithmique et structures de données
constante
tailleréponse = 1000 ;
taillefréquence = 10 ;
type
vréponse = vecteur[1..tailleréponse] de entier ;
vrésumé = vecteur[1..taillefréquence] de entier ;
Exercice 6.7
76
Dr Ndi Nyoungui André
Algorithmique et structures de données
Une compagnie paie ses n vendeurs sur la base d’une commission. Le vendeur
reçoit $50 par semaine plus 10% du montant de ses ventes cette semaine. Écrire
une procédure qui calcule le nombre de vendeurs qui perçoivent un salaire dans
chacun des intervalles suivants (utiliser un vecteur pour faire le compte).
[$50 , $100[
[$100 , $200[
[$200 , $300[
[$300 , $400[
[$400 , $500[
[$500 , ∞[
constante
nbintervalles = 6 ;
nbvendeurs = 100 ;
type
vfréquence = vecteur[1..nbintervalles] de entier ;
vcommission = vecteur[1..nbvendeurs] de réel ;
77
Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
fin ;
78
Dr Ndi Nyoungui André
Algorithmique et structures de données
sinon
liste[6]← liste[6] + 1 ;
i ← i + 1;
fin ;
fin ;
Exercice 6.8
Une des techniques utilisées par les cryptographes pour déchiffrer les codes est
d’utiliser la fréquence avec laquelle les différents caractères apparaissent dans
un texte encodé. Écrire une procédure qui lit une chaîne de caractères se
terminant par un point et calcule la fréquence d’apparition de chaque caractère
dans le texte. On suppose que seules les lettres de l’alphabet anglais sont
concernées. La ponctuation est ignorée et aucune différence n’est faite entre les
lettres minuscules et majuscules.
type
ventier = vecteur['A' .. 'Z'] de entier ;
Exercice 6.9
Écrire une procédure qui reçoit en entrée un vecteur de n nombres réels et
détermine le plus grand et le second plus grand de ces nombres.
79
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 6.10
On suppose que l’on a les définition suivantes :
type
toption = (GBIO, MIP, GTE, GIN) ;
tétudiant = article
nom, chaîne ;
prénom : chaîne ;
sexe : (féminin, masculin) ;
matricule : chaîne ;
datenais : chaîne ;
lieunais : chaîne ;
80
Dr Ndi Nyoungui André
Algorithmique et structures de données
option : toption ;
fin ;
vétudiant = vecteur[1..100] de tétudiant ;
Ces algorithmes sont une traduction directe des algorithmes présentés dans le
cours.
81
Dr Ndi Nyoungui André
Algorithmique et structures de données
83
Dr Ndi Nyoungui André
Algorithmique et structures de données
i←0;
compte ← 0 ;
tantque i < n faire
début
i←i+1;
si liste[i].option = option alors
compte ← compte + 1 ;
fin ;
effectif ← compte ;
fin ;
Exercice 6.11
Écrire une fonction qui calcule le produit des éléments d’un vecteur de n nombres
réels (penser au cas où un élément serait nul).
Exercice 6.12
84
Dr Ndi Nyoungui André
Algorithmique et structures de données
Deuxième version
85
Dr Ndi Nyoungui André
Algorithmique et structures de données
une variable indice. La dernière valeur de indice sera bien celle de la dernière
occurrence de val.
Deuxième méthode
Exercice 6.13
Écrire une fonction entière qui retourne la place de la première occurrence de la
valeur val dans un vecteur trié liste[1..n] si val appartient au vecteur liste, et 0 si
val n’appartient à liste.
86
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 6.14
Même question pour la dernière occurrence.
87
Dr Ndi Nyoungui André
Algorithmique et structures de données
indicederniertrié ← 0 ;
fin ;
fin ;
Exercice 6.15
Modifier les fonctions dichotomie ci-dessus afin qu’elles retournent la place de
élément dans le vecteur liste si élément est présent dans le vecteur et 0 sinon
(on supposera que le vecteur est trié sans répétition)
Version itérative
Version récursive
88
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 6.16
Écrire un algorithme pour supprimer un sous-vecteur donnée dans un vecteur.
89
Dr Ndi Nyoungui André
Algorithmique et structures de données
possible ← vrai ;
i←1;
tantque i ≤ ns faire
début
tasser(liste, n, p) ;
i←i+1;
fin ;
fin ;
fin ;
90
Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
j : entier ;
début
j←i;
tantque (i ≤ n – ns + 1) et alors non préfixe(liste, sliste, j, n, ns) faire
j←j+1;
si j > n – ns + 1 alors
rechercehsliste ← 0
sinon
recherchesliste ← j ;
fin;
Exercice 6.17
Écrire un algorithme pour remplacer un sous-vecteur donné dans un vecteur par
un autre.
Une méthode consiste à écrire d’abord une procédure qui remplace les ns
premiers éléments de liste[i..n] par les nr éléments de rliste. Pour cela, on sera
amené à décaler la suite de liste à gauche ou à droite, selon que ns est supérieur
ou inférieur à nr.
fin ;
fin ;
j ← 1 ; {remplacement}
tantque j ≤ nr faire
début
liste[i + j - 1] ← rliste[j];
j ← j + 1;
fin;
n ← n + nr – ns;
fin;
Exercice 6.18
Écrire un algorithme pour remplacer toutes les occurrences d’un sous-vecteur
donnée dans un vecteur par un autre.
92
Dr Ndi Nyoungui André
Algorithmique et structures de données
début
i ← rechercheslsite(liste, 1, n, sliste, ns) ;
tantque i ≠ 0 faire
début
remplacersliste(liste, i, n, rliste, nr, ns) ;
i ← rechercheslsite(liste, i, n, sliste, ns) ;
fin ;
fin ;
Exercice 6.19
Écrire un algorithme pour nettoyer un texte (vecteur de caractères), en
éliminant les espaces superflus : chaque fois que l’on trouve une suites d’espaces,
on les supprime tous sauf un.
Une première approche consisterait à retasser le vecteur chaque fois que l’on
trouve deux espaces consécutifs, afin d’en éliminer un :
93
Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 6.20
Modifier le tri par bulles pour obtenir un vecteur trié par ordre décroissant.
Rappelons que le tri par bulles consiste a effectuer des permutations telles que
le plus grand élément de liste[1..n – k + 1] se retrouve placé dans liste[n – k + 1].
On répète l’opération pour k allant de 1 à n – 1.
Pour obtenir un tri par ordre décroissant, on procède la manière suivante : au lieu
de ranger dans liste[n – k + 1] le maximum de liste[1..n – k + 1], on y range plutôt
le minimum. Il suffit alors d’inverser le sens du test qui détermine si l’on doit
permuter deux éléments consécutifs ou non.
94
Dr Ndi Nyoungui André
Algorithmique et structures de données
tantque i ≤ n - k faire
début
si liste[i] < liste[i + 1] alors
début
permute(liste[i], liste[i + 1]) ;
stop ← faux ;
fin ;
i←i+1;
fin;
k←k+1;
fin;
fin;
Exercice 6.21
Modifier le tri par sélection pour obtenir un vecteur trié par ordre décroissant.
Le tri par sélection du cours permet d’obtenir un vecteur trié par ordre
croissant, en permutant d’abord le minimum de liste[1..n] avec liste[1], puis le
minimum de liste[2..n] avec liste[2], et ainsi de suite jusqu’à liste[n-1]. Pour
obtenir un vecteur trié par ordre décroissant, deux adaptations sont possibles :
Première solution
On opère sur les maxima au lieu de minima, en les rangeant dans l’ordre liste[1],
…,liste[n].
95
Dr Ndi Nyoungui André
Algorithmique et structures de données
La procédure de tri par sélection par ordre décroissant est alors identique à
celle du cours, en remplaçant indicemim par indicemax.
Exercice 6.22
Modifier le tri par insertion pour obtenir un vecteur trié par ordre décroissant.
Pour obtenir un tri par ordre décroissant, on va procéder à des insertions telles
que à chaque étape l’élément liste[i] est inséré dans le sous-vecteur liste[1..i-1]
de telle sorte que le sous-vecteur liste[1..i] reste trié par ordre décroissant. Il
suffit alors d’inverser le sens de du test dans le processus de recherche de la
place de liste[i] dans le sous-vecteur liste[1..i-1].
j←j+1;
si j < i alors
début
elem ← liste[i];
pour k ← i bas j + 1 faire
liste[k] ← liste[k - 1];
liste[j] ← elem;
fin;
i←i+1;
fin;
fin;
Exercice 6.23
Modifier le tri par insertion par bissection pour obtenir un vecteur trié par
ordres décroissant.
Rappelons que le tri par insertion par bissection est une variante du tri par
insertion dans laquelle on utilise la méthode recherche dichotomique pour
trouver la place de l’élément liste[i] dans le sous-vecteur liste[1..i-1].
Pour obtenir un vecteur trié par ordre décroissant, il suffit de trouver une
version de la méthode de recherche dichotomique qui opère dans un vecteur trié
par ordre décroissant. Ceci est immédiat car il suffit d’inverser le sens du test
qui détermine la moitié du vecteur à explorer à chaque étape.
sinon
sup ← m ;
fin ;
indichodec ← sup ;
fin ;
fin ;
liste[j] ← elem ;
fin;
i ← i + 1;
fin;
fin;
Exercice 6.24
Modifier le Quicksort pour obtenir un vecteur trié par ordre décroissant.
début
place ← pivot(liste, inf, sup) ;
si place ≠ 0 alors
début
L ← place + 1 ;
R ← sup ;
tantque L ≤ R faire
début
tantque liste[L] > liste[place] faire
L←L+1;
permute(liste[L], liste[R])
fin ;
permute(liste[place], liste[R]) ;
Quicksort(liste, inf, R – 1) ;
Quicksort(liste, R + 1, sup)
fin;
fin;
Exercice 6.25
Écrire un algorithme pour calculer la réunion de deux ensembles représentés par
des vecteurs.
i←i+1;
fin ;
i←1;
tantque i ≤ n2 faire
début
trouvé ← faux ;
j←1;
tantque (j ≤ n1) et non trouvé faire
début
si liste2[j] = liste1[i] alors
trouvé ← vrai ;
j←j+1;
fin ;
si non trouvé alors
début
n3 ← n3 + 1 ;
liste3[n3] ← liste2[i] ;
fin;
i←i+1;
fin ;
fin ;
Exercice 6.26
Écrire un algorithme pour calculer l’intersection de deux ensembles représentés
par des vecteurs.
L’algorithme consiste à recopier dans liste3 les éléments de liste1 qui sont aussi
dans liste2.
Exercice 6.27
Écrire un algorithme pour calculer la différence ensembliste de deux ensembles
représentés par des vecteurs.
L’algorithme consiste à recopier dans liste3 les éléments de liste1 qui ne sont pas
dans liste2.
début
n3 ← n3 + 1 ;
liste3[n3] ← liste1[i] ;
fin;
i←i+1;
fin ;
fin ;
Exercice 6.28
Écrire un algorithme pour calculer la différence symétrique de deux ensembles
représentés par des vecteurs.
Exercice 6.29
Un palindrome est une chaîne de caractères qui se lit de la manière de la gauche
vers la droite et de la droite vers la gauche. Écrire une fonction qui prend en
entrée une chaîne de caractères et détermine si c’est un palindrome ou non.
Exercice 6.30
Écrire une procédure qui reçoit en entrée deux matrices réelles de m lignes et n
colonnes et retourne la somme des deux matrices.
Exercice 6.31
Écrire une procédure qui reçoit en entrée une matrice réelle A de m lignes et n
colonnes et une matrice B réelle de n lignes de p colonnes retourne le produit AB
de ces deux matrices.
10
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 6.32
Une matrice de N lignes et N colonnes est dite symétrique si A[i, j] = [j, i] pour
couple (i, j). Écrire une fonction qui prend en une matrice réelle de N lignes et N
colonnes et détermine si la matrice est symétrique.
10
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 6.33
Écrire une fonction qui prend en entrée une matrice réelle de m lignes et n
colonnes et retourne le plus grand élément de cette matrice.
Exercice 6.34
Écrire une procédure qui prend en entrée une matrice réelle de m lignes et n
colonnes et retourne le plus grand élément de cette matrice ainsi sa position
ligne/colonne.
10
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 6.35
Écrire une procédure qui calcule la transposée d’une matrice réelle.
Exercice 6.36
Un carré magique est un tableau de N lignes et N colonnes d’entiers de
l’intervalle [1.. N*N] tel que les sommes des termes de chaque ligne, chaque
colonne et de chaque diagonale principale sont égales. Écrire une fonction qui
prend en entrée une matrice de N lignes et N colonnes d’entiers de l’intervalle
[1.. N*N] et détermine si la matrice est un carré magique.
10
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
i, j : entier ;
courante, somme, diag1, diag2 : réel ;
magique : booléen ;
début
{Vérifier la conformité des lignes}
courante ← 0 ;
pour j ← 1 haut n faire
courante ← courante + A[1, j] ;
magique ← vrai ;
i←2;
tantque (i ≤ n) et magique faire
début
somme ← 0 ;
pour j ← 1 haut n faire
somme ← somme + A[i, j] ;
si courante ≠ somme alors
magique ← faux ;
i←i+1;
fin ;
{Vérifier la conformité des colonnes}
j←1;
tantque (j ≤ n) et magique faire
début
somme ← 0 ;
pour i ← 1 haut n faire
somme ← somme + A[i, j] ;
si courante ≠ somme alors
magique ← faux ;
j←j+1;
fin ;
{traitement des diagonales}
si magique alors
début
diag1 ← 0 ;
pour i ← n haut n faire
diag1 ← diag1 + A[i, i] ;
diag2 ← 0 ;
pour j ← 1 haut n faire
diag2 ← diag2 + A[n - j + 1, j] ;
fin;
carrémagique ← magique et (diag1 = courante) et (diag2 = courante) ;
10
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin;
Exercice 6.37
Écrire une fonction qui prend en entrée une matrice réelle de m lignes et n
colonnes et retourne le numéro de la ligne dont la somme des coefficients est
maximum.
Exercice 6.38
Écrire une procédure qui prend en entrée un entier n et retourne la matrice des
n premières lignes du triangle de Pascal.
constante
taillemax = 100 ;
type
tmatrice = tableau[0..taillemax, 0..taillemax] de entier ;
10
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
{Construction du triangle}
n←0;
tantque n < nblignes faire
début
A[n, 0] ← 1 ;
p←1;
tantque p ≤ n faire
début
A[n, p] ← A[n - 1, p - 1] + A[n - 1, p] ;
p←p+1;
fin ;
n←n+1;
fin ;
fin ;
Exercice 3.39
On veut écrire pour calculer la liste des nombres premiers compris entre 1 et un
certain entier positif arbitraire, nombremax. Pour obtenir les nombres premiers,
nous allons utiliser un algorithme classique connu comme l’algorithme
d’Eratosthenes. L’algorithme peut être décrit de la manière suivante :
1. Commencer avec le vecteur des entiers consécutifs compris entre 1 et
nombremax.
2. Mettre à zéro tous les multiples de 2. Ceux-ci ne sont pas certainement
des nombres premiers.
3. Trouver le prochain entier non nul dans le vecteur supérieur à celui dont
les multiples viennent d’être mis à zéro et mettre à zéro tous ses
multiples. Ceux-ci ne peuvent pas être des nombres premiers.
4. Répéter l’étape 3 jusqu’à ce que l’entier dont les multiples viennent d’être
mis à zéro soit supérieur ou égal à la racine carrée de nombremax. Cette
condition de terminaison pour la mise à zéro des entiers non premiers est
10
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
basée sur le fait que les deux facteurs dans un produit ne peuvent pas
être tous les deux supérieurs à la racine carrée du produit.
5. Les nombres non nuls dans le vecteur après le processus de mise à zéro
sont les nombres premiers compris entre 1 et nombremax.
constante
taillemax = 1000 ;
type
vnombre = vecteur[1..taillemax] de entier ;
11
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
Études de cas
Dans ces études de cas, nous allons appliquer les algorithmes sur les vecteurs
(création, parcours, recherche, insertion, suppression, tri) à des structures de
données plus ou moins complexes.
constante
taillemax = 100 ;
nbmax = 20 ;
type
tdate = article
jour, mois, année : entier ;
fin ;
tcours = article
code : entier ;
intitulé : chaîne ;
examenpartiel : réel ;
examenfinal : réel ;
fin ;
vcours = vecteur[1..nbmax] de tcours ;
tétudiant = article
matricule : chaîne ;
nom : chaîne ;
sexe : (Féminin, Masculin) ;
annéenais : tdate ;
lieunaiss : chaîne ;
filière : chaîne ;
nbcours : entier ;
courspris : vcours ;
11
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
vétudiant = vecteur[1..taillemax] de tétudiant ;
On suppose que le vecteur est trié par ordre alphabétique et que tous étudiants
de la même filière ont les mêmes cours.
3°/ Écrire une fonction qui retourne le nombre d’étudiants d’une filière donnée
contenus dans un vecteur de n étudiants.
6°/ Écrire une fonction qui retourne la position d’un étudiant de matricule donné
dans un vecteur de n étudiants. La fonction retourne zéro si l’étudiant concerné
n’est pas présent dans la liste.
7°/ Écrire une procédure pour insérer un nouvel étudiant dans un vecteur de n
étudiants. La procédure doit d’abord vérifier qu’il n’existe pas encore un étudiant
ayant le même matricule.
8°/ Écrire une procédure qui supprime un étudiant de matricule donné dans un
vecteur de n étudiants.
9°/ Écrire un algorithme qui calcule le nombre d’unités de valeur validées par un
étudiant de matricule donné.
10°/ Écrire une fonction qui retourne la moyenne des notes d’un étudiant de
matricule donné dans une unité de valeur de code donné.
11°/ Écrire une fonction qui retourne la moyenne générale des notes d’un
étudiant de matricule donné.
11
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
12°/ Écrire un algorithme qui classe par ordre de mérite, par rapport à la
moyenne générale des notes, les étudiants d’une filière donnée. À moyenne égale,
les étudiants seront classés par ordre alphabétique.
Solution
11
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
lireln(étudiant.courspris[i].examenpartiel) ;
écrire('Examen final : ') ;
lireln(étudiant.courspris[i].examenfinal) ;
i←i+1;
fin ;
fin ;
11
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
3°/ Écrire une fonction qui retourne le nombre d’étudiants d’une filière donnée
contenus dans un vecteur de n étudiants.
11
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
i←1;
nbgar ← 0 ;
nbfil ← 0 ;
tantque i ≤ n faire
début
si liste[i].sexe = féminin alors
nbfil ← nbfil + 1
sinon
nbgar ← nbgar + 1 ;
i←i+1;
fin ;
fin ;
6°/ Écrire une fonction qui retourne la position d’un étudiant de matricule donné
dans un vecteur de n étudiants. La fonction retourne zéro si l’étudiant concerné
n’est pas présent dans la liste.
11
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
7°/ Écrire une procédure pour insérer un nouvel étudiant dans un vecteur de n
étudiants. La procédure doit d’abord vérifier qu’il n’existe pas encore un étudiant
un étudiant ayant le même matricule.
11
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
liste[p] ← elem ;
fin ;
8°/ Écrire une procédure qui supprime un étudiant de matricule donné dans un
vecteur de n étudiants.
9°/ Écrire un algorithme qui calcule le nombre d’unités de valeur validées par un
étudiant de matricule donné.
11
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
10°/ Écrire une fonction qui retourne la moyenne des notes d’un étudiant de
matricule donné dans une unité de valeur de code donné.
11°/ Écrire une fonction qui retourne la moyenne générale des notes d’un
étudiant de matricule donné.
12°/ Écrire un algorithme qui classe par ordre de mérite, par rapport à la
moyenne générale des notes, les étudiants d’une filière donnée. À moyenne égale,
les étudiants seront classés par ordre alphabétique.
Stock de voitures
type
tvoiture = article
numéro : chaîne ;
année : entier ;
marque, modèle : chaîne ;
prix : réel ;
fin ;
vvoiture = vecteur[1..100] de tvoiture ;
On suppose que le vecteur est trié par ordre croissant sur les numéros des
véhicules.
1°/ Écrire une procédure qui prend en entrée un vecteur de n voitures, une
marque et modèle et affiche l’année et le prix de chacune des voitures de le
marque et du modèle demandés
11
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
2°/ Écrire une procédure qui prend en entrée un vecteur de n voitures, un prix
inférieur et un prix supérieur et affiche l’année, la marque et le modèle de
chacune des voitures dont le prix est compris entre les deux prix.
4°/ Écrire une procédure qui prend entrée un vecteur de n voitures et une
nouvelle voiture et procède à l’insertion de la nouvelle voiture dans la liste ; le
vecteur de sortie devant être trié sur les numéros. La procédure retourne
également un indicateur booléen permettant de déterminer si l’insertion a
effectivement eu lieu.
5°/ Écrire une procédure qui prend entrée un vecteur de n voitures et un numéro
et procède à la suppression de la voiture de numéro demandé. La procédure
retourne également un indicateur booléen permettant de déterminer si la
suppression a effectivement eu lieu.
Librairie
On souhaite gérer les ouvrages vendus dans une librairie à l’aide d’une structure
composée d’un vecteur liste[1..taillemax]. Chaque composante du vecteur est une
variable article composé des champs suivants : le nom de l’auteur, le titre de
l’ouvrage, la discipline, le nom de l’éditeur, l’année d’édition et le prix du livre.
Le vecteur des ouvrages est supposé trié par ordre alphabétique sur les noms
des auteurs.
constante
taillemax = 100 ;
type
touvrage = article
auteur : chaîne ;
12
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
titre : chaîne ;
discipline : chaîne ;
éditeur : chaîne ;
prix : réel ;
quantité : entier ;
fin ;
vouvrage = vecteur[1..taillemax] de touvrage ;
On supposera que les titres de tous les livres écrits par un même auteur sont
différents.
1°/ Écrire une procédure qui crée un vecteur de n livres et le trie par ordre
alphabétique sur les noms des auteurs.
3°/ Écrire une fonction qui déterminer si un auteur de nom donné a écrit au
moins un livre.
4°/ Écrire une fonction qui délivre l’indice d’un ouvrage de titre et d’auteur
donnés dans la liste si cet ouvrage se trouve dans la liste et 0 sinon.
5°/ Écrire une fonction qui délivre la quantité en stock d’un ouvrage de titre et
d’auteur donnés.
6°/ Écrire une procédure qui imprime la liste des ouvrages dont la quantité en
stock est égale à zéro.
7°/ Écrire une procédure qui imprime la liste des ouvrages édités par un éditeur
donné.
8°/ Écrire une procédure qui imprime la liste des ouvrages disponibles dans une
discipline donnée.
9°/ Écrire une procédure qui ajoute un nouvel ouvrage dans la liste.
10°/ Écrire une procédure qui supprime un ouvrage de titre et d’auteur donnés.
12°/ Écrire une procédure qui supprime tous les livres dont la quantité en stock
est nulle.
12
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
Chapitre 7
Exercice 7.1
Écrire une fonction qui délivre la somme des éléments de rang impair d’un fichier
de nombres entiers.
Première version
Deuxième version
12
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
relire(f, nomfichier) ;
somme ← 0 ;
bascule ← vrai ;
tantque non fin(f) faire
début
lire(f, nombre) ;
si bascule alors
somme ← somme + nombre ;
Exercice 7.2
Écrire une fonction qui délivre la différence entre la somme des éléments de
rang pair et la somme des éléments de rang impair d’un fichier de nombres réels.
12
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 7.3
Écrire une fonction qui délivre la valeur du dernier élément d’un fichier
dernier ← élément ;
fermer(f) ;
fin ;
12
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 7.4
Écrire une fonction qui délivre la somme du premier élément et du dernier
élément d’un fichier de nombres réels (par convention, si le fichier est vide la
somme est nulle et si le fichier ne contient qu’un seul élément, la somme est
égale au double de l’unique élément).
Exercice 7.5
Écrire une fonction qui calcule le nombre d’occurrences d’une valeur dans un
fichier.
lire(f, élément) ;
si élément = val alors
n←n+1;
fin ;
nboccurrence ← n ;
fermer(f) ;
fin ;
Exercice 7.6
Écrire une fonction qui calcule le rang de la dernière occurrence d’une valeur
dans un fichier.
rangdernier ← rang ;
fermer(f) ;
fin ;
Exercice 7.7
Écrire une fonction qui vérifie qu’un fichier contient au moins n éléments.
12
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
i : entier ;
f : fichier de télément ;
début
relire(f, nomfichier) ;
i←0;
tantque (i < n) et non fin(f) faire
début
lire(f, élément) ;
i←i+1;
fin ;
aumoinsn ← i = n ;
fermer(f) ;
fin ;
Exercice 7.8
Écrire une fonction qui calcule le nombre d’occurrences d’une valeur comprises
entre le ième et le jème éléments avec i < j.
total ← 0 ;
tantque (k ≤ j) et non fin(f) faire
début
lire(f, élément) ;
k←k+1;
12
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
si élément = val
total ← total + 1 ;
fin ;
entreij ← total ;
fermer(f) ;
fin ;
sinon
entreij ← 0 ;
fin ;
Exercice 7.9
Écrire une fonction qui délivre le rang de la première occurrence de la valeur val
dans un fichier. Cette fonction retourne la valeur zéro si la valeur n’est pas
présente dans le fichier.
rangpremier ← i
sinon
rangpremier ← 0
fin ;
fermer(f) ;
12
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
Exercice 7.10
Écrire une fonction qui délivre le nombre d’occurrences de la valeur « val1 »
entre les premières occurrences des valeurs « val2 » et « val3 » dans cet ordre.
Première version
Deuxième version
On décompose le fichier f en :
f = f1 || <val2> || f2 || <val3> || f3 avec va2 ∉ f1 et val3 ∉ f2.
Exercice 7.11
On considère un fichier dont le type des éléments est défini par :
type
tpersonne = article
nom : chaîne ;
matricule : chaîne ;
âge : entier ;
sexe : (féminin, masculin) ;
fin ;
13
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
1. Écrire une fonction qui prend en entrée un fichier et délivre l’âge moyen
des femmes présentes dans le fichier.
2. Écrire une procédure qui prend en entrée un fichier et délivre le nombre
d’hommes et le nombre de femmes présents dans le fichier.
3. Écrire une fonction qui prend en entrée un fichier et retourne le nombre
de personnes mineures (moins de 18 ans) présentes dans le fichier.
4. Écrire une fonction qui prend en entrée un fichier et retourne le nom de la
personne la plus âgée présente dans le fichier. On suppose que la personne
la plus âgée est unique.
5. Écrire une procédure qui prend en entrée un fichier et une chaîne de
caractères représentant le matricule d’un employé et détermine si un
employé ayant ce matricule est présent dans la fichier. Dans le cas où
l’employé est présent dans le fichier, la procédure doit aussi retourner
l’ensemble des informations concernant cet employé.
13
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
pers : tpersonne ;
i, j : entier ;
début
relire(f, nomfichier) ;
i←0;
j←0;
tantque non fin(f) faire
début
lire(f, pers) ;
si pers.sexe = masculin alors
i←i+1
sinon
j←j+1;
fin ;
nbhom ← i ;
nbfem ← j ;
fermer(f) ;
fin ;
13
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
âgegrand : entier ;
nomgrand : chaîne ;
début
relire(f, nomfichier) ;
si fin(f) alors
plusâgé ← ‘*’
sinon
début
lire(f, pers) ;
âgegrand pers.âge ;
nomgrand pers.nom ;
tantque non fin(f) faire
début
lire(f, pers) ;
si pers.âge > grand alors
début
âgegrand ← pers.âge ;
nomgrand ← pers.nom ;
fin ;
fin ;
plusâgé ← nomgrand ;
fin ;
fermer(f) ;
fin ;
13
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin;
fermer(f) ;
fin ;
Exercice 7.12
Écrire une fonction qui reçoit en entrée un fichier et vérifie que le fichier est
trié dans l’ordre croissant sans répétition.
Exercice 7.13
13
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
Écrire une fonction qui reçoit en entrée un fichier et vérifie que le fichier est
trié dans l’ordre décroissant.
Il s’agit du même algorithme que celui du cours (fichier trié par ordre croissant)
mais en inversant la relation d’ordre ; il faut alors inverser les tests entre les
variables précédent et courant.
Exercice 7.14
Écrire un algorithme qui délivre le nombre d’occurrences de la valeur val dans un
fichier trié.
13
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
nb : entier ;
f : fichier de télément ;
courant : télément ;
début
relire(f, nomfichier) ;
nb ← 0 ;
si non fin(f) alors
début
lire(f, courant) ;
tantque non fin(f) et (courant ≤ val) faire
début
si courant = val alors
nb ← nb + 1 ;
lire(f, courant) ;
fin ;
si courant = val alors
nb ← nb + 1 ;
fin ;
effectifval nb ;
fin ;
Deuxième version
13
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
nb ← nb + 1 ;
lire(f, courant) ;
fin ;
si courant = val alors
nb ← nb + 1 ;
fin ;
effectifval nb ;
fin ;
Exercice 7.15
Écrire un algorithme qui délivre le rang de la dernière occurrence de la valeur val
dans un fichier trié ou zéro si val ne se trouve pas dans le fichier.
Première version
13
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
r←0;
si non fin(f) alors
début
lire(f, courant) ;
tantque non fin(f) et( courant ≤ val) faire
début
si courant = val alors
r←i;
i←i+1;
lire(f, courant) ;
fin ;
si courant = val alors
r←i;
fin ;
rangderval ← r ;
fermer(f) ;
fin ;
Deuxième version
13
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
i←i+1;
fin ;
tantque non fin(f) et( courant = val) faire
début
r←i;
lire(f, courant) ;
i←i+1;
fin ;
si courant = val alors
r←i;
fin;
rangderval ← r ;
fermer(f);
fin ;
Exercice 7.16
Écrire un algorithme qui recherche la valeur val après le rang i dans un fichier
trié.
Première version
13
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
sinon
si courant > val alors
rechercheaprèsi ← faux
sinon
début
tantque non fin(f) et (courant < val) faire
lire(f, courant) ;
rechercheaprèsi ← courant = val ;
fin ;
fin ;
Deuxième version
Exercice 7.17
14
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 7.18
Écrire une procédure qui prend en entrée un fichier de nombres entiers et
délivre en sortie deux fichiers, le premier contenant les éléments de rang impair
et le deuxième les éléments de rang pair.
14
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
bascule ← faux ;
tantque non fin(f) faire
début
lire(f, courant) ;
si bascule alors
écrire(h, courant)
sinon
écrire(g, courant) ;
bascule ← non bascule ;
fin ;
fermer(f) ;
fermer(g) ;
fermer(h) ;
fin ;
Exercice 7.19
Écrire une procédure d’union de deux fichiers triés par ordre croissant sans
répétition (le fichier obtenu doit être trié sans répétition).
14
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
écrire(hH, cg) ;
lire(gH, cg) ;
fin
sinon
début
écrire(hH, cf) ;
lire(fH, cf) ;
lire(gH, cg) ;
fin ;
écrire(hH, cf) ;
fermer(fH) ;
fermer(gH) ;
fermer(hH) ;
fin ;
Exercice 7.20
Écrire une procédure d’intersection de deux fichiers triés par ordre croissant
sans répétition (le fichier obtenu doit être trié sans répétition).
14
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
si fin(f) alors
écrire(hH, cf)
sinon
écrire(hH, cg) ;
fermer(fH) ;
fermer(gH) ;
fermer(hH) ;
fin ;
Exercice 7.21
Écrire une procédure d’insertion de la valeur elem après chaque occurrence de la
valeur val dans un fichier.
Exercice 7.22
Écrire une procédure d’insertion de la valeur elem après la dernière occurrence
de la valeur val dans un fichier trié.
14
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
courant : télément ;
f, g : fichier de télément ;
trouvé : booléen ;
début
relire(f, source) ;
réécrire(g, sortie) ;
trouvé ← faux ;
si non fin(f) alors
début
lire(f, courant) ;
tantque non fin(f) et (courant ≤ val) faire
début
écrire(g, courant) ;
trouvé ← courant = val ;
lire(f, courant) ;
fin ;
si courant = val alors
début
écrire(g, courant) ;
écrire(g, elem) ;
trouvé ← vrai ;
fin
sinon
si trouvé alors
début
écrire(g, elem) ;
écrire(g, courant) ;
tantque non fin(f) faire
début
lire(f, courant) ;
écrire(g, courant) ;
fin ;
fin ;
fin ;
fermer(f) ;
fermer(g) ;
fin ;
Exercice 7.23
14
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
Écrire une procédure de suppression, dans un fichier, de tous les éléments ayant
un rang compris entre i et j (j ≥ i).
Première version
14
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
Deuxième version
Exercice 7.24
Écrire une procédure de suppression de toutes les occurrences de la valeur val
dans un fichier trié.
14
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
lire(f, courant) ;
tantque non fin(f) et (courant < val) faire
début
écrire(g, courant) ;
lire(f, courant) ;
fin ;
si courant > val alors
possible ← faux
sinon
début
possible ← vrai ;
tantque non fin(f) et (courant = val) faire
lire(f, courant) ;
si courant > val alors
début
écrire(g, courant) ;
tantque non fin(f) faire
début
lire(f, courant) ;
écrire(g, courant) ;
fin ;
fin ;
fin ;
fin ;
fermer(f) ;
fermer(g) ;
fin ;
Deuxième version
14
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
trouvé ← faux ;
stop ← faux ;
tantque non fin(f) et non stop alors
début
lire(f, courant) ;
si (courant < val) alors
écrire(g, courant) ;
sinon
si courant = val alors
trouvé ← vrai
sinon
si trouvé alors
écrire(g, courant)
sinon
stop ← vrai ;
fin ;
possible ← trouvé ;
fermer(f) ;
fermer(g) ;
fin ;
Exercice 7.25
Écrire une procédure de suppression de tous les espaces (caractère blanc)
superflus dans une fichier de caractères. Le fichier résultat ne doit jamais
contenir deux espaces consécutifs.
14
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
écrire(g, courant) ;
précédent ← courant ;
fin ;
fermer(f) ;
fermer(g) ;
fin ;
Exercice 7.26
On considère un fichier d’étudiants dont le type des éléments est défini par :
type
toption = (GBIO, MIP, GTE, GIN) ;
tétudiant = article
nom : chaîne ;
matricule : chaîne ;
option : toption ;
fin ;
15
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
lire(f, étudiant) ;
si étudiant.option = option alors
possible ← vrai
sinon
écrire(g, étudiant) ;
fin ;
fermer(f) ;
fermer(g) ;
fin ;
15
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
relire(f, source) ;
réécrire(g, sortie) ;
trouvé ← faux ;
stop ← faux ;
tantque non fin(f) et non stop alors
début
lire(f, étudiant) ;
si (étudiant.option < option) alors
écrire(g, étudiant) ;
sinon
si étudiant.option = option alors
trouvé ← vrai
sinon
si trouvé alors
écrire(g, étudiant)
sinon
stop ← vrai ;
fin ;
possible ← trouvé ;
fermer(f) ;
fermer(g) ;
fin ;
Études de cas
Dans ce chapitre, nous appliquerons les algorithmes sur les fichiers séquentiels
composés d’articles ayant une structure complexe : gestion d’un fichier du
personnel enseignant d’une faculté (comptage des éléments vérifiant une ou
plusieurs propriétés, recherche d’éléments vérifiant une ou plusieurs propriétés,
mise à jour de fichiers, éclatement de fichiers), la facturation des bons de
commandes (comptage, création de fichiers, mise à jour, édition de factures), la
gestion académique des étudiants ‘une faculté.
On veut écrire un programme pour générer les étudiants inscrits dans une
faculté. Les informations sur les étudiants sont stockés dans un fichier. Les
informations retenues pour chaque étudiant sont : le numéro matricule
(différent pour chaque étudiant), le nom, le sexe, le programme de formation de
la filière concernée.
15
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
constante
nbmax = 40 ;
type
tcours = article
Code : chaîne ;
Intitulé : chaîne ;
Note : réel ;
fin ;
vcours = vecteur[1..nbmax] de tcours ;
tfilière = article
Code : chaîne ;
Dénomination : chaîne ;
nbcours : entier ;
listecours : vcours ;
fin ;
tétudiant = article
Matricule : chaîne ;
Nom : chaîne ;
Sexe : (Féminin, Masculin) ;
filière : tfilière ;
fin ;
fétudiant = fichier de tétudiant ;
Nous écrivons d’abord une procédure pour lire les informations sur un étudiant.
15
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
écrire('Nom : ' ) ;
lire(etudiant.Nom) ;
écrire('Sexe (F ou M): ' ) ;
lire(Ch) ;
si Ch = 'F' alors
etudiant.Sexe ← Feminin
sinon
si Ch = 'M' alors
etudiant.Sexe ← Masculin ;
écrire('Code filière : ' ) ;
lire(etudiant.filière.Code) ;
écrire('Dénomination filière : ' ) ;
lire(etudiant.filière.Dénominantion) ;
écrire('Nombre de cours : ' ) ;
lire(etudiant.filière.nbcours) ;
i ←1 ;
tantque i ≤ etudiant.filière.nbcours faire
début
écrire('Code du cours : ' ) ;
lire(etudiant.filière.listecours[i].Code) ;
écrire('Intitulé du cours : ' ) ;
lire(etudiant.filière.listecours[i].Intitulé) ;
écrire('Note obtenue : ' ) ;
lire(etudiant.filière.listecours[i].Note) ;
i←i+1;
fin ;
fin ;
15
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
fermer(f) ;
fin ;
2°/ Écrire une procédure qui imprime la liste générale des étudiants inscrits.
Nous écrivons d’abord une procédure pour afficher le nom, le matricule, le sexe
et la filière d’un étudiant.
3°/ Écrire une fonction qui délivre le nombre d’étudiants inscrits dans une filière
de code donné.
étudiant : tétudiant ;
f : fétudiant ;
nb : entier ;
début
relire(f, nomfichier) ;
nb ← 0 ;
tantque non(f) faire
début
lire(f, étudiant) ;
si étudiant.filière.Code = code alors
nb ← nb + 1 ;
fin ;
nbinscrits ← nb ;
fermer(f) ;
fin ;
4°/ Écrire une fonction qui délivre le nombre d’unités de valeurs validée par un
étudiant de matricule donné.
15
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
nb ← nb + 1 ;
i←i+1;
fin ;
fin ;
nbvalidés ← nb ;
fermer(f) ;
fin ;
5°/ Écrire une procédure qui imprime la liste étudiants ayant validé la totalité de
leurs unités de valeurs dans une filière donnée.
6°/ Écrire une procédure qui imprime (matricule, nom, sexe, filière) de tous les
étudiants présents dans le fichier.
7°/ Écrire une procédure qui imprime la liste des garçons inscrits dans une
filière de code donné.
15
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
étudiant : tétudiant ;
f : fétudiant ;
début
relire(f, nomfichier) ;
tantque non(f) faire
début
lire(f, étudiant) ;
si nb = étudiant.filière.code = code alors
afficherétudiant(étudiant) ;
fin ;
fermer(f) ;
fin ;
8°/ Écrire une procédure qui imprime la liste générale des garçons inscrits.
9°/ Écrire une procédure qui imprime la liste des filles inscrites dans une filière
de code donné.
15
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
lire(f, étudiant) ;
si (étudiant.sexe = Feminin) et (étudiant.filière.code = code)
alors
afficherétudiant(étudiant) ;
fin ;
fermer(f) ;
fin ;
10°/ Écrire une procédure qui imprime la liste générale des filles inscrites.
11°/ Écrire une procédure qui imprime le relevé des notes d’un étudiant de
matricule donné.
15
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
i←i+1;
fin ;
fin;
fermer(f) ;
fin ;
12°/ Écrire une procédure qui éclate un fichier d’étudiants en deux fichiers
suivant le sexe de l’étudiant.
14°/ Écrire une procédure qui insère un nouvel étudiant dans le fichier.
lire(f, étudiant) ;
si étudiant.matricule ≠ matricule alors
écrire(g, étudiant) ;
fin ;
fermer(f) ;
fermer(g) ;
fin ;
17°/ Écrire une procédure qui supprime tous étudiants d’une filière de code
donné.
Personnel enseignant
16
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
type
tenseignant = article
matricule : entier ;
nom : chaîne ;
statut : chaîne;
département : chaîne;
présent : booléen ;
grade : chaîne;
nbcours : entier;
ancienneté : entier ;
fin ;
fesneignant = fichier de tenseignant ;
5°/ Écrire un algorithme qui délivre le nombre des assistants les plus anciens
ainsi que leur nombre d’années d’ancienneté.
8°/ Écrire un algorithme qui vérifie qu’une personne de matricule donné est bien
dans le fichier et qu’elle est actuellement en poste. Si ces conditions sont
remplies, un nouveau fichier est créé où cette personne est mise en congé.
9°/ Écrire une procédure pour supprimer un enseignant de matricule donné dans
le fichier des personnels.
10°/ Écrire un algorithme qui éclate le fichier des personnels en deux fichiers :
un contenant les personnels en poste et un autre les personnels en congé.
Solution
16
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
Il s’agit d’un parcours de fichier avec affichage des éléments vérifiant certaines
propriétés.
Il s’agit d’un parcours de fichier avec affichage des éléments vérifiant une
certaine propriété.
début
écrire('Matricule : ' enseignant.matricule) ;
écrire('Nom : ', enseigant.nom) ;
{écriture du statut}
écrire('Statut :', enseignant.statut)
écrire('Grade : ', enseignant.grade)
si ens.position alors
écrire('Position : Présent')
sinon
écrire('Position : Congé') ;
fin ;
fermer(f) ;
fin ;
Facturation
16
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
Dans un premier temps, on dispose d’un fichier de commandes contenant tous les
bons de commande de l’ensemble des clients.
type
tcommande = article
codeclient, quantité : entier ;
prixunit : réel ;
fin ;
tfacture = article
codeclient : entier ;
montant : réel ;
fin ;
fcommande = fichier de tcommande;
ffacture = fichier de tfacture ;
1°/ On souhaite vérifier que le fichier de commandes est trié par ordre
croissant sur le code client. Écrire une fonction booléenne trié qui prend en
argument un fichier de commandes et retourne la valeur vrai si le fichier est trié
et faux sinon
3°/ On suppose maintenant que le fichier de commandes est trié par ordre
croissant sur le code client et on souhaite connaître le nombre de clients
différents dans le fichier de commande. Écrire une fonction qui prend en
argument un fichier de commandes et retourne le nombre de clients différents
présents dans le fichier de commandes.
16
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
4°/ Le fichier de commandes est toujours trié, et on veut établir une seule
facture pour tous les bons de commande d’un même client. Écrire une procédure
de facturation qui prend en argument un fichier de commandes et construit un
fichier de factures contenant une facture pour chaque client.
5°/ On dispose maintenant d’un fichier clients indiquant pour chaque client son
adresse. Ce fichier est trié sur codeclient. On utilisera les définitions
supplémentaires suivantes :
type
tclient = article
codeclient : entier ;
adresse : chaîne ;
fin ;
fclient = fichier de tclient ;
En supposant que le fichier clients est une variable globale de type fclient trié
sur codeclient, codeclient une variable globale de type entier, écrire un
algorithme qui prend en entrée un fichier de clients, un code client et retourne
l’adresse du client ayant cette adresse si celui est présent dans le fichier.
L’algorithme retourne aussi un booléen indiquant si la recherche a été fructueuse
ou non.
Remarque
Quand on invoque cet algorithme, on suppose que les premiers éléments de client
ont déjà été parcourus lors des appels précédents.
• clients est donc déjà ouvert en lecture,
• cet algorithme recherche l’adresse du client possédant le code codeclient,
• l’algorithme doit tenir compte du fait que le fichier clients est trié sur le
code client.
type
tfacturebis = article
codeclient : entier ;
adresse : chaîne50 ;
montant : réel ;
fin ;
terreur = article
codeclient : entier ;
message : chaîne ;
fin ;
16
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
8°/ On souhaite maintenant détecter les bons de commandes des clients afin de
leur faire un cadeau pour les fêtes de fin d’années. Pour cela on doit disposer du
montant de toutes les commandes de chaque client. On dispose de la structure
suivante :
type
tclient = article
codeclient : entier ;
adresse : chaîne ;
montant : réel ;
fin ;
Solution
16
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
1°/ On souhaite vérifier que le fichier de commandes est trié par ordre
croissant sur le code client. Écrire une fonction booléenne trié qui prend en
argument un fichier de commandes et retourne la valeur vrai si le fichier est trié
et faux sinon
16
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
de commandes n’est pas trié. Écrire une procédure de facturation qui construit
un fichier de factures contenant toutes les factures établies pour chaque bon de
commande.
3°/ On suppose maintenant que le fichier de commandes est trié par ordre
croissant sur le code client et on souhaite connaître le nombre de clients
différents dans le fichier de commande. Écrire une fonction qui prend en
argument un fichier de commandes et retourne le nombre de clients différents
présents dans le fichier de commandes.
C’est un parcours classique d’un fichier trié avec comptage d’éléments. Tous les
bons de commande d’un même client se suivent puisque le fichier est trié sur
code client. Deux clients consécutifs différents signifient que l’on passe d’un
client à un autre.
16
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
4°/ Le fichier de commandes est toujours trié, et on veut établir une seule
facture pour tous les bons de commande d’un même client. Écrire une procédure
de facturation qui prend en argument un fichier de commandes et construit un
fichier de factures contenant une facture pour chaque client.
17
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
5°/ On dispose maintenant d’un fichier clients indiquant pour chaque client son
adresse. Ce fichier est trié sur codeclient. On utilisera les définitions
supplémentaires suivantes :
type
tclient = article
codeclient : entier ;
adresse : chaîne ;
fin ;
fclient = fichier de tclient ;
En supposant que le fichier clients est une variable globale de type fclient trié
sur codeclient, codeclient une variable globale de type entier, écrire un
algorithme qui prend en entrée un fichier de clients, un code client et retourne
17
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
l’adresse du client ayant cette adresse si celui est présent dans le fichier.
L’algorithme retourne aussi un booléen indiquant si la recherche a été fructueuse
ou non.
type
tfacturebis = article
codeclient : entier ;
adresse : chaîne50 ;
montant : réel ;
fin ;
terreur = article
codeclient : entier ;
message : chaîne ;
fin ;
fcommande = fichier de tcommande ;
ffactures = fichier de tfacture ;
17
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
Cet algorithme est aussi une procédure auxiliaire utilisée dans la procédure
facturation3.
procédure cliensuivant ;
début
lire(commandes, commande) ;
tantque non fin(commandes) et (commande.codeclient = codeclient) faire
lire(f, commande) ;
fin ;
17
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
prochainclient : booléen ;
adresse : chaîné ;
fcoms : fcommande ;
clients : fclient ;
factures : ffacturebis ;
erreurs : ferreur ;
début
relire(fcoms, nomcom) ;
relire(clients, nomcli) ;
réécrire(factures, nomfac) ;
réécrire(erreurs, nomerr) ;
lire(fcom, commande) ;
tantque non fin(fcoms) faire
début
prochainclient ← faux ;
tantque non fin(fcoms) et (non prochainclient) faire
début
code ← commande.codeclient ;
recherche(adresse, prochainclient) ;
si non prochainclient alors
début
erreur.codeclient ← client.codeclient ;
erreur.message ← 'client inconnu' ;
écrire(erreurs, erreur) ;
clientsuivant ;
fin ;
fin ;
si prochainclient alors
début
montantclient ← commande.quantité * commande.prixunit ;
lire(fcom, commande) ;
tantque non fin(fcoms) et (code = commande.codeclient) faire
début
montantclient ← montantclient +
commande.quantité * commande.prixunit ;
lire(fcoms, commande) ;
fin ;
facture.codeclient ← codeclient ;
facture.montant ← montantclient ;
facture.adresse ← adresse ;
écrire(factures, facture) ;
17
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
fin ;
fermer(fcoms) ;
fermer(clients) ;
fermer(erreurs) ;
fin ;
8°/ On souhaite maintenant détecter les bons de commandes des clients afin de
leur faire un cadeau pour les fêtes de fin d’années. Pour cela on doit disposer du
montant de toutes les commandes de chaque client. On dispose de la structure
suivante :
type
tclient = article
codeclient : entier ;
adresse : chaîne ;
montant : réel ;
fin ;
17
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
factures : ffacturebis ;
erreurs : ferreur;
début
relire(fcoms, nomcom) ;
relire(clients, nomcli) ;
réécrire(factures, nomfac) ;
réécrire(erreurs, nomerr) ;
réécrire(nclients, nomncli) ;
lire(fcoms, com) ;
tantque non fin(fcoms) faire
début
{recherche client suivant}
prochainclient ← faux ;
tantque non fin(fcoms) et (non prochainclient) faire
début
codecli ← com.codeclient ;
recherche(adresse, prochainclient) ;
si non prochainclient alors
début
{codeclient n’est pas fcli, mise à jour de ferr}
erreur.codeclient ← client.codeclient ;
erreur.message ← 'client inconnu' ;
écrire(erreurs, erreur) ;
{cherche la première commande du prochain client}
clientsuivant ;
fin ;
fin ;
si prochainclient alors
début
total ← com.quantité * com.prixunit ;
lire(fcoms, com) ;
tantque non fin(fcoms) et (codecli = com.codeclient) faire
début
total ← total + com.quantité * com.prixunit ;
lire(fcoms, com) ;
fin ;
{mise à jour de ffac avec la facture du client précédent}
facture.codeclient ← codecli ;
facture.montant ← total ;
facture.adresse ← adresse ;
écrire(factures, facture) ;
17
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
17
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
Chapitre 8
Exercice 8.1
Citez deux différences entres les structures de données statiques et les
structures de données dynamiques.
Exercice 8.2
Définir des pointeurs pour pointer sur des variables de type entier, réel,
caractère, booléen, vecteur ou article.
Exercice 8.3
Que fait la procédure suivante ?
procédure parcoursliste(liste : pélément) ;
début
si liste ≠ nil faire
début
écrire(liste^.donnée) ;
parcoursliste(liste^.suivant) ;
écrire(liste^.donnée) ;
fin ;
fin ;
• parcoursliste((a, b, c))
•• écrire(a)
•• parcoursliste((b, c))
••• écrire(b)
17
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
••• parcoursliste((c))
•••• écrire(c)
•••• parcoursliste(nil)
•••• écrire(c)
••• écrire(b)
•• écrire(a)
Exercice 8.4
Que fait la procédure suivante ?
procédure parcoursliste(liste : pélément) ;
début
si liste ≠ nil faire
début
parcoursliste(liste^.suivant) ;
écrire(liste^.donnée) ;
parcoursliste(liste^.suivant) ;
fin ;
fin ;
• parcoursliste((a, b, c))
•• parcoursliste((b, c))
••• parcoursliste((c))
•••• parcoursliste(nil)
•••• écrire(c)
•••• parcoursliste(nil)
••• écrire(b)
••• parcoursliste(c)
•••• parcoursliste(nil)
•••• écrire(c)
•••• parcoursliste(nil)
•• écrire(a)
•• parcoursliste((b, c))
17
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
••• parcoursliste((c))
•••• parcoursliste(nil)
•••• écrire(c)
•••• parcoursliste(nil)
••• écrire(b)
••• parcoursliste(c)
•••• parcoursliste(nil)
•••• écrire(c)
•••• parcoursliste(nil)
Exercice 8.5
Écrire un algorithme qui retourne la valeur de la dernière cellule d’une liste
linéaire chaînée.
Exercice 8.6
Écrire un algorithme qui détermine le plus grand élément dans une liste linéaire
chaînée.
18
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
si liste = nil alors
trouvé ← faux
sinon
début
courant ← liste ;
grand ← liste^.donnée ;
trouvé ← vrai ;
tantque courant ≠ nil faire
début
si grand < courant^.donnée alors
grand ← courant^.donnée ;
courant ← courant^.suivant ;
fin ;
fin ;
fin ;
Exercice 8.7
Écrire un algorithme qui détermine le plus petit élément dans une liste linéaire
chaînée.
18
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
Exercice 8.8
Écrire une fonction qui prend en entrée une liste chaînée et retourne la position
du plus grand élément de la liste. On suppose que le plus grand élément est
unique et que la fonction retourne zéro si la liste est vide.
Exercice 8.9
Écrire une fonction qui prend en entrée une liste chaînée et retourne la position
du plus petit élément de la liste. On suppose que le plus grand élément est unique
et que la fonction retourne zéro si la liste est vide.
18
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 8.10
Écrire une procédure qui prend en entrée une liste chaînée et retourne le plus
grand et le second plus grand éléments de la liste.
On peut s’inspirer de l’algorithme que nous avons développé dans le cas des
vecteurs pour résoudre ce problème.
18
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
si liste = nil alors
trouvé ← faux
sinon
début
trouvé ← vrai ;
si liste^.suivant = nil alors
début
grand ← liste^.donnée ;
second ← liste^.donnée ;
fin
sinon
début
{trouver le plus grand}
grand ← liste^.donnée ;
p ← liste^.suivant ;
tantque p ≠ nil faire
début
si grand < p^.donnée alors
grand ← p^.donnée ;
p ← p^.suivant ;
fin ;
{trouver le second plus grand}
si liste^.donnée ≠ grand alors
second ← liste^.donnée
sinon
second ← liste^.suivant^.donnée ;
p ← liste^.suivant ;
tantque p ≠ nil faire
début
si grand ≠ p^.donnée alors
si second < p^.donnée alors
second ← p^.donnée ;
p ← p^.suivant ;
fin ;
fin ;
fin ;
fin ;
Exercice 8.11
Écrire une fonction qui prend en entrée une liste chaînée de nombres réels
retourne la somme des éléments de la liste.
18
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 8.12
On désire connaître l’adresse de la dernière occurrence d’une valeur dans une
liste. Écrire sous forme itérative et sous forme récursive la fonction qui délivre
cette adresse ou nil si la valeur n’est pas présente dans la liste.
18
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
pointeurdernier ← dernier ;
fin ;
On peut aussi donner une version récursive proche du parcours droite gauche
donné en cours. Il s’agit alors de trouver la première de la valeur val en
commençant par la fin de liste.
Exercice 8.13
Écrire, sous forme récursive et sous forme itérative, un algorithme qui vérifie
qu’une liste est triée par ordre décroissant.
Schéma récursif
sinon
décroissant ← faux ;
fin ;
Schéma itératif
Exercice 8.14
Écrire, sous forme itérative, un algorithme de recherche de la première
occurrence d’une valeur val dans une liste triée.
18
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 8.15
Écrire, sous forme itérative et sous forme récursive, un algorithme de
recherche de la dernière occurrence d’une valeur dans une liste triée.
Schéma itératif
fin ;
fin ;
Schéma récursif
Exercice 8.16
Écrire, sous forme itérative et sous forme récursive, l’algorithme d’insertion d’un
élément avant la première occurrence d’une valeur.
Schéma récursif
18
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
Schéma itératif
19
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
p ← p^.suivant ;
Exercice 8.17
Écrire, sous forme itérative et sous forme récursive, l’algorithme d’insertion d’un
élément après chaque occurrence d’une valeur.
Version récursive
Schéma itératif
19
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 8.18
Écrire, sous forme itérative et sous forme récursive, l’algorithme d’insertion d’un
élément avant chaque occurrence d’une valeur.
Schéma récursif
19
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
Schéma itératif
Pour pouvoir une insertion avant une occurrence de la valeur val, on a besoin de
connaître l’adresse de la cellule qui précède celle qui contient la valeur val. On va
donc utiliser la variable p^.suivant qui permet de sonder la valeur d’une cellule en
restant positionner sur celle qui la précède. Chaque fois qu’une insertion est
effectuée, on exécute l’instruction d’affectation p^ ← p^.suivant^.suivant pour
éviter de tourner en rond indéfiniment.
Exercice 8.19
Réécrire la procédure ci-dessus dans le cas d’une liste avec une sentinelle en
tête de liste.
19
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 8.20
On suppose que l’on les définitions de type suivantes :
type
pétudiant = ^tétudiant ;
pétudiant = article
nom : chaîne ;
prénom : chaîne ;
suivant : pétudiant ;
fin ;
Écrire une procédure qui prend en entrée un fichier d’étudiants et les insère
dans une liste chaînée par ordre alphabétique. Si deux étudiants ont le même
nom, on les classe par rapport à leurs prénoms.
L’algorithme d’insertion d’un élément dans une liste triée d’étudiants est le
suivant :
19
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 8.21
Écrire sous forme récursive et sous forme itérative l’algorithme de suppression
de toutes les occurrences d’une valeur dans une liste
19
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin
sinon
supprimetoutes(liste^.suivant, elem) ;
fin ;
Schéma itératif
Exercice 8.22
19
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
Schéma récursif
Schéma itératif
Exercice 8.23
Écrire sous forme récursive et sous forme itérative l’algorithme de suppression
de toutes les occurrences d’une valeur dans une liste triée.
Schéma récursif
19
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
supptête(liste) ;
supptoutes(liste, elem) ;
fin
sinon
supptoutes(liste^.suivant, elem) ;
fin ;
Schéma itératif
Exercice 8.24
Que fait la procédure suivante ?
19
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 8.25
Les listes circulaires ou anneaux. Les listes circulaires ou anneaux sont des
listes linéaires dans lesquelles le dernier élément pointe sur le premier. Il n’y a
donc ni premier ni dernier, mais il est nécessaire de garder un seul point d’entrée
dans l’anneau, que nous appellerons liste, pour faciliter l’écriture des algorithmes
sur les anneaux.
Ces listes sont très utilisées en programmation système et dans les systèmes de
gestion de bases de données. Une liste circulaire permet de chaîner entre eux
des éléments possédant une même propriété. Il suffit alors de connaître un
élément possédant cette propriété pour obtenir, par parcours de la liste
circulaire, tous les autres.
1. Écrire un algorithme pour créer une liste circulaire à partir des éléments
d’un fichier.
2. Écrire un algorithme de parcours d’une liste circulaire.
3. Écrire un algorithme qui délivre l’adresse de la cellule de valeur val dans un
anneau ou nil si val n’est présente dans l’anneau.
4. Écrire un algorithme d’insertion d’un nouvel élément avant une valeur val
dans une liste circulaire.
5. Écrire un algorithme d’insertion d’un nouvel élément après une valeur val
dans une liste circulaire.
6. Écrire un algorithme de suppression de la cellule de valeur val dans une
liste circulaire.
liste
19
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
20
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
p : pélément ;
stop : booléen ;
début
p ← liste ;
stop ← p = nil ;
tantque non stop faire
début
traiter(p) ;
p ← p^.suivant ;
stop ← p = liste ;
fin ;
fin ;
20
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
C’est un algorithme très important que nous utiliserons pour réaliser les autres
insertions. On notera en outre que c’est un cas très particulier car l’insertion en
tête modifie non seulement l’adresse du point d’entrée mais aussi celle de la
cellule précédente pour préserver la boucle. On peut schématiser cet algorithme
comme suit :
liste
(b)
(a)
(c)
Il suffit de réaliser les liaisons (a), (b) et (c) dans cet ordre.
20
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
liste
val
(b) (a)
élément à insérer
val
(b) (a)
20
3 Dr Ndi Nyoungui André
p
élément à insérer
Algorithmique et structures de données
(a)
liste
(a) (b)
liste
On suppose également que l’on a plus besoin de la cellule supprimée et que l’on la
rend au réservoir de cellules. Il faut donc préserver l’adresse de la tête de liste
avant d’effectuer la modification de cette adresse.
Il suffit d’effectuer les liaisons (a) et (b) dans cet ordre. Pour effectuer la
liaison (b), on doit connaître l’adresse de la cellule qui précède la tête de liste
dans l’anneau.
Exercice 8.26
Une liste doublement chaînée est une liste dans laquelle chaque cellule a un
pointeur sur la cellule précédente et un pointeur sur la cellule suivante.
1. Écrire un algorithme d’insertion d’un élément avant une valeur val.
2. Écrire un algorithme d’insertion d’un élément après une valeur val
3. Écrire un algorithme d’insertion d’un élément à la kème place.
4. Écrire un algorithme d’insertion de la valeur elem après chaque occurrence
de la valeur val.
5. Écrire un algorithme de suppression d’une valeur val.
6. Écrire un algorithme de suppression de la kème cellule.
7. Écrire un algorithme de suppression de toutes les occurrences de la valeur
val.
type
pélément = ^tcellule;
tcellule = article
précédent : pélément ;
donnée : télément;
20
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
suivant : pélément ;
fin ;
val
elm
p
Il faut effectuer les modifications des pointeurs (a), (b), (c), (d) et faire surtout
d’effectuer (c) et (d) dans cet ordre. Dans le cas de l’insertion en tête, on
obtient :
liste
(d)
(b) (c)
(a)
p
possible ← faux ;
si pval ≠ nil alors
début
possible ← vrai ;
nouveau(p) ;
p^.donnée ← elem ;
p^.suivant ← pval ;
p^.précédent ← pval^.précédent ;
si pval = liste alors
liste ← p
sinon
début
pval^.précédent^.suivant ← p ;
pval^.précédent ← p ;
fin ;
fin ;
fin ;
liste pval
val
elem
p
L’insertion en tête n’est pas possible, il faut par contre traiter le cas particulier
de l’insertion en fin de liste.
20
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
possible ← faux ;
si pval ≠ nil alors
début
possible ← vrai ;
nouveau(p) ;
p^.donnée ← elem ;
si pval^.suivant ≠ nil alors
début
p^.suivant ← pval^.suivant ;
pval^.suivant^.précédent ← p ;
p^.précédent ← pval ;
pval^.suivant ← p ;
fin
sinon
début
p^.suivant ← nil ;
p^.précédent ← pval ;
pval^.suivant ← p ;
fin ;
fin ;
fin ;
liste
(d)
(c)
(a)
(b)
p
20
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
Ou bien une insertion après le (k-1)ème élément, si k > 1 et que cet élément
existe. Il faut prévoir le cas particulier de l’insertion en fin de liste (pk = nil) où
l’action (c) n’a plus de sens.
liste pkmoinsun pk
21
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
p^.précédent ← pkmoinsun ;
si pk ≠ nil alors
pk^.précédent ← p ;
pkmoinsun^.suivant ← p ;
fin ;
fin ;
fin ;
21
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
fin ;
On veut supprimer, par exemple, la première occurrence de la valeur val dans une
liste doublement chaînée. On a trois cas possibles : suppression de la première
cellule, suppression de la dernière cellule et le cas général. Supposons que pval
contienne l’adresse de la cellule à supprimer.
pval
(a)
(b)
On peut effectuer les liaisons (a) et (b) dans n’importe quel ordre.
liste
pval
liste
(a)
(b) 21
2 Dr Ndi Nyoungui André
pval
Algorithmique et structures de données
pval
(a)
21
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
21
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
p^.suivant^.précédent ← p^.précédent ;
fin ;
Exercice 8.27
Les piles. La structure de pile est une structure de liste particulière.
Contrairement aux fichiers et aux vecteurs, elle ne sert généralement pas à
garder de façon plus ou moins définitive des informations. On s’intéresse plutôt
à la suite des états de la pile et on utilise le fait que le dernier élément ajouté se
trouve au sommet de la pile, afin de pouvoir être atteint le premier.
On peut donner une image du fonctionnement de cette structure avec une pile
d’assiettes : on peut ajouter et enlever des assiettes au sommet de la pile ; toute
insertion ou retrait d’une assiette au milieu de la pile est une opération qui
comporte des risques.
1. Écrire une procédure empiler qui a pour effet d’insérer un élément dans la
pile.
21
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
Soit une pile utilisant une représentation contiguë : un vecteur pile dont on donne
a priori la taille maximale taillemax. Dans ce cas, l’accès au premier élément est
déterminé par un indice sommet dont les valeurs extrêmes permettant de tester
les dépassements sont 0 et taillemax. On peut remarquer que la liste est
représentée à l’envers dans le vecteur : la tête de la liste correspond à l’indice le
plus élevé, ou sommet, la base à l’indice 1. Les dépassements sont testés dans les
primitives dépiler et empiler.
Les variables pile, taillemax et sommet étant globales, les primitives de gestion
d’une pile sont les suivantes :
21
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
Une pile peut être représentée par une liste linéaire chaînée telle que les
insertions ou les suppressions sont toujours effectuées en tête de liste.
procédure initpile ;
début
pile = nil ;
fin ;
21
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
elem ← pile^.donnée ;
possible ← vrai ;
fin ;
fin ;
Exercice 8.28
Les files d’attente ou queues. Une queue est semblable à une file d’attente à
une caisse d’un supermarché. La première personne en ligne est servie en premier
et les autres clients qui entrent à la fin de la queue attendent d’être servis à
leur tour. Les cellules sont retirées uniquement à la tête de la queue et insérés
uniquement à la fin. C’est pourquoi on désigne souvent la queue comme étant une
structure de données « premier arrivé, premier servi ». En anglais on dira
« first-in, first-out ou en abrégé FIFO ».
Les queues ont de nombreuses applications dans les systèmes informatiques. La
plupart des ordinateurs n’ont qu’un seul processeur, de sorte qu’un seul
utilisateur de ce processeur peut être servi à la fois. Les entrées des autres
utilisateurs doivent être placées dans une queue. Chacun des entres avance
progressivement vers le début de la queue, à mesure que les utilisateurs sont
21
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
servis. L’entrée qui se présente à l’avant de la queue est celle qui est sur le point
d’obtenir le service.
Une queue est définie à tout moment par sa tête et par sa queue.
procédure initqueue ;
début
tête ← 1 ;
queue ← 0 ;
fin ;
21
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin
sinon
On voit que les variables tête et queue augmentent toujours, et donc que le
vecteur devra être très grand, même s’il ne contient que peu d’éléments à chaque
instant. Pour contourner cet inconvénient , on peut envisager deux solutions.
procédure initqueue ;
début
queue ← 0 ;
fin ;
22
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
queue ← queue – 1;
fin ;
fin ;
Lorsque tête devient égal à (queue + 1) mod n, la queue est soit vide, soit pleine.
On est donc amené à distinguer les deux possibles en utilisant deux indicateurs
booléens queuevide et queuepleine.
procédure initqueue ;
début
tête ← 1 ;
queue ← 0 ;
queuevide ← vrai ;
queuepleine ← faux ;
fin ;
22
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
C’est une représentation classique de liste chaînée, dans laquelle on utilise une
pointeur supplémentaire : le pointeur sur la dernier cellule, ce qui permet
d’accélérer l’algorithme d’insertion qui a toujours en fin de liste.
En supposant que les variables tête et queue sont globales, les primitives de
gestion d’une queue deviennent :
procédure initqueue ;
début
tête ← nil ;
queue ← nil ;
fin ;
22
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
Études de cas
Dans ces études de cas, nous appliquerons les algorithmes classiques sur les
listes chaînées à quelques structures de données complexes.
Bibliothèque
type
pouvrage = ^touvrage ;
touvrage = article
auteur : chaîne ;
éditeur : chaîne ;
22
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
titre : chaîne ;
discipline : chaîne ;
année : entier ;
suivant : pouvrage ;
fin ;
1°/ Écrire un algorithme pour créer une liste chaînée d’ouvrages à partir d’un
fichier.
Nous écrivons d’abord des procédures auxiliaires pour lire un article de type
ouvrage et créer un fichier séquentiel d’articles de type ouvrage.
22
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
2°/ Écrire , sous forme itérative et sous forme récursive, un algorithme qui
imprime le nom de l’auteur, le nom de l’éditeur, le titre de l’ouvrage, la discipline
et l’année d’édition de tous les ouvrages enregistrés.
Nous écrivons d’abord une procédure auxiliaire pour imprimer un article de type
ouvrage.
22
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
Version itérative
Version récursive
3°/ Écrire, sous forme itérative et sous forme récursive, une fonction retourne
le nombre d’ouvrages présents dans la liste.
Version itérative
22
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
courant ← liste ;
compte ← 0 ;
tantque courant ≠ nil faire
début
compte ← compte + 1 ;
courant ← courant^.suivant ;
fin ;
longueurliste ← compte ;
fin ;
Version récursive
4°/ Écrire, sous forme itérative et sous forme récursive, une fonction qui
retourne le nombre d’ouvrages écrits par un auteur donné.
Version itérative
22
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
Version récursive
5°/ Écrire, sous forme itérative et sous forme récursive, une fonction qui
retourne un pointeur sur la kème cellule de la liste. La fonction retourne nil si la
cellule de rang k n’existe pas dans la liste.
Version itérative
Version récursive
22
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
si (liste = nil) alors
pointeurk ← liste
sinon
si (k = 1) alors
pointeurk ← liste
sinon
pointeurk ← pointeurk(liste^.suivant, k-1);
fin ;
6°/ Écrire, sous forme itérative et sous forme récursive, une fonction qui
retourne un pointeur sur le dernier livre d’une discipline donnée contenu dans une
liste. La fonction retourne nil si aucun live de mathématiques ne figure dans la
liste.
Version itérative
Version récursive
22
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
ptd ← liste ;
pointeurdernier ← pointeurdernier(liste^.suivant,
discip, ptd) ;
fin
sinon
pointeurdernier ← pointeurdernier(liste^.suivant, discip, ptd)
fin ;
7°/ On suppose que la liste est triée par ordre alphabétique sur les noms des
auteurs. Écrire, sous forme itérative et sous forme récursive, une fonction qui
délivre un pointeur sur le premier ouvrage écrit par un auteur donné. La fonction
retourne nil si cet auteur ne figure pas dans la liste.
Version itérative
Version récursive
23
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
sinon
premièrefois ← liste ;
fin ;
8°/ On suppose que la liste est triée par ordre alphabétique sur les noms des
auteurs. Écrire, sous forme itérative et sous forme récursive, une fonction qui
délivre un pointeur sur le dernier ouvrage écrit par un auteur donné. La fonction
retourne nil si cet auteur ne figure pas dans la liste.
Version itérative
Version récursive
23
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
9°/ Écrire, sous forme itérative et sous forme récursive, une procédure qui
insère un ouvrage à la kème place dans la liste.
Version itérative
23
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
fin ;
fin ;
Version récursive
Nous écrivons d’abord une fonction auxiliaire qui délivre un pointeur sur le
premier ouvrage d’une discipline donnée rencontré dans la liste.
Version itérative
23
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
Version récursive
Version itérative
23
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
Version récursive
11°/ Écrire sous forme itérative un algorithme d’insertion d’un ouvrage avant le
premier ouvrage d’une discipline donnée rencontré dans la liste.
Version récursive
Version itérative
23
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
p : pouvrage ;
début
si liste = nil alors
possible ← faux
sinon
si liste^.discipline = discip alors
début
possible ← vrai ;
insertête(liste, livre) ;
fin
sinon
début
p ← liste ;
tantque (p^.suivant ≠ nil) et alors
(p^.suivant^.discipline ≠ discip)
faire
p ← p^.suivant ;
12°/ On suppose que la liste est trié par ordre alphabétique sur les noms des
auteurs. Écrire, sous forme itérative et sous forme récursive, une procédure
d’insertion d’un ouvrage dans la liste.
Version itérative
23
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
Version récursive
Version itérative
23
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
supprimetête(liste) ;
possible ← vrai ;
fin
sinon
début
possible ← faux ;
précédent ← pointeurk(liste, k-1) ;
si (précédent ≠ nil) et alors (précédent^.suivant ≠ nil) alors
début
possible ← vrai ;
supprimetête(précédent^.suivant)
fin ;
fin ;
fin ;
Version récursive
14°/ Écrire, sous forme itérative et sous forme récursive, une procédure de
suppression du premier titre d’une discipline donné contenus dans la liste.
Version récursive
23
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
possible ← faux
sinon
si (liste^.discipline = discip) alors
début
supprimetête(liste) ;
possible ← vrai;
fin
sinon
supprimeval(liste^.suivant, val, possible) ;
fin ;
23
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
15°/ Écrire un algorithme de suppression de tous les livres écrits par un auteur
donné contenus dans la liste.
Version itérative
Version récursive
Agence de voyage
24
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
1. Une liste chaînée des compagnies avec lesquelles l’agence travaille. Chaque
compagnie sera caractérisée par :
• le nom de la compagnie
• un pointeur sur la liste des vols offerts par cette compagnie.
2. Pour chaque compagnie, il existe une liste chaînée des vols prévus. Chaque vol
est caractérisé par :
• le numéro du vol,
• les villes de départ et de destination,
• les heures de départ et d’arrivée,
• le nombre de places,
• un vecteur de booléens pour gérer la disponibilité des places.
• un pointeur sur une liste de passagers ayant fait une réservation pour ce
vol,
3. Pour chaque vol, il existe une liste chaînée des passagers ayant fait une
réservation. Chaque passager est caractérisé par :
• le nom du passager,
• le numéro du vol,
• le numéro de siège.
type
pcompagnie = ^tcompagnie ;
ppassager = ^ppassager ;
pvol = ^tvol ;
tcompagnie = article
nomcomp : chaîne ;
listevols : pvol ;
suivant : pcompagnie ;
fin ;
tvol = article
numéro : chaîne ;
villedépart, villearrivée : chaîne ;
heuredépart, heurearrivée : entier ;
24
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
nbplaces : entier ;
listeplaces : vecteur[1..nbplaces] de booléen ;
listepass : ppassager ;
suivant : pvol ;
fin ;
ppassager = article
nompass : chaîne ;
numvol : chaîne ;
siège : entier ;
suivant : ppassager ;
fin ;
On supposera que :
1°/ Écrire, sous itérative et sous forme récursive, une fonction qui retourne le
nombre de compagnies qui n’ont pas de vol programmé.
2°/ Écrire, sous itérative et sous forme récursive, une fonction qui retourne le
nombre de compagnies ayant un seul vol programmé.
3°/ Écrire, sous itérative et sous forme récursive, une fonction qui retourne le
nombre total de vols programmés.
4°/ Écrire, sous itérative et sous forme récursive, une fonction qui retourne le
nombre de vols programmés par la compagnie de nom nomcomp.
24
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
6°/ Écrire une procédure qui enregistre un passager de nom nompassager dans le
vol de numéro numvol de la compagnie de nom nomcomp.
7°/ On suppose maintenant que la liste de passagers pour chaque vol est
ordonnée par ordre alphabétique. Écrire une procédure qui enregistre un
passager de nom nompassager dans le vol de numéro numvol de la compagnie de
nom nomcomp.
8°/ Écrire une procédure qui supprimer le passager de nom nompassager dans le
vol de numéro numvol de la compagnie de nom nomcomp.
9°/ Écrire une procédure qui transfère le passager de nom nompassager du vol
de numéro numvil1 au vol de numéro numvol2 de la compagnie de nom nomcomp.
Familles
La liste est ordonnée par ordre alphabétique sur les noms de famille. La
population correspond au schéma suivant :
liste
Hamado
Amougou Kamgang
u
type
pfamille = ^tfamille ;
tfamille = article
nom : chaîne ;
suivant : pfamille ;
24
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
fin ;
1°/ Écrire, sous forme itérative et sous forme récursive, une fonction retourne
le nombre de familles dans une liste.
Version itérative
Version récursive
2°/ Écrire, sous forme itérative et sous forme récursive, une fonction qui
détermine si une famille de donnée est présente dans la liste.
Version itérative
24
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
courant ← liste ;
tantque (courant ≠ nil) et alors (nomfam > liste^.nom) faire
courant ← courant^.suivant ;
si (courant ≠ nil) et alors (courant^.nom = nomfam) alors
présent ← courant
sinon
présent ← nil ;
fin ;
Version itérative
3°/ Écrire, sous forme itérative et sous forme récursive, une procédure qui
insère une nouvelle famille dans la liste.
Il s’agit d’une insertion classique dans une liste chaînée. On définit d’abord la
procédure auxiliaire insertête.
Version itérative
24
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
Version récursive
4°/ Écrire, sous forme itérative et sous forme récursive, une procédure qui
supprime une famille de nom donné de la liste.
24
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
Il s’agit d’une suppression classique dans une liste triée. On définit d’abord la
procédure auxiliaire supptête.
Version itérative
24
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
type
pfamille = ^tfamille ;
ppersonne = ^tpersonne ;
pvoiture = ^tvoiture ;
tfamille = article
nom : chaîne ;
parent : ppersonne ;
enfant : ppersonne ;
voiture : pvoiture ;
suivant : pfamille ;
fin ;
tpersonne = article
nom : chaîne ;
sexe : caractère ;
suivant : ppersonne ;
fin ;
tvoiture = article
marque : chaîne ;
numéro : chaîne ;
suivant : pvoiture ;
fin ;
On supposera que :
24
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
• la population est ordonnée par ordre alphabétique sur les noms de famille.
1°/ Écrire, sous itérative et sous forme récursive, une fonction qui retourne le
nombre de famille sans parents.
Version itérative
Version récursive
2°/ Écrire, sous itérative et sous forme récursive, une fonction qui retourne le
nombre de familles qui n’ont plus qu’un seul parent.
Version récursive
24
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
3°/ Écrire, sous itérative et sous forme récursive, une fonction qui retourne le
nombre d’enfants de la population.
Version itérative
Version récursive
25
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
début
si enf = nil alors
nbenfantsfamille ← 0
sinon
nbenfantsfamille ← 1 + nbenfantsfamille(enf^.suivant) ;
fin ;
4°/ Écrire, sous itérative et sous forme récursive, une fonction qui retourne le
nombre d’enfants d’une famille de nom donné.
Version itérative
25
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
6°/ Écrire une procédure qui insère un enfant de prénom et de sexe donnés dans
une famille de nom donné.
25
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
p^.suivant ← enf ;
enf ← p ;
fin ;
7°/ On suppose maintenant que la liste des enfants est ordonnée par ordre
alphabétique. Écrire une procédure qui insère un enfant de nom et de sexe
donnés dans une famille de nom donné.
8°/ Écrire une fonction booléenne qui supprime une voiture de numéro donné. La
fonction retourne la valeur vrai si et seulement si une voiture ayant ce numéro
existe et a été supprimée.
25
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
9°/ Une famille achète une voiture à une autre famille. Écrire une procédure qui
effectue le transfert de la voiture entre les deux familles.
25
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
p : pvoiture ;
début
si liste2 = nil alors
trouvé ← faux
sinon
si liste2^.numéro = numéro alors
début
p ← liste2^.suivant ;
liste2^.suivant ← liste1 ;
liste1 ← liste2 ;
liste2 ← p ;
trouvé ← vrai ;
fin
sinon
changeprop(liste1, liste2^.suivant, numéro, trouvé) ;
fin ;
Location de voitures
25
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
1. Un vecteur vprop dans lequel figure les noms et adresses des propriétaires de
voitures mises en location. Dans ce vecteur, chaque propriétaire apparaît une
seule fois, dans un ordre quelconque. Un entier nbprop indique le nombre de
propriétaires répertoriés. On suppose que les propriétaires ont des noms
différents.
2. Une liste chaînée, d’adresse liste, des voitures offertes en location. Chaque
voiture sera caractérisée dans la liste par :
• la marque de la voiture,
• le numéro de la voiture,
• l’indice dans le vecteur des propriétaires,
• un pointeur sur la liste des réservations (nil si aucune réservation n’est
enregistrée).
La liste [liste] des voitures est triée uniquement sur les marques de voitures.
3. Pour chaque voiture, il existe une liste chaînée des locations. Les locations ne
pouvant se faire que par jours entiers, les dates de locations sont remplacées
par des numéros de jour dans le mois. Chaque location est caractérisée par :
• le numéro du jour du début de la location,
• le numéro du jour de fin de la location (si la location est pour une seule
journée, ces numéros sont identiques),
• le nom du locataire.
Ces listes sont triées sur les dates de location. On ne peut pas avoir plus d’une
réservation pour une même voiture pour une journée donné. On suppose que les
locataires ont tous des noms différents, et qu’aucun n’a effectué plus d’une
réservation le même mois.
constante
taillemax = 100 ;
type
propriétaire = article
nom : chaîne ;
adresse : chaîne ;
fin ;
vectprop = vecteur[1..taillemax] de propriétaire ;
pvoiture = ^voiture ;
25
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
plocation = ^location ;
voiture = article
marque : chaîne ;
numéro : chaîne ;
indprop : entier ;
reserv : plocation ;
suivant : pvoiture ;
fin ;
location = article
jourdeb, jourfin : 1..31 ;
nomloc : chaîne ;
suivant : plocation ;
fin ;
variable
vprop : vectprop ;
nbprop : entier ;
liste : pvoiture ;
On précise que vprop, nbprop et liste sont des variables globales et peuvent donc
ne pas figurer dans les en-têtes des algorithmes.
1°/ Écrire une fonction qui retourne la position d’un propriétaire de nom donné
dans vprop. La fonction retourne zéro si aucun propriétaire de ce nom n’est
présent dans la liste.
Version itérative
Version récursive
25
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
2°/ Écrire une fonction qui délivre un pointeur sur la réservation dont le nom du
locataire est nomloc, ou bien nil si aucune réservation n’est trouvée.
On utilise une recherche associative dans une liste non triée. Ici il y a deux
niveaux de listes, la version récursive oblige donc à écrire deux fonction
séparées.
Version itérative
25
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
sinon
pointeurloc ← nil ;
fin ;
Version récursive
3°/ Écrire une fonction qui délivre le nombre de voitures qui appartiennent au
propriétaire de rang indice dans le vecteur vprop.
Version itérative
25
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
compte : entier ;
début
liste1 ← liste ;
compte ← 0 ;
tantque liste1 ≠ nil faire
début
si liste1^.indprop = indice alors
compte ← compte + 1 ;
liste1 ← liste1^.suivant ;
fin ;
nbvoituresprop ← compte ;
fin ;
Version récursive
4°/ Écrire une fonction qui délivre le nombre de voitures qui appartiennent au
propriétaire de nom nomprop. La fonction retourne –1 si ce propriétaire est
inconnu.
26
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
5°/ Écrire une fonction qui retourne le nombre total de jours de location
enregistrés dans la liste des réservations.
Shéma itératif
Shéma itératif
6°/ Écrire une fonction qui retourne le nombre de voitures qui ne sont pas
louéesau cours d’un mois.
26
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
Schéma itératif
Version récursive
7°/ Écrire une procédure qui imprime la liste complète des voitures, avec pour
chaque voiture, la marque, le numéro et le nom du propriétaire.
C’est le parcours simple d’une liste chaînée avec impression de chaque élément.
Schéma itératif
26
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
p : liste ;
début
p ← liste ;
tantque p ≠ nil faire
début
écrite(p^.marque) ;
écrire(p^.numéro) ;
écrire(vprop[p^.indprop].nom) ;
p ← p^.suivant ;
fin ;
fin ;
Version récursive
8°/ Écrire une procédure qui imprime la liste des locataires pour un jour de
numéro donné numjour, avec pour chacun le nom du propriétaire ainsi que la
marque et le numéro du véhicule.
26
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
trouvé ← faux ;
tantque (pr ≠ nil) et (non trouvé) faire
si pr^.jourfin < numjour alors
pr ← pr^.reserv
sinon
début
trouvé ← vrai ;
si pr^.jourdeb ≤ numjour alors
début
écrire(pr^.nomloc) ;
écrire(vprop[p^.indprop].nom)
;
écrire(p^.marque) ;
fin ;
fin ;
p ← p^.suivant ;
fin ;
fin ;
9°/ Écrire une fonction qui détermine si une voiture dont la liste de réservations
a pour adresse reserv est libre pendant le jour de numéro numjour.
Schéma itératif
26
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
stop ← vrai ;
trouvé ← faux ;
fin
sinon
p ← p^.suivant ;
libre ← trouvé ;
fin ;
Schéma récursif
10°/ Écrire une procédure qui imprime les noms et les adresses des propriétaires
de voitures d’une marque donnée qui sont libres un jour de numéro donné.
Ici encore, on recherche toutes les occurrences d’une valeur dans une liste triée.
Schéma itératif
26
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
Schéma récursif
écrire(vprop[liste^.indprop].adresse) ;
fin ;
listelibre(liste^.suivant, marque, numjou) ;
fin ;
fin ;
11°/ Écrire une procédure d’insertion d’un propriétaire de nom donné dans le
vecteur vprop. S’il y figure déjà, la procédure retourne son rang dans vprop. S’il
n’y figure pas encore, la procédure demandera son adresse, l’insérera dans vprop,
et retournera l’indice d’insertion.
Le vecteur vprop n’est pas trié, on se contente donc d’insérer les coordonnées
des nouveaux propriétaires à la fin du vecteur.
26
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
i : entier ;
adresse : chaîne ;
début
i ← rangprop(nom) ;
si i = 0 alors
début
nbprop ← nbprop + 1 ;
vprop[nbprop].nom ← nom ;
écrire('Quelle est son adresse ? ') ;
lire(vprop[nbprop].adresse) ;
insprop ← nbprop ;
fin
sinon
insprop ← i ;
fin ;
12°/ Écrire une procédure qui insère en tête de liste une nouvelle voiture dont on
donne la marque, le numéro et le nom du propriétaire.
C’est l’insertion classique d’une nouvelle cellule en tête d’une liste chaînée.
13°/ Écrire une procédure qui insère en tête de liste une nouvelle voiture dont on
donne la marque, le numéro et le nom du propriétaire, après les autres voitures
de même marque. Si le nom du propriétaire est nouveau, les mises à jour
nécessaires seront effectuées.
26
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
Schéma itératif
Schéma récursif
14°/ Écrire une procédure qui insère une nouvelle réservation en tête d’une liste
de réservations ; le nom du locataire et les numéros des jours de début et de fin
sont donnés.
26
8 Dr Ndi Nyoungui André
Algorithmique et structures de données
variable
p : plocation ;
début
nouveau(p) ;
p^.suivant ← liste ;
p^.nomloc ← nomloc ;
p^.jourdeb ← jour1 ;
p^.jourfin ← jour2 ;
liste ← p ;
fin ;
15°/ Écrire une fonction qui effectue la réservation pour un locataire de nom
donné dans une liste de réservations. La fonction retourne une valeur booléenne
égale à vrai si la réservation a été possible (la période souhaitée est libre) et
faux sinon.
Il s’agit encore d’une variante de l’insertion d’un élément dans une liste triée.
Nous ne donnons que la version récursive, car la version itérative serait
particulièrement lourde.
16°/ Écrire une fonction qui effectue une réservation pour le locataire de nom
donné d’une voiture de marque donnée, du jour jour1 au jour jour2. La fonction
retourne une valeur booléenne égale à vrai si la réservation a été possible (il
existe une voiture de la marque souhaitée, libre les jours souhaités) et faux
sinon.
26
9 Dr Ndi Nyoungui André
Algorithmique et structures de données
Schéma itératif
Schéma récursif
27
0 Dr Ndi Nyoungui André
Algorithmique et structures de données
17°/ Écrire une fonction qui supprime la réservation au nom de nomloc, si elle
existe, dans une liste de réservations et délivre un booléen indiquant si la
suppression a été effectué.
Il s’agit ici de la suppression d’une valeur dans une liste non triée. Nous ne
donnons que la version récursive en raison de sa simplicité.
18°/ Écrire une procédure qui annule la réservation faite au nom de nomloc. S’il
n’y a pas de réservation à ce nom, la procédure imprime un message d’erreur.
Version itérative
27
1 Dr Ndi Nyoungui André
Algorithmique et structures de données
Version récursive
19°/ Écrire une procédure qui essaie de prolonger d’un jour la location au nom de
nomloc, pour la même voiture. Des messages sont affichés dans tous les cas :
prolongement possible, prolongement impossible ou réservation inexistante.
27
2 Dr Ndi Nyoungui André
Algorithmique et structures de données
si p ≠nil alors
début
jour ← p^.jourfin + 1 ;
si p^.suivant = nil alors
début
p^.jourfin ← jour ;
écrire('Prolongation enregistrée') ;
fin
sinon
si p^.suivant^.jourdeb > jour alors
début
p^.jourfin ← jour ;
écrire('Prolongation enregistrée') ;
fin
sinon
écrire('Prolongation impossible') ;
fin
sinon
écrire('Erreur sur le locataire : ', nom) ;
fin ;
27
3 Dr Ndi Nyoungui André
Algorithmique et structures de données
Chapitre 9
linéaires
Exercice 9.1
Écrire, sous forme récursive et itérative, un algorithme vérifiant qu’un arbre
binaire est ordonné.
Version récursive
Version itérative
27
4 Dr Ndi Nyoungui André
Algorithmique et structures de données
rac : pélément ;
début
initpilevide ;
trié ← vrai ;
rac ← racine ;
tantque ((rac ≠ nil) ou non pilevide) et trié faire
début
tantque rac ≠ nil faire
début
empiler(rac) ;
rac ← rac^.gauche ;
fin ;
dépiler(rac) ;
trié ← min ≤ racine^.donnée ;
min ← rac^.donnée ;
rac ← rac^.droire ;
fin ;
ordonné ← trié ;
fin ;
Exercice 9.2
Transformer la fonction récursive de recherche d’un élément dans un arbre
binaire afin qu’elle délivre un pointeur sur la première occurrence de l’élément
qu’elle trouve dans l’arbre.
La fonction que nous allons écrire doit délivrer un pointeur et non un booléen ; on
ne peut donc plus l’utiliser dans un test. Nous ne pouvons pas non plus songer à
écrire :
car cela reviendrait à appeler deux fois la même fonction récursive. Il faut donc
forcément passer par une variable auxiliaire de type POINTEUR dans laquelle on
range la valeur de adresse(racine^.gauche, val) pour pouvoir d’abord la comparer
à nil, et ensuite, s’il y a lieu, retourner cette valeur.
27
5 Dr Ndi Nyoungui André
Algorithmique et structures de données
p : pélément ;
début
si (racine = nil) ou sinon (racine^.donnée = val) alors
adresse ← racine
sinon
début
p ← adresse(racine^.gauche, val) ;
si p ≠ nil alors
adresse ← p
sinon
adresse ← adresse(racine^.droite, val) ;
fin ;
fin ;
Exercice 9.3
Transformer la fonction itérative de recherche d’un élément dans un arbre
binaire afin qu’elle délivre un pointeur sur la première occurrence de l’élément
qu’elle trouve dans l’arbre.
27
6 Dr Ndi Nyoungui André
Algorithmique et structures de données
adresse ← adr ;
fin ;
Exercice 9.4
Transformer la fonction récursive de recherche d’un élément dans un arbre
binaire ordonné afin qu’elle délivre un pointeur sur la première occurrence de
l’élément rencontrée.
Exercice 9.5
27
7 Dr Ndi Nyoungui André
Algorithmique et structures de données
Exercice 9.6
Écrire une procédure qui crée un arbre binaire ordonné à partir des éléments
d’un fichier.
27
8 Dr Ndi Nyoungui André