Commit 88514699d32296c1f6c4d481913a26e63e60d2d5
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 | - lè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 | ... | ... |