Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

Un tableau est une collection ordonnée d'objets. L'accès aux éléments individuels d'un tableau se fait grâce à leur index.

Dans beaucoup de langages – et en l'occurrence dans tous les langages présentés ici – l'index du premier élément d'un tableau est 0, pas 1.


Dans le principe général, le tableau suivant:

définir jour ← { "lundi", "mardi", "mercredi",
                 "jeudi", "vendredi", "samedi",
                 "dimanche" }

Pourrait se représenter ainsi en mémoire:

Exemple

Dans la grèce antique, la Sibylle est une prêtresse d'Apollon qui personnalise la divination et prophétise.

Pour illustrer la notion de tableau nos allons réaliser un programme capable d'afficher une prédiction parmi un ensemble possible. L'ensemble des prédictions sera contenu dans un tableau. Et la prédiction choisie dépendra de l'instant à laquelle elle est faite.

Remarque:

Les citations utilisées ici sont très, très, TRES librement inspirées des Oracles Sibyllins...

En outre – et vous vous en doutez – les capacités divinatoires de ce programme sont plus que douteuses!

Pseudo-code

Nous allons commencer par le programme principal, celui-ci étant comme souvent très simple:

le programme principal fait:
    définir demophile ← créer une nouvelle Sibylle
    demander à demophile de faire une prophétie

Vous le voyez, nous allons avoir besoin de définir la classe Sibylle. C'est à dire de déclarer tout ce que sait faire une Sibylle. En l'occurrence, nous voyons aussi à partir du programme principal que chacune de nos Sibylles doit savoir faire une prophétie.

chaque Sibylle
    sait que faire une prophétie c'est:
        définir prophéties ← {
            "Le figuier porte de nombreuses fleurs",
            "Un brouillard épais cache un monde sans limite",
            "Le feu consume aussi ceux qui l'allument"
        }
        définir maintenant ← obtenir l'heure actuelle en secondes
        définir index ← maintenant modulo taille du tableau(prophéties)
        afficher prophéties[index]

Plusieurs points peuvent être notés à propos du code ci-dessus:

        définir prophéties ← {
            "Le figuier porte de nombreuses fleurs",
            "Un brouillard épais cache un monde sans limite",
            "Le feu consume aussi ceux qui l'allument"
        }

Il s'agit de la définition du tableau des prophéties. Pour cette explication il n'y en a que 3, mais vous verrez dans les codes sources ci-dessous qu'on peut bien entendu en mettre plus (selon les langages, la limite varie – mais se situe généralement au delà de plusieurs dizaines de milliers d'éléments!).

Date Modulo 3
00:00:00 0
00:00:01 1
00:00:02 2
00:00:03 0
00:00:04 1
00:00:05 2
00:00:06 0
00:00:07 1
... ...
        définir maintenant ← obtenir l'heure actuelle en secondes
        définir index ← maintenant modulo taille du tableau(prophéties)

Cette partie est la partie "divination" du code. En fait, elle récupère l'heure courante et calcule le reste de la division entière (modulo) de cette heure par le nombre d'éléments du tableau.

Pourquoi? Pour obtenir un résultat entre 0 et la taille du tableau(prophéties)-1 – et qui peut donc servir d'index pour extraire un élément du tableau. Par ailleurs, le modulo nous garantit un résultat cyclique, qui change d'une seconde à l'autre.

        afficher prophéties[index]

Pour cette dernière ligne, rien de spécial à noter, sinon la notation entre crochets [] qui permet d'accéder à un élément du tableau à partir de son index.

PHP

Voici la version PHP de notre programme Prediction.php:

<?php
 
class Sibylle {
    public function faireUnePrediction() {
        $predictions = array(
            "Le figuier porte de nombreuses fleurs",
            "Un brouillard épais cache un monde sans limite",
            "Le feu consume aussi ceux qui l'allument",
            "Les nobles desseins ne se préoccupent pas de la course du soleil",
            "De grandes merveilles résident sous la mer",
            "Le serpent inspire la guerre",
            "Les rois dévorent leurs parents",
            "La faim vient de la pauvreté",
            "Les fausses promesses enchaînent les hommes",
            "Parfois le chemin est difficile",
            "On va plus vite en courant qu'en marchant",
            "Il y a plus d'un poisson dans la mer"
        );
 
        $maintenant = time();
        $index  = $maintenant % count($predictions);
 
        print($predictions[$index] . "\n");
    }
}
 
header("Content-type: text/plain");
$demophile = new Sibylle();
$demophile->faireUnePrediction();

En PHP, la fonction time permet de connaître le nombre de secondes écoulées depuis le 1er janvier 1970 00:00:00 GMT. Et quand à la fonction count, elle permet de connaître la taille d'un tableau.

Au final, cette version est très proche de l'équivalent en pseudo-code et ne devrait pas être difficile à comprendre.

JavaScript

Vous le savez, pour charger un script JavaScript votre navigateur a besoin d'un document HTML. Commençons donc par le fichier Predictions.html:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
             xml:lang="fr"
             lang="fr"
             dir="ltr">
<head>
        <title>Prédictions</title>
</head>
<body>
        <script type= "text/javascript" src="Predictions.js">
        </script>
</body>
</html>

Et maintenant Predictions.js.

Sibylle = function () {
    var that = {};
 
    that.faireUnePrediction = function () {
        var predictions = [
            "Le figuier porte de nombreuses fleurs",
            "Un brouillard épais cache un monde sans limite",
            "Le feu consume aussi ceux qui l'allument",
            "Les nobles desseins ne se préoccupent pas de la course du soleil",
            "De grandes merveilles résident sous la mer",
            "Le serpent inspire la guerre",
            "Les rois dévorent leurs parents",
            "La faim vient de la pauvreté",
            "Les fausses promesses enchaînent les hommes",
            "Parfois le chemin est difficile",
            "On va plus vite en courant qu'en marchant",
            "Il y a plus d'un poisson dans la mer"
        ];
 
        var maintenant = new Date(); // récupère la date et l'heure actuelle
        var index = Math.floor(maintenant.getTime()/1000) % predictions.length;
 
 
        document.write(predictions[index]);
    };
 
    return that;
};
 
demophile = Sibylle();
demophile.faireUnePrediction();

Mis à part la syntaxe quelque peu différente, la seule différence entre ce programme et la version PHP équivalente est la manière dont on récupère le "nombre de secondes". En PHP, nous utilisions la fonction time qui renvoie le nombre de secondes écoulées depuis une date donnée.

Ici, nous utilisons la méthode getTime qui renvoie le nombre de millisecondes depuis cette même date. D'où la nécessité de diviser cette valeur par 1000 pour avoir un comportement identique à celui du programme PHP.

C++

#include <iostream>
#include <time.h>
 
class Sibylle {
    public:
    void faireUnePrediction() {
        std::string predictions[] = {
            "Le figuier porte de nombreuses fleurs",
            "Un brouillard épais cache un monde sans limite",
            "Le feu consume aussi ceux qui l'allument",
            "Les nobles desseins ne se préoccupent pas de la course du soleil",
            "De grandes merveilles résident sous la mer",
            "Le serpent inspire la guerre",
            "Les rois dévorent leurs parents",
            "La faim vient de la pauvreté",
            "Les fausses promesses enchaînent les hommes",
            "Parfois le chemin est difficile",
            "On va plus vite en courant qu'en marchant",
            "Il y a plus d'un poisson dans la mer"
        };
 
        time_t  maintenant  = time(NULL);
        int     index       = maintenant % (sizeof(predictions)/sizeof(std::string));
 
        std::cout << predictions[index] << std::endl;
    }
};
 
int main()
{
    Sibylle demophile;
    demophile.faireUnePrediction();
 
    return 0;
}

Grosse différence par rapport aux deux programmes précédents: ici les déclarations des variables predictions, maintenant et index font apparaître leur type.

C++ fait partie de la famille des langages à typage statique. Cela veut dire que dans le code source, il est impératif d'indiquer quelle est la nature des données stockées dans chaque variable. Ainsi:

Remarquez aussi la manière donc C++ détermine la taille d'un tableau: celle-ci est calculée en divisant l'espace mémoire occupé par le tableau par la taille d'un de ces éléments.

A titre indicatif sur mon ordinateur, un élément occupe 4 octets, et le tableau 48. On a bien 48/4 soit 12 éléments dans le tableau.

Vous pouvez vérifier pour votre propre système en ajoutant les instructions suivantes à la méthode faireUnePrediction:

/* ... */
        std::cout << sizeof(predictions) << std::endl;
        std::cout << sizeof(std::string) << std::endl;
/* ... */

Java

import java.util.*;
 
class Sibylle {
    public void faireUnePrediction() {
        String[]    predictions = {
            "Le figuier porte de nombreuses fleurs",
            "Un brouillard épais cache un monde sans limite",
            "Le feu consume aussi ceux qui l'allument",
            "Les nobles desseins ne se préoccupent pas de la course du soleil",
            "De grandes merveilles résident sous la mer",
            "Le serpent inspire la guerre",
            "Les rois dévorent leurs parents",
            "La faim vient de la pauvreté",
            "Les fausses promesses enchaînent les hommes",
            "Parfois le chemin est difficile",
            "On va plus vite en courant qu'en marchant",
            "Il y a plus d'un poisson dans la mer"
        };
 
        Calendar now    = Calendar.getInstance();
        int     index   = now.get(Calendar.SECOND)%predictions.length;
 
        System.out.println(predictions[index]);
    }
}
 
public class Predictions {
    static public void main(String[] args) {
        Sibylle demophile = new Sibylle();
 
        demophile.faireUnePrediction();
    }
}

Comme C++, Java est statiquement typé. Mis à part cela et une manière encore différente de déterminer l'heure courante (utilisant la classe Calendar) et de connaître la taille du tableau, la structure reste très proche de pseudo-code (ou de l'implémentation en PHP ou C++, d'ailleurs).

Groovy

class Sibylle {
    public void faireUnePrediction() {
        def    predictions = [
            "Le figuier porte de nombreuses fleurs",
            "Un brouillard épais cache un monde sans limite",
            "Le feu consume aussi ceux qui l'allument",
            "Les nobles desseins ne se préoccupent pas de la course du soleil",
            "De grandes merveilles résident sous la mer",
            "Le serpent inspire la guerre",
            "Les rois dévorent leurs parents",
            "La faim vient de la pauvreté",
            "Les fausses promesses enchaînent les hommes",
            "Parfois le chemin est difficile",
            "On va plus vite en courant qu'en marchant",
            "Il y a plus d'un poisson dans la mer"
        ];
 
        def now     = Calendar.getInstance();
        def index   = now.get(Calendar.SECOND)%predictions.size();
 
        println predictions[index];
    }
}
 
def demophile = new Sibylle();
demophile.faireUnePrediction();

Comme à l'habitude, le code Groovy est similaire, quoi que plus compact, à son homologue Java. Point à noter concernant Groovy: c'est un langage dynamique. Autrement dit, il n'est pas nécessaire de typer les variables (en fait, en Groovy, le typage est possible, mais optionnel – c'est surtout une question de goût personnel).

Pour les programmeurs habitués à Java, deux petits pièges à éviter tout de même:

  1. Dans la déclaration, les éléments du tableau sont délimités par des crochets ([]) et non des accolades ({});
  2. On obtient la taille du tableau par la méthode size et non pas par la propriété length.

Si vous connaissez Java...

Si vous connaissez Java, sachez que les tableaux en Groovy ne sont pas des tableaux Java, mais des instances de la classe ArrayList. Vous comprenez donc pourquoi il faut utiliser size pour obtenir la taille du tableau...

A vous de jouer

On souhaite écrire un programme qui affiche le menu du jour de la cantine.

Le cuisinier – programmeur Java à ses heures – vous fournit le menu suivant pour la semaine:

String[]    menu = {
            "Lundi: des patates",
            "Mardi: petit salé aux lentilles",
            "Mercredi c'est raviolis",
            "Jeudi: steak hâché - frites",
            "Vendredi: poisson pané",
            "Samedi: Spaghettis sauce tomate",
            "Dimanche: Quiche Lorraine"
        };
  1. Ecrivez la classe Chef qui correspond au programme principal ci-dessous:
    public class Menu {
        static public void main(String[] args) {
            Chef    chef = new Chef();
            chef.afficherMenuDuJour();
        }
    }
  2. Assurez-vous que votre programme fonctionne bien tous les jours de la semaine (vous pouvez tester en changeant la date de votre ordinateur).

    Obtenir le jour de la semaine?

    Vous vous souvenez du code permettant de connaître le nombre de secondes correspondant à une date:

    now.get(Calendar.SECOND)

    Et bien, on peut utiliser une expression très similaire pour connaître le jour de la semaine:

    now.get(Calendar.DAY_OF_WEEK)

    Mais attention: ne partez pas forcément du principe que le premier jour de la semaine est lundi. Ni que l'index du premier jour de la semaine est 0...

  3. Ecrivez un programme similaire pour un des autres langages que vous connaissez.