LP
IMApp

Scripts
Clients

Leçon 05

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

  1. la somme des valeurs saisies (comme dans l'exercice 5 de la leçon 4)
  2. la moyenne des valeurs saisies (comme dans l'exercice 5 de la leçon 4)
  3. 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 :
  1. fabrique un tableau vide
  2. fabrique un tableau à 3 éléments qui sont les chaînes de caractères "Jean", "Pierre" et "Paul"
  3. fabrique un tableau à 13 éléments dont chaque élément a la valeur undefined (non défini)
  4. 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 :
  1. 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
  2. l'adresse (la référence) du tableau juste créé est affectée à la variable t1
  3. 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 : Occurences 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 : Loto 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 :
  1. on place le premier nombre premier 2 dans un tableau
  2. le prochain candidat est le nombre 3
  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 : Premiers 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.