1 / 20
Introduction à l’algorithmique
Travaux dirigés (TD)
Correction
Youssouf EL ALLIOUI
p
y.elallioui@usms.ma
Série 1
FONCTIONS ET PROCEDURES
Exercice 5. 1.
Ecrire une fonction distance ayant comme paramètres 4 rèels 𝑥𝑎, 𝑦𝑎, 𝑥𝑏 𝑒𝑡 𝑦𝑏 qui représentent
les coordonnées de deux points 𝐴 et 𝐵 et qui renvoie la distance 𝐴𝐵. Tester cette fonction.
Solution
Fonction distance (xa:Rèel, xb:Rèel, ya:Rèel, yb:Rèel) : Rèel
Var AB : Rèel
Début
AB ← sqrt ((xa - xb)2
+ (ya - yb)2
)
distance ← AB
Fin
Tester cette fonction :
Algo test
Var xa, ya : Rèel
Var xb, yb : Rèel
Var distanceAB : Rèel
Début
Ecrire ("Entrer les cordonnées du point A : ")
Lire (xa, ya)
Ecrire ("Entrer les cordonnées de point B : ")
Lire (xb, yb)
distanceAB ← distance (xa, xb, ya, yb)
Ecrire ("AB = ", distanceAB)
Fin
2020
2 / 20
Exercice 5. 2.
Ecrire une fonction 𝑓 ayant en paramètre un entier et qui renvoie un booléen : 𝑂𝑈𝐼 si l'entier
est premier 𝑁𝑂𝑁 sinon. Tester cette fonction.
Solution
Fonction f (N : Entier) : Booleen
Var estPremier : Booleen
Var i : Entier
Début
estPremier ← Faux
Pour i ← 1 A N Faire
Si (N % i = 0) Alors
estPremier ← Vrai
f ← estPremier
Fin Si
Fin Pour
f ← estPremier
Fin
Tester cette fonction :
Algo test
Var N : Entier
Début
Ecrire ("Entrer un nombre entier : ")
Lire (N)
Si (f(N)) Alors
Ecrire (N, " est premier")
Sinon
Ecrire (N, " n’est pas premier")
Fin Si
Fin
Exercice 5. 3.
Ecrire une fonction 𝑠𝑤𝑎𝑝 ayant en paramètres 2 entiers a et b et qui échange les contenus de 𝑎
et de 𝑏. Tester cette fonction.
Solution
Procedure swap (A : Entier, B : Entier)
Var C : Entier
Début
C ← A
A ← B
B ← C
Fin
3 / 20
Tester cette fonction :
Algo test
Var A, B : Entier
Début
Ecrire ("Entrer le premier nombre : ")
Lire (A)
Ecrire ("Entrer le dexième nombre : ")
Lire (B)
swap (A, B)
Ecrire ("A : ", A)
Ecrire ("B : ", B)
Fin
Exercice 5. 4.
Etablir une fonction 𝑟é𝑠𝑜𝑢𝑑𝑟𝑒 permettant de calculer les solutions de l'équation :
(𝑬) : 𝒂𝒙𝟐
+ 𝒃𝒙 + 𝒄 = 𝟎 𝒂, 𝒃 𝑒𝑡 𝒄 sont des réels
Cette fonction aura comme paramètres 𝒂, 𝒃 et 𝒄. On prendra garde à bien tester tous les cas
possibles :
• 𝑎 est nul, et l'équation est en fait une équation du premier degré. Exemple : 4𝑥 − 2 = 0
donne une unique solution 𝑥 = 0.5.
• Le discriminant 𝛥 = (𝑏"
− 4 ∗ 𝑎 ∗ 𝑐) est nul, et il n'y a qu'une seule solution, appelée
racine double, au problème. Exemple : 2𝑥² + 4𝑥 + 2 = 0 donne 𝑥 = −1.
• Le discriminant 𝛥 est positif, et deux solutions existent : 𝑥# =
$%$√'
"∗)
et 𝑥" =
$%*√'
"∗)
.
Exemple : 2𝑥² + 𝑥 − 6 = 0 donne 𝑥# = 1.5 et 𝑥" = −2.
• Le discriminant 𝛥 est négatif, et il n'existe pas de solutions (réelles) au problème.
Exercice 5. 5.
Écrire les actions paramètres (procédure ou fonction) permettant de résoudre les problèmes
suivants :
1) Calcul de la somme de deux nombres entiers.
2) Calcul de la factorielle de N (N !).
3) Vérifier si un nombre entier A divise un nombre entier B.
4) Calcul du quotient et du reste de la division entière de deux nombres entiers A et B.
5) Vérifier si un caractère donné est une voyelle (voyelles : 'a', 'e', 'i', 'o', 'u', 'y').
6) Permet de permuter le contenu de deux variables rèelles.
7) Étant donné un entier A, calcule sa valeur absolue.
4 / 20
Solution
1) Calcul de la somme de deux nombres entiers.
Fonction somme (x : Entier, y : Entier) : Entier
Début
somme ← x + y
Fin
2) Calcul de la factorielle de N (N !).
Fonction factorielle (x : Entier) : Entier
Var i, fact : Entier
Début
Fact ← 1
Pour i ← 1 A x Faire
fact ← fact * i
Fin Pour
factorielle ← fact
Fin
3) Vérifier si un nombre entier A divise un nombre entier B.
Fonction divise (A : Entier, B : Entier) : booleen
Début
divise ← Faux
Si (B mod A = 0) Alors
divise ← vrai
Fin Si
Fin
4) Calcul du quotient et du reste de la division entière de deux nombres entiers A et B.
Procedure quotientDuReste (A : Entier, B : Entier)
Var Q, R : Entier
Début
Q ← 0
R ← 0
Tantque (R>=B) faire
R ← R mod B
Q ← Q + 1
Fin Tantque
Fin
5) Vérifier si un caractère donné est une voyelle (voyelles : 'a', 'e', 'i', 'o', 'u', 'y').
Fonction voyelle (c : Caractère) : Booleen
5 / 20
Var estVoyelle : Booleen
Début
estBooleen ← Faux
Si (c = 'a' OU c = 'e' OU c = 'i' OU c = 'o' OU c = 'u' OU c = 'y')
Alors
estBooleen ← Vrai
Fin Si
voyelle ← estBooleen
Fin
6) Permet de permuter le contenu de deux variables réelles.
Procedure permuter (A : Entier, B : Entier)
Var C : Entier
Début
C ← A
A ← B
B ← C
Fin
7) Étant donné un entier A, calcule sa valeur absolue.
Fonction valeurAbsolue (A : Entier) : Entier
Début
Si (A < 0) Alors
valeurAbsolue ← -A
Fin Si
valeurAbsolue ← A
Fin
6 / 20
Introduction à l’algorithmique
Travaux dirigés (TD)
Correction
Youssouf EL ALLIOUI
p
y.elallioui@usms.ma
Série 2
LA RÉCURSIVITÉ
Exercice 2. 1
Écrire les actions paramètres (procédure ou fonction) permettant de calculer la factorielle d’un
entier N (N !). Tester cette fonction.
Solution :
Fonction factorielle (x : Entier) : Entier
Var i, fact : Entier
Début
If (N = 0 OU N = 1) Alors
factorielle ← 1
Sinon
factorielle ← N * factorielle (N-1)
Fin Si
Fin
Tester cette fonction :
Algo test
Var N : Entier
Début
Ecrire ("Entrer un nombre entier : ")
Lire (N)
Ecrire (N, " ! = ", factorielle (N))
Fin
Exercice 2. 2
Expliquez les fonctionnalités des fonctions suivantes
2020
7 / 20
Fonction fct1 (x : Entier, y : Entier) : Entier
Début
Si (x = 0) Alors
fct1 ← y
Sinon
fct1 ← fct1 (x-1, x+y)
Fin Si
Fin
Solution :
La fonction fct1() calcule et retourne ((1 + 2 ... + x-1 + x) +y) qui est (x(x+1)/2) + y. Par
exemple, si x est 5 et y est 2, alors fct1 devrait retourner 15 + 2 = 17.
Exercice 2. 3
Expliquez les fonctionnalités des fonctions suivantes
Fonction fct2 (n : Entier) : Entier
Début
Si (n = 1) Alors
Fct2 ← 0
Sinon
Fct2 ← 1 + fct2 (n/2)
Fin Si
Fin
Solution :
La fonction calcule et renvoie le plus grand entier inférieur ou égal à log2(n). Par exemple, si n
est entre 8 et 15, fct2() renvoie 3. Si n est entre 16 et 31 alors fct2() renvoie 4.
Exercice 2. 4
Expliquez les fonctionnalités des fonctions suivantes
Procédure fct3 (n : Entier)
Début
Si (n = 0) Alors
retourne
Fin Si
Fct3 (n/2)
Écrire (n%2)
Fin
Solution :
La fonction fct3() affiche l'équivalent binaire d'un nombre n.Par exemple, si n est 21, alors
fct3() affiche 10101.
Exercice 2. 5
8 / 20
Expliquez les fonctionnalités des fonctions suivantes
Fonction fct4 (tab[] : Entier, n : Entier) : Entier
Début
x ← -1
Si (n = 1) Alors
fct4 ← tab [0]
Sinon
x ← fct4 (tab, n-1)
Fin Si
Si (x > tab[n-1]) Alors
fct4 ← x
Sinon
fct4 ← tab[n-1]
Fin Si
Fin
Solution :
fct4() renvoie la valeur maximale dans le tableau d'entrée tab[] de taille n.
Exercice 2. 6
Expliquez les fonctionnalités des fonctions suivantes
Fonction fct5 (a : Entier, b : Entier) : Entier
Début
Si (b = 0) Alors
fct5 ← 1
Fin Si
Si (b mod 2 = 0) Alors
fct5 ← fct5(a*a, b/2)
Fin Si
fct5 ← fct5(a*a, b/2) * 2
Fin
Solution :
fct5() renvoie ab
Exercice 2. 7
On souhaite écrire une fonction récursive qui calcule le carré d'un entier. Pour trouver un lien
entre 𝑐𝑎𝑟𝑟𝑒(𝑛) et 𝑐𝑎𝑟𝑟𝑒(𝑛 − 1), on utilise la formule donnée en énoncé : (𝑛 + 1)"
= 𝑛"
+
2𝑛 + 1. En changeant 𝑛 en 𝑛 − 1, la formule se réécrit 𝑛"
= (𝑛 − 1)"
+ 2(𝑛 − 1) + 1 d'où
𝑐𝑎𝑟𝑟𝑒(𝑛) = 𝑐𝑎𝑟𝑟𝑒(𝑛−) + 2 ∗ 𝑛 − 1. Dans le cas où 𝑛 est un entier négatif, on utilise le fait
que (−𝑛)"
= 𝑛"
. On se ramène ainsi au cas où n est un entier positif. Les appels récursifs
successifs nous mènent au cas de base : si 𝑛 = 0, alors 𝑐𝑎𝑟𝑟𝑒(𝑛) = 0.
9 / 20
Solution :
Fonction carré (n : Entier) : Entier
Début
Si (n = 0) Alors
carré ← 0
Fin Si
Sinon Si (n < 0) Alors
carré ← carré (-n)
Sinon
carré ← carré (n-1) + 2*n - 1
Fin Si
Fin
Exercice 2. 8
On veut écrire une fonction récursive qui calcule la somme de 1 à un entier 𝑛 : 1 + 2 + 3 +· ·
· +(𝑛 − 1) + 𝑛. On remarque que si on connaît 𝑠𝑜𝑚𝑚𝑒_𝑟𝑒𝑐𝑢𝑟𝑠𝑖𝑣𝑒(𝑛 − 1), alors pour avoir
𝑠𝑜𝑚𝑚𝑒_𝑟𝑒𝑐𝑢𝑟𝑠𝑖𝑓(𝑛) il suffit d'ajouter n au résultat précédent. On prend comme convention
que si 𝑛 < 1, alors la somme est nulle. Le cas de base est celui où n vaut 1, et dans ce cas la
somme vaut 1.
Solution :
De l'explication précédente on déduit :
Fonction somme_recursive (n : Entier) : Entier
Début
Si (n < 0) Alors
somme_recursive ← 0
Fin Si
Sinon Si (n = 1) Alors
somme_recursive ← 1
Sinon
somme_recursive ← somme_recursive (n-1) + n
Fin Si
Fin
Exercice 2. 9
Ecrire une fonction récursive qui calcule le produit de 1 à un entier 𝑛 : 1 ∗ 2 ∗ 3 ∗ · · · ∗ (𝑛 −
1 ∗ 𝑛. On remarque que si on connaît 𝑝𝑟𝑜𝑑𝑢𝑖𝑡_𝑟𝑒𝑐𝑢𝑟𝑠𝑖𝑣𝑒(𝑛 − 1), alors 𝑝𝑟𝑜𝑑𝑢𝑖𝑡+,-.+/01(3) =
𝑛 ∗ 𝑝𝑟𝑜𝑑𝑢𝑖𝑡_𝑟𝑒𝑐𝑢𝑟𝑠𝑖𝑣𝑒(𝑛 − 1). On prend comme convention que si 𝑛 < 1, alors le produit
est nulle. Le cas de base est celui où n vaut 1 ou 0, et dans ce cas le produit vaut respectivement
1 et 0.
Solution :
De l'explication précédente on déduit :
Fonction produit_recursive (n : Entier) : Entier
Début
10 / 20
Si (n <= 0) Alors
produit_recursive ← 0
Fin Si
Sinon Si (n = 1) Alors
produit_recursive ← 1
Sinon
produit_recursive ← n * produit_recursive (n-1)
Fin Si
Fin
11 / 20
Introduction à l’algorithmique
Travaux dirigés (TD)
Correction
Youssouf EL ALLIOUI
p
y.elallioui@usms.ma
Série 3
LES FICHIERS
Exercice 3. 1
Soit le fichier NOMBRES.BIN qui contient une liste de nombres entiers. Écrire un algorithme
qui affiche les nombres du fichier, leur somme et leur moyenne.
Solution :
Algorithme Nombre
Var F : Fichier d’entier
Var X, S, Nb : Entier
Var M : Réel
Début
Assigner(F,’NOMBRES.BIN’)
Relire(F)
Nb ← 0
S ← 0
Tantque Non FDF(F) Faire
Lire(F,X) ; // Lire un élément du fichier
Ecrire(X) ; // affichage à l’écran
S ← S+X
Nb ← Nb+1
Fin Tanque
Si Nb≠0 Alors
M ← S/Nb
Ecrire(‘Somme des éléments =’,S,’ Moyenne=’,M)
Sinon
Ecrire(‘Fichier vide’)
Fin Si
Fermer(F)
Fin
Exercice 3. 2
Écrire un algorithme qui crée le fichier MOTS.TXT contenant une série de mots (longueur
maximale d'un mot: 20 caractères). La saisie des mots se terminera à l'introduction du symbole
'*' qui ne sera pas écrit dans le fichier.
2020
12 / 20
Écrire un algorithme qui affiche le nombre de mots ainsi que la longueur moyenne des mots
contenus dans le fichier MOTS.TXT. 3- Écrire un algorithme qui crée un deuxième fichier
MOTS10.TXT contenant les mots du fichier MOTS.TXT de plus de 10 caractères.
Solution :
Algorithme TraiteMot;
Var F,G :Fichier de chaine[20] ;
Var X : Chaine[20] ;
Var Nb : Entier
Var M : Réel
Début
/*question 1
Assigner(F,’MOTS.TXT’) ;
Reecrire(F) ; /*ouvrir F en écriture
Ecrire(‘Donner une suite de mots. Introduire le mot ‘*’
pour arrêter la saisie’) ;
Lire(X) ; /*Lire le premier mot à l’extérieur de la boucle
Tantque X≠’*’ Faire
Ecrire(F,X) ;
Lire(X) ; /*Lire le mot suivant
Fait ;
Fermer(F) ;
/*question 2
Nb←0 ;
M←0 ; /*on peut utiliser M pour la somme des longueurs puis
pour la moyenne
Relire(F) /*ouvrire F en lecture
Tantque Non FDF(F) Faire
Lire(F,X) ; /*Lire un élément du fichier
M←M+Taille(X) ;
Nb←Nb+1 ;
Fait ;
Si Nb≠0 Alors
M←M/Nb ;
Ecrire(‘Nombre de mots =’,Nb,’ Longueur Moyenne=’,M)
Sinon
Ecrire(‘Fichier vide’)
Fsi ;
Fermer(F) ;
/*question 3
Assigner(G,’MOTS10.TXT’) ;
Reecrire(G) ;
Relire(F) /*ouvrir G en écriture et F en lecture
Tantque Non FDF(F) Faire
Lire(F,X) ; /*Lire un élément du fichier
Si Taille(X)>10 Alors
Ecrire(G,X)
Fsi ;
Fait ;
Fermer(F) ;
13 / 20
Fermer(G) ;
Fin
Exercice 3. 3
Considérons le type enregistrement suivant :
Type Étudiant = Enregistrement
Matricule : Entier ;
Nom, Prénom : Chaine [20] ;
Moyenne : Réel ;
Fin;
Soit T un tableau d’au plus 100 étudiants. Écrire un algorithme permettant de recopier tous les
étudiants admis appartenant à T dans un fichier ADMIS de type étudiant. Un étudiant est admis
si sa moyenne est supérieure ou égale 10.
Solution :
Algorithme Étude
Type Étudiant = Enregistrement
Matricule : entier
Nom, Prénom : chaine [20] ;
Moyenne : réel
Fin
Var T : Tableau[1..100] de Étudiant
Var F : Fichier de Étudiant
Var X : Étudiant
Var I,N : Entier ;
Debut
Ecrire(‘Donner le nombre d’’etudiants’) ; /*lecture des
éléments du tableau
Repeter
Lire(N)
Jusqu’à N>0 et N≤100
Pour I←1 à N Faire
Avec X
Faire
Lire(Matricule)
Lire(Nom,Prenom)
Lire(Moyenne)
Fait
T[I]←X ; /*On peut utiliser directement T[I] et on
évite l’affectation ( en bleu )
Avec T[I]
Faire Lire(Matricule)
14 / 20
Lire(Nom,Prenom)
Lire(Moyenne)
Fait
Fait
/*création du fichier des admis
Assigner(F,’ADMIS’)
Reecrire(F)
Pour I←1 à N Faire
Si T[I].Moyenne)≥10 Alors
Ecrire(F,T[I])
Fsi; /*même remarque, on peut utiliser un
enregistrement X
X←T[I]
Si X.Moyenne)≥10 Alors
Ecrire(F,X)
Fsi
Fait
Fermer(F)
Fin
Exercice 3. 4
Soient les enregistrements suivants :
Type TDate = Enregistrement
Jour, mois, année : entier ;
Fin
Type TDiscipline = Enregistrement
Discipline : chaine [10] ;
Faculté : chaine [20] ;
Fin;
Type TEtudiant = Enregistrement
Nom, prénom : chaine [20] ;
DateN : TDate ;
Filière : TDiscipline ;
Fin;
Soit FEtudiant un fichier d’étudiants. Écrire un algorithme qui permet de :
- Remplir le fichier FEtudiant.
- Éclater le fichier FEtudiant en deux fichiers, F1 (étudiants de la faculté ‘FEI’) et F2
(étudiants des autres facultés).
Solution :
15 / 20
Algorithme Eclate
Type TDate = Enregistrement
Jour, mois, année : entier ;
Fin
Type TDiscipline = Enregistrement
Discipline : chaine [10] ;
Faculté : chaine [20] ;
Fin;
Type TEtudiant = Enregistrement
Nom, prénom : chaine [20] ;
DateN : TDate ;
Filière : TDiscipline ;
Fin;
Var Étudiant : TEtudiant ;
Var F, F1, F2 : Fuchier de TEtudiant ;
Var FEI, Autre : Booléen ;
Debut
Assigner(F,’FEtudiant’) ;
Réecrire(F) ;
Avec Etudiant, Etudiant.DateN, Etudiant.Filiere Faire
Ecrire(‘Nom :’) ;
Lire(Nom) ; /*Lire 1er nom à l’extérieur de la boucle
Tantque Nom<>’’ Faire
Ecrire(‘Prénom :’) ;
Lire(prenom) ;
Ecrire(‘Date de naissance :’) ;
Lire(Jour,mois,Annee) ;
Ecrire(‘Discipline, Faculté :’) ;
Lire(Discipline, Faculté) ;
Ecrire(F,Etudiant) ;
Ecrire(‘Nom :’) ;
Lire(Nom) ; /*Lire le nom suivant
Fait ;
Fait ;
Fermer(F) ;
Relire(F) ; /*Pour éviter de créer des fichiers vides,
on peut utiliser ces 2 indicateurs booléens, dans ce Cas
/*l’assignation et la création ne se font que si nous
trouvons un élément, après on remet le booléen à /*vrai
pour ne pas refaire ces opérations
/*CETTE OPERATION N’EST PAS OBLIGATOIRE MAIS MIEUX LA
SAVOIR
FEI ←Faux ;
Autre ←Faux ;
/*Si on n’utilise pas ces booléens, on doit assigner et
ouvrir les 2 fichiers en écriture à ce niveau
16 / 20
Assigner(F1,’FFEI’) ;
Réecrire(F1) ;
Assigner(F2,’FAutrer’);
Réecrire(F2);
Si FDF(F) Alors
Ecrire(‘Fichier vide’)
Sinon
Tantque Non FDF(F) Faire
Lire(F,Etudiant) ;
Avec Etudiant.Filiere Faire
Si Faculté =’FEI’ Alors
Si Non FEI Alors
Assigner(F1,’FFEI’) ;
Réecrire(F1) ;
FEI ←Vrai
Fsi ;
Ecrire(F1,Etudiant) ;
Sinon
Si Non Autre Alors
Assigner(F2,’FAutrer’);
Réecrire(F2);
Autre←Vrai
Fsi ;
Ecrire(F2,Etudiant) ;
Fsi ;
Fait ;
Fait ;
Fermer(F) ;
Si FEI Alors
Fermer(F1)
Fsi ;
Si Autre Alors
Fermer(F2)
Fsi ;
Fsi ;
Fin.
Exercice 3. 5
1) Soient F1 et F2 deux fichiers d’entiers strictement positifs et sans répétition.
Écrire un algorithme qui construit (crée) un fichier G d’entiers tel que G contient
pour chaque valeur de F1 la valeur et tous ses multiples appartenant à F2 (F1
et F2 sont supposés existants). Exemple :
F1 : 3 10 20 17
F2 : 3 6 19 60 40 30
G : 3 3 6 60 30 10 60 40 30 20 60 40 17
2) Écrire un algorithme qui permet à partir du fichier résultat (G) de générer un
autre fichier (H) contenant toutes les valeurs du fichier (G) (sans répétition) avec
leur nombre. Exemple :
H : 3 2 6 1 60 3 30 2 10 1 40 2 20 1 17 1
18 / 20
Exercice 3. 6
Soit F un fichier d’entiers représentant des séquences de nombres séparées par un ou plusieurs
zéro. Écrire un algorithme qui réalise les traitements suivants :
1) A partir de F (fichier existant), crée un fichier G contenant pour chaque
séquence, la moyenne des nombres qui la constituent.
2) 2- Puis, Supprimer les valeurs nulles du fichier G. Exemple :
F : 0 0 1 4 3 7 0 0 0 6 -9 2 7 -6 0 -10 3 0 0
G : 3,75 0,00 -3,50 Avant suppression
G : 3,75 -3,50 Après suppression
Solution :
20 / 20
Introduction à l’algorithmique
Travaux dirigés (TD)
Correction
Youssouf EL ALLIOUI
p
y.elallioui@usms.ma
Série 4
LA COMPLEXITÉ ALGORITHMIQUE
2020