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
17 / 20
Solution :
1)
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 :
19 / 20
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

02 correction-td smi-s3-algo2

  • 1.
    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.
    2 / 20 Exercice5. 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.
    3 / 20 Testercette 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.
    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.
    5 / 20 VarestVoyelle : 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.
    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.
    7 / 20 Fonctionfct1 (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.
    8 / 20 Expliquezles 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.
    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.
    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.
    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.
    12 / 20 Écrireun 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.
    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.
    14 / 20 Lire(Nom,Prenom) Lire(Moyenne) Fait Fait /*créationdu 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.
    15 / 20 AlgorithmeEclate 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.
    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
  • 17.
  • 18.
    18 / 20 Exercice3. 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 :
  • 19.
  • 20.
    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