Commit 88514699d32296c1f6c4d481913a26e63e60d2d5

Authored by rtaniel
1 parent f996eddc

update rapport

Showing 1 changed file with 79 additions and 105 deletions   Show diff stats
1 -# RAPPORT FINALE 1 +# RAPPORT FINAL
2 2
3 > ANDJEMBE Maksoudath, TANIEL Rémi 3 > ANDJEMBE Maksoudath, TANIEL Rémi
4 4
5 Le but du projet est de réaliser un tableur "basique" mais facilement 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 * la partie graphique 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 ## 1. ANALYSE ET CONCEPTION 15 ## 1. ANALYSE ET CONCEPTION
15 16
@@ -21,7 +22,6 @@ abstraites sont en italique : @@ -21,7 +22,6 @@ abstraites sont en italique :
21 22
22 ![UML](rapport_image/uml.png) 23 ![UML](rapport_image/uml.png)
23 24
24 -  
25 ### PSEUDO-JAVA CREATION GRILLE,CASES 25 ### PSEUDO-JAVA CREATION GRILLE,CASES
26 26
27 Voici un exemple de création d'une grid et de l'ajout / modification / 27 Voici un exemple de création d'une grid et de l'ajout / modification /
@@ -65,7 +65,7 @@ class Application { @@ -65,7 +65,7 @@ class Application {
65 ### CHOIX STRUCTURE DE DONNÉES 65 ### CHOIX STRUCTURE DE DONNÉES
66 66
67 Nous devons choisir une structure de donnée pour stocker les cases dans 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 pour les stocker,voici celles que nous connaissons: 69 pour les stocker,voici celles que nous connaissons:
70 - des tableaux 70 - des tableaux
71 - des listes 71 - des listes
@@ -77,23 +77,22 @@ pour stocker les cases de notre grid : @@ -77,23 +77,22 @@ pour stocker les cases de notre grid :
77 * Pour rechercher une case et, effectuer des opérations dessus ce sera 77 * Pour rechercher une case et, effectuer des opérations dessus ce sera
78 plus facile, la clé de la Map sera une chaine de caractère (String) qui 78 plus facile, la clé de la Map sera une chaine de caractère (String) qui
79 représente la coordonnée de cette case (c'est-à-dire la concaténation 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 pas le nombre d'autres cases où elle sera utilisée, on stockera donc 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 ### METHODES ESSENTIELLES EN PSEUDO-JAVA 89 ### METHODES ESSENTIELLES EN PSEUDO-JAVA
90 90
91 -#### 1. Methode getValeur 91 +#### 1. Methode getValue
92 92
93 Cette méthode retourne la valeur d'une case se trouvant dans une grille grâce aux coordonnées de la case. 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 ```java 95 ```java
96 -  
97 class Grid { 96 class Grid {
98 Map<String, Cell> cells = new HashMap<>(); 97 Map<String, Cell> cells = new HashMap<>();
99 98
@@ -102,7 +101,6 @@ class Grid { @@ -102,7 +101,6 @@ class Grid {
102 } 101 }
103 } 102 }
104 103
105 -  
106 class Cell { 104 class Cell {
107 String column; 105 String column;
108 int line; 106 int line;
@@ -112,17 +110,14 @@ class Cell { @@ -112,17 +110,14 @@ class Cell {
112 return value; 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 ```java 120 ```java
125 -  
126 class Grid { 121 class Grid {
127 Map<String, Cell> cells = new HashMap<>(); 122 Map<String, Cell> cells = new HashMap<>();
128 123
@@ -131,7 +126,6 @@ class Grid { @@ -131,7 +126,6 @@ class Grid {
131 } 126 }
132 } 127 }
133 128
134 -  
135 class Cell { 129 class Cell {
136 String column; 130 String column;
137 int line; 131 int line;
@@ -146,9 +140,12 @@ class Cell { @@ -146,9 +140,12 @@ class Cell {
146 } 140 }
147 } 141 }
148 ``` 142 ```
  143 +
149 **Exemple pour Addition** (Opération Binaire) 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 ```java 149 ```java
153 class BinaryOperation { 150 class BinaryOperation {
154 Cell leftCell; 151 Cell leftCell;
@@ -164,13 +161,15 @@ class Addition { @@ -164,13 +161,15 @@ class Addition {
164 return "+"; 161 return "+";
165 } 162 }
166 } 163 }
167 -  
168 ``` 164 ```
169 165
170 -  
171 #### 3. Methode getDevelopedFormula 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 ```java 173 ```java
175 class Grid{ 174 class Grid{
176 Map<String, Cell> cells = new HashMap<>(); 175 Map<String, Cell> cells = new HashMap<>();
@@ -209,19 +208,19 @@ class Average { @@ -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 class BinaryOperation { 217 class BinaryOperation {
220 Cell leftCell; 218 Cell leftCell;
221 Cell rightCell; 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 - Dans Addition : 225 - Dans Addition :
227 226
@@ -229,7 +228,7 @@ Les classes Addition,Multiplication,Substraction et Division héritent de la cla @@ -229,7 +228,7 @@ Les classes Addition,Multiplication,Substraction et Division héritent de la cla
229 class Addition { 228 class Addition {
230 229
231 double eval() { 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,21 +239,19 @@ class Addition {
240 ```java 239 ```java
241 class Multiplication { 240 class Multiplication {
242 241
243 -  
244 double eval() { 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 - Dans Soustraction : 248 - Dans Soustraction :
252 249
253 ```java 250 ```java
254 -class Substraction { 251 +class Subtraction {
255 252
256 double eval() { 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,12 +262,8 @@ class Substraction {
265 ```java 262 ```java
266 class Division { 263 class Division {
267 264
268 -  
269 double eval() { 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,10 +272,8 @@ class Division {
279 272
280 class Function { 273 class Function {
281 List<Cell> listCells; 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 - Dans Moyenne : 278 - Dans Moyenne :
288 279
@@ -291,13 +282,12 @@ class Average { @@ -291,13 +282,12 @@ class Average {
291 282
292 double eval() { 283 double eval() {
293 double val=0; 284 double val=0;
294 -  
295 if (listCases.size() != 0) 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 else 289 else
300 - ve une exception 290 + leve une exception
301 } 291 }
302 } 292 }
303 293
@@ -309,12 +299,9 @@ class Sum { @@ -309,12 +299,9 @@ class Sum {
309 299
310 double eval() { 300 double eval() {
311 double val=0; 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,14 +309,16 @@ class Sum {
322 309
323 #### 5. Methode setValue 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 ```java 316 ```java
328 class Grid { 317 class Grid {
329 Map<String, Cell> cells = new HashMap<>(); 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,30 +329,28 @@ class Cell {
340 Formula formula; 329 Formula formula;
341 List<Cell> usedIn = new ArrayList<Cell>(); 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 #### 5. Methode setFormula 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 ```java 345 ```java
357 class Grid { 346 class Grid {
358 Map<String, Cell> cases = new HashMap<>(); 347 Map<String, Cell> cases = new HashMap<>();
359 348
360 void setFormula(String column, int line, Formula formula) { 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 class Cell { 354 class Cell {
368 String column; 355 String column;
369 int line; 356 int line;
@@ -379,16 +366,17 @@ class Cell { @@ -379,16 +366,17 @@ class Cell {
379 if (!formula.createCycle(this)) 366 if (!formula.createCycle(this))
380 formule = formula; 367 formule = formula;
381 updateValue(); 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 else 371 else
385 - lève une exception 372 + leve une exception
386 } 373 }
387 } 374 }
388 ``` 375 ```
389 #### 5. Methode createCycle 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 ##### Opération binaire 381 ##### Opération binaire
394 382
@@ -398,20 +386,11 @@ class BinaryOperation { @@ -398,20 +386,11 @@ class BinaryOperation {
398 Cell rightCell; 386 Cell rightCell;
399 387
400 boolean createCycle(Cell cell) { 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 ##### Fonction 396 ##### Fonction
@@ -421,9 +400,8 @@ class Function { @@ -421,9 +400,8 @@ class Function {
421 List<Cell> listCells; 400 List<Cell> listCells;
422 401
423 boolean creerCycle(Cell cell) { 402 boolean creerCycle(Cell cell) {
424 -  
425 Si la case n'est pas dans listCells 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,48 +415,44 @@ que nous allons programmé dans notre application, voici quelques
437 exemples : 415 exemples :
438 416
439 - Création d'une case avec une valeur fixe 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 - Modification d'une case avec une valeur sans qu'elle soit utilisée dans 420 - Modification d'une case avec une valeur sans qu'elle soit utilisée dans
443 une autre case 421 une autre case
444 - Modification d'une case avec une valeur utilisée dans une autre case 422 - Modification d'une case avec une valeur utilisée dans une autre case
445 - Vérification qu'une erreur se lève lors de la création des 2 types 423 - Vérification qu'une erreur se lève lors de la création des 2 types
446 de cycles (direct et indirect) 424 de cycles (direct et indirect)
447 - Renvoie de la formule dévéloppée d'une case avec une formule assez compliqué 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 ## 2. STRUCTURE DU PROJET 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 L'implémentation du projet peut se résumer comme suit : 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 ### MODES D'UTILISATION 439 ### MODES D'UTILISATION
462 440
463 Concernant les commandes de compilation et d'exécution, sous des logiciels comme Eclipse ou IntelliJ par exemple, juste un clique bouton suffit. 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 **Commande de compilation**: 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 **Commande d'exécution**: 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 ## 3. BILAN 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 ### Le noyeau 457 ### Le noyeau
484 458