Blame view

rapport_finale.md 14.4 KB
23982881   [mandjemb]   update ihm
1
2
3
4
5
6
7
8
9
10
11
12
13
  # RAPPORT FINALE
  
  > 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
  * 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).
  
08cc28cc   [mandjemb]   update ihm
14
  ## 1. ANALYSE ET CONCEPTION
23982881   [mandjemb]   update ihm
15
16
17
18
19
20
21
  
  
  ### SCHEMA UML
  
  Voici le schéma UML de notre application, les classes et méthodes
  abstraites sont en italique :
  
453ac322   mandjemb   up
22
  ![UML](rapport_image/uml.png)
23982881   [mandjemb]   update ihm
23
24
25
26
27
28
29
30
31
32
33
  
  
  ### PSEUDO-JAVA CREATION GRILLE,CASES
  
  Voici un exemple de création d'une grid et de l'ajout / modification /
  affichage de plusieurs types de case :
  
  ```java
  class Application {
      
      public static void main(String[] args) {
9f417dcb   mandjemb   Update rapport
34
          Grid g = new Grid();
23982881   [mandjemb]   update ihm
35
36
37
38
39
40
          
          g.createCase("b",1); //Ajout case vide
          g.createCase("a",1,100.0); //Ajout case avec valeur
          g.createCase("a",2,50.0); //Ajout case avec valeur
          g.createCase("a",3,new Addition(g.getCase("a",2),g.getCase("a",1))); //Ajout case avec operation binaire
          
37b36bec   mandjemb   update rapport
41
          List<Cell> plageCase1 = new ArrayList<Cell>(); // Crée une liste de case
23982881   [mandjemb]   update ihm
42
43
44
45
46
47
          plageCase1.add(g.getCase("a",1));
          plageCase1.add(g.getCase("a",2));
          plageCase1.add(g.getCase("a",3));
          
          g.createCase("a",4,new Somme(plageCase1)); //Ajout case avec fonctions
          
9f417dcb   mandjemb   Update rapport
48
          g.setValue("b",1,100); //Met la valeur de b1 à 100
23982881   [mandjemb]   update ihm
49
          
37b36bec   mandjemb   update rapport
50
          List<Cell> plageCase2 = new ArrayList<Cell>(); // Crée une liste de case
23982881   [mandjemb]   update ihm
51
52
53
54
          plageCase1.add(g.getCase("a",4));
          plageCase1.add(g.getCase("a",2));
          plageCase1.add(g.getCase("a",3));
          
9f417dcb   mandjemb   Update rapport
55
          g.setFormula("b",2,new Moyenne(plageCase2)); //Met la formule dans b2 
23982881   [mandjemb]   update ihm
56
          
9f417dcb   mandjemb   Update rapport
57
58
59
60
          g.getValue("a",1); //Affichera 100.0
          g.getValue("a",4); //Affichera (100+50+150)=100
          g.getFormulaAsString("b",2); //Affichera MOYENNE(a4,a2,a3)
          g.getDevelopedFormula("b",2); 
23982881   [mandjemb]   update ihm
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
      }
  }
  ```
  
  ### 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
  pour les stocker,voici celles que nous connaissons:
  - des tableaux
  - des listes
  - des maps
  - des sets
    
  D'après le schéma UML ci-dessus, nous allons donc utiliser une `HashMap` 
  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...)
  
  Une case peut etre utilisée dans plusieurs autres cases, on ne sait 
  pas le nombre d'autres cases où elle sera utilisée, on stockera donc 
  cette donée dans une `ArrayList` de `Case`.
  
  Certaines fonctions (`Moyenne`, `Somme`) utilise également une plage de case, pour stocker ces cases,
  nous allons également une `ArrayList` de `Case`.
  
  ### METHODES ESSENTIELLES EN PSEUDO-JAVA
  
  #### 1. Methode getValeur
  
9f417dcb   mandjemb   Update rapport
93
94
  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.
23982881   [mandjemb]   update ihm
95
96
  ```java
  
882d59f8   mandjemb   Rapport
97
  class Grid {
9f417dcb   mandjemb   Update rapport
98
    Map<String, Cell> cells  = new HashMap<>();
23982881   [mandjemb]   update ihm
99
    
882d59f8   mandjemb   Rapport
100
    double getValue(String column, int line){
9f417dcb   mandjemb   Update rapport
101
      return this.getCell(column, line).getValue();
23982881   [mandjemb]   update ihm
102
103
104
105
    }
  }
  
  
882d59f8   mandjemb   Rapport
106
107
108
109
  class Cell {
    String column;
    int line;
    double value;
23982881   [mandjemb]   update ihm
110
    
882d59f8   mandjemb   Rapport
111
112
    double getValue() {
      return value;
23982881   [mandjemb]   update ihm
113
114
115
116
117
118
    }
  }
  
  ```
  
  
