Algorithmes et Structures de Données : TD et Examens 2024/2025
Algorithmes et Structures de Données : TD et Examens 2024/2025
Adel DAHMANE
Maître Technologue – ISETSO
[email protected]
Notions abordées
ELEMENTS DE BASE D'UN ALGORITHME
STRUCTURES DE CONTROLE
Les structures conditionnelles
Les structures itératives (les boucles)
STRUCTURES DE DONNEES COMPOSEES
Les tableaux
Le type Chaîne de caractère
Le type Structure (Enregistrement)
SOUS PROGRAMMES : LES FONCTIONS ET LES PROCEDURES
RECURSIVITE
ALGORITHMES DE RECHERCHE ET DE TRI
2024/2025
TYPES DE DONNEES
PARTIE
STRUCTURES DE CONTROLE
TABLEAUX & ENREGISTREMENTS
1
Points abordés :
Les types de données (intégrés, énumérés, tableaux, enregistrements)
Les structures conditionnelles simples (réduite et complète) : Si..Alors..[Sinon]..FinSi.
La structure conditionnelle généralisée : Si..Alors..Sinon Si..Alors…FinSi.
La structure de choix Selon..Faire.
Les structures itératives à conditions d'arrêts (Répéter et TantQue)
La structure itérative complète (Pour)
1) SEQUENCE EQUIVALENTE
Soient a, b et c trois variables entières. Proposer une autre séquence équivalente à celle présentée ci-dessous
en utilisant une seule structure conditionnelle.
Si (a > 0)
Alors c 1
SinonSi (b > 0)
Alors c 1
Sinon c 0
FinSi
Soient P et Q deux expressions logiques. Donner une séquence équivalente à celle présentée ci-dessous en
utilisant deux structures de contrôle conditionnelles.
Si (P Et Q)
Alors Traitement1
Sinon Traitement2
FinSi
2) NOMBRE VALIDE
Un nombre n est dit valide partiel s’il est multiple de l’un des chiffres qui le composent.
Exemple : n =52 est divisible par 2 et non divisible par 5.
Ecrire un algorithme qui permet de saisir un entier n, on suppose qu’il est formé de deux chiffres, et indique
s’il est : valide partiel, non valide partiel ou valide total.
NB : Un nombre n est dit valide total s’il est multiple de deux chiffres qui le composent.
© 24/25 A. DAHMANE & O. BEN ROMDHANE
Un point du plan est défini par deux réels (X, Y) représentant ses coordonnées cartésiennes. Soient
trois points A, B et C. On souhaite déterminer la nature du triangle ABC. Un triangle peut être soit :
Plat : est un triangle ayant les sommets alignés ;
Isocèle : est un triangle ayant au moins deux côtés de même longueur ;
Equilatéral : est un triangle dont les trois côtés ont la même longueur ;
Scalène : est un triangle qui n'est ni isocèle ni plat.
2
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
Travail demandé :
Écrire un algorithme qui permet de :
1. Saisir les coordonnées des trois points A, B et C.
2. Afficher la nature du triangle ABC (plat, équilatéral, isocèle,
scalène). Sachant qu'un triangle équilatéral est aussi isocèle,
alors dans ce cas, l'algorithme affiche seulement la
caractéristique équilatérale.
Distances :
AB = √(𝟏 − 𝟓)𝟐 + (𝟏 − 𝟏)𝟐 = 𝟒, AC =√(𝟏 − 𝟑)𝟐 + (𝟏 − 𝟑)𝟐 = √𝟖 et BC = √𝟖
Conclusion :
AC = BC, donc le triangle ABC est isocèle.
NB :
On rappelle que, la distance AB = √(𝑿𝑨 − 𝑿𝑩)𝟐 + (𝒀𝑨 − 𝒀𝑩)𝟐
A, B et C sont alignés si et seulement si : (YA - YB)*(XB - XC) = (XA - XB)*(YB – YC)
La fonction Racine(X) renvoie la racine carrée du nombre X.
La fonction Carre(X) renvoie le carré du nombre X.
L’eau distribuée aux abonnés est comptabilisée par compteurs et facturée selon un barème de tarifs
progressifs à plusieurs tranches trimestrielles de Consommation d’eau. Le système tarifaire, qui est le même
pour tout le pays, comporte sept tranches de consommation avec un seul tarif par tranche (tarif). Les tarifs
varient de 200 millimes/m3 pour la première tranche sociale (20 m3/trimestre) à 1990 millimes/m3 pour la
tranche de consommation supérieure (> à 150 m3/trimestre).
Source : https://www.sonede.com.tn/accueil/contenu-principal/tout-savoir-sur-leau/la-facture-deau,
[http://www.sonede.com.tn] consulté en sep. 2023
3
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
TRAVAIL DEMANDE:
Etablir un algorithme qui permet de calculer le tarif de l'eau distribuée ted par la SONEDE à un abonné donné
selon le mode de tarifs binômes présenté ci-dessus.
NB: - la redevance fixe RF est supposée une constante égale à 3800 millimes pour tous les abonnés.
- le volume de consommation vc (en m3) sera saisi au clavier.
- le type de l'usage de l'eau type (domestique, touristique ou fontaine) sera aussi saisi au clavier.
- le taux de TVA applicable est 18% sur le total (redevance fixe RF + partie variable pv=tarif*vc).
5) DEMANDE D'ASSURANCE
L'objectif de cet exercice est d'afficher la réponse à une demande d'assurance vie selon les règles suivantes:
TRAVAIL DEMANDE:
1) Compléter la table de vérité suivante pour examiner les différents cas de résultat : refus, expertise ou
contrat :
SANTE = Vrai F V
ACCIDENT = 0 F F
Contrat de type A ✓
Résultats
Contrat de type B ✓
Expertise médicale ✓ ✓ ✓ ✓
Contrat refusé ✓ ✓
NB: - SANTE: Vrai pour bonne santé et Faux pour mauvaise santé
© 24/25 A. DAHMANE & O. BEN ROMDHANE
- ACCIDENT : 0 pour aucun accident, 1 pour un seul accident, 2 pour deux accidents, …
- V: Condition vérifiée (Vrai) & F: Condition non vérifiée (Faux)
- ✓: Réponse à la demande (Contrat A, Contrat B, Expertise médicale ou Contrat refusé)
4
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
6) ÉQUATION DU SECOND DEGRÉ
Compléter l'algorithme suivant qui calcul les solutions réelles d’une équation du second degré :
Algorithme Equation_Second_Degre
DefVar
A, B, C, Delta (Réel) //delta représente le discriminant (Delta = B2-4AC)
Début
Ecrire("Calcul des solutions réelles d'une équation du second degré")
Ecrire("de la forme A x^2 + B x + C = 0 ")
Ecrire() //ligne vide
Ecrire("Introduire les valeurs pour A, B, et C :")
Ecrire("A = "), Lire(A)
Ecrire("B = "), Lire(B)
Ecrire("C = "), Lire(C)
//Calcul du discriminant b^2-4ac
//Résolution de l’équation (les différents cas à étudier sont présentés ci-dessous)
Fin
NB :
Les deux fonctions suivantes sont supposées prédéfinies :
Carre(x) pow(x, 2) en C
Racine_Carre(x) sqr(x) en C
© 24/25 A. DAHMANE & O. BEN ROMDHANE
7) L’HEURE SUIVANTE
Écrire un algorithme qui permet de lire une heure sous forme de : heures (hh), minutes (mm) et secondes
(ss), puis de déterminer l'heure à la seconde suivante et de l'afficher.
On suppose que hh, mm et ss sont valides.
5
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
Exemples :
L'heure saisie est : hh = 13, mm = 22, ss = 40
L'heure suivante sera affichée comme suit : 13h:22mn:41s.
8) LE LENDEMAIN
Proposer un algorithme qui permet de déterminer la date du lendemain (jj2/mm2/aa2) à partir d’une date
donnée et représentée par 3 entiers (jours jj, mois mm et année aa).
Exemples :
pour jj/mm/aa = 31/12/2017, l’algorithme affiche : Demain = 1/1/2018
pour jj/mm/aa = 5/10/2017, l’algorithme affiche : Demain = 6/10/2017
pour jj/mm/aa = 28/2/2017, l’algorithme affiche : Demain = 1/3/2018
pour jj/mm/aa = 28/2/2016, l’algorithme affiche : Demain = 29/2/2016
NB: une année bissextile est une année qui est divisible par 400 ou bien par 4 mais non par 100.
Algorithme Boucle
DefVar
j, r : Entier
ok : Booléen
Début
Ecrire ("Donner un entier ?")
Lire (J)
ok Faux
Tantque (j 25) Et (Non ok) Faire
Si (j = 25)
Alors ok Vrai
Sinon j j + 1
FinSi
FinTantque
r j
Fin
TRAVAIL DEMANDE :
a) Donner la condition de sortie de l'itération.
b) Donner le tableau de sortie qui permet d'étudier les différents cas de figure possibles à la sortie
de l'itération. Le tableau de sortie se présente ainsi :
© 24/25 A. DAHMANE & O. BEN ROMDHANE
j 25 OK Commentaire
Faux Faux
................................... ... ... .... ..................... ...................................................................
Vrai Faux
..................... ................ ... ........ .....................................................................................
Faux Vrai
............................... ...... ... .................. ...........................................................................
Vrai Vrai
................................. ..... ... ................... .........................................................................
6
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
10) TRACE D'EXÉCUTION
Algorithme Deviner
DefConst
ERR: Réel = 0.00001 //limite de la suite s
DefVar
i: Entier //compteur des itérations
terme: Réel //terme courant de la suite s
s: Réel //suite récurrente
Début
s 1, terme 1, i 0
Tanque (terme ≥ ERR) Faire
i i + 1
terme terme / i
s s + terme
FinTantQue
Fin
Travail demandé :
1) Faire la trace d'exécution des 5 premiers tours da la boucle TantQue de cet algorithme Suite (sans
application numérique).
1er tour 2ème tour 3ème tour 4ème tour 5ème tour
terme = ... ... ... ... ...
A la fin du 5ème tour : S = … + … + … + … + …
TRAVAIL DEMANDE :
1) Donner la trace détaillée de calcul du 5ème terme de la suite U pour x = 2.
2) Ecrire un algorithme EstTerme qui permet de vérifier si un entier t donné est un terme de la suite U en
retournant son rang sachant que x est un entier naturel non nul. Cet algorithme retourne -1 si t ne
représente pas un terme de U.
Exemples (pour x = 2) :
▪ t = 1 est un terme de U dont le rang = 1
© 24/25 A. DAHMANE & O. BEN ROMDHANE
Deux joueurs (l’utilisateur et l’ordinateur) "lancent" un dé dont les faces sont numérotées de 1 à 6.
Le joueur qui obtiendra la plus grande valeur aura un point. Le jeu s'arrête quand l'un des joueurs
arrive le premier à un score de 10 points.
7
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
Ecrire un algorithme permettant de simuler ce jeu et afficher le joueur gagnant. On pourra utiliser la
fonction prédéfinie Alea pour le tour de l’ordinateur. Aléa(n) est une fonction prédéfinie qui retourne
un nombre entier aléatoire appartenant à l'intervalle [0, n-1].
Voici une représentation de l'algorithme lorsqu’il sera terminé :
>> Lancement de dés N:1
Joueur 1 : 4
Joueur 2 : 1
Score : Joueur1 (1) & Joueur2 (0)
13.a) Suite de Fibonacci : La suite de Fibonacci est une suite récurrente dont chaque élément obéit à la
relation de récurrence suivante :
U1 = 1 et U2 = 1
Un = Un-1 + Un-2
Cette suite doit son nom à un mathématicien italien du XIIIe siècle connu sous le nom de Leonardo
Fibonacci qui, dans un problème récréatif (amusant) posé dans un de ses ouvrages, le Livre du Calcul,
décrit la croissance d'une population de lapins. Le nième terme correspond au nombre de paires de
lapins au nième mois
Ecrire un algorithme FIBO qui calcul le nième terme de Fibonacci sachant que n >=1.
13.b) Ecrire l'algorithme qui permet de calculer la somme S suivante :
S = 2 + 3/2 – 4/3 - 5/4 + 6/5 + 7/6 – 8/7 - … n/n-1 avec n2
13.c) Ecrire un algorithme qui permet de calculer et d'afficher les termes de la suite S jusqu'à ce que la
différence entre deux termes consécutifs devienne ≤ epsilon ( 10-4).
𝑺𝟏 = 𝟐 & 𝑺𝒊 = 𝑺𝒊−𝟏 (𝒊 − 𝟏⁄𝒊) (𝒊 + 𝟏⁄𝒊) avec i>1 & i est impair
13.d) Ecrire un algorithme qui permet de calculer la somme suivante :
© 24/25 A. DAHMANE & O. BEN ROMDHANE
𝒏𝒃𝒓
∑(𝑪𝒊 ∗ 𝑵𝒊 )/(𝒊!) =
𝒊=𝟏
(𝐶1 ∗ 𝑁1 )/1 + (𝐶2 ∗ 𝑁2 )/(1 ∗ 2) + (𝐶3 ∗ 𝑁3 )/(1 ∗ 2 ∗ 3) + ⋯ + (𝐶𝑛𝑏𝑟 ∗ 𝑁𝑛𝑏𝑟 )/(1 ∗ 2 ∗ 3 ∗ … ∗ 𝑛𝑏𝑟)
Sachant que :
▪ nbr est une constante = 30
▪ Ci est un coefficient de type entier {1 ; 2 ; 3}
▪ Ni est un entier strictement positif
8
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
14) ALGORITHMES D'APPROXIMATION
14.a) Ecrire un algorithme Valeur1_Pi permettant de calculer une valeur approchée de 𝝅 en utilisant
la formule suivante (On s’arrête lorsque la marge d’erreur err est < 10-6).
14.b) Ecrire un algorithme Valeur2_Pi permettant de calculer une valeur approchée de π en utilisant
la formule suivante (On s’arrête lorsque la marge d’erreur err est < 10-6):
On remarque que : 12 * 42 = 21 * 24
13 * 62 = 31 * 26
14 * 82 = 41 * 28
…
ab * cd = ba * dc
Où a b et c d
Écrire un algorithme permettant de déterminer les couples de nombres entiers vérifiant cette
propriété. Ces nombres sont compris entre 10 et 99 :
Ecrire un algorithme qui saisit un nombre entier nb composé de quatre chiffres puis calcule le chiffre
de chance correspondant à ce nombre de la façon suivante :
▪ Faire la somme de tous les chiffres qui composent le nombre saisi.
▪ Si le nombre calculé est composé de plus d’un chiffre, faire la somme des chiffres qui le composent.
© 24/25 A. DAHMANE & O. BEN ROMDHANE
Exemple :
Pour nb = 9569, on aura les sommes suivantes :
9 + 5 + 6 + 9 = 29
2 + 9 = 11
1 + 1 = 2 est le chiffre de chance
9
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
17) MULTIPLICATION RUSSE
La multiplication Russe est une méthode particulière permettant de multiplier deux entiers strictement
positifs, en utilisant seulement la division entière par 2, la multiplication par 2 et l’addition.
Soient a et b deux entiers strictement positifs saisis au clavier. On se propose de multiplier a par b en utilisant
cette méthode.
Le principe consiste à mettre a dans une première colonne et b dans une deuxième puis diviser
successivement a par 2 et multiplier b par 2 jusqu’à atteindre 1 dans la première colonne (celle où on effectue
la division entière). Tous les nombres de la seconde colonne qui sont en face des nombres pairs seront
ignorés. Le résultat de la multiplication de a par b s’obtient alors en additionnant les nombres restants.
Écrire un algorithme qui permet de réaliser cette multiplication.
Exemple 1 :
A B Commentaire
20 5 ignoré car 20 est pair
10 10 ignoré car 10 est pair
5 20 non ignoré car 5 est impair
2 40 ignoré car 2 est pair
1 80 non ignoré car 1 est impair (Fin traitement)
Exemple 2 :
A B Commentaire
9 25 non ignoré car 9 est impair
4 50 ignoré car 4 est pair
2 100 ignoré car 2 est pair
1 200 non ignoré car 1 est impair (Fin traitement)
Il s’agit d’écrire un algorithme pour compter le nombre de points marqués tout au long d’un match de Volley-
ball et d’indiquer à la fin l’équipe gagnante (avec affichage du résultat en nombre de sets). Chaque fois que
la balle est en jeu et qu’une faute est commise par une équipe (c’est une donnée à définir aléatoirement en
© 24/25 A. DAHMANE & O. BEN ROMDHANE
utilisant la fonction Alea(n)), l’équipe adverse prendre un point et ainsi de suite jusqu’à la fin du set encours :
Le match se joue en trois sets gagnants (résultats possibles : 3-0, 3-1 ou 3-2).
Un set est remporté par l’équipe qui a obtenu un score de 25 points à condition qu’il y ait au moins deux
points d’écart entre les scores des deux équipes. Sinon le set se poursuit jusqu’à ce que cette condition
soit remplie.
Lorsqu’un set est terminé, les équipes commencent avec zéro point chacune pour le set suivant.
Une équipe marque un point si l’équipe adverse a commis une erreur.
10
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
19) CHAINE PALINDROME
Ecrire un algorithme qui permet de déterminer si une chaîne de caractères ch, lue au clavier, est palindrome
ou non. Une chaîne de caractères est dite palindrome si elle peut se lire de gauche à droite ou de droite à
gauche.
Exemples :
"elle", "Radar", "sos", "", "Z", "10ABBA01"...
Ce jeu se joue à deux. Le premier joueur choisit un mot que le deuxième joueur est chargé de dévoiler en un
nombre fini d'essais. Le jeu se déroule de la façon suivante :
Le premier joueur masque le mot choisi mot de n lettres par une chaîne S de n tirets.
Le deuxième joueur propose une lettre. Si celle-ci figure dans le mot mot, elle sera dévoilée dans la chaîne
S à la place de chaque tiret qui lui correspond.
Chaque proposition d'une lettre compte un essai. Le nombre d’essais maximum est fixé à 2*n.
Le mot est dévoilé, c'est le bon résultat. La longueur du mot étant de 7, le nombre d'essais autorisé est de
2*7=14. On a fait seulement 9 essais.
Ecrire un algorithme qui permet de compter le nombre de voyelles nv et le nombre de consonnes nc d'une
phrase ph saisie au clavier. Cette phrase peut comporter des lettres, des chiffres, des signes de ponctuations
et des caractères spéciaux.
© 24/25 A. DAHMANE & O. BEN ROMDHANE
Exemple :
Pour ph = "Promotion 2017 ! Génie Informatique"
L'algorithme doit afficher le message suivant :
Le texte contient : 13 voyelles et 13 consonnes (avec redondance)
Ou bien
Le texte contient : 5 voyelles et 8 consonnes (sans redondance)
11
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
22) TROIS TABLEAUX
Algorithme TROIS_TABLEAUX
DefConst
TAILLE = 6
DefVar
i,j : Entier
tinit,trang,tres : Tableau[1..TAILLE] de Entier
Début
//Étape 1 : Remplissage du vecteur Tinit
Pour i de 1 à TAILLE Faire
Ecrire ("Donner l'élément N: ", i)
Lire (Tinit[i])
FinPour
TRAVAIL DEMANDE :
Faire l'exécution de cet algorithme en remplissant les tableaux suivants :
© 24/25 A. DAHMANE & O. BEN ROMDHANE
1 2 3 4 5 6
ÉTAPE 1 : TINIT 10 7 18 5 13 7
1 2 3 4 5 6
ÉTAPE 2 : TRANG
1 2 3 4 5 6
ÉTAPE 3 : TRANG
1 2 3 4 5 6
ÉTAPE 4 : TRES
12
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
23) CONVERSION D'UN ENTIER EN BINAIRE
Écrire un algorithme qui permet de convertir un entier positif (<=65535) en un nombre binaire et de l’afficher
(en base 2 sous forme de suite de 1 et de 0). Le résultat de cette conversion sera mis dans un vecteur ayant
pour dimension n=16 (2 octets) ou bien dans une chaîne de caractères.
Exemples:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
▪ 77 se convertit en "1001101" ou bien 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
▪ 2013 se convertit en "11111011101" 0 0 0 0 0 1 1 1 1 1 0 1 1 1 0 1
Principe:
Conversion de 77 en base 2 :
Il s'agit de faire une suite de divisions euclidiennes par 2. Le
résultat sera la juxtaposition des restes. Le schéma ci-contre
explique la méthode.
77 s'écrit donc en base 2: 1001101.
Le triangle de Pascal est la matrice des coefficients qui sont utilisés pour le développement de certaines
expressions comme (a+b)² ou (a+b)n.
Exemple (pour n = 4) :
0 1 2 3 4
Ligne 0 1 (a+b)0 = 1
Ligne 1 1 1 (a+b)1 = 1*a + 1*b
Ligne 2 1 2 1 (a+b)2 = 1*a2 + 2*a*b + 1*b2
Ligne 3 1 3 3 1 (a+b)3 = 1*a3 + 3*a²*b + 3*a*b² + 1*b3
Ligne 4 1 4 6 4 1 (a+b)4 = 1*a4 + 4*a3*b + 6*a²*b² + 4*a*b3 + 1*b4
Ecrire un algorithme permettant de remplir et d'afficher une matrice P(n x n) contenant le triangle de Pascal
pour n 10.
© 24/25 A. DAHMANE & O. BEN ROMDHANE
Ecrire un algorithme qui permet de rechercher deux entiers a et b dans un tableau T de N entiers impairs (N
est supposée une constante = 8). Le résultat de cet algorithme doit être 0, 1 ou 2 :
0 : si aucune des deux valeurs a et b n'existe dans T,
1 : si l'une seulement des valeurs a et b existe dans T,
2 : si les deux valeurs a et b existent dans T.
13
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
26) SOMME DES NOMBRES EXTRAITS DES CHAINES
Soit T un tableau de N chaînes de caractères non vides et dont la taille maximale est 5 caractères. On se
propose d'écrire un algorithme permettant de remplir le tableau T par N chaînes de caractères (2 <=N<=30),
puis de calculer et d'afficher la somme des nombres extraits des chaînes de chaque élément du tableau T.
Le nombre extrait de la chaîne contenue dans la case i du tableau T, est formé par la concaténation de tous
les chiffres de la chaîne parcourue de gauche à droite.
N.B. : si une chaîne ne contient pas des chiffres, elle prend la valeur 0 dans le calcul de la somme finale.
Exemple :
Si N = 9 et que le tableau T contient les éléments suivants :
1 2 3 4 5 6 7 8 9
"3E-
"R4*s2" "12hj5" "5?7e" "Ak!r" "E9Y41" "6754" "G(Y" "U5Kx1"
Z2"
Écrire un algorithme qui permet de déterminer l’ensemble des nombres premiers compris entre 2 et n (n >
0 saisi au clavier) en utilisant le crible d’Eratosthène.
Cette méthode consiste à laisser le premier entier rencontré puis remplacer tous ses multiples par zéro.
Ensuite continuer de la même manière jusqu’au parcours total du crible.
Exemple (n=18)
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
2 est considéré comme nombre premier (c’est le premier entier rencontré), on doit éliminer tous ses
multiples. On aura alors :
2 3 0 5 0 7 0 9 0 11 0 13 0 15 0 17 0
puis on continue le traitement de la même manière. À la fin on affiche les entiers différents de zéro.
Soit un tableau T de 30 nombres réels compris entre 0 et 20. Ecrire un algorithme qui affiche un message
indiquant si :
▪ tous les éléments de T sont égaux.
▪ T est trié dans l’ordre croissant.
▪ T est trié dans l’ordre décroissant.
▪ T n’est pas trié.
© 24/25 A. DAHMANE & O. BEN ROMDHANE
Exemple :
1 2 3 4 27 28 29 30
Si T = 5 7 7 9.5 ... 15 15 17.5 18.5 Tableau trié dans l’ordre croissant
14
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
29) CALCUL DU TEMPS ECOULE ENTRE DEUX HEURES
Écrire un algorithme qui permet de calculer le temps écoulé diff (en minutes) entre deux temps tm1 et tm2
(en heures et minutes) saisis au clavier. On convertit chaque temps en une valeur entière correspondant au
nombre de minutes écoulées depuis minuit. L'algorithme doit effectuer les opérations suivantes :
a) Saisie de deux structures temps tm1 et tm2,
Structure Temps
Hh: Entier //heures [0, 23]
mm: Entier //minutes [0, 59]
FinStructure
b) Conversion de deux temps tm1 et tm2 en minutes (tmm1 et tmm2),
c) Calcul de la différence entre tmm1 et tmm2 en tenant compte du cas particulier de temps qui se situent
de part et d’autre de minuit.
Cas 1 : Si tm1 = 15:45 et tm2 = 17:30 Alors temps écoulé : diff = 105 minutes
Cas 2 : Si tm1 = 23:30 et tm2 = 00:45 Alors temps écoulé : diff = 75 minutes
d) Affichage du résultat : Nombre de minutes écoulées entre ces deux temps = diff
TRAVAIL DEMANDE :
Écrire un ensemble d'actions qui permet d’afficher tous les titres de chansons folkloriques enregistrés dans
le studio s durant l’année a. Le résultat doit comporter aussi le titre de l’album de chaque chanson, sachant
que le nombre d’albums enregistrés dans s est égal à nbr (les variables s et a sont supposées définies).
L’objectif de cet exercice est de proposer une structure de données adéquate pour représenter les projets
réalisés dans les différents départements d'une société.
La société est découpée en 5 départements. Chaque département est caractérisé par son nom et son chef
et il est responsable d'un certain nombre de projets (100 au maximum). Il est à noter que le nombre de
projets réellement réalisé doit être également mémorisé.
Un projet est caractérisé par une désignation, une date de début, une date de fin et il est réalisé par trois
personnes (la 1ère personne représente le chef du projet)
15
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
Chaque personne est identifiée par son numéro de CIN et décrit par un nom, une adresse et un numéro
de téléphone. Le nombre d'heures passé par une personne sur chaque projet doit être mémorisé.
a) Proposer une structure de données « Société » pour représenter ces cinq départements.
b) Ecrire un bloc d’instructions (Boucle Pour) pour déterminer le nombre d’heures total « NBHT » passé par
les chefs des projets sur tous les projets réalisés par le premier département de la société S.
32) ATHLETES
On se propose d'effectuer le suivi des athlètes participant à des compétitions sportives ainsi que le calcul
des points qu'ils ont gagnés au cours d'une année. Les structures de données proposées pour la
représentation de l'ensemble des athlètes et ses compétitions sont illustrées par les 3 tableaux suivants :
1- Liste_Categories
1 … MAXCATEG = 10
+ Code catégorie (codcateg)
+ Nom de catégorie (nomcateg)
2- Liste_Competitions
1 … MAXCOMP = 30
+ Code compétition (codcomp)
+ Désignation de compétition (nomcomp)
+ Catégorie de compétition (categ)
Représente l'indice d'une catégorie dans le tableau Liste_Categories
3- Liste_Athletes
1 … MAXA=100
+ Numéro de licence d'un athlète (licence)
+ Nom et prénom d'un athlète (noma)
+ Pays d'un athlète (pays)
+ Nombre de compétitions auxquelles un athlète a participé (Nbc)
+ Compétitions (comp) :
1 … MAXC = 5
+ Indice de compétition (numc)
Représente l'indice d'une compétition dans le tableau Liste_Competitions
+ Nombre de points gagnés (score).
Travail demandé :
Soient les variables suivantes :
▪ LA : représente une liste d'athlètes qui est supposée remplie avec des données valides et cohérentes.
▪ NA : représente le nombre réel d'athlètes (1≤ NA ≤ MAXA).
▪ LCom : représente la liste des toutes les compétitions.
▪ LCat : représente la liste des toutes les catégories.
▪ Cat : représente le code d'une catégorie de compétitions.
© 24/25 A. DAHMANE & O. BEN ROMDHANE
1) Afficher les nombres des points gagnés par chaque athlète tunisien dans
chacune des compétitions auxquelles il a participé. Seules les
compétitions de catégorie Cat seront affichées.
Voici un
2) Dire comment faire, au niveau des structures de données, pour
Exemple
supprimer une compétition donnée sans perdre l'historique des athlètes d'affichage
(Attention à la redondance de données !).
16
Algorithmique et Structures de données I
TD Partie 1 : Types de données, Structures de contrôle, Tableaux, Chaînes de caractères & Enregistrements
LES SOUS-PROGRAMMES PARTIE
LA RECURSIVITE
LES ALGORITHMES DE RECHERCHE
LES ALGORITHMES DE TRI
2
Points abordés :
Les structures de contrôle & les structures de données simples et composées
Les sous-programmes (procédures, fonctions, paramètres, passage par valeur/par référence, variable globale/locale… )
L'approche récursive
Les méthodes de recherche séquentielle et dichotomique
Les méthodes de tri : Tri par sélection, Tri à bulles, Tri par insertion, Tri fusion, …
Algorithme BlaBla
DefVar
essai, precedent : entier
ok : booléen
Début
precedent 9
Répéter
Ecrire("Principal : une donnée SVP : ")
Lire(essai)
ok faux
Deviner(essai, precedent, ok)
Ecrire("Principal : ", essai, precedent)
//Ne pas chercher à comprendre le rôle de cet algorithme !!!
Jusqu'à ok
Fin
val1 0
Ecrire("Fin deviner : ", val1, val2)
Fin
Travail demandé :
a) Quels sont les affichages de l'algorithme BlaBla lorsque les données saisies sont 11, 11, 11, 11, ... ?
b) Quelles sont les instructions inutiles qui peuvent être supprimées sans que le fonctionnement général de
l'algorithme ne soit modifié ?
17
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
2) TRACE D’EXECUTION : DECRYPTAGE
Le programme présenté ci-dessous permet de décrypter un message en anglais. Vous êtes appelés à faire la
trace d’exécution de ce programme pour décrypter le message stocké dans le tableau T.
Voici le contenu initial du tableau T (taille = 5)
"HXG\U'" "\rx" "lezi" "7" "swv"
0 1 2 3 4
DefType
Tab = Tableau[1..5] de Chaîne
DefVar
T: Tab = {"HXG\U'", "\rx", "lezi", "7", "swv"}
Procédure Decrypter(T: Tab, taille: Entier)
DefVar
i: Entier
Début
Pour i de 1 A taille Faire
T[i] Decrypter_UnMot(T[i])
FinPour
Fin
Exemples:
ASC("7")=55, ASC("'")=39, ASC("\")=92 CHR(55)="7", CHR(39)="'", CHR(92)="\"
18
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
3) TRACE D’EXECUTION : FREQUENCE
Le programme présenté ci-dessous est composé de deux fonctions : Devinette & Fonc et une procédure Proc :
Procédure Proc (t: Tab, taille: Entier, pos: Entier, VAR k: Entier)
DefVar
i (Entier)
Début
k 0, i pos
Répéter
Si (t[pos] = t[i]) Alors
k k + 1
FinSi
i i + 1
Jusqu’à (i > taille)
Fin
1 2 3 4 5 6 7 8 9 10 MAX
t= 3 2 8 6 8 8 2 2 3 2 … & taille = 10
i Avant Pour 1 2 3 4 5 6 7 8 9 10
existe
f
fmax 0
vmax
19
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
4) DATE VALIDE
Exemples de dates :
28/11/2006 C’est une date valide
29/02/2016 C’est une date valide (car 2016 est bissextile)
31/6/2017 C’est une date invalide (car le mois 6 [juin] a seulement 30 jours)
20/13/2017 C’est une date invalide (car le mois 13 n’existe pas)
Indications :
La plage autorisée pour le champ année aa est [1..9999].
Si l’année aa est bissextile alors le mois de février a 29 jours ; sinon, 28 jours.
Une année bissextile est une année qui est divisible par 400 ou bien par 4 et non par 100.
TRAVAIL DEMANDE :
On souhaite écrire un algorithme modulaire permettant de saisir une date valide. Pour ce faire, développer
les modules suivants :
a) Fonction Bissextile (aa: Entier): Booléen
// retourne Vrai si aa est une année bissextile, sinon Faux
b) Fonction isDate (d: Date): Booléen
// retourne Vrai si l’expression d représente une date valide, sinon Faux
c) Algorithme Principal
// Il permet de saisir une date valide en utilisant les deux modules Bissextile et isDate
// Cet algorithme doit afficher les messages suivants :
▪ Donner une date (jj/mm/aaaa) : message de saisie d'une date au format français jj/mm/aaaa
▪ Date invalide ! Réessayer... (taper f/F pour annuler) : Si la date saisie est invalide
▪ OK ! Date Valide : Si la date saisie est valide
▪ Opération Annulée ! : Si l'opération a été annulée
5) NOMBRES ROMAINS
© 24/25 A. DAHMANE & O. BEN ROMDHANE
La notation des nombres romains est basée sur l'utilisation des lettres M, D, C L, X, V et I. On se propose
d'écrire un programme qui, à partir d'une chaîne de caractères formée uniquement de chiffres romains,
donne son équivalent décimal selon le principe suivant :
L'équivalent décimal de chaque chiffre romain est : M=1000, D=500, C=100, L=50, X=10, V=5 et I=1.
L'équivalent décimal de la chaîne de chiffres romains est obtenu en additionnant les équivalents décimaux
de ses chiffres. Le parcours de la chaîne se fait de gauche à droite et dans le cas où un chiffre est inférieur
à son successeur, il sera précédé du signe moins (-).
20
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
Exemples :
CDXL = -100 + 500 -10 + 50 = 440
CXVI = 100 + 10 + 5 +1 = 116
CXIV = 100 + 10 – 1 + 5 = 114
MMCIX = 1000 + 1000 + 100 -1 +10 = 2109
Travail demandé :
Ecrire un algorithme modulaire qui permet de saisir une chaîne formée uniquement par des chiffres romains,
de calculer et d'afficher son équivalent décimal.
6) CARACTERES CONTIGUS
Le tableur Microsoft Excel offre une fonctionnalité nommée "Supprimer les doublons" permettant de
supprimer les lignes en double dans une feuille de données. La figure présentée ci-dessous montre un
exemple d'un tableau Excel L1 qui regroupe 10 candidats (matricule, nom et bac) contenant des lignes
redondantes.
Figure : Exemple d'un tableau Excel (L1 et L2)
21
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
1) Définir les structures de données nécessaires pour la représentation d'une liste de candidats.
2) Ecrire une procédure, nommée Supprimer_Doublons (…), qui prend en entrée une liste de candidats L1
et retourne une deuxième liste L2 dans laquelle chaque candidat n'apparaît qu'une seule fois. L'ordre des
candidats doit être conservé. Cette procédure doit déterminer aussi le nombre de valeurs en double
trouvées.
NB: Pour simplifier le traitement, penser à développer une fonction de recherche nommée Existe(…) et
l'appeler dans la procédure Supprimer_Doublons.
Soit Grade, un tableau contenant les matricules et les scores de N employés qui ont participé à un concours
sur dossier pour le passage à un grade. On se propose d'écrire un algorithme modulaire qui affiche le résultat
de ce concours, sachant que 25% des participants seront déclarés admis pour ce grade par ordre de mérite
(du plus grand au plus petit score).
Remarques :
Les matricules sont des chaînes de caractères formées de 8 chiffres.
Les scores des employés sont des entiers compris entre 20 et 120.
Si le calcul de 25% des participants ne donne pas un entier, on utilisera l'arrondi du nombre trouvé.
Exemple :
Pour N = 7 et le tableau Grade suivant :
1 2 3 4 5 6 7
Matricule 63078256 45789623 45786237 45231216 45781269 23564789 01245786
Score 38 31 45 56 28 60 21
Le programme affiche :
Liste des admis : 23564789 45231216
Travail demandé :
Ecrire un algorithme modulaire qui permet de saisir le nombre des employés N (avec 5 N 100), puis de
remplir le tableau Grade et d'afficher les résultats de passage de grade comme expliqué ci-dessus.
9) FILE D'ATTENTE
Une file est un type particulier de tableau, où les éléments sont insérés en queue (en arrière) et supprimés
en tête. Le nom vient des files d’attente à un guichet, où le premier arrivé est le premier servi, ce que justifie
le terme anglo-saxon de « FIFO » (First In First Out). Elles sont d’un usage très répandu dans la
© 24/25 A. DAHMANE & O. BEN ROMDHANE
programmation système. Les trois modules suivants sont supposés définis sur les files :
22
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
c) Procédure Défiler (VAR F : File, VAR E : TypeElement)
// On suppose que F n’est pas vide
// La file finale F' ayant tous les éléments de la file initiale F sans le premier
// Si F contient (a1, a2, … an), elle devient F’ (a2, … an) et E = a1
La figure présentée ci-après décrit l'organisation de passage des processus dans le CPU (Central Processing
Unit) de l'ordinateur pour exécution.
Structure Processus
descripteur : Chaîne
duree : Entier
FinStructure
Structure File
taille : 0..1000
File_Process : Tableau [1..1000] de Processus
FinStructure
// le champ taille représente le nombre de processus présents dans la file d’attente
23
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
Travail demandé :
1) Écrire la procédure TraiterFile qui permet de défiler tous les processus de la file F et d’enfiler dans FF
ceux qui ont une durée d’exécution supérieure à t.
Procédure TraiterFile (VAR F : File, t : Entier, VAR FF : File)
// Après l'exécution de TraiterFile :
// F devient une file vide
// et FF comporte tous les processus défilés de F et dont la durée a été diminuée de t
2) Écrire une procédure MultiLevel permettant de régler le passage des processus dans le CPU en faisant
appel à la procédure TraiterFile (les trois files doivent être traitées).
On relève dans certains jours de l’année les degrés de températures. Une observation sera un tableau de
trois valeurs {jour, moi, degré}. Par exemple, une température 24°C enregistrée le 22 Avril correspond au
tableau {22, 4, 24}. Le but de l’exercice est de manipuler une liste de telles observations qui est un tableau
de tableaux et pour simplifier on supposera que toutes les observations sont enregistrées pendant les années
non bissextiles (le nombre de jours du mois de février d’une année non bissextile est égal à 28).
Coups de pouces :
LO[1] : représente l’observation du premier jour de l’année.
LO[1][2] : représente le mois de l’observation du premier jour de l’année.
LO[1][3] : représente le degré de température enregistrée le premier jour de l’année.
OBS LO[1] : permet d’affecter l’observation du premier jour de l’année dans OBS
24
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
Voici un exemple du tableau LO :
1 2 … 31 32 … 112 … MAX
1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
1 1 12 2 1 12 … 31 1 9 1 2 10 … 22 4 24 …
jour mois degré
TRAVAIL DEMANDE :
Le tableau JM = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} contenant les nombres de jours des mois d’une
année non bissextile est supposé déjà défini. Donc, Il sera passé comme paramètre en cas de besoin.
1) Ecrire la fonction Valide qui retourne vrai si à une observation obs donnée correspond un mois et un
taille nb, une observation obs donnée, si celle-ci est valide et non déjà enregistrée.
5) Ecrire la procédure Trier_Observation qui ordonne une liste LO de nb observations par ordre
On souhaite gérer la saisie et l’affichage des résultats d’une course de ski. Pour cela, on dispose, avant la
course, d’un tableau contenant le nom et la nationalité de chacun des concurrents inscrits. Les dossards sont
attribués aux concurrents dans l’ordre où ils figurent dans ce tableau. Le numéro de dossard d’un concurrent
sera donc égal à son indice dans le tableau.
Au moment da la course, les concurrents prennent le départ les uns après les autres, à une minute
d’intervalle, dans un ordre qui n’est pas nécessairement celui des dossards.
25
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
A l’arrivée de chaque concurrent, on saisit directement son numéro de dossard et son temps (en minutes,
secondes et centièmes). On veut obtenir alors l’affichage du classement provisoire de la course : dans l’ordre
croissant des temps de parcours, on affichera le rang, le nom et le temps, de chaque concurrent déjà classé.
Ce classement s’allongera au fur et à mesure du déroulement de la course.
Exemple :
Soit le tableau de 5 skieurs suivant :
1 2 3 4 5
Bouteflika Adli Marzouki Erdogan MohamedVI
Algérie Egypte Tunisie Turquie Maroc
2) Ecrire la fonction suivante, qui permet de trouver la position du temps t parmi les temps déjà
© 24/25 A. DAHMANE & O. BEN ROMDHANE
3) Ecrire la procédure suivante, qui permet d'insérer le nom correspondant au skieur s et le temps
donné t, à la place donnée p, dans le vecteur trié TC[1..nb]. Le nom sera extrait du vecteur
TS[1..maxSkieur] :
26
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
Procédure InsPlace (s : Entier, p : Entier, t : Temps, TS : TabSkieur, VAR TC : TabClass)
-- Précond : TC[1..nb] trié
-- Postcond : le skieur s et son temps t ont été insérés dans TC[1..nb]
4) Ecrire la procédure suivante, qui permet l'insertion dans TC du nom correspondant au skieur s et
du temps donné t, de telle sorte que TC reste trié.
Procédure Insérer (à compléter…)
-- Précond : TC[1..nb] trié
-- Postcond : TC[1..nb] trié, le skieur s et son temps t ont été insérés dans TC[1..nb]
5) Ecrire la procédure suivante, qui permet l'affichage du classement des nb premiers concurrents :
Procédure Afficher (à compléter…)
-- Précond : nb > 0, TC[1..nb] trié
-- Postcond : TC[1..nb] a été affiché
6) Ecrire la procédure suivante, qui permet la saisie du numéro de dossard doss et du temps t :
Procédure Saisie (à compléter)
-- Postcond : saisie de doss et t (avec doss [0..maxSkieur])
7) Ecrire l'algorithme principal qui permet d'enchaîner les opérations de saisie et d'affichage des
classements, puis délivre le classement final et le nombre total de concurrents dans TC[1..nb]. on
supposera que la fin de la saisie est indiquée par un numéro de dossard nul.
27
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
© 24/25 A. DAHMANE & O. BEN ROMDHANE
28
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
LES ALGORITHMES RECURSIFS Partie 2
Points abordés :
Les structures de données simples et composées & Les structures de contrôle
Les sous-programmes (procédures, fonctions, paramètres, passage par valeur/par référence, variable globale/locale…)
L'approche récursive
TRAVAIL DEMANDE :
1) Exécuter la fonction Deviner pour les 4 cas suivants :
Deviner(3,3), Deviner(4,11), Deviner(10,19062012) et Deviner(2,-5)
Développer un algorithme récursif et/ou un programme C (main+fonction récursive) qui permet d’inverser
un tableau t de n entiers.
14) PALINDROME
Développer un algorithme récursif et/ou un programme C (main+fonction récursive) qui permet de vérifier
si une chaîne de caractères est palindrome ou pas (une chaîne palindrome est une chaîne qu’on peut lire
dans les deux sens).
29
Algorithmique et Structures de données I
TD N°7: La récursivité
15) OCCURRENCES D’UN ELEMENT DANS UN TABLEAU
Le triangle de Pascal est la matrice des coefficients qui sont utilisés pour le développement de certaines
expressions comme (a+b)² ou (a+b)n. Proposer une solution récursive pour le remplissage de ce triangle.
Exemple (pour n = 4) :
0 1 2 3 4
Ligne 0 1 (a+b)0 = 1
Ligne 1 1 1 (a+b)1 = 1*a + 1*b
Ligne 2 1 2 1 (a+b)2 = 1*a2 + 2*a*b + 1*b2
Ligne 3 1 3 3 1 (a+b)3 = 1*a3 + 3*a²*b + 3*a*b² + 1*b3
Ligne 4 1 4 6 4 1 (a+b)4 = 1*a4 + 4*a3*b + 6*a²*b² + 4*a*b3 + 1*b4
Travail demandé :
Faire la trace d’exécution de cette fonction SacADos sachant que :
1 2 3 4
Masse = 10, E = 1, n = 4, Poids = 5 3 4 2
30
Algorithmique et Structures de données I
TD N°7: La récursivité
LES ALGORITHMES Partie
DE RECHERCHE ET DE TRI 2
Points abordés :
Les structures de données simples et composées, les structures de contrôle, les sous-programmes et la récursivité
Les méthodes de recherche séquentielle et dichotomique
Les méthodes de tri : Tri par sélection, Tri à bulles, Tri par insertion, Tri fusion
1) RECHERCHE DICHOTOMIQUE
Sur un vecteur délimité par les indices 1 (BInf) et N (BSup), ordonné de manière croissante, le principe de
recherche dichotomique est le suivant :
Raisonnement itératif
On rechercher l'élément situé à l'indice Pivot du vecteur (c-à-d le milieu du vecteur).
On effectue une comparaison entre l'élément recherché et l'élément Pivot :
1. Elément à chercher = Elément Pivot : arrêt du traitement.
2. Elément à chercher Elément Pivot : l'élément à chercher est obligatoirement (s'il existe) dans la partie
gauche du vecteur. On rapplique le même principe en modifiant la borne supérieure de recherche dans
le vecteur (BSup = Indice Pivot – 1).
3. Elément à chercher Elément Pivot : l'élément à chercher est obligatoirement (s'il existe) dans la partie
droite du vecteur. On rapplique le même principe en modifiant la borne inférieure de recherche dans
le vecteur (BInf = Indice Pivot + 1).
Raisonnement récursif
Paramétrage du problème : ...
Recherche d'une valeur d'arrêt : le processus d'appel récursif s'arrête dans les 2 cas suivants :
▪ Lorsqu'on trouve l'élément recherché,
▪ Ou lorsque la borne inférieure dépasse la borne supérieure (Elément non trouvé).
Décomposition du cas général : au moment du premier appel la borne inférieure vaut 1 et la borne
supérieure vaut N. Au deuxième appel, le champ de la recherche est diminué en positionnant l'élément à
chercher dans la partie adéquate (gauche ou droite).
© 24/25 A. DAHMANE & O. BEN ROMDHANE
Travail demandé :
1) Ecrire une fonction itérative, nommée Dicho1(...) permettant d'effectuer une recherche dichotomique
d'un élément réel elem dans un tableau T de N nombres réels triés dans l’ordre croissant. Le résultat de
la recherche est de type Booléen (Vrai si elem existe dans T, Faux sinon).
2) Ecrire une fonction récursive nommée Dicho2(...).
3) Développer un algorithme principal qui permet d'appliquer cette méthode de recherche dichotomique.
31
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
2) TRI COMPTAGE
TRAVAIL DEMANDE :
1 2 3 4 5 6
ÉTAPE 1 : TRANG 1 1 1 1 1 1
1 2 3 4 5 6
ÉTAPE 2 : TRANG
1 2 3 4 5 6
ÉTAPE 3 : TRES
32
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
3) TRI PAR SELECTION
Le principe du tri par sélection consiste à sélectionner l'élément dont la valeur est la plus basse (le minimum),
puis échanger la valeur de cet élément avec le premier élément du tableau. Le traitement se poursuit en
cherchant le minimum parmi ceux qui restent : c'est à dire à partir du deuxième élément du tableau puis
faire l'échange avec le deuxième élément jusqu'à atteindre T[n-1] et T[n]. La figure suivante présente un
exemple d'utilisation de cette méthode de tri par sélection.
TRAVAIL DEMANDE :
© 24/25 A. DAHMANE & O. BEN ROMDHANE
1) Ecrire une procédure modulaire TRI_SELECTION (...) permettant de trier un tableau T de N entiers dans
1 2 3 4 5 6
T 9 14 2 9 5 12
33
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
4) TRI A BULLES
L’idée de cet algorithme de tri est de faire descendre les éléments les plus petits, tandis que les
éléments les plus grands remontent. Chaque passe consiste en un parcours séquentiel. Durant ce
parcours, on permute les éléments consécutifs non ordonnés. Le vecteur est trié si lors d’une passe
on n’effectue aucune permutation.
TRAVAIL DEMANDE :
Ecrire une procédure TRI_BULLES (...) permettant de trier un tableau T de N entiers dans l'ordre croissant en
utilisant la méthode de tri à bulles.
34
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
5) TRI PAR INSERTION
Le principe du tri par insertion consiste à placer l'élément T[i] du tableau (2 i n) à la bonne place, c'est à
dire l'insérer parmi les éléments déjà ordonnés du sous-vecteur T[1..i-1]. Chaque insertion se fait par
comparaisons et décalages successifs et a pour conséquence d'agrandir le sous-vecteur ordonné d'un
élément.
TRAVAIL DEMANDE :
Ecrire une procédure TRI_INSERTION (...) permettant de trier un tableau T de N entiers dans l'ordre croissant
en utilisant la méthode de tri à par insertion.
35
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
6) FUSION DE DEUX TABLEAUX TRIES
Soit un tableau t contenant une suite d’éléments triés entre les indices g et m inclus, puis une 2ème suite
d’éléments triés entre les indices m+1 et d inclus. On se propose d’écrire une procédure Fusion permettant
de fusionner ces deux suites d’éléments pour obtenir une suite triée entre les indices g et d inclus.
Coup de pouce : Vous pouvez commencer par recopier les deux suites t[g..m] et t[m+1..d] dans deux tableaux t1 et
t2, puis vous traitez le problème de la fusion (voir Figure ci-dessous). Il serait également possible de faire la fusion
“sur place” sans tableaux intermédiaires. La fusion consiste donc en des comparaisons successives. Des 2 sous-
séquences à fusionner, un seul élément peut-être origine de la nouvelle séquence. La détermination de cet élément
s'effectue suivant l'ordre du tri à adopter.
36
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
7) TRI PAR FUSION
TRAVAIL DEMANDE :
a) Ecrire une procédure récursive TRI_FUSION (...) permettant de trier un tableau T de N entiers
dans l'ordre croissant selon la méthode de tri à par fusion en faisant appel à la procédure
précédente FUSION.
Procédure TRI_FUSION (VAR t : TAB, ...)
b) Faites la trace d’exécution de cette procédure TRI_FUSION avec le tableau réel suivant :
© 24/25 A. DAHMANE & O. BEN ROMDHANE
1 2 3 4 5 6 7 8
t 7 3 2 9 8 4 3 0
37
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
© 24/25 A. DAHMANE & O. BEN ROMDHANE
38
Algorithmique et Structures de données I
TD Partie 2 : Sous-programmes, Récursivité, Algorithmes de recherche et de tri
ALGORITHMES AVANCES
TD 9
& ANCIENS EXAMENS
Points abordés :
Les structures de données, les structures de contrôle, les sous-programmes
La récursivité
Les algorithmes de recherche et de tri
1) DEMINEUR
Le démineur est un jeu de réflexion dont le but est de localiser des x mines
cachées dans une grille de taille n x m, qui peut avoir trois dimensions
différentes en fonction du niveau de difficulté, avec pour seule indication le
nombre de mines dans les cases adjacentes :
Niveau de difficulté :
-1- Débutant : Grille 9x9 et 10 Mines
-2- Intermédiaire : Grille 16x16 et 40 Mines
-3- Avancé : Grille 16x30 et 99 Mines
Voici un exemple d'une grille démineur (9x9) complète après le placement des mines (*) et des chiffres
© 24/25 A. DAHMANE & O. BEN ROMDHANE
Au voisinage
direct de la case
[1,6], il y a 2 mines
39
Algorithmique et Structures de données I
TD N°9 : Algorithmes avancés & Sujets d’examens
4) Calcul du nombre de mines de chaque case : Après le placement des mines, l'algorithme parcourt
la grille en entier, case par case. Pour chacune d'entre elles, il compte le nombre de mines dans
le voisinage direct, et lui assigne ce nombre. Cette méthode est la plus évidente à comprendre
et à mettre en place, mais ce n'est pas la plus optimisée. Vous êtes appelés à proposer une
deuxième méthode plus performante ?
2) SUDOKU
Jeu de chiffres d'origine japonaise consistant à compléter une grille, subdivisée en 9 zones de 9 cases, avec des chiffres de 1 à 9.
Sur chaque ligne, il doit y avoir tous les chiffres de 1 à 9.
Sur chaque colonne, il doit y avoir tous les chiffres de 1 à 9.
Dans chaque bloc de 3x3 cases, il doit y avoir tous les chiffres de 1 à 9
NB: Le choix des cases à vider doit se faire d'une façon aléatoire en utilisant la fonction prédéfinie RAND(x)
qui retourne un nombre entier dans l'intervalle fermé [0 ; x-1]. Le vidage consiste simplement à mettre
un zéro dans les différentes cases à vider.
© 24/25 A. DAHMANE & O. BEN ROMDHANE
40
Algorithmique et Structures de données I
TD N°9 : Algorithmes avancés & Sujets d’examens
3) Procédure ChiffresPossibles(s:Sudoku, l:Entier, c:Entier,
ldeb: Entier, cdeb: Entier,
VAR tc: TabChiffres)
Elle permet de déterminer, dans le tableau tc (supposé initialisé à zéro), tous les chiffres possibles
pouvant être placés dans la case référencée par la ligne l et la colonne c de la grille s. ldeb et cdeb
représentent respectivement la ligne et la colonne de début du bloc encours. Voir exemple ci-
dessous :
41
Algorithmique et Structures de données I
TD N°9 : Algorithmes avancés & Sujets d’examens
5) Procédure AfficherSudoku (s : Sudoku, n : Entier)
Cette procédure permet d’afficher toute la grille S (n x n) de la façon suivante :
Le but du problème des huit dames est de placer huit dames d'un jeu
d'échecs sur un échiquier de 8 × 8 cases sans que les dames ne
puissent se menacer mutuellement, conformément aux règles du jeu
d'échecs (la couleur des pièces étant ignorée). Par conséquent, deux
dames ne devraient jamais partager la même rangée, colonne, ou
diagonale. Le plus souvent, il est employé comme exemple d'un
problème qui peut être résolu avec un algorithme récursif, en
© 24/25 A. DAHMANE & O. BEN ROMDHANE
42
Algorithmique et Structures de données I
TD N°9 : Algorithmes avancés & Sujets d’examens
4) TOURS DE HANOI
Implémenter en langage C le jeu des tours de Hanoï en utilisant une démarche récursive.
Paramétrage du problème :
▪ n : nombre de disques
▪ A, B, C : les trois tours (départ, intermédiaire et arrivée)
Recherche de la valeur d’arrêt : Si (n = 1) Alors « Déplacer un disque de A vers C »
Décomposition du cas général : Résoudre le problème pour n disques ne présente pas de difficulté si on
sait le résoudre pour (n-1) disques ; en effet, transporter les n disques de la tour A à la tour C, c’est :
▪ Transporter les (n-1) premiers disques de A vers B (C tour intermédiaire), puis
▪ Déplacer le disque restant de A vers C, et enfin
▪ Transporter les (n-1) disques de B vers C (A tour intermédiaire).
int main ()
{ int n;
char t1='A', t2='B', t3='C'; //ou bien int t1=1, t2=2, t3=3;
printf("Donner le nombre des disques : "); scanf("%d", &n);
hanoi(n, t1, t2, t3);
system("pause");
}
43
Algorithmique et Structures de données I
TD N°9 : Algorithmes avancés & Sujets d’examens
5) CRYPTAGE/DECRYPTAGE
On se propose de développer un programme (C, VB, Pascal ou autres) qui permet de crypter et décrypter un
texte. Un texte est constitué de plusieurs blocs de caractères (lettre, chiffre [0..9], symbole [#, &, *, @, ~,
%, …] ou signe de ponctuation [?, !, :, …]). Les différents blocs peuvent être éventuellement séparés par un
ou plusieurs espaces (bloc d’espaces).
➢ Le cryptage traite chaque bloc de caractères séparément selon son longueur et laisse invariant les blocs
d’espaces: on ajoute à chaque code "Unicode" d’un caractère le nombre de caractères du bloc qui le
contient.
➢ Le décryptage traite aussi chaque bloc de caractères (crypté) séparément selon son longueur et laisse
invariant les blocs d’espaces: on diminue de chaque code "Unicode" d’un caractère le nombre de
caractères du bloc qui le contient.
"Petità petit,l’oiseaufaitsonnid!"
Espace
"vkzoz2"
Unicode("p") + long("petit,")
donne le nouveau caractère "v"
© 24/25 A. DAHMANE & O. BEN ROMDHANE
44
Algorithmique et Structures de données I
TD N°9 : Algorithmes avancés & Sujets d’examens