Ce TP a pour but de modéliser la structure de données sous-jacente à un tableur comme LibreOffice Calc ou Microsoft Excel.
Pour simplifier le problème nous allons supposer que:
-
Toutes les cases non-vides ont des valeurs de même type.
-
Toutes les cases non-vides contiennent une fonction, qui ne prend pas d'argument et renvoie un résultat. L'évaluation de cette fonction est la valeur de la case: si, par exemple, une case doit avoir pour valeur 2, elle contient en fait la fonction () -> 2.
-
Une case est identifiée par une chaîne de caractères comme "A1", "Z350" ou "B5000" par exemple. La lettre indique la valeur de la colonne, le nombre indique la valeur de la ligne.
-
Pour éviter les limitations sur le nombre de lignes et de colonnes, les cases sont stockées dans une table de hachage qui associe au nom de la case la fonction qu'elle contient.
Par exemple, le tableau suivant
| A | B | C | D |
1 | 5 | | | |
2 | | 3 | 4 | |
3 | 8 | | | |
sera représenté par les couples A1:() -> 5, B2:() -> 3, C2:() -> 4 et A3:() -> 8 dans la table de hachage.
Un tableau est représenté par une instance de la classe
Calc munie des méthodes suivantes
-
set qui permet d'indiquer pour une case donnée, une fonction à évaluer.
-
eval qui permet d'évaluer la valeur d'une case donnée (si celle-ci existe).
De plus, comme avec n'importe quel tableur, le calcul d'une case peut dépendre de la valeur d'une autre.
Par exemple, dans le code ci-dessous, pour calculer la valeur de la case B1, on a besoin d'évaluer la valeur de la case "A1".
var calc = new Calc>Integer<();
calc.set("A1", () -> 3);
calc.set("B1", () -> 7 + calc.eval("A1").orElseThrow());