Leçon 05 : Les tableaux
Contenu :
Cette leçon présente les tableaux. Les tableaux sont des structures de données élémentaires qui permettent de stocker plusieurs valeurs dans une même variable.
Objectifs :
Comprendre le concept de tableau. Etre capable d'utiliser des tableaux pour résoudre des problèmes simples. Savoir utiliser conjointement des tableaux et la structure itérative for.
Un exemple
Reprenons l'enoncé de l'exercice 5 de la leçon 4, avec la modification suivante : une fois toutes les valeurs saisies, on désire afficher
-
la somme des valeurs saisies (comme dans l'exercice 5 de la leçon 4)
-
la moyenne des valeurs saisies (comme dans l'exercice 5 de la leçon 4)
-
les valeurs saisies supérieures à la moyenne
Pour réaliser le point 3, on est obligé de stocker toutes les valeurs saisies dans une structure de données, pour pouvoir les
comparer à la moyenne, après que celle-ci ait été calculée à la fin de la saisie des valeurs ! La structure de données en question
s'appelle un tableau. Un tableau est une suite de valeurs repérées par un indice (un entier). Dans une première partie, nous
allons créer un tableau vide que l'on va stocker dans la variable valeur et nous allons le remplir avec les nombres
saisis par l'utilisateur :
var stop = "stop";
var reponse = "start";
var valeurs = [];
do {
if ( ! isNaN( reponse ) )
valeurs.push( Number( reponse ) );
reponse = prompt( "Entrez un nombre ou 'stop' pour sortir :","" ).trim().toLowerCase();
} while ( reponse != stop );
var resultat = "Vous avez entré " + valeurs.length + " nombres\n";
L'instruction var valeurs = []; déclare la variable valeurs et lui affecte comme valeur (initiale) un tableau
vide. Ensuite, durant la lecture des valeurs saisies par l'utilisateur, on utilise la fonction push pour
ajouter ces valeurs à la fin du tableau. Une fois la saisie terminée, on peut connaître le nombre de valeurs contenues dans le
tableau à l'aide de l'attribut length avec l'expression valeurs.length.
Un attribut n'est pas une fonction, c'est une caractéristique de l'objet duquel on l'extrait. C'est pour cette raison
qu'on ne fait pas suivre l'attribut de parenthèses comme on le fait pour les fonctions ! Aiinsi, dans l'exemple précédent, on écrit
valeurs.length et non pas valeurs.length() !
Une fois les valeurs saisies stockées dans le tableau, on peut les traîter, et par exemple calculer leur somme et leur moyenne :
var somme = 0;
for ( var i = 0; i < valeurs.length; i++ )
somme += valeurs[ i ];
var moyenne = somme / valeurs.length;
resultat += "La somme de ces nombres est " + somme + "\n";
resultat += "La moyenne de ces nombre est " + moyenne.toFixed( 2 ) + "\n";
Analysez bien la boucle for ci-dessus, elle est très caractéristique et montre comment
parcourir un tableau (c'est à dire accéder consécutivement à chacune des valeurs contenues dans le tableau). La variable
d'itération i joue le rôle d'indice pour le tableau et l'exemple nous montre que ces indices démarrent à la valeur
0 (et non pas 1). Donc, les indices des valeurs dans un tableau de taille 10 vont de 0 à 9 ! Remarquez que la variable
d'itération i est locale à la boucle for et on peut donc utiliser une nouvelle variable
de même nom dans la boucle suivante qui va repérer les valeurs du tableau supérieures à la moyenne :
resultat += "Les valeurs au dessus de la moyenne sont :\n";
for ( var i = 0; i < valeurs.length; i++ )
if ( valeurs[ i ] > moyenne )
resultat += valeurs[ i ] + " ";
alert( resultat );
Remarquez que cette nouvelle boucle est en tout point identique à la précédente, seul le corps de la boucle (le traitement)
change.
Construction de tableau
Nous avons vu dans l'exemple précédent comment construire un tableau vide. Il y a plusieurs autres façon de construire un
tableau :
var t1 = [];
var t2 = [ "Jean", "Pierre", "Paul" ];
var t3 = new Array( 13 );
var t4 = new Array( 10, 12, 23, 37, 39 );
Dans les déclarations précédentes :
- fabrique un tableau vide
-
fabrique un tableau à 3 éléments qui sont les chaînes de caractères
"Jean", "Pierre" et
"Paul"
-
fabrique un tableau à 13 éléments dont chaque élément a la valeur
undefined (non défini)
-
fabrique un tableau à 5 éléments qui sont les nombres
10, 12, 23, 37 et
39
Les valeurs d'un même tableau peuvent être de types différents. Par exemple, le tableau suivant est légal :
var t = [ "Alfred", 123, true, 37.2 ];
Un tableau peut contenir d'autres (sous-)tableaux :
var t = [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ];
Il est très important de distinguer un tableau de la variable qui le référence. Dans le code suivant :
var t1 = [ "rouge", "vert", "bleu" ];
var t2 = t1;
t2.push( "jaune" );
t2[ 1 ] = "orange";
t1.shift();
les trois instructions qui suivent les déclarations/initialisations des variables t1 et t2 agissent sur
le même tableau. L'instruction à la ligne 4 va ajouter la chaîne de caractères "jaune" à la fin du
tableau. L'instruction à la ligne 5 va remplacer la valeur à l'indice 1 (la chaîne "vert") par la chaîne
"orange". L'instruction à la ligne 6 va supprimer la première valeur du tableau. On décompose maintenant les instructions
des lignes 1 et 2 :
-
l'expression
[ "rouge", "vert", "bleu" ] à droite de l'affectation fabrique un tableau de
longueur 3 contenant les chaînes de caractères "rouge", "vert" et "bleu". Ce tableau
(une suite de 3 cases contenant des chaînes de caractères) est une portion de mémoire se trouvant quelquepart dans la mémoire
de l'ordinateur. L'expression [ "rouge", "vert", "bleu" ] retourne ensuite l'adresse
(une référence) de cette portion de mémoire
-
l'adresse (la référence) du tableau juste créé est affectée à la variable
t1
-
le contenu de la variable
t1 est copié dans la variable t2
Donc, les deux variables t1 et t2 contiennent toutes les deux la même adresse (référence) menant à un unique
tableau (portion de mémoire). Un tableau peut exister sans variable pour le référencer. Si on exécute le code suivant :
alert( ([ "rouge", "vert", "bleu" ])[0] );
on remarque qu'il affiche bien une fenêtre avec la chaîne de caractères "rouge" à l'intérieur : dans ce cas, l'adresse
(la référence) du tableau fraîchement créé est directement utilisée pour accéder à une valeur du tableau via un indice.
Exercice 1
Reprenez l'exercice 6 de la leçon 3, cette fois en utilisant judicieusement deux tableaux, un pour stocker le nom des
jours de la semaine, l'autre pour stocker le nom des mois de l'année. Remarquez au passage la cohérence entre les nombres retournés
par les méthodes des objets Date et les indices des tableaux.
Accès aux valeurs
On peut accéder au contenu d'un tableau en lecture ou en écriture via un indice. Si t est un tableau, l'expression
t[ i ] est strictement équivalente à une variable et peut être utilisée partout où on utilise une variable,
en particulier à gauche d'une affectation. Par exemple, le code suivant :
var t = new Array(10);
for ( var i = 0; i < t.length; i++ )
t[ i ] = i + 1;
remplit le tableau t avec les entiers de 1 à 10 ( t[0] = 1, t[1] = 2,...,
t[9] = 10 ). L'indice i entre les crochets peut être remplacé par n'importe quelle expression dont la
valeur est un indice valide du tableau. Par exemple, le code suivant :
var t = new Array(10);
for ( var i = 0; i < t.length / 2; i++ ) {
t[ 2 * i ] = "pair";
t[ 2 * i + 1 ] = "impair";
}
remplit le tableau t avec les chaînes de caractères "pair" (aux indices 0, 2, 4, etc.) et
"impair" (aux indices 1, 3, 5, etc.). Si un tableau contient des (sous-)tableaux, l'accès aux valeurs des sous-tableaux
s'effectue en combinant succéssivement plusieurs paires de crochets. Par exemple, le code suivant :
var t = [ [ "A", "B", "C" ], [ "x", "y", "z" ], [ "?", "!", "%" ] ];
alert( t[ 0 ][ 1 ] + t[ 1 ][ 2 ] + t[ 2 ][ 0 ] )
affiche une fenêtre avec la chaîne de caractères "Bz?".
La méthode join
Il existe de nombreuses fonctions qui peuvent agir sur un tableau. Ces fonctions sont appelées parfois des méthodes
et dans ce cas, la syntaxe d'application de la fonction sur le tableau diffère de la syntaxe habituelle. Par exemple, on écrit
t.shift() et non pas shift( t ) parce que shift est une méthode. On a vu
précédemment les méthodes push et shift. La méthode
join permet de convertir un tableau en chaîne de caractères. Par exemple, le code suivant :
var t = [ "rouge", "vert", "bleu" ];
var s = t.join( " & " );
alert( s );
affiche une fenêtre avec la chaîne "rouge & vert & bleu". Le paramètre de la méthode
join (la valeur entre parenthèses) est une chaîne de caractères qui va être utilisée comme un séparateur
entre les différentes valeurs du tableau. Cette chaîne peut être vide (pas de séparateur).
La méthode split
La méthode split est en quelque sorte l'inverse de la méthode join : elle
s'applique à une chaîne de caractères et permet de la tronçonner en morceaux et de placer ces morceaux dans un tableau. Par exemple, le
code suivant :
var s = "rouge;vert;bleu";
var t = s.split( ";" );
alert( t[ 1 ] );
affiche une fenêtre avec la chaîne "vert". Le paramètre de la méthode split (la valeur entre
parenthèses) est une chaîne de caractères qui va être utilisée comme le séparateur suivant lequel la chaîne va être tronçonnée.
Exercice 2
Ecrivez un code qui demande à l'utilisateur de saisir une chaîne de caractères ne contenant que des chiffres et qui
affiche dans une fenêtre le nombre d'occurences de chaque chiffre apparaissant au moins une fois dans la chaîne. Par exemple, si
l'utilisateur saisit la chaîne "112522312411443", le programme affiche la fenêtre suivante :
On peut supposer que la chaîne de caractères saisie par l'utilisateur est valide (c'est à dire ne contient que des chiffres).
La méthode sort
La méthode sort permet de trier le contenu d'un tableau. Cette méthode modifie le
contenu du tableau en déplaçant les valeurs de façon à les faire apparaître triées. Le tri par défaut est alphabétique et
il est possible de changer ce mode (on verra comment dans la leçon suivante). Par exemple, le code suivant :
var t = [ "orange", "ananas", "pomme", "banane" ];
t.sort();
alert(t);
affiche une fenêtre avec la chaîne "ananas,banane,orange,pomme".
Exercice 3
Ecrivez un programme qui permet d'établir une liste de participants à un évènement de la façon suivante : lorsq'un participant se
présente à l'entrée, on lui demande son nom et on le saisit dans le programme. Lorsqu'il n'y a plus de nouveaux participants et que
l'évènement commence, on peut afficher la liste triée alphabétiquement de tous les participants. Cependant, certains participants
distraits peuvent éventuellement sortir avant le début de l'évènement et se représenter plusieurs fois à l'entrée. Dans ce cas, le
programme signale lors de la saisie que ce participant est déjà enregistré, et son nom ne doit donc apparaître qu'une seule fois dans
la liste finale des participants.
Exercice 4
Ecrivez un programme qui affiche dans une fenêtre des numéros pour le prochain
Loto. Le programme doit afficher 5 numéros
distincts compris entre 1 et 49, plus un numéro Chance compris entre 1 et 10. Les 5 numéros peuvent apparaitre dans
un ordre quelconque (et non pas triés croissant). Voilà un exemple d'affichage de votre programme :
Une fois que votre programme fonctionne, essayez de trier le
tableau des 5 nombres afin de les faire apparaitre par ordre croissant, et vérifiez que ça ne marche pas ! Essayez
d'expliquer pourquoi : la solution à ce problème sera étudiée dans la leçon suivante.
Fichier(s)
exo4-schema-boucle.pdf
Exercice 5
Ecrivez un programme qui demande à l'utilisateur d'entrer un nombre N et qui affiche dans une fenêtre les N
premiers nombres premiers, en utillisant une variante du
crible d'Erathostène. Cet algorithme
fonctionne de la manière suivante :
-
on place le premier nombre premier 2 dans un tableau
-
le prochain candidat est le nombre 3
-
si le candidat n'est divisible par aucun des nombres contenus dans le tableau, alors ce nombre est premier et on l'ajoute à
la suite des autres
-
-
si on a le nombre voulu de nombres premiers dans le tableau, c'est fini !
-
sinon, on passe au candidat suivant (le prochain nombre impair) et on retourne au point 3
Pour réaliser le point 3, il faut parcourir le tableau à la recherche d'un diviseur pour le candidat ! A la fin, le programme
affiche les N nombres premiers dans une fenêtre à raison de 10 nombres par ligne. Voilà le résultat du programme pour
N égal à 37 :
Enfin, pour simplifier la gestion du tableau, vous pouvez le déclarer et l'initialiser avec la seule valeur 2, et ensuite ajouter les
nombres premiers suivants à l'aide de la méthode push.