Correction TP 4 : Types de données abstraits séquenciels Licence 2 MASS semestre 2, 2007/2008 Exercice 1 : Liste d’étudiants lettre( m, i ) : retourne la lettre numéro i du mot m Algorithme etudiant(l : liste de mot) : liste de mot début si listeEstVide?(l) alors retourner listeVide() sinon si lettre(listeTete(l), ’m’) alors retourner listeCons(listeTete(l), etudiant(listeQueue(l))) sinon retourner etudiant(listeQueue(l)) fin si fin si fin Exercice 2 : Maximums a- Algorithme maximum(l : liste de réel) : réel début si listeEstVide?(l) alors retourner 0 sinon si listeEstVide?(listeTete(l)) alors retourner listeTete(l) sinon retourner max2(listeTete(l), maximum(listeQueue(l))) fin si fin si fin et il faut alors définir aussi l’algorithme max2 : Algorithme max2(a, b : réel) : réel début si a < b alors retourner b sinon retourner a fin si fin b- Algorithme maximumListes(l : liste de listes de réel) : liste de réel 1 début si listeEstVide?(l) alors retourner listeVide() sinon retourner listeCons(maximum(listeTete(l)), maximumListes(listeQueue(l))) fin si fin Exercice 3 : Distribution de feuilles Algorithme distribution(p, p1 , p2 : pile de feuilles) : (pile de feuilles, pile de feuilles) début si pileEstVide?(p) alors retourner (p1 , p2 ) sinon retourner distribution(depiler(p), p2 , empiler(sommet(p), p1 )) fin si fin Exercice 4 : Couples • coupleCons : typeElément1 × typeElément2 → couple construit un couple d’éléments • premier : couple → typeElément1 donne le premier élément du couple • second : couple → typeElément2 donne le second élément du couple Les couples peuvent être utiliser pour représenter par exemple les coordonnées de points du plan, les noms et prénom de personnes, etc. Exercice 5 : Longueur d’une ligne brisée On utilise le TDA couple défini dans l’exercice précédent. Algorithme longueur(l : liste de couples de deux réels) : réel début si listeEstVide(L) alors retourner 0 sinon retourner longueurAvecPoint(listeTete(l), listeQueue(l)) fin si fin Algorithme longueurAvecPoint(point : couple de reel, l : liste de couples de deux réels) : réel début si listeEstVide?(L) alors retourner 0 sinon 2 retourner distance(point, listeTete(l)) + longueurAvecPoint(listeTete(l), listeQueue(l)) fin si fin Algorithme distance(point1, point2 : couple de reels) : réel début p retourner (premier(point1) − premier(point2))2 + (second(point1) − second(point2))2 fin Exercice 6 : File avec priorité L’algorithme pourrait ressembler à insertion mais en fait beaucoup plus technique car enfiler ajoute à la fin. Algorithme ajout(c : couple, f : file de couples) : file de couples début retourner ajoutTerm(fileVide(), c, f ) fin Algorithme ajoutTerm(f term : file de couples, c : couple, f : file de couples) : file de couples début si fileEstVide?(f ) alors retourner enfiler(c, f term) sinon si second(c) ≤ second(fileTete(f )) alors retourner ajoutTerm(enfiler(fileTete(f ), f term), c, defiler(f )) sinon retourner ajoutTerm(enfiler(c, f term), fileTete(f ), defiler(f )) fin si fin si fin Exercice 7 : Polynomes Algorithme somme(P1 , P2 : liste de couple) : liste de couple début variable : m1 , m2 : couple si listeEstVide?(P1 ) alors retourner P2 sinon si listeEstVide?(P2 ) alors retourner P1 sinon m1 ← listeTete(P1 ) m2 ← listeTete(P2 ) si second(m1 ) ¡ second(m2 ) alors retourner listeCons(m2 , somme(P1 , listeQueue(P2 ))) sinon si second(m1 ) = second(m2 ) alors retourner listeCons(coupleCons(premier(m1 ) + premier(m2 ), second(m1 )), somme(listeQueue(P1 ), listeQueue(P2 ))) 3 sinon retourner listeCons(m1 , somme(listeQueue(P1 ), P2 )) fin si fin si fin si fin si fin 4