Commit 88514699d32296c1f6c4d481913a26e63e60d2d5

Authored by rtaniel
1 parent f996eddc

update rapport

Showing 1 changed file with 79 additions and 105 deletions   Show diff stats
rapport_finale.md
1   -# RAPPORT FINALE
  1 +# RAPPORT FINAL
2 2  
3 3 > ANDJEMBE Maksoudath, TANIEL Rémi
4 4  
5 5 Le but du projet est de réaliser un tableur "basique" mais facilement
6   -extensible, l'application sera divisée en 2 parties :
7   -* le kernel
  6 +extensible, l'application sera donc divisée en 2 parties :
  7 +* le coeur (ou kernel)
8 8 * la partie graphique
9 9  
10   -Le kernel s'occupera de toutes les opérations de notre grid, les cases
11   -ne pourront contenir que des réels ou des formules(opération binaire ou
12   -des fonctions acceptant des plages de cases).
  10 +Le coeur de l'application s'occupera de toutes les opérations de notre grilles,
  11 +pour simplifier le problème les cases ne pourront contenir que des réels ou des
  12 +formules(opération binaire ou des fonctions acceptant des plages de cases
  13 +comme une moyenne ou une somme).
13 14  
14 15 ## 1. ANALYSE ET CONCEPTION
15 16  
... ... @@ -21,7 +22,6 @@ abstraites sont en italique :
21 22  
22 23 ![UML](rapport_image/uml.png)
23 24  
24   -
25 25 ### PSEUDO-JAVA CREATION GRILLE,CASES
26 26  
27 27 Voici un exemple de création d'une grid et de l'ajout / modification /
... ... @@ -65,7 +65,7 @@ class Application {
65 65 ### CHOIX STRUCTURE DE DONNÉES
66 66  
67 67 Nous devons choisir une structure de donnée pour stocker les cases dans
68   -notre grid, nous savons déjà que nous allons utiliser ne collection
  68 +notre grille, nous savons déjà que nous allons utiliser une collection
69 69 pour les stocker,voici celles que nous connaissons:
70 70 - des tableaux
71 71 - des listes
... ... @@ -77,23 +77,22 @@ pour stocker les cases de notre grid :
77 77 * Pour rechercher une case et, effectuer des opérations dessus ce sera
78 78 plus facile, la clé de la Map sera une chaine de caractère (String) qui
79 79 représente la coordonnée de cette case (c'est-à-dire la concaténation
80   -du nom de ligne et de l'indice de la colonne, exemple "A1", "B9", etc...)
  80 +du nom de la ligne et de l'indice de la colonne, exemple : "A1", "B9", etc...)
81 81  
82   -Une case peut etre utilisée dans plusieurs autres cases, on ne sait
  82 +Une case peut etre utilisée dans plusieurs autres cases, on ne connait
83 83 pas le nombre d'autres cases où elle sera utilisée, on stockera donc
84   -cette donée dans une `ArrayList` de `Case`.
  84 +cette donnée dans une `ArrayList<Case>`.
85 85  
86   -Certaines fonctions (`Moyenne`, `Somme`) utilise également une plage de case, pour stocker ces cases,
87   -nous allons également une `ArrayList` de `Case`.
  86 +Certaines fonctions (`Average`, `Sum`) utilise également une plage de case,
  87 +pour stocker ces cases, nous allons également une `ArrayList<Case>`.
88 88  
89 89 ### METHODES ESSENTIELLES EN PSEUDO-JAVA
90 90  
91   -#### 1. Methode getValeur
  91 +#### 1. Methode getValue
92 92  
93 93 Cette méthode retourne la valeur d'une case se trouvant dans une grille grâce aux coordonnées de la case.
94   -Elle utilise la méthode getCell qui permet d'accet à une case qui existe et dans le contraire lève une exeption.
  94 +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.
95 95 ```java
96   -
97 96 class Grid {
98 97 Map<String, Cell> cells = new HashMap<>();
99 98  
... ... @@ -102,7 +101,6 @@ class Grid {
102 101 }
103 102 }
104 103  
105   -
106 104 class Cell {
107 105 String column;
108 106 int line;
... ... @@ -112,17 +110,14 @@ class Cell {
112 110 return value;
113 111 }
114 112 }
115   -
116 113 ```
117 114  
  115 +#### 2. Methode getFormulaAsString
118 116  
119   -#### 2. Methode getFormuleAsString (acceder au contenu)
120   -
121   -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
122   -pou dire qu'elle ne contient pas de formule mais une valeur.
  117 +Cette méthode permet de retourner le contenu d'une case. Si elle contient une formule,
  118 +on retourne la formule simple et dans le cas contraire ses coordonnées.
123 119  
124 120 ```java
125   -
126 121 class Grid {
127 122 Map<String, Cell> cells = new HashMap<>();
128 123  
... ... @@ -131,7 +126,6 @@ class Grid {
131 126 }
132 127 }
133 128  
134   -
135 129 class Cell {
136 130 String column;
137 131 int line;
... ... @@ -146,9 +140,12 @@ class Cell {
146 140 }
147 141 }
148 142 ```
  143 +
149 144 **Exemple pour Addition** (Opération Binaire)
150 145  
151   -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.
  146 +La classe `BinaryOperation` implémente la methode `toString()` en récuperant l'opérateur qui est définit dans la
  147 +méthode `getOperator()` défini dans ses classes filles.
  148 +
152 149 ```java
153 150 class BinaryOperation {
154 151 Cell leftCell;
... ... @@ -164,13 +161,15 @@ class Addition {
164 161 return "+";
165 162 }
166 163 }
167   -
168 164 ```
169 165  
170   -
171 166 #### 3. Methode getDevelopedFormula
172 167  
173   -Cette méthode renvoie la formule dévéloppée d'une case.
  168 +Cette méthode renvoie la formule dévéloppée d'une case, c'est à dire suivant les cas :
  169 +- Case avec une valeur : ses coordonnées (exemple: A1)
  170 +- Case avec une formule "simple" : la valeur de la case (exemple: SUM(A1,A2,A3))
  171 +- 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)))
  172 +
174 173 ```java
175 174 class Grid{
176 175 Map<String, Cell> cells = new HashMap<>();
... ... @@ -209,19 +208,19 @@ class Average {
209 208  
210 209 ```
211 210  
  211 +#### 4. Methode eval
212 212  
213   -#### 4. Methode eval()
214   -
215   -Cette méthode permet de retourner le résultat d'un calacul avec des opérations binaires ou des fonctions.
  213 +Cette méthode permet de retourner le résultat d'un calcul avec des opérations binaires ou des fonctions.
216 214  
217   -##### Opération binaires
  215 +##### Opération Binaire
218 216  
219 217 class BinaryOperation {
220 218 Cell leftCell;
221 219 Cell rightCell;
222 220  
223 221 }
224   -Les classes Addition,Multiplication,Substraction et Division héritent de la classe BinaryOpération et utilisent donc ses attributs leftCell et rightCell.
  222 +Les classes `Addition`, `Multiplication`, `Subtraction` et `Division` héritent de la classe `BinaryOperation` et utilisent
  223 +donc ses getters associés à `leftCell` et `rightCell`.
225 224  
226 225 - Dans Addition :
227 226  
... ... @@ -229,7 +228,7 @@ Les classes Addition,Multiplication,Substraction et Division héritent de la cla
229 228 class Addition {
230 229  
231 230 double eval() {
232   - return leftCell.getValue() + rightCell.getValue();
  231 + return getLeftCell().getValue() + getRightCell().getValue();
233 232 }
234 233 }
235 234  
... ... @@ -240,21 +239,19 @@ class Addition {
240 239 ```java
241 240 class Multiplication {
242 241  
243   -
244 242 double eval() {
245   - return leftCell.getValue() * rightCell.getValue();
  243 + return getLeftCell().getValue() * getRightCell().getValue();
246 244 }
247 245 }
248 246 ```
249 247  
250   -
251 248 - Dans Soustraction :
252 249  
253 250 ```java
254   -class Substraction {
  251 +class Subtraction {
255 252  
256 253 double eval() {
257   - return leftCell.getValue() - rightCell.getValue();
  254 + return getLeftCell().getValue() - getRightCell().getValue();
258 255 }
259 256 }
260 257  
... ... @@ -265,12 +262,8 @@ class Substraction {
265 262 ```java
266 263 class Division {
267 264  
268   -
269 265 double eval() {
270   - if (droite.getValue() != 0)
271   - return gauche.getValue() / droite.getValue();
272   - else
273   - lève une exception
  266 + return getLeftCell().getValue() / getRightCell().getValue();
274 267 }
275 268 }
276 269  
... ... @@ -279,10 +272,8 @@ class Division {
279 272  
280 273 class Function {
281 274 List<Cell> listCells;
282   -
283 275 }
284   -Les classes Average et Sum héritent de la classe BinaryOpération et utilisent donc son attribut listCells.
285   -
  276 +Les classes `Average` et `Sum` héritent de la classe `Function` et utilisent donc le getter associé à `listCells`.
286 277  
287 278 - Dans Moyenne :
288 279  
... ... @@ -291,13 +282,12 @@ class Average {
291 282  
292 283 double eval() {
293 284 double val=0;
294   -
295 285 if (listCases.size() != 0)
296   - for(int i=0; i<listCells.size(); i++)
297   - val += listCells.get(i).getValue();
298   - return val / listCells.size();
  286 + for(Cell c : getUtilisedCells())
  287 + val += c.getValue();
  288 + return val / getUtilisedCells().size();
299 289 else
300   - ve une exception
  290 + leve une exception
301 291 }
302 292 }
303 293  
... ... @@ -309,12 +299,9 @@ class Sum {
309 299  
310 300 double eval() {
311 301 double val=0;
312   - if (listCases.size() != 0)
313   - for(int i=0; i<listCells.size(); i++)
314   - val += listCells.get(i).getValue();
315   - return val;
316   - else
317   - lève une exception
  302 + for(Cell c : getUtilisedCells())
  303 + val += c.getValue();
  304 + return val;
318 305 }
319 306 }
320 307  
... ... @@ -322,14 +309,16 @@ class Sum {
322 309  
323 310 #### 5. Methode setValue
324 311  
325   -Lorsque l'on modifie une valeur d'une case, on met à jour la valeur des cases qui utilisent la case.
  312 +Nous différencions une valeur fixe et une formule quand nous souhaitons une cellule.
  313 +De plus, si la cellule est utilisée dans une autre, nous propageons la nouvelle valeur
  314 +pour modifier la valeur des cellules en conséquence.
326 315  
327 316 ```java
328 317 class Grid {
329 318 Map<String, Cell> cells = new HashMap<>();
330 319  
331   - void setValue(String column, int line, double value) {
332   - this.getCell(column, line).setValue(value);
  320 + void setValue(String column, int line, double v) {
  321 + this.getCell(column, line).setValue(v);
333 322 }
334 323 }
335 324  
... ... @@ -340,30 +329,28 @@ class Cell {
340 329 Formula formula;
341 330 List<Cell> usedIn = new ArrayList<Cell>();
342 331  
343   - void setValue(double valeur) {
344   - value = valeur;
345   - for(int i=0; i<usedIn.size(); i++)
346   - usedIn.get(i).updateValue();
  332 + void setValue(double v) {
  333 + value = v;
  334 + for(Cell c : usedIn)
  335 + c.updateValue();
347 336 }
348 337 }
349   -
350 338 ```
351 339  
352   -
353 340 #### 5. Methode setFormula
354 341  
355   -Cette méthode assigne une formule à une case en étant sûre qu'un cycle n'est pas créée.
  342 +Cette méthode assigne une formule à une case en étant sûre qu'un cycle n'est pas créée,
  343 +une exception est lévée dans le cas où un cycle est crée.
  344 +
356 345 ```java
357 346 class Grid {
358 347 Map<String, Cell> cases = new HashMap<>();
359 348  
360 349 void setFormula(String column, int line, Formula formula) {
361   - String code = colonne + ligne;
362   - this.getCell(column, line).setFormula(formula);
  350 + this.getCell(column, line).setFormula(formula);
363 351 }
364 352 }
365 353  
366   -
367 354 class Cell {
368 355 String column;
369 356 int line;
... ... @@ -379,16 +366,17 @@ class Cell {
379 366 if (!formula.createCycle(this))
380 367 formule = formula;
381 368 updateValue();
382   - for(int i=0; i<usedIn.size(); i++)
383   - usedIn.get(i).updateValue();
  369 + for(Cell c : usedIn)
  370 + c.updateValue();
384 371 else
385   - lève une exception
  372 + leve une exception
386 373 }
387 374 }
388 375 ```
389 376 #### 5. Methode createCycle
390 377  
391   -Cette méthode vérifie si on créée un cycle direct ou indirece.La façon de la définir est differente si on a une opération binaire ou une focntion.
  378 +Cette méthode vérifie si on crée un cycle direct ou indirect. La façon de la définir est différente
  379 +si on a une opération binaire ou une fonction.
392 380  
393 381 ##### Opération binaire
394 382  
... ... @@ -398,20 +386,11 @@ class BinaryOperation {
398 386 Cell rightCell;
399 387  
400 388 boolean createCycle(Cell cell) {
401   - Si la case gauche ne contient pas de formule et la case de droite contient une
402   - rechercher si la case est dans la formule de la case de droite
403   -
404   - Si la case gauche contient une formule et la case de droite n'en contient pas
405   - rechercher si la case est dans la formule de la case de gauche
406   -
407   - Si la case gauche et la droite contiennent des formules
408   - rechercher si la case est dans les deux formule
409   -
410   - Si les deux cases n'ont pas de formules
411   - rechercher si la case est égale à case gauche ou droite
  389 + Si la case gauche contient une formule, voir si on crée un cycle avec la fonction
  390 + Sinon si la case droite en contient une, voir si on crée un cycle avec
  391 + Sinon vérifier que la case à droite et à gauche sont égales avec celle donnée en paramètre
412 392 }
413 393 }
414   -
415 394 ```
416 395  
417 396 ##### Fonction
... ... @@ -421,9 +400,8 @@ class Function {
421 400 List<Cell> listCells;
422 401  
423 402 boolean creerCycle(Cell cell) {
424   -
425 403 Si la case n'est pas dans listCells
426   - Pour toute les cases dans listCells qui contiennent des formules, regarder si la case est dans la formule
  404 + Sinon pour toute les cases dans listCells qui contiennent des formules, regarder si on crée un cycle avec
427 405 }
428 406 }
429 407  
... ... @@ -437,48 +415,44 @@ que nous allons programmé dans notre application, voici quelques
437 415 exemples :
438 416  
439 417 - Création d'une case avec une valeur fixe
440   -- Création d'une case avec une formule d' `Opération binaire` et une
441   -fonction comme `Moyenne`
  418 +- Création d'une case avec une formule d'opération binaire et une
  419 +fonction comme une moyenne
442 420 - Modification d'une case avec une valeur sans qu'elle soit utilisée dans
443 421 une autre case
444 422 - Modification d'une case avec une valeur utilisée dans une autre case
445 423 - Vérification qu'une erreur se lève lors de la création des 2 types
446 424 de cycles (direct et indirect)
447 425 - Renvoie de la formule dévéloppée d'une case avec une formule assez compliqué
  426 +- Sauvegarde d'une grille
448 427  
449 428 ## 2. STRUCTURE DU PROJET
450 429  
451   -
452   -### PACKAGES,CLASSES,FICHIERS DE DONNÉES
  430 +### PACKAGES, CLASSES, FICHIERS DE DONNÉES
453 431  
454 432 L'implémentation du projet peut se résumer comme suit :
455 433  
456   -![PACKAGE](rapport_image/package.png)
457   -
  434 +![PACKAGE](package.png)
458 435  
459   -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).
  436 +Le schéma ci-dessus nous montre que, l'implémentation est composé de 5 package (representant 5 repertoires) contenant des
  437 +classes (chaque classe est un fichier d'extension java).
460 438  
461 439 ### MODES D'UTILISATION
462 440  
463 441 Concernant les commandes de compilation et d'exécution, sous des logiciels comme Eclipse ou IntelliJ par exemple, juste un clique bouton suffit.
464   -
465   -Par contre, dans le cas contraire, il faut se placer dans à la raicne du repertoire contenant les fichiers et lancer les commandes suivantes :
  442 +Par contre, dans le cas contraire, il faut se placer dans à la racine du répertoire contenant les fichiers et lancer les commandes suivantes :
466 443  
467 444 **Commande de compilation**:
468 445  
469   -mkdir -p bin|find src -not \( -path src/kernel/test -prune \) -name \*.java|xargs -i javac -d bin {} -cp src/
  446 +find src -not \( -path src/kernel/test -prune \) -name \*.java|xargs -i javac -d bin {} -cp src/
470 447  
471 448 **Commande d'exécution**:
472 449  
473   -**java -cp bin app.Menu** pour tester les possibilités qu'offre une grille
474   -ou **java -cp bin ihm.TablooProto** pour lancer l'interface graphique de la grille.
475   -
476   -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
477   -ou à l'interface grapphique en faisant **./appbash** ou **./tablobash**.
  450 +java -cp bin app.Menu
  451 +java -cp bin ihm.TablooProto
478 452  
479 453 ## 3. BILAN
480 454  
481   -Au cours de ce projet les actions suivantes ont été faites :
  455 +Au cours de ce projet, voici ce que nous avons réalisé :
482 456  
483 457 ### Le noyeau
484 458  
... ...