Vous êtes sur la page 1sur 7

Université Mohammed Premier Année Universitaire

Faculté des Sciences 2020/2021


Département d’Informatique Filière SMI
Oujda – MAROC Semestre 3 : Algorithmique II

Série de TD N°4

Exercice 1:
Le tri à bulles est un algorithme de tri qui consiste à comparer deux éléments
consécutifs dans le tableau T. S'ils sont en ordre croissant ils restent à leur place,
sinon ils sont échangés. Puis on recommence avec les éléments suivants.
Implémenter une fonction Tri_a_bulles qui prend en argument un tableau T et sa
taille et qui renvoie un nouveau tableau trié contenant les éléments de T.
Calculer la complexité temporelle de cette fonction.

Réponse 1 :
Procédure Tri_a_bullees(T:tableau[] d’entiers, Taille:
Entier)
Variable i,j,Temp : Entier
DébutProcédure
Pour i allant de Taille-1 jusqu’à 1 (Pas :-1) Faire
Pour j allant de 0 jusqu’à i-1 Faire
Si (T[j]> T[j+1]) Alors
Temp=T[j]
T[j]=T[j+1]
T[j+1] =Temp
FinSi
FinPour
FinPour
FinProcédure
La complexité est quadratique.

Exercice 2 : Le tri par dénombrement.


Soit T un tableau d'entiers. Si on sait que les valeurs du tableau T sont comprises
entre 0 et max (avec max pas trop grand), on peut trier les valeurs en comptant
tout d'abord le nombre de 0, le nombre de 1, le nombre de 2,..., le nombre de max
en entrée. Ensuite, il faut parcourir le tableau T à nouveau en indiquant la bonne
quantité de chaque valeur.
1. Écrire une fonction qui renvoie le maximum du tableau T.
2. Écrire une fonction qui effectue le tri du tableau T à l'aide de l'algorithme
du tri par dénombrement. On utilisera un tableau annexe E où E[i] le
nombre de fois où i apparaît dans le tableau T.
3. Calculer la complexité de cet algorithme.

Réponse 2 :
Question 1

1
Fonction Max_Tab(T : tableau[ ] d’entiers, n:
Entier) : Entier
Variable max,i :Entier
DébutFonction
max ← T[0]
Pour i allant de 1 à n-1 Faire
Si (T[i]>max) Alors
max ← T[i]
FinSi
FinPour
Retourner max
FinFonction

Question 2
Fonction Occurence(T:tableau[]d’entiers, n:Entier, x:
Entier ): Entier
Variable nb,i :Entier
DébutFonction
nb ← 0
Pour i allant de 0 à n-1 Faire
Si (T[i]=x) Alors
nb ← nb+1
FinSi
FinPour
Retourner nb
FinFonction

Procédure Remplir(E:tableau[]d’entiers,
T:tableau[]d’entiers, n:Entier, m:Entier)
Variable i : Entier
DébutProcédure
Pour i allant de 0 à m Faire
E[i] ← Occurence(T,n,i)
FinPour
FinProcédure

Procédure Tri_dénombrement(T:tableau[]d’entiers,
n:Entier)
Variable i,max,k,j : Entier
E : tableau[ 0..1000] d’entiers
DébutFonction
max ← Max_Tab(T, n)
Remplir(E,T,n,max)
k ← 0
Pour i allant de 0 à max Faire
Si (E[i]<>0) Alors
Pour j allant de 1 à E[i] Faire
T[k] ← i
k←
← k+1
FinPour
FinSi
FinPour
FinProcédure

Algorithme Tri_par_Dénombrement

2
Constante N ← 3
Variable
i : Entier
T : tableau[ 0..N-1] d’entiers
Début
Pour i allant de 0 à N-1 Faire
Lire (T[i])
FinPour

Tri_dénombrement(T,N)
Pour i allant de 0 à N-1 Faire
Afficher (T[i])
FinPour
Fin
Question 3
Donc la complexité de cet algorithme est linéaire (O(N)+O(max)).

Exercice 3 :
On s'intéresse à l'évaluation d'une fonction polynôme P de degré n en un point x.
On suppose P représenté par le tableau a[0..n] de ses coefficients ; il s'agit donc
de calculer la somme
a0+a1*x+…+an*xn.

1. Écrire un sous-algorithme très simple qui permet d'évaluer P en x, et


calculer sa complexité, en prenant comme opération élémentaire les
opérations arithmétiques (addition et multiplication).
2. Proposer un sous-algorithme pour calculer xi en ne faisant que de l'ordre
de log(i) multiplications.
3. Quelle est la complexité de l'algorithme si l'on utilise cette mise à la
puissance dans la question précédente ?
4. En s'appuyant sur le fait que
P(x)= a0+x(a1+ a2x+…+ an*xn-1).
Proposer un sous-algorithme pour résoudre le problème. Donner
l'équation de sa complexité. Montrer que l'algorithme est linéaire.

Réponse 3 :
Question 1
Fonction Puissance( x : Réel, i : Entier) : Réel
Variable
p : Réel
j : Entier
DébutFonction
Si (i=0) Alors Retourner 1 FinSi
p ← 1
Pour j allant de 1 à i Faire
p←← p*x
FinPour
Retourner p
FinFonction

3
Fonction Evaluation(a:tableau[]de Réels, N:Entier, x :
Réel) : Réel
Variable
P : Réel
i : Entier
DébutFonction
P ← 0
Pour i allant de 0 à N Faire
P ← P+a[i]*Puissance(x,i)
FinPour
Retourner P
FinFonction

Algorithme Evaluation_de_P
Constante n ← 3
Variable
x, P : Réel i : Entier
a : tableau[ 0..n] de Réels
Début
Pour i allant de 0 à n Faire
Lire(a[i])
FinPour
Lire(x)
P ← Evaluation(a,n,x)
Afficher(P)
Fin

Donc la complexité est en O(n2).

Question 2
0
x = 1;
i i/2 i/2
x = x * x , si i est pair;
i i/2 i/2
x = x*x * x si i est impair (i/2=i div 2)
Fonction Puissance2(x : Réel, i : Entier) : Réel
Variable p :Réel
DébutFonction
Si (i=0) Alors Retourner 1 FinSi
p ← Puissance2(x,i/2)
p ← p*p
Si (i%2==0) Alors
Retourner p
Sinon
Retourner x*p
FinSi
FinFonction

Donc la complexité de cette méthode est en log(i).

Question 3 :
Donc la complexité de cet algorithme est en n*log(n).

Question 4 :
Fonction Evaluation1(a:tableau[]de Réels, N:Entier, x :
Réel) : Réel

4
Variable
P,S : Réel
i : Entier
DébutFonction
S ← 0
P ← 1
Pour i allant de 0 à N Faire
S ← S+a[i]*P
P ← x*P
FinPour
Retourner S
FinFonction

Quelle est sa complexité ?


puisque c(n+1)=c(n)+1, alors c(n)=O( n) .

Fonction Evaluation1(a:tableau[]de Réels, N:Entier, x :


Réel) : Réel
Variable
r : Réel
k : Entier
DébutFonction
r ← a[N]
Pour k allant de 2 à N+1 Faire
r ← r*x+a[N-k+1]
FinPour
Retourner r
FinFonction

Quelle est sa complexité ?


puisque c(n+1)=c(n)+1, alors c(n)=O( n) .

Exercice 4 :
Pour représenter un nombre complexe définir un type de structure qui contient
deux flottants, la partie réelle et la partie imaginaire.
1. Écrire une fonction permettant de saisir un complexe passé en paramètre.
2. Écrire une fonction permettant d'afficher un complexe passé en
paramètre.
3. Écrire une fonction d'addition qui reçoit en paramètre deux complexes,
qui fait la somme des deux et range le résultat dans la première structure.
4. Écrire un algorithme principal qui :
• saisit deux complexe c1 et c2.
• ajoute c1 à c2.
• affiche c1 après ajout.

Réponse 4 :
5
Algorithme Exercice4
Type
Structure complexe
reel : Réel
imag : Réel
FinStructure
Fonction Saisir(x : complexe) : complexe
DébutFonction
Afficher (" Partite réelle ? ")
Lire (x.reel)
Afficher (" Partie imaginaire ? ")
Lire (x.imag)
Retourner x
FinFonction

Procédure Imprimer(x : complexe)


DébutProcédure
Afficher (x.reel,"+i ",x.imag)
FinProcédure

Fonction Addition(x: complexe, y: complexe) : complexe


DébutFonction
x.reel ← x.reel+ y.reel
x.imag ← x.imag+ y.imag
Retourner x
FinFonction

Variable c1,c2 : complexe


Début
c1 ← Saisir(c1)
c2 ← Saisir(c2)
c1 ← Addition(c1,c2)
Imprimer(c1)
Fin
Exercice 5 :
Écrire un programme qui permet de :
1. Remplir un tableau de 10 éléments. Chaque élément est un
enregistrement et chaque enregistrement contient trois champs : NOM
(chaîne de caractères), AGE (entier) et NOTES (tableau contenant quatre
éléments de type réel).
2. Après la saisie de toutes les informations. Écrivez les instructions qui
vous permettent d'afficher les indices des éléments, du tableau, qui
contiennent les données suivantes s'elles existent :
• Le champ NOM commence par la lettre A.
• Le champ AGE est supérieur à 18.
3. Enfin, affichez les notes de l'élément correspondant.

Réponse 5 :
Algorithme Exercice 5
Constante N ← 6
Type
Structure pers

6
NOM: Chaîne de caractères
AGE: Entier
NOTES: Tableau[0..3] de Réels
FinStructure
Variable
TAB: Tableau[0..N-1] de pers
i,j : Entier
Début
Pour i allant de 0 jusqu’à N-1 Faire
Afficher("NOM :") Lire(TAB[i].NOM)
Afficher("AGE :") Lire(TAB[i].AGE)
Pour j allant de 0 jusqu’à 3 Faire
Lire (TAB[i].NOTES[j])
FinPour
FinPour
i ← 0
Tantque (i<N)) Faire
Si ((TAB[i].NOM[0]='A') et(TAB[i].AGE>18)) Alors
Afficher ("indice : " , i)
Afficher ("Nom : ", TAB[i].NOM)
Afficher ("AGE : ", TAB[i].AGE)
Pour j allant de 0 jusqu’à 3 Faire
Afficher (TAB[i].NOTES[j])
FinPour
FinSi
i ← i+1
FinTantque
Fin

Exercice 6 :
Supposons qu’on a un fichier nommé DONNEES qui contient des entiers relatifs.
On veut créer un fichier nommé PAIRS_NEGATIFS à partir du fichier DONNEES.
Ecrire un programme qui permet de lire les entiers à partir du fichier DONNEES,
s’il trouve un entier pair et négatif alors il va insérer cet entier dans le fichier
PAIRS_NEGATIFS.
Réponse 6 :
Algorithme Exercice6
Variable
don,res : fichier séquentiel
m : entier
Début
Ouvrir " DONNEES.txt" dans don en Lecture
Ouvrir " PAIRS_NEGATIFS " dans res en Ajout
Tantque NonFinFichier(don) Faire
Lire(don,m)
Si((m%2 = 0)et(m<=0))
Ecrire(res,m)
FinSi
FinTantque
Afficher("Terminer")
Fin

Vous aimerez peut-être aussi