882d59f8   mandjemb   Rapport
119
  #### 2. Methode getFormuleAsString (acceder au contenu)
23982881   [mandjemb]   update ihm
120
  
9f417dcb   mandjemb   Update rapport
121
122
123
  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.
  
23982881   [mandjemb]   update ihm
124
125
  ```java
  
882d59f8   mandjemb   Rapport
126
  class Grid {
9f417dcb   mandjemb   Update rapport
127
    Map<String, Cell> cells  = new HashMap<>();
23982881   [mandjemb]   update ihm
128
    
882d59f8   mandjemb   Rapport
129
130
    String getFormuleAsString(String column, int line) {
      return this.getCell(column, line).toString();
23982881   [mandjemb]   update ihm
131
132
133
134
    }
  }
  
  
882d59f8   mandjemb   Rapport
135
136
137
138
139
  class Cell {
    String column;
    int line;
    double value;
    Formula formula;
23982881   [mandjemb]   update ihm
140
141
    
    String getFormuleAsString() {
882d59f8   mandjemb   Rapport
142
143
        if (formula != null) 
            return formula.toString();
23982881   [mandjemb]   update ihm
144
145
146
147
        else
            return toString();
    }
  }
9f417dcb   mandjemb   Update rapport
148
149
  ```
  **Exemple pour Addition** (Opération Binaire)
23982881   [mandjemb]   update ihm
150
  
9f417dcb   mandjemb   Update rapport
151
152
153
  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.
  ```java
  class BinaryOperation {
882d59f8   mandjemb   Rapport
154
155
      Cell leftCell;
      Cell rightCell;
23982881   [mandjemb]   update ihm
156
      
9f417dcb   mandjemb   Update rapport
157
158
159
160
161
162
163
164
165
  	public String toString() {
  		return "(" + this.leftCell.getId() + this.getOperator() + this.rightCell.getId() + ")";
  	}
  }
  class Addition {
      	
  	public String getOperator() {
  		return "+";
  	}
23982881   [mandjemb]   update ihm
166
167
168
169
170
  }
  
  ```
  
  
882d59f8   mandjemb   Rapport
171
  #### 3. Methode getDevelopedFormula
23982881   [mandjemb]   update ihm
172
  
9f417dcb   mandjemb   Update rapport
173
  Cette méthode renvoie la formule dévéloppée d'une case.
23982881   [mandjemb]   update ihm
174
  ```java
882d59f8   mandjemb   Rapport
175
  class Grid{
9f417dcb   mandjemb   Update rapport
176
    Map<String, Cell> cells  = new HashMap<>();
23982881   [mandjemb]   update ihm
177
    
882d59f8   mandjemb   Rapport
178
179
    String getDevelopedFormula(String column, int line) {
      return this.getCell(column,line).getFormuleDeveloppe();
23982881   [mandjemb]   update ihm
180
181
182
    }
  }
  
9f417dcb   mandjemb   Update rapport
183
  class Cell{
882d59f8   mandjemb   Rapport
184
185
186
187
188
    String column;
    int line;
    double value;
    Formula formula;
    List<Cell> usedIn = new ArrayList<>(); 
23982881   [mandjemb]   update ihm
189
    
882d59f8   mandjemb   Rapport
190
191
    String getDevelopedFormula() {
        if (formula != null)
9f417dcb   mandjemb   Update rapport
192
            return formula.getDevelopedFormula();
23982881   [mandjemb]   update ihm
193
194
195
196
        else
            return toString();
    }
  }
9f417dcb   mandjemb   Update rapport
197
198
199
  ```
  
  **Exemple de la méthode getDevelopedFormula() pour la class Average** (moyenne)
23982881   [mandjemb]   update ihm
200
  
9f417dcb   mandjemb   Update rapport
201
  ```java
882d59f8   mandjemb   Rapport
202
203
  class Average {
      List<Cell> listCases = new ArrayList<Cell>();
23982881   [mandjemb]   update ihm
204
      
882d59f8   mandjemb   Rapport
205
      String getDevelopedFormula() {
23982881   [mandjemb]   update ihm
206
207
208
209
210
211
212
213
214
          return Average + listCases.stream().map(c -> c.getFormuleDeveloppe()).collect((Collectors).joining(", ")) + ")";
      }
  }
  
  ```
  
  
  #### 4. Methode eval()
  
