Chapitre 5 : Tableaux⚓︎
Partie A - Notion de tableau⚓︎
Définition d'un tableau en extension⚓︎
Un tableau permet de stocker en mémoire plusieurs valeurs dans une seule variable.
Une façon de définir un tableau est d'indiquer entre crochets les différentes valeurs, séparées par des virgules. On parle alors de définition en extension.
Par exemple, le tableau jours
défini ci-dessous contient sept chaînes de caractères :
1 |
|
Accès aux valeurs grâce à leur indice⚓︎
Chaque valeur contenue dans un tableau est indexée par un entier supérieur ou égal à 0
. Dans la mémoire de la machine, les valeurs sont stockées consécutivement. Pour accéder à la valeur d'indice n
d'un tableau tab
, on utilise la notation tab[n]
.
Modification des valeurs grâce à leur indice⚓︎
Pour modifier la valeur d'indice n
contenue dans le tableau tab
, il suffit d'utiliser une affectation du type tab[n] = nouvelle_valeur
.
Mais si on tente d'accéder ou de modifier, dans un tableau, une valeur située à un indice qui n'existe pas, alors une erreur se produit.
Par exemple, pour le tableau jours
défini précédemment, les sept valeurs ont des indices compris entre 0
et 6
. Si on essaie d'accéder à la valeur d'indice 7
, une erreur se produit.
1 |
|
Exercice 5-01 : Tableaux définis en extension
Carnet Jupyter à télécharger ici
Carnet Jupyter accessible sur CAPYTALE
Corrigé disponible ici
Définition d'un tableau en compréhension⚓︎
Si on souhaite stocker dans un tableau les carrés des entiers compris entre 0 et 10, on peut définir le tableau en extension :
1 |
|
On constate qu'une telle définition n'est pas pratique, voire impossible à mettre en œuvre si le nombre de valeurs dans le tableau est grand.
On utilise alors une autre façon de définir le tableau : la définition en compréhension, qui est basée sur la notion de boucle.
1 |
|
Il faut comprendre qu'on affecte à la variable tab
un tableau contenant les valeurs de k*k
(soit k
au carré) pour tous les entiers k
compris entre 0
et 10
(c'est-à-dire les valeurs entières auxquelles correspondent range(11)
).
Il est également possible d'ajouter une condition à la définition en compréhension.
Par exemple, pour obtenir le carré des nombres pairs compris entre 0 et 10, on écrit :
1 |
|
Pour définir, par exemple, un tableau qui contient 100 fois la valeur 0, on peut écrire :
1 |
|
ou alors, de façon encore plus simple, utiliser l'opérateur *
:
1 |
|
Enfin, l'opérateur +
permet de concaténer (c'est-à-dire mettre bout à bout) plusieurs tableaux. Par exemple, le tableau :
1 |
|
est le tableau défini en compréhension qui correspond au tableau défini en extension :
1 |
|
Exercice 5-02 : Tableaux définis en compréhension
Carnet Jupyter à télécharger ici
Carnet Jupyter accessible sur CAPYTALE
Corrigé disponible ici
Remarquons enfin qu'en théorie la taille d'un tableau est fixée et ne peut pas être modifiée. En Python, les tableaux sont en réalité des tableaux dynamiques pour lesquels il est possible d'ajouter ou de retirer des éléments. Nous verrons en Terminale que ce comportement est celui des listes et non des tableaux.
- Pour ajouter un élément à la fin de
tab
, on utilise l'instructiontab.append(element)
. - Pour ajouter un élément à l'indice
n
danstab
, on utilise l'instructiontab.insert(n, element)
. - Pour supprimer l'élément d'indice
n
danstab
, on utilise l'instructiondel tab[n]
.
Partie B - Tri d'un tableau : algorithmes de tri par sélection et de tri par insertion⚓︎
Objectif⚓︎
Le but de cette partie est d'étudier deux algorithmes permettant de trier les élements d'un tableau du plus petit au plus grand. Les éléments peuvent être des nombres mais aussi, par exemple, des chaînes de caractères (ou tout autre objet dont le type possède un ordre total, c'est-à-dire un ordre pour lequel tout élément peut être comparé à tout autre élément).
Tri par sélection⚓︎
Le principe du tri par sélection est le suivant :
- On parcourt le tableau de la gauche vers la droite, en définissant une partie gauche déjà triée et une partie droite pas encore triée.
- On détermine quel est le plus petit élément de la partie de droite, et on l'échange avec le premier élément de la partie de droite.
De cette façon, la partie de gauche du tableau est triée en permanence, et les éléments y sont placés à leur position définitive.
En vert, la partie gauche du tableau est triée. En rouge, la partie droite a tous ses éléments plus grands que les éléments de la partie gauche.
Algorithme de tri par sélection
Début
n
← longueur du tableau tab
Pour k
allant de 0 à (n
-2) faire
i
← indice du plus petit élement de tab
dont l'indice est compris entre k
et (n
-1)
Echanger le k
ème élement et le i
ème élement du tableau tab
Fin Pour
Fin
Activité 5-03 : Tri par sélection
Objectif : Comprendre et implémenter l'algorithme de tri par sélection.
Carnet Jupyter à télécharger ici
Carnet Jupyter accessible sur CAPYTALE
Corrigé disponible ici
Tri par insertion⚓︎
Le principe du tri par insertion est le suivant :
- On parcourt le tableau de la gauche vers la droite, en définissant une partie gauche déjà triée et une partie droite pas encore triée.
- On déplace le premier élément de la partie de droite au bon endroit dans la partie de gauche.
De cette façon, la partie de gauche du tableau est triée en permanence mais les éléments n'y sont pas placés à leur position définitive.
En vert, la partie gauche du tableau est triée. En rouge, le premier élément de la partie droite doit être inséré au bon endroit dans la partie gauche.
Algorithme de tri par insertion
Début
n
← longueur du tableau tab
Pour k
allant de 1
à (n
-1) faire
valeur
← tab[k]
pos
← k
Tant que pos
> 0 et tab[pos - 1]
> valeur
faire
tab[pos]
← tab[pos - 1]
pos
← pos - 1
Fin Tant que
tab[pos]
← valeur
Fin Pour
Fin
Activité 5-04 : Tri par insertion
Objectif : Comprendre et implémenter l'algorithme de tri par insertion, puis comparer son efficacité avec celle de l'algorithme de tri par sélection.
Carnet Jupyter à télécharger ici
Carnet Jupyter accessible sur CAPYTALE
Corrigé disponible ici
Partie C - Tableaux à plusieurs dimensions⚓︎
Nous avons vu jusqu'à présent des tableaux contenant des valeurs de type entier ou de type chaîne de caractères, mais les valeurs peuvent en réalité être de n'importe quel type.
En particulier, un tableau peut contenir des tableaux. On parle alors de tableau à deux dimensions.
Par exemple, le tableau union_europeenne
défini ci-dessous est un tableau à deux dimensions contenant 27 tableaux qui correspondent à chaque état-membre de l'UE. On stocke en mémoire l'équivalent d'un tableau composé de 27 lignes et 2 colonnes.
1 2 3 4 5 6 7 8 9 10 11 |
|
L'élément du tableau union_européenne
d'indice 2
est un tableau contenant des chaînes de caractères.
Il correspond à la troisième ligne de union_europeenne
.
Dans un tableau à deux dimensions, on utilise une double indexation pour accéder aux éléments du tableau. Le premier indice correspond au numéro de ligne (ici l'indice du pays dans le tableau union_europeenne
) et le second au numéro de colonne (ici 0
pour le nom du pays et 1
pour sa capitale).
Par exemple, l'instruction :
1 |
|
affiche à l'écran la chaîne "Paris est la capitale de France."
Exercice 5-05 : Tableau à deux dimensions
Carnet Jupyter à télécharger ici
Carnet Jupyter accessible sur CAPYTALE
Corrigé disponible ici
Partie D - Exercices et activités⚓︎
Exercices 5-06 et 5-07
Activités 5-08 et 5-09
Ce qu'il faut savoir et savoir faire⚓︎
- Définir un tableau en extension.
- Utiliser la fonction
len
pour déterminer le nombre d'éléments d'un tableau. - Accéder à, ou modifier, une valeur contenue dans un tableau, à partir de son indice.
- Éviter les erreurs en se souvenant que les indices des éléments d'un
tableau
sont compris entre0
etlen(tableau)-1
. - Définir un tableau en compréhension.
- Utiliser les opérateurs
*
et+
sur des tableaux. - Connaître l'algorithme de tri par sélection.
- Connaître l'algorithme de tri par insertion.
- Savoir que l'algorithme de tri par sélection a une complexité quadratique dans tous les cas.
- Savoir que l'algorithme de tri par insertion a une complexité quadratique dans le pire des cas, et une complexité linéaire dans le meilleur des cas.
- Mesurer le temps d'exécution d'une partie de programme grâce à la fonction
time
du moduletime
. - Définir un tableau à deux dimensions.
- Utiliser la double indexation des éléments d'un tableau à deux dimensions pour accéder aux élements d'un tel tableau.