INF130 - Ordinateurs et programmation Semaine 08 Document présenté par Frédérick Henri et conçu par les enseignants en informatique du SEG
Retour sur l'examen intra Objectifs Tableaux à deux dimensions - Déclaration -Accès à un élément Algorithmes sur tableaux - Fouilles - Fouille séquentielle - Fouille dichotomique Algorithmes sur tableaux - Tris - Tri par sélection - Tri par insertion -Tri bulle Objectifs
Tableaux (p. 129) Un tableauest une séried'éléments de même nature regroupés sous un seul identificateur. Chaque élément possède un indice permettant d'accéder à son contenu. Illustration d'un tableau Le tableau ci-dessouscontient 5 éléments de type entier. L'indice de chacun des éléments apparaît au-dessus de de dernier. 1 2 3 4 5 12 45 1 56 9 La création de ce tableau pourrait se faire ainsi : ' On déclare un tableau de 5 entiers. Dim tableau(1 To 5) As Integer ' On assigne une valeur à chacun des éléments du tableau. tableau(1) = 12 tableau(2) = 45 tableau(3) = 1 tableau(4) = 56 tableau(5) = 9 Rappel
Déclaration d'un tableau statique à deux dimensions (p. 136) Les tableaux à taille fixe se déclarent comme suit : Dim nom_du_tableau(taille, [taille],...) As type_de_données où nom_du_tableau: correspond au nom du tableau taille: le nombre d'éléments pour une dimension (où les indices des élémentssi le mot To est utilisé). type_de_données: Le type de donnée de chacun des éléments. EXEMPLES DE TABLEAUX À PLUSIEURS DIMENSIONS ' Tableau à deux dimensions d'entiers. ' L'indiçage dépend de l'instruction Option Base. Dim un_tableau(5, 10) As Integer ' Tableau à deux dimensions d'entiers (5 lignes et 10 colonnes), respectivement ' indicées de 1 à 5 et de 1 à 10. Dim un_tableau(1 To 5, 1 To 10) As Integer ' Tableau à 4 dimensions, 10 x 10 x 10 x 10 pu encore 11 x 11 x 11 x 11 selon ' la présence de l'instruction Option Base. Dim un_tableau(10, 10, 10, 10) As Integer EXEMPLE Pour créer le tableau ci-dessous, nous pourrions écrire le code qui suit. 1 2 3 4 1 2 3 0 3 0 0 1 0 0 0 0 0 0 2 Dim un_tableau(1 To 3, 1 To 4) As Integer ' On assigne la valeur 1 à l'élément situé à l'intersection de la ligne 2 et ' de la colonne 1. un_tableau(2, 1) = 1 ' On assigne la valeur 2 à l'élément situé à l'intersection de la ligne 3 et ' de la colonne 4. un_tableau(3, 4) = 2 ' On assigne la valeur 3 à l'élément situé à l'intersection de la ligne 1 et ' de la colonne 2. un_tableau(1, 2) = 3 Déclaration
Fonctions LBound et UBound Les fonctions LBound et UBound servent à identifier les indices des bornes d'un tableau : LBound Signifie Lower Bound et retourne l'indice du premier élément d'un tableau. UBound Signifie Upper Bound et retourne l'indice du dernier élément d'un tableau. SYNTAXE - UBound et LBound borne_inférieure = LBound(nom_du_tableau, [dimension à consulter]) borne_supérieure = UBound(nom_du_tableau, [dimension à consulter]) EXEMPLES Option Base 1 ' Indiçage à partir de 1 (dans le haut du module). Public Sub test_bounds() ' Déclaration des variables. Dim tableau_deux(8, 33 To 99) As String Dim tableau_dynamique() As Boolean ' Quelques tests. Call MsgBox(LBound(tableau_deux, 1)) ' Affiche 1. Call MsgBox(UBound(tableau_deux, 1)) ' Affiche 8. Call MsgBox(LBound(tableau_deux, 2)) ' Affiche 33. Call MsgBox(UBound(tableau_deux, 2)) ' Affiche 99. ' Redimension de tableau_dynamique. ReDim tableau_dynamique(1 To 100, 0 To 9) Call MsgBox(LBound(tableau_dynamique, 1)) ' Affiche 1. Call MsgBox(UBound(tableau_dynamique, 1)) ' Affiche 100. Call MsgBox(LBound(tableau_dynamique, 2)) ' Affiche 0. Call MsgBox(UBound(tableau_dynamique, 2)) ' Affiche 9. End Sub Accès
Nombre de dimensions d'un tableau Malheureusement, aucune fonctionnalité du langage ne permet d'identifierle nombre de dimensions d'un tableau (Aide et support Microsoft - Article 152288). La fonction qui suit permet de déterminer le nombre de dimensions d'un tableau. Elle profite du fait que la consultation de la borne inférieure d'une dimension inexistante génère une erreur. Nombre de dimensions d'un tableau ' ' NOMBRE_DE_DIMENSIONS ' ' Cette fonction retourne le nombre de dimensions d'un tableau. ' ' PARAMÈTRES : ' - tableau : (ENTRÉE) Le tableau dont on cherche le nombre de dimensions. ' ' VALEUR DE RETOUR : Le nombre de dimensions du tableau reçu. ' Public Function nombre_de_dimensions(byref tableau() As Integer) As Long Const NB_DIMENSIONS_MAXIMAL As Long = 60000 Dim indice_dimension As Long ' Pour itérer sur chacune des dimensions. Dim resultat_lbound As Long ' Reçoit le retour du Lbound. ' En cas d'erreur, on saute à l'étiquette DERNIÈRE_DIMENSION. On Error GoTo DERNIÈRE_DIMENSION ' On consulte la borne inférieure de chaque dimension potentielle. For indice_dimension = 1 To NB_DIMENSIONS_MAXIMAL ' Si la dimension n'existe pas, alors on saute à l'étiquette ' DERNIÈRE_DIMENSION. resultat_lbound = LBound(tableau, indice_dimension) Next indice_dimension DERNIÈRE_DIMENSION: nombre_de_dimensions = indice_dimension - 1 Nombre de dimensions
Exercices (p. 155) Écrivez une procédurequi reçoit un tableau à deux dimensions d'entiers ainsi qu'un entier. Elle assigne l'entier reçu à chacun des éléments du tableau. Exemple d'utilisation Dim tableau(1 To 3, 1 To 8) As Integer Call remplir_tableau(tableau, 2) Suite à l'exécution du code ci-dessus, la variable tableau contiendra les valeurs suivantes. 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 Écrivez une procédurequi reçoit un tableau à deux dimensions d'entiers et le remplit de la façon suivante (avec des 1 dans la première et la dernière ligne et des 2 partout ailleurs). 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 Exercices 1a
Solutions Public Sub remplir_tableau(byref tableau() As Integer, _ ByVal valeur As Integer) Dim ligne As Integer Dim colonne As Integer For ligne = LBound(tableau, 1) To UBound(tableau, 1) For colonne = LBound(tableau, 2) To UBound(tableau, 2) tableau(ligne, colonne) = valeur Next colonne Next ligne End Sub Public Sub remplir_tableau(byref tableau() As Integer) Dim ligne As Integer Dim colonne As Integer For ligne = LBound(tableau, 1) To UBound(tableau, 1) For colonne = LBound(tableau, 2) To UBound(tableau, 2) If (ligne = LBound(tableau, 1) Or _ ligne = UBound(tableau, 1)) Then tableau(ligne, colonne) = 1 Else tableau(ligne, colonne) = 2 End If Next colonne Next ligne End Sub Voici une autrefaçon de réaliser la même tâche. Public Sub remplir_tableau(byref tableau() As Integer) Dim ligne As Integer Dim colonne As Integer ' On remplit la première et la dernière ligne. For colonne = LBound(tableau, 2) To UBound(tableau, 2) tableau(lbound(tableau, 1), colonne) = 1 tableau(ubound(tableau, 1), colonne) = 1 Next colonne ' On remplit toutes les autres lignes. For ligne = LBound(tableau, 1) + 1 To UBound(tableau, 1) - 1 For colonne = LBound(tableau, 2) To UBound(tableau, 2) tableau(ligne, colonne) = 2 Next colonne Next ligne End Sub Solutions 1a
Exercices (p. 155) Écrivez une procédurequi reçoit un tableau à deux dimensions d'entiers et le remplit de lafaçon suivante (avec des 0 dans la première ligne, des 1 dans la deuxième, etc.). 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 Écrivez une procédurequi reçoit un tableau à deux dimensions d'entiers et le remplit de la façon suivante. 1 1 1 1 1 2 2 2 1 2 3 3 1 2 3 4 Afin de simplifier l'exercice, supposez que l'indice du premier élément de chaque dimension vaut 1. Exercices 1b
Solutions ' PREMIÈRE FAÇON : Utiliser une formule utilisant l'indice de la ligne ' et/ou de la colonne. Public Sub remplir_tableau_version1(byref tableau() As Integer) Dim ligne As Integer Dim colonne As Integer For ligne = LBound(tableau, 1) To UBound(tableau, 1) For colonne = LBound(tableau, 2) To UBound(tableau, 2) tableau(ligne, colonne) = ligne - Lbound(tableau, 1) Next colonne Next ligne End Sub ' DEUXIÈME FAÇON : Utiliser une variable conservant la prochaine valeur à ' assigner à un élément. Public Sub remplir_tableau_version2(byref tableau() As Integer) Dim ligne As Integer Dim colonne As Integer Dim valeur_a_assigner As Integer valeur_a_assigner = 0 For ligne = LBound(tableau, 1) To UBound(tableau, 1) For colonne = LBound(tableau, 2) To UBound(tableau, 2) tableau(ligne, colonne) = valeur_a_assigner Next colonne valeur_a_assigner = valeur_a_assigner + 1 Next ligne End Sub ' TROISIÈME FAÇON : Remplir la première ligne et remplir ensuite les ' lignes suivantes en utilisant les lignes précédentes. Public Sub remplir_tableau_version3(byref tableau() As Integer) Dim ligne As Integer Dim colonne As Integer For colonne = LBound(tableau, 2) To UBound(tableau, 2) tableau(lbound(tableau, 1), colonne) = 0 Next colonne For ligne = LBound(tableau, 1) + 1 To UBound(tableau, 1) For colonne = LBound(tableau, 2) To UBound(tableau, 2) tableau(ligne, colonne) = tableau(ligne - 1, colonne) + 1 Next colonne Next ligne Public Sub remplir_tableau(byref tableau() As Integer) Dim ligne As Integer Dim colonne As Integer For ligne = 1 To UBound(tableau, 1) For colonne = 1 To UBound(tableau, 2) If (ligne < colonne) Then tableau(ligne, colonne) = ligne Else tableau(ligne, colonne) = colonne End If Next colonne Next ligne End Sub Solutions 1b
Les fouilles L'intérêt de conserver des données est biensûr de pouvoir les consulter ultérieurement. L'action de rechercher une donnée parmi un ensemble de données se nomme une fouille. Comme toujours, Excel nous offre des fonctions nous permettant d'effectuerunefouilledans une plage Excel (la méthodefinddans un objet de la classe Range, la fonction Recherchev, etc.). Malheureusement, ceci n'est pas possible en mémoire (par exemple, lorsque nous travaillons avec des tableaux). Il arrive donc fréquemment que nous ayons à écrire nos propres sous-programmes réalisant une fouille. Il existe deux types de fouilles simples que nous présenterons dans ce classeur : la fouille Fouilles
La fouille séquentielle Fonctionnement de la fouille séquentielle Tant que (la valeur n'est pas trouvée Et que le tableau n'a pas été parcouru au complet) avancer au prochain élément Fin pour Il est à noter que... - La fouille séquentielle n'exige pas que les valeurs du tableau soient ordonnées. -S'il y a plusieurs occurrences de la valeur recherchée dans le tableau, la fouille séquentielle retourne la position de la première occurence. -Dans le pire des cas (si la valeur recherchée n'est pas dans le tableau), le nombre d'éléments consultés sera égal au nombre d'éléments dans le tableau. Fouille séquentielle
La fouille dichotomique Voici ce à quoi ressemble l'algorithme de la fouille dichotomiquelorsque l'on recherche la valeur valeur_recherchée dans le tableau tableau de n éléments ordonnés : gauche = 1 droite = n Boucle Tant Que (gauche < droite) // On trouve le milieu de la plage de recherche // (notons ici que la division est entière). milieu = (gauche + droite) \ 2 si (tableau(milieu) < valeur_recherchée) Alors gauche = milieu + 1 Sinon droite = milieu Fin Si Fin Boucle Pourtrouver le milieu d'une plage, évitez d'écrire gauche + (droite -gauche) \2. En effet, l'expression (gauche + droite) \ 2, est équivalenteet plus rapide (c'est une moyenne). Si (tableau(gauche) = valeur_recherchée) Alors // L'indice de la valeur cherchée est conservé dans la // variable milieu. Sinon // La valeur recherchée n'est pas dans le tableau. Quelques petites choses à noter : - La fouille dichotomique exige que les valeurs du tableau soient en ordre croissant. -La fouille dichotomique consulte toujours log 2 (n) éléments, où ncorrespond au nombre d'éléments dans le tableau. Ainsi, la fouille dichotomique est BEAUCOUP plus rapide que la fouille séquentielle, mais ne peut être utilisée que sur des données triées! Fouille dichotomique
Exercices Écrivez une fonction qui reçoit deux paramètres : un tableau à une dimension d'entiers et unentier. Elle fouille le tableau et retourne l'indice de la première occurrence du nombre dans le tableau. Si le nombre n'est pas dans le tableau, elle retourne l'indice du premier élément du tableau moins 1. Exercices 2
Solutions Commençons par une version très simple qui parcourt toujours le tableau au complet. Public Function fouiller_tableau(byref tableau() As Integer, _ ByVal valeur_cherchée As Integer) _ As Integer Dim i As Integer ' Pour parcourir le tableau. ' Au départ, on suppose que la valeur est absente. fouiller_tableau = LBound(tableau) - 1 ' On cherche la première occurence de la valeur. For i = LBound(tableau) To UBound(tableau) If (tableau(i) = valeur_cherchée) Then fouiller_tableau = i End If Next i End Function Pourquoi cette versionne répond-elle pas à nos attentes? Tout d'abord, parce qu'elle ne retourne pas l'indice de la première occurrence de la valeur recherchée, mais celle de la dernière. Une façon simple de corriger le problème consiste à terminer la boucle lorsque la valeur est trouvée. Voici donc une version plus efficace qui répond aux exigences du problème. Public Function fouiller_tableau(byref tableau() As Integer, _ ByVal valeur_cherchée As Integer) _ As Integer Dim i As Integer ' Pour parcourir le tableau. ' Au départ, on suppose que la valeur est absente. fouiller_tableau = LBound(tableau) - 1 ' On cherche la première occurence de la valeur. For i = LBound(tableau) To UBound(tableau) If (tableau(i) = valeur_cherchée) Then fouiller_tableau = i Exit Function End If Next i End Function Il est généralementrecommandé de n'avoir qu'un unique point de sortie dans une fonction. En ajoutant Exit Function, cela en ajoute un second (quand on rentre dans l'instruction conditionnelle et quand on sort de la boucle). L'utilisation d'une boucle Whilepermet de corriger le problème. Public Function fouiller_tableau(byref tableau() As Integer, _ ByVal valeur_cherchée As Integer) _ As Integer Dim i As Integer ' Pour parcourir le tableau. ' Au départ, la valeur n'a pas encore été trouvée. fouiller_tableau = LBound(tableau) - 1 ' On parcourt le tableau tant que l'on est toujours dans le tableau ' et que la valeur recherchée n'est pas trouvée. i = LBound(tableau) While (i <= UBound(tableau) And _ fouiller_tableau = LBound(tableau) - 1) If (tableau(i) = valeur_cherchée) Then fouille_tableau = i Else i = i + 1 End If Wend Solutions 2
Les tris Il est impossible de parler de gestion de données sans parler de tris. Imaginez un bottin téléphonique dont les données ne seraient pas triées! En fait, à chaque fois qu'on présente des données, peu importe leur type, on doit les présenter d'une façon ordonnée, à moins de n'avoir que quelques informations à montrer. Pour trier une base de données présentée dans une feuille de calcul Excel avec VBA, on utilise la méthode Sortd'un objet de type Range(voir l'exemplede code qui suit qui n'est offert qu'à titre indicatif). Procédure triant une plage de données ' ' TRIER_PLAGE ' ' Cette procédure trie les données de la plage reçue en ordre croissant. ' Elle suppose que la plage de données ne possède pas d'en-tête. ' ' PARAMÈTRES : ' - plage : La plage de données a trier. ' - feuille : La feuille contenant la plage à trier. ' ' VALEUR DE RETOUR : Aucune. ' ' Exemple d'appel : ' Call trier_plage(range("a1:a10"), ActiveSheet) ' Public Sub trier_plage(byval plage As Range, ByVal feuille As Worksheet) ' On efface l'état du tri. feuille.sort.sortfields.clear ' On ajoute un champs de tri (la clé étant la première colonne). feuille.sort.sortfields.add Key:= plage.cells(1, 1), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal ' On trie la plage. With feuille.sort.setrange plage.header = xlno.matchcase = False.Orientation = xltoptobottom.sortmethod = xlpinyin.apply End With Malheureusement, ceci n'est pas possible en mémoire (par exemple, lorsque nous travaillonsavec des tableaux). Il faut donc écrire du code pour trier des tableaux. Il existe une foule d'algorithmes de tri dans la littérature. Dans ce cours, nous en étudierons trois : o Le tri par sélection; o Le tri bulle; o Le tri par insertion. Tris
Le tri par sélection Le fonctionnement du tri par sélection est le suivant : Première passe On cherche l'élément contenant la plus petite valeur du tableau à partir du premier élément. On échange lavaleur de cet élément avec celle du premierélément du tableau. Deuxième passe On cherche l'élément contenant la plus petite valeur du tableau à partir du deuxième élément. On échange lavaleur de cet élément avec celle du deuxièmeélément du tableau.... et ainsi de suite pour chaque élément du tableau jusqu'à l'avant-dernier. Fonctionnement du tri par sélection Pour i = 1 À n - 1 indice_du_minimum = indice du plus petit élément se trouvant entre T(i) et T(n) inclusivement permuter T(i) et T(indice_du_minimum) Fin Boucle Tri par sélection
Exercices Écrivez une procédure nommée permuterqui reçoitdeux entiers par référence et qui échange leurs contenus. À l'aide de la fonctionpermuter(ci-dessus) et de la fonction indice_minimum(ci-dessous), écrivez une procédure nommée tri_par_selectionqui reçoit un tableau à une dimension d'entiers et trie les valeurs qui s'y trouvent en ordre croissant à l'aide d'un tri par sélection. Private Function indice_minimum(byref tableau() As Integer, _ ByVal debut As Integer, _ ByVal fin As Integer) As Integer Dim i As Integer ' Pour parcourir le tableau. ' Au départ, on suppose que le premier élément est le plus ' petit. indice_minimum = debut ' On consulte tous les autres éléments du tableau. For i = debut + 1 To fin ' Si cet élément est plus petit que le minimum, il ' devient le nouveau minimum. If (tableau(i) < tableau(indice_minimum)) Then indice_minimum = i End If Next i End Function Exercices 3
Solutions Public Sub permuter(byref nb1 As Integer, ByRef nb2 As Integer) Dim tampon As Double ' Une variable servant à conserver ' temporairement la valeur de nb1. tampon = nb1 nb1 = nb2 nb2 = tampon End Sub Public Sub tri_par_selection(byref tableau() As Integer) Dim i As Integer ' Pour trier chacun des éléments. ' On place au bon endroit chacun des éléments du tableau. For i = LBound(tableau) To UBound(tableau) - 1 ' On s'assure que le ième plus petit élément se trouve à ' l'ième position. Call permuter(tableau(i), _ tableau(indice_minimum(tableau, i, _ UBound(tableau)))) Next i End Sub Solutions 3
Le tri par insertion Le fonctionnement du tri par insertion est le suivant : Première passe On reculela valeur du deuxièmeélément dans le tableau jusqu'à ce que les valeurs des deux premiers éléments soient ordonnés. Deuxième passe On recule la valeur du troisièmeélément dans le tableau jusqu'à ce que les valeurs destrois premiers éléments soient ordonnés.... et ainsi de suite pour tous les autres éléments du tableau. Fonctionnement du tri par insertion Pour i = 2 À n insérer l'élément T(i) au bon endroit parmi les i-1 éléments déjà triés Fin Pour Public Sub tri_par_insertion(byref tableau() As Integer) Dim element_a_inserer As Integer ' L'indice de l'élément à reculer. ' On insère chaque élément au bon endroit dans le tableau. For element_a_inserer = LBound(tableau) + 1 To UBound(tableau) Call reculer_element(tableau, element_a_inserer) Next element_a_inserer End Sub Private Sub reculer_element(byref tableau() As Integer, _ ByVal indice As Integer) Dim copie As Integer ' Pour copier l'élément à reculer. Dim element_a_copier As Integer ' Indice de l'élément à copier. Dim fin_copie_a_droite As Boolean ' True lorsqu'il n'y a plus de ' valeurs à décaler. ' On fait une copie de la valeur à reculer. copie = tableau(indice) ' Tant qu'il reste une valeur qui doit être copiée, on la copie ' dans l'élément à droite et on passe au prochain élément à gauche. element_a_copier = indice - 1 While (Not fin_copie_a_droite) ' Si l'on ne se trouve plus dans le tableau, alors les copies ' sont terminées. If (element_a_copier < LBound(tableau)) Then fin_copie_a_droite = True ' Si la valeur de l'élément courant est plus petite que la ' valeur à reculer, alors les copies sont terminées. ElseIf (tableau(element_a_copier) <= copie) Then fin_copie_a_droite = True ' Sinon, on copie la valeur de l'élément courant et on passe au ' prochain élément à gauche. Else ' On copie la valeur courante d'un élément vers la droite. tableau(element_a_copier + 1) = tableau(element_a_copier) element_a_copier = element_a_copier - 1 End If Wend ' On écrit l'élément à reculer au bon endroit. tableau(element_a_copier + 1) = copie End Sub Tri par insertion
L'algorithme du tri bulleest le suivant : Le tri bulle Première passe On part du dernierélément du tableau jusqu'au deuxièmeet on compare la valeur de chaque élément avec celle de l'élément précédent. Si la valeur de l'élément de droite est plus petite que celle de celuide gauche, on échange les deux valeurs. Deuxième passe On part du dernier élément du tableau jusqu'au troisième et on compare la valeur de chaque élément avec celle de l'élément précédent. Si la valeur de l'élément de droite est plus petite que celle de celuide gauche, on échange les deux valeurs.... et ainsi de suite jusqu'à ce qu'on parte du dernier élément jusqu'à l'avant-dernier. Notons que le tri bulle est extrêmement lent et ne devrait jamais être utilisé! Fonctionnement du tri bulle Pour i = 1 À n-1 Pour j = n À i + 1 Si (T(j) < T(j - 1)) Alors permuter T(j) et T(j - 1) Fin Si Fin Boucle Fin Boucle Tri bulle
Exercices On retrouve ci-dessous l'étatd'un tableau suite aux trois premières passes de trois tris différents. Identifiez le tri utilisé dans chacun des cas. Premier tri Départ : 10 1 2 5 3 8 9 7 6 4 Passe 1 : 1 10 2 5 3 8 9 7 6 4 Passe 2 : 1 2 10 5 3 8 9 7 6 4 Passe 3 : 1 2 3 5 10 8 9 7 6 4 Deuxième tri Départ : 10 1 2 5 3 8 9 7 6 4 Passe 1 : 1 10 2 3 5 4 8 9 7 6 Passe 2 : 1 2 10 3 4 5 6 8 9 7 Passe 3 : 1 2 3 10 4 5 6 7 8 9 Troisième tri Départ : 10 1 2 5 3 8 9 7 6 4 Passe 1 : 1 10 2 5 3 8 9 7 6 4 Passe 2 : 1 2 10 5 3 8 9 7 6 4 Passe 3 : 1 2 5 10 3 8 9 7 6 4 Exercices 4
Solutions 1) Tri par sélection. 2) Tri bulles. 3) Tri par insertion. Solutions 4
Conclusion Nous savons maintenant comment conserverdes données d'un même type se rapportant généralement à des entités distinctes (par exemple, les notes de différents étudiants). Mais comment ferait-on pour conserver des données de types différents décrivant une seule entité (par exemple, les informations sur un étudiant)? C'est ce que nous verrons au cours des prochaines semaines. -Lire le chapitre 8 du livre. - Avancer le travail pratique numéro II. À faire cette semaine - Tableaux à deux dimensions; - Fouilles séquentielle et dichotomique; -Tris : par sélection, par insertion et bulles. Notions importantes vues cette semaine Conclusion