9f417dcb   mandjemb   Update rapport
215
216
217
218
219
220
221
222
223
224
225
  Cette méthode permet de retourner le résultat d'un calacul avec des opérations binaires ou des fonctions.
  
  ##### Opération binaires 
  
  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.
  
23982881   [mandjemb]   update ihm
226
227
228
229
  - Dans Addition :
  
  ```java
  class Addition {
23982881   [mandjemb]   update ihm
230
231
  
    double eval() {
9f417dcb   mandjemb   Update rapport
232
        return leftCell.getValue() + rightCell.getValue();
23982881   [mandjemb]   update ihm
233
234
235
236
237
238
239
240
241
    }
  }
  
  ```
  
  - Dans Multiplication :
  
  ```java
  class Multiplication {
9f417dcb   mandjemb   Update rapport
242
  
23982881   [mandjemb]   update ihm
243
244
  
    double eval() {
9f417dcb   mandjemb   Update rapport
245
        return leftCell.getValue() * rightCell.getValue();
23982881   [mandjemb]   update ihm
246
247
248
249
250
251
252
253
    }
  }
  ```
  
  
  - Dans Soustraction :
  
  ```java
9f417dcb   mandjemb   Update rapport
254
  class Substraction {
23982881   [mandjemb]   update ihm
255
256
  
    double eval() {
9f417dcb   mandjemb   Update rapport
257
        return leftCell.getValue() - rightCell.getValue();
23982881   [mandjemb]   update ihm
258
259
260
261
262
263
264
265
266
    }
  }
  
  ```
  
  - Dans Division :
  
  ```java
  class Division {
9f417dcb   mandjemb   Update rapport
267
  
23982881   [mandjemb]   update ihm
268
269
  
    double eval() {
9f417dcb   mandjemb   Update rapport
270
271
      if (droite.getValue() != 0)
          return gauche.getValue() / droite.getValue();
23982881   [mandjemb]   update ihm
272
273
274
275
276
277
      else
          lève une exception
    }
  }
  
  ```
9f417dcb   mandjemb   Update rapport
278
279
280
281
282
283
284
285
  ##### Fonctions
  
  class Function {
      List<Cell> listCells;
      
  }
  Les classes Average et Sum héritent de la classe BinaryOpération et utilisent donc son attribut listCells. 
  
23982881   [mandjemb]   update ihm
286
287
288
289
  
  - Dans Moyenne :
  
  ```java
882d59f8   mandjemb   Rapport
290
  class Average {
23982881   [mandjemb]   update ihm
291
292
293
294
295
  
    double eval() {
      double val=0;
    
      if (listCases.size() != 0)
9f417dcb   mandjemb   Update rapport
296
297
298
        for(int i=0; i<listCells.size(); i++)
              val += listCells.get(i).getValue();
        return val / listCells.size();
23982881   [mandjemb]   update ihm
299
300
301
302
303
304
305
306
307
      else
        lève une exception
    }
  }
  
  ```
  - Dans Somme :
  
  ```java
882d59f8   mandjemb   Rapport
308
  class Sum {
23982881   [mandjemb]   update ihm
309
310
311
312
  
    double eval() {
      double val=0;
      if (listCases.size() != 0)
9f417dcb   mandjemb   Update rapport
313
314
        for(int i=0; i<listCells.size(); i++)
              val += listCells.get(i).getValue();
23982881   [mandjemb]   update ihm
315
316
317
318
319
320
321
322
        return val;
      else
          lève une exception
    }
  }
  
  ```
  
9f417dcb   mandjemb   Update rapport
323
324
325
  #### 5. Methode setValue
  
  Lorsque l'on modifie une valeur d'une case, on met à jour la valeur des cases qui utilisent la case.
23982881   [mandjemb]   update ihm
326
327
  
  ```java
882d59f8   mandjemb   Rapport
328
  class Grid {
9f417dcb   mandjemb   Update rapport
329
    Map<String, Cell> cells  = new HashMap<>();
23982881   [mandjemb]   update ihm
330
    
9f417dcb   mandjemb   Update rapport
331
332
333
    void setValue(String column, int line, double value)  {
  		this.getCell(column, line).setValue(value);
  	}
23982881   [mandjemb]   update ihm
334
335
  }
  
882d59f8   mandjemb   Rapport
336
  class Cell {
9f417dcb   mandjemb   Update rapport
337
338
339
340
341
    String column;
    int line;
    double value;
    Formula formula;
    List<Cell> usedIn = new ArrayList<Cell>(); 
23982881   [mandjemb]   update ihm
342
    
9f417dcb   mandjemb   Update rapport
343
344
345
346
    void setValue(double valeur) {
      value = valeur;
      for(int i=0; i<usedIn.size(); i++)
         usedIn.get(i).updateValue();
23982881   [mandjemb]   update ihm
347
348
349
350
351
    }
  }
  
  ```
  
23982881   [mandjemb]   update ihm
352
  
9f417dcb   mandjemb   Update rapport
353
354
355
  #### 5. Methode setFormula
  
  Cette méthode assigne une formule à une case en étant sûre qu'un cycle n'est pas créée.
23982881   [mandjemb]   update ihm
356
  ```java
882d59f8   mandjemb   Rapport
357
358
  class Grid {
    Map<String, Cell> cases  = new HashMap<>();
23982881   [mandjemb]   update ihm
359
    
9f417dcb   mandjemb   Update rapport
360
    void setFormula(String column, int line, Formula formula) {
23982881   [mandjemb]   update ihm
361
      String code = colonne + ligne;
9f417dcb   mandjemb   Update rapport
362
      	this.getCell(column, line).setFormula(formula);
23982881   [mandjemb]   update ihm
363
364
365
366
    }
  }
  
  
882d59f8   mandjemb   Rapport
367
  class Cell {
9f417dcb   mandjemb   Update rapport
368
369
370
371
372
    String column;
    int line;
    double value;
    Formula formula;
    List<Cell> usedIn = new ArrayList<Cell>(); 
23982881   [mandjemb]   update ihm
373
    
9f417dcb   mandjemb   Update rapport
374
375
    void updateValue() {
        valeur = formula.eval();
23982881   [mandjemb]   update ihm
376
377
    }
    
9f417dcb   mandjemb   Update rapport
378
379
    void setFormula(Formula formula) {
      if (!formula.createCycle(this))
23982881   [mandjemb]   update ihm
380
        formule = formula;
9f417dcb   mandjemb   Update rapport
381
382
383
        updateValue();
        for(int i=0; i<usedIn.size(); i++)
          usedIn.get(i).updateValue();
23982881   [mandjemb]   update ihm
384
385
386
387
      else
        lève une exception
    }
  }
9f417dcb   mandjemb   Update rapport
388
389
390
391
392
393
  ```
  #### 5. Methode createCycle
  
  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.
  
  #####   Opération binaire
23982881   [mandjemb]   update ihm
394
  
9f417dcb   mandjemb   Update rapport
395
396
397
398
  ```java
  class BinaryOperation {
      Cell leftCell;
      Cell rightCell;
23982881   [mandjemb]   update ihm
399
      
9f417dcb   mandjemb   Update rapport
400
      boolean createCycle(Cell cell) {
882d59f8   mandjemb   Rapport
401
          Si la case gauche ne contient pas de formule et la case de droite contient une
9f417dcb   mandjemb   Update rapport
402
            rechercher si la case est dans la formule de la case de droite 
882d59f8   mandjemb   Rapport
403
404
405
406
407
408
            
          Si la case gauche contient une  formule et la case de droite n'en contient pas
            rechercher si la case est dans la formule de la case de gauche
                    
          Si la case gauche et la droite contiennent des formules
            rechercher si la case est dans les deux formule
23982881   [mandjemb]   update ihm
409
          
882d59f8   mandjemb   Rapport
410
411
412
413
414
          Si les deux cases n'ont pas de formules
            rechercher si la case est égale à case gauche ou droite
      }
  }
  
9f417dcb   mandjemb   Update rapport
415
416
417
418
419
420
  ```
  
  #####   Fonction
  
  ```java
  class Function {
882d59f8   mandjemb   Rapport
421
422
      List<Cell> listCells;
      
9f417dcb   mandjemb   Update rapport
423
      boolean creerCycle(Cell cell) {
882d59f8   mandjemb   Rapport
424
425
426
          
          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
23982881   [mandjemb]   update ihm
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
      }
  }
  
  ```
  
  ### LISTE DE TESTS
  
  Afin de s'assurer de la maintenabilité de notre code et de la qualité de
  celui-ci, nous allons réaliser plusieurs tests sur les différentes méthodes
  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`
  - 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é
08cc28cc   [mandjemb]   update ihm
448
449
450
  
  ## 2. STRUCTURE DU PROJET
  
3d82806c   [mandjemb]   rapp
451
  
e4ef4371   [mandjemb]   mm
452
453
  ### PACKAGES,CLASSES,FICHIERS DE DONNÉES
  
08cc28cc   [mandjemb]   update ihm
454
455
456
  L'implémentation du projet peut se résumer comme suit :
  
  ![PACKAGE](package.png)
e4ef4371   [mandjemb]   mm
457
458
459
460
461
462
  
  
  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
  
9f417dcb   mandjemb   Update rapport
463
464
465
  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 : 
e4ef4371   [mandjemb]   mm
466
  
9f417dcb   mandjemb   Update rapport
467
  **Commande de compilation**: 
e4ef4371   [mandjemb]   mm
468
  
294cf1f5   mandjemb   update
469
  mkdir -p bin|find src -not \( -path src/kernel/test -prune \) -name \*.java|xargs -i javac -d bin {} -cp src/ 
e4ef4371   [mandjemb]   mm
470
  
9f417dcb   mandjemb   Update rapport
471
  **Commande d'exécution**: 
882d59f8   mandjemb   Rapport
472
  
294cf1f5   mandjemb   update
473
474
  **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.
64bfe3ad   mandjemb   update
475
  
294cf1f5   mandjemb   update
476
477
  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**.
882d59f8   mandjemb   Rapport
478
  
3d82806c   [mandjemb]   rapp
479
480
481
  ## 3. BILAN 
  
  Au cours de ce projet les actions suivantes ont été faites :
e4ef4371   [mandjemb]   mm
482
  
882d59f8   mandjemb   Rapport
483
484
485
486
487
488
489
490
491
492
493
494
495
496
  ### Le noyeau
  
  - La gestion des cycles aussi bien direct qu'indirects.
  - La modification d'une case par des valeurs ou des formules et dans ce dernier cas la vérification qu'aucun cycle n'est créée.
  - La gestion de la langue (en francais et en anglais).
  - De supprimer une case que si elle existe et, n'est pas utilisée par d'autres cases.
  - De sérialiser l'état d'une grille après avoir effectué des actions.
  
  ### L'interface graphique
  
  L'interface graphique implementée permet d'effectuer les actions suivantes :
  
  - Créer une case à partir de d'une valeure.
  - Créer une case en saisissant une formule (aussi bien français qu'en anglais).
13e51102   mandjemb   img
497
498
499
500
501
502
     Par exemple, on crée la case A10=SOMME(A1,A2,B2)
     
    ![CASE](rapport_image/case_f.PNG)  
    
    ![CASE](rapport_image/case_fv.PNG)
    
1b85b400   mandjemb   update rf
503
  - Emettre une erreur lorsque l'on saisit du texte au lieu d'un double ou une formule incorrecte.
13e51102   mandjemb   img
504
505
    
    ![CASE](rapport_image/erreur_s.PNG)
1b85b400   mandjemb   update rf
506
507
  - Emettre une erreur indiquant qu'un cycle est généré.
  - Emettre une erreur indiquant qu'on ne peut pas supprimer une case utilisé par d'autres cases.
13e51102   mandjemb   img
508
509
    
    ![CASE](rapport_image/erreur_sup.PNG)
882d59f8   mandjemb   Rapport
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
  
  ### Les tests
  
  Plusieurs tests ont été réalisés au cours de ce projet notamment celles permettant de :
  
  - Créer une ou plusieurs cases
  - Mettre à jour une case avec une valeur ou formule
  - Créer une exception lorsqu'un cycle est créee
  - Créer une exception lorsqu'on utilise une case pas encore créée
  - Effectuer le re-calcul des cases qui dependent d'une case quand elle est modifiée
  - Supprimer une case que si elle n'est pas utilisée par d'autres cases
  
  
  ## Conclusion
  
2cc93bf1   mandjemb   update rf
525
  En résumé, ce projet de programmation par objet (PPO) avait pour but de développer les actions que l'on peut faire avec un classeur Excel usuel.Il était divisé en deux parties :
882d59f8   mandjemb   Rapport
526
  - La première, créée un noyeau avec differentes méthodes permettant d'effectuer et vérifier des actions comme la création, modification d'une case  avec des valeurs, opérations usuelles ou formules.
fe6de1ca   mandjemb   update rf
527
  - La deuxième, de créer un interface.
882d59f8   mandjemb   Rapport
528
529
  Ces deux parties ont été réalisées ainsi que des tests permettant de fonctionner le fonctionnement.
  ce projet nous a donc été bénéfique car, il nous a permis de pouvoir mettre en pratique nos connaisances tout en developpant des nouvelles.
fe6de1ca   mandjemb   update rf
530
  Aussi, concernant les améliorations possibles , l'on pourrait envisager de pouvoir ajouter dans l'interface une option permettant de choisir la langue étant donné qu'actuellement l'on fait un choix d'affichage dans une langue et l'utilisateur ne peut la modifier mais, peut rentrer le nom de d'une fonction dans les deux langues, sera fonctionnera.