INF130 - Ordinateurs et programmation. Semaine 08. Document présenté par Frédérick Henri et conçu par les enseignants en informatique du SEG



Documents pareils
Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Recherche dans un tableau

Application 1- VBA : Test de comportements d'investissements

Programmation Objet - Cours II

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

1 TD 2 : Construction d'une chier Acrobat et envoi par

Architecture des Systèmes d Information Architecture des Systèmes d Information

.NET - Classe de Log

EXCEL PERFECTIONNEMENT CALCULS AVANCES

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Algorithmique et programmation : les bases (VBA) Corrigé

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Cours Informatique Master STEP

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Travaux Pratiques de Commande par ordinateur 1 TRAVAUX PRATIQUES

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Visual Basic for Applications

1. Introduction Création d'une requête...2

I. Introduction aux fonctions : les fonctions standards

Paginer les données côté serveur, mettre en cache côté client

1. Structure d'un programme FORTRAN 95

PROGRAMMATION EVENEMENTIELLE sur EXCEL

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

TD3 - Facturation avec archivage automatisé

Utilitaires méconnus de StrataFrame

Programmation Visual Basic. Visite guidée d'un programme Visual Basic 6.0

Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

Formation VBA 3 Interagir

FORMATION au VBA Pour EXCEL. Version 2007 & +

Programmation C++ (débutant)/instructions for, while et do...while

TUTORIAL REUTERS. Utilisation de l'utilitaire de recherche Reuters

Navigation dans Windows

IMPORTATION, CRÉATION, MANIPULATION, EXPORTATION DE DONNÉES STATISTIQUES

Initiation à la programmation en Python

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Plan du cours Cours théoriques. 29 septembre 2014

CRÉER UNE BASE DE DONNÉES AVEC OPEN OFFICE BASE

TD3: tableaux avancées, première classe et chaînes

Corrigé des TD 1 à 5

GUIDE Excel (version débutante) Version 2013

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Propagation sur réseau statique et dynamique

Rapport de Mini-Projet en ArcGIS Engine

Listes de validation dans OpenOffice Calc


Arbres binaires de recherche

Stockez et organisez vos données sous Excel. Une approche systématique, structurée et simplifiée

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Chapitre 2 Devine mon nombre!

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Compte-rendu de projet de Système de gestion de base de données

Excel Avancé. Plan. Outils de résolution. Interactivité dans les feuilles. Outils de simulation. La valeur cible Le solveur

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

Encryptions, compression et partitionnement des données

Formations 2015 Bureautique

EXCEL TUTORIEL 2012/2013

Livret Cours Microsoft office 2007 Tableur Excel Perfectionnement

Utiliser une base de données

Comment Définir une Plage de données Pour Utiliser Fonctions de Filtres et de Tris

Introduction à JDBC. Accès aux bases de données en Java

STAGE IREM 0- Premiers pas en Python

1. Introduction Création d'une macro autonome Exécuter la macro pas à pas Modifier une macro... 5

Plan de cours. Chiffriers et bases de données en gestion commerciale

Algorithmique et Programmation, IMA

Algorithmique I. Algorithmique I p.1/??

NOS FORMATIONS EN BUREAUTIQUE

Compilation (INF 564)

EXCEL PERFECTIONNEMENT SERVICE INFORMATIQUE. Version /11/05

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Algorithmique avec Algobox

Traitement des données avec Microsoft EXCEL 2010

Examen Médian - 1 heure 30

CPLN 20/08/2009 MBO Service ICT et Pédagogie

Utilisation d objets : String et ArrayList

Guide d'utilisation. OpenOffice Calc. AUTEUR INITIAL : VINCENT MEUNIER Publié sous licence Creative Commons

Adama MBODJI MBODJ.SYSTEM

COURS ALGORITHMIE. Mathématiques. Le monde merveilleux des algorithmes!! Croyez-moi, vous allez les adorer. Julien Bordas T.S 3

FORMATION EXCEL NIVEAU 2

Génie Logiciel avec Ada. 4 février 2013

Introduction à MATLAB R

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Trier les ventes (sales order) avec Vtiger CRM

La Clé informatique. Formation Excel XP Aide-mémoire

1. Création d'un état Création d'un état Instantané Colonnes Création d'un état Instantané Tableau... 4

SOMMAIRE. Travailler avec les requêtes... 3

Langage Java. Classe de première SI

Semestre3 (Licence Economie et Gestion) EXCEL : interface. Une fois lancé, Excel crée par défaut un "classeur" nommé «classeur1.xls».

Algorithmes de recherche

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

POUR ALLER UN PEU PLUS LOIN SUR UN TABLEUR. Version EXCEL

Compression de Données - Algorithme de Huffman Document de Conception

Organigramme / Algorigramme Dossier élève 1 SI


Le stockage local de données en HTML5

1 Recherche en table par balayage

Module 5 : Lier des classeurs

Transcription:

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