diff --git a/rapport_finale.md b/rapport_finale.md index 1a2d9b0..2a31e3c 100644 --- a/rapport_finale.md +++ b/rapport_finale.md @@ -1,15 +1,16 @@ -# RAPPORT FINALE +# RAPPORT FINAL > ANDJEMBE Maksoudath, TANIEL Rémi Le but du projet est de réaliser un tableur "basique" mais facilement -extensible, l'application sera divisée en 2 parties : -* le kernel +extensible, l'application sera donc divisée en 2 parties : +* le coeur (ou kernel) * la partie graphique -Le kernel s'occupera de toutes les opérations de notre grid, les cases -ne pourront contenir que des réels ou des formules(opération binaire ou -des fonctions acceptant des plages de cases). +Le coeur de l'application s'occupera de toutes les opérations de notre grilles, +pour simplifier le problème les cases ne pourront contenir que des réels ou des +formules(opération binaire ou des fonctions acceptant des plages de cases +comme une moyenne ou une somme). ## 1. ANALYSE ET CONCEPTION @@ -21,7 +22,6 @@ abstraites sont en italique : ![UML](rapport_image/uml.png) - ### PSEUDO-JAVA CREATION GRILLE,CASES Voici un exemple de création d'une grid et de l'ajout / modification / @@ -65,7 +65,7 @@ class Application { ### CHOIX STRUCTURE DE DONNÉES Nous devons choisir une structure de donnée pour stocker les cases dans -notre grid, nous savons déjà que nous allons utiliser ne collection +notre grille, nous savons déjà que nous allons utiliser une collection pour les stocker,voici celles que nous connaissons: - des tableaux - des listes @@ -77,23 +77,22 @@ pour stocker les cases de notre grid : * Pour rechercher une case et, effectuer des opérations dessus ce sera plus facile, la clé de la Map sera une chaine de caractère (String) qui représente la coordonnée de cette case (c'est-à-dire la concaténation -du nom de ligne et de l'indice de la colonne, exemple "A1", "B9", etc...) +du nom de la ligne et de l'indice de la colonne, exemple : "A1", "B9", etc...) -Une case peut etre utilisée dans plusieurs autres cases, on ne sait +Une case peut etre utilisée dans plusieurs autres cases, on ne connait pas le nombre d'autres cases où elle sera utilisée, on stockera donc -cette donée dans une `ArrayList` de `Case`. +cette donnée dans une `ArrayList`. -Certaines fonctions (`Moyenne`, `Somme`) utilise également une plage de case, pour stocker ces cases, -nous allons également une `ArrayList` de `Case`. +Certaines fonctions (`Average`, `Sum`) utilise également une plage de case, +pour stocker ces cases, nous allons également une `ArrayList`. ### METHODES ESSENTIELLES EN PSEUDO-JAVA -#### 1. Methode getValeur +#### 1. Methode getValue Cette méthode retourne la valeur d'une case se trouvant dans une grille grâce aux coordonnées de la case. -Elle utilise la méthode getCell qui permet d'accet à une case qui existe et dans le contraire lève une exeption. +Elle utilise la méthode getCell qui permet d'accéder à une case qui existe et qui dans le cas contraire lève une exeption. ```java - class Grid { Map cells = new HashMap<>(); @@ -102,7 +101,6 @@ class Grid { } } - class Cell { String column; int line; @@ -112,17 +110,14 @@ class Cell { return value; } } - ``` +#### 2. Methode getFormulaAsString -#### 2. Methode getFormuleAsString (acceder au contenu) - -Cette méthode permet de retourner le contenu d'une case. Si elle contient une formule, on retourne la formule simple et dans le cas contraire son nom -pou dire qu'elle ne contient pas de formule mais une valeur. +Cette méthode permet de retourner le contenu d'une case. Si elle contient une formule, +on retourne la formule simple et dans le cas contraire ses coordonnées. ```java - class Grid { Map cells = new HashMap<>(); @@ -131,7 +126,6 @@ class Grid { } } - class Cell { String column; int line; @@ -146,9 +140,12 @@ class Cell { } } ``` + **Exemple pour Addition** (Opération Binaire) -La classe BinaryOperation implémente la methode toString() en, récuperant l'opérateur qui est définit dans la méthode getOperator() de chaque classe qui hérite d'elle. +La classe `BinaryOperation` implémente la methode `toString()` en récuperant l'opérateur qui est définit dans la +méthode `getOperator()` défini dans ses classes filles. + ```java class BinaryOperation { Cell leftCell; @@ -164,13 +161,15 @@ class Addition { return "+"; } } - ``` - #### 3. Methode getDevelopedFormula -Cette méthode renvoie la formule dévéloppée d'une case. +Cette méthode renvoie la formule dévéloppée d'une case, c'est à dire suivant les cas : +- Case avec une valeur : ses coordonnées (exemple: A1) +- Case avec une formule "simple" : la valeur de la case (exemple: SUM(A1,A2,A3)) +- Case avec une formule "complexe" : la valeur de la case et de ses cases utilisées (exemple: SUM(B1,(B1+B2),AVERAGE(C1,C2,C3))) + ```java class Grid{ Map cells = new HashMap<>(); @@ -209,19 +208,19 @@ class Average { ``` +#### 4. Methode eval -#### 4. Methode eval() - -Cette méthode permet de retourner le résultat d'un calacul avec des opérations binaires ou des fonctions. +Cette méthode permet de retourner le résultat d'un calcul avec des opérations binaires ou des fonctions. -##### Opération binaires +##### Opération Binaire class BinaryOperation { Cell leftCell; Cell rightCell; } -Les classes Addition,Multiplication,Substraction et Division héritent de la classe BinaryOpération et utilisent donc ses attributs leftCell et rightCell. +Les classes `Addition`, `Multiplication`, `Subtraction` et `Division` héritent de la classe `BinaryOperation` et utilisent +donc ses getters associés à `leftCell` et `rightCell`. - Dans Addition : @@ -229,7 +228,7 @@ Les classes Addition,Multiplication,Substraction et Division héritent de la cla class Addition { double eval() { - return leftCell.getValue() + rightCell.getValue(); + return getLeftCell().getValue() + getRightCell().getValue(); } } @@ -240,21 +239,19 @@ class Addition { ```java class Multiplication { - double eval() { - return leftCell.getValue() * rightCell.getValue(); + return getLeftCell().getValue() * getRightCell().getValue(); } } ``` - - Dans Soustraction : ```java -class Substraction { +class Subtraction { double eval() { - return leftCell.getValue() - rightCell.getValue(); + return getLeftCell().getValue() - getRightCell().getValue(); } } @@ -265,12 +262,8 @@ class Substraction { ```java class Division { - double eval() { - if (droite.getValue() != 0) - return gauche.getValue() / droite.getValue(); - else - lève une exception + return getLeftCell().getValue() / getRightCell().getValue(); } } @@ -279,10 +272,8 @@ class Division { class Function { List listCells; - } -Les classes Average et Sum héritent de la classe BinaryOpération et utilisent donc son attribut listCells. - +Les classes `Average` et `Sum` héritent de la classe `Function` et utilisent donc le getter associé à `listCells`. - Dans Moyenne : @@ -291,13 +282,12 @@ class Average { double eval() { double val=0; - if (listCases.size() != 0) - for(int i=0; i cells = new HashMap<>(); - void setValue(String column, int line, double value) { - this.getCell(column, line).setValue(value); + void setValue(String column, int line, double v) { + this.getCell(column, line).setValue(v); } } @@ -340,30 +329,28 @@ class Cell { Formula formula; List usedIn = new ArrayList(); - void setValue(double valeur) { - value = valeur; - for(int i=0; i cases = new HashMap<>(); void setFormula(String column, int line, Formula formula) { - String code = colonne + ligne; - this.getCell(column, line).setFormula(formula); + this.getCell(column, line).setFormula(formula); } } - class Cell { String column; int line; @@ -379,16 +366,17 @@ class Cell { if (!formula.createCycle(this)) formule = formula; updateValue(); - for(int i=0; i listCells; boolean creerCycle(Cell cell) { - Si la case n'est pas dans listCells - Pour toute les cases dans listCells qui contiennent des formules, regarder si la case est dans la formule + Sinon pour toute les cases dans listCells qui contiennent des formules, regarder si on crée un cycle avec } } @@ -437,48 +415,44 @@ que nous allons programmé dans notre application, voici quelques exemples : - Création d'une case avec une valeur fixe -- Création d'une case avec une formule d' `Opération binaire` et une -fonction comme `Moyenne` +- Création d'une case avec une formule d'opération binaire et une +fonction comme une moyenne - Modification d'une case avec une valeur sans qu'elle soit utilisée dans une autre case - Modification d'une case avec une valeur utilisée dans une autre case - Vérification qu'une erreur se lève lors de la création des 2 types de cycles (direct et indirect) - Renvoie de la formule dévéloppée d'une case avec une formule assez compliqué +- Sauvegarde d'une grille ## 2. STRUCTURE DU PROJET - -### PACKAGES,CLASSES,FICHIERS DE DONNÉES +### PACKAGES, CLASSES, FICHIERS DE DONNÉES L'implémentation du projet peut se résumer comme suit : -![PACKAGE](rapport_image/package.png) - +![PACKAGE](package.png) -Le schéma ci-dessus nous montre que, l'implémentation est composé de 5 package (representant 5 repertoires) contenant des classes ( chaque classe est un fichier d'extension java). +Le schéma ci-dessus nous montre que, l'implémentation est composé de 5 package (representant 5 repertoires) contenant des +classes (chaque classe est un fichier d'extension java). ### MODES D'UTILISATION Concernant les commandes de compilation et d'exécution, sous des logiciels comme Eclipse ou IntelliJ par exemple, juste un clique bouton suffit. - -Par contre, dans le cas contraire, il faut se placer dans à la raicne du repertoire contenant les fichiers et lancer les commandes suivantes : +Par contre, dans le cas contraire, il faut se placer dans à la racine du répertoire contenant les fichiers et lancer les commandes suivantes : **Commande de compilation**: -mkdir -p bin|find src -not \( -path src/kernel/test -prune \) -name \*.java|xargs -i javac -d bin {} -cp src/ +find src -not \( -path src/kernel/test -prune \) -name \*.java|xargs -i javac -d bin {} -cp src/ **Commande d'exécution**: -**java -cp bin app.Menu** pour tester les possibilités qu'offre une grille -ou **java -cp bin ihm.TablooProto** pour lancer l'interface graphique de la grille. - -Si l'on ne veut pas saisir ces commandes, on peut directement utiliser les fichiers bash exécutable **appbash** ou **tablobash** respectivement pour acceder au menu -ou à l'interface grapphique en faisant **./appbash** ou **./tablobash**. +java -cp bin app.Menu +java -cp bin ihm.TablooProto ## 3. BILAN -Au cours de ce projet les actions suivantes ont été faites : +Au cours de ce projet, voici ce que nous avons réalisé : ### Le noyeau -- libgit2 0.21.2