Blame view

rapport_finale.md 14 KB
88514699   rtaniel   update rapport
1
  # RAPPORT FINAL
23982881   [mandjemb]   update ihm
2
3
4
5
  
  > ANDJEMBE Maksoudath, TANIEL Rémi
  
  Le but du projet est de réaliser un tableur "basique" mais facilement
88514699   rtaniel   update rapport
6
7
  extensible, l'application sera donc divisée en 2 parties :
  * le coeur (ou kernel)
23982881   [mandjemb]   update ihm
8
9
  * la partie graphique
  
88514699   rtaniel   update rapport
10
11
12
13
  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).
23982881   [mandjemb]   update ihm
14
  
08cc28cc   [mandjemb]   update ihm
15
  ## 1. ANALYSE ET CONCEPTION
23982881   [mandjemb]   update ihm
16
17
18
19
20
21
22
  
  
  ### SCHEMA UML
  
  Voici le schéma UML de notre application, les classes et méthodes
  abstraites sont en italique :
  
453ac322   mandjemb   up
23
  ![UML](rapport_image/uml.png)
23982881   [mandjemb]   update ihm
24
  
23982881   [mandjemb]   update ihm
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
      }
  }
  ```
  
  ### CHOIX STRUCTURE DE DONNÉES
  
  Nous devons choisir une structure de donnée pour stocker les cases dans 
88514699   rtaniel   update rapport
68
  notre grille, nous savons déjà que nous allons utiliser une collection
23982881   [mandjemb]   update ihm
69
70
71
72
73
74
75
76
77
78
79
  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 
88514699   rtaniel   update rapport
80
  du nom de la ligne et de l'indice de la colonne, exemple : "A1", "B9", etc...)
23982881   [mandjemb]   update ihm
81
  
88514699   rtaniel   update rapport
82
  Une case peut etre utilisée dans plusieurs autres cases, on ne connait 
23982881   [mandjemb]   update ihm
83
  pas le nombre d'autres cases où elle sera utilisée, on stockera donc 
88514699   rtaniel   update rapport
84
  cette donnée dans une `ArrayList<Case>`.
23982881   [mandjemb]   update ihm
85
  
88514699   rtaniel   update rapport
86
87
  Certaines fonctions (`Average`, `Sum`) utilise également une plage de case, 
  pour stocker ces cases, nous allons également une `ArrayList<Case>`.
23982881   [mandjemb]   update ihm
88
89
90
  
  ### METHODES ESSENTIELLES EN PSEUDO-JAVA
  
88514699   rtaniel   update rapport
91
  #### 1. Methode getValue
23982881   [mandjemb]   update ihm
92
  
9f417dcb   mandjemb   Update rapport
93
  Cette méthode retourne la valeur d'une case se trouvant dans une grille grâce aux coordonnées de la case.
88514699   rtaniel   update rapport
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.
23982881   [mandjemb]   update ihm
95
  ```java
882d59f8   mandjemb   Rapport
96
  class Grid {
9f417dcb   mandjemb   Update rapport
97
    Map<String, Cell> cells  = new HashMap<>();
23982881   [mandjemb]   update ihm
98
    
882d59f8   mandjemb   Rapport
99
    double getValue(String column, int line){
9f417dcb   mandjemb   Update rapport
100
      return this.getCell(column, line).getValue();
23982881   [mandjemb]   update ihm
101
102
103
    }
  }
  
882d59f8   mandjemb   Rapport
104
105
106
107
  class Cell {
    String column;
    int line;
    double value;
23982881   [mandjemb]   update ihm
108
    
882d59f8   mandjemb   Rapport
109
110
    double getValue() {
      return value;
23982881   [mandjemb]   update ihm
111
112
    }
  }
23982881   [mandjemb]   update ihm
113
114
  ```
  
88514699   rtaniel   update rapport
115
  #### 2. Methode getFormulaAsString
23982881   [mandjemb]   update ihm
116
  
88514699   rtaniel   update rapport
117
118
  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.
9f417dcb   mandjemb   Update rapport
119
  
23982881   [mandjemb]   update ihm
120
  ```java
882d59f8   mandjemb   Rapport
121
  class Grid {
9f417dcb   mandjemb   Update rapport
122
    Map<String, Cell> cells  = new HashMap<>();
23982881   [mandjemb]   update ihm
123
    
882d59f8   mandjemb   Rapport
124
125
    String getFormuleAsString(String column, int line) {
      return this.getCell(column, line).toString();
23982881   [mandjemb]   update ihm
126
127
128
    }
  }
  
882d59f8   mandjemb   Rapport
129
130
131
132
133
  class Cell {
    String column;
    int line;
    double value;
    Formula formula;
23982881   [mandjemb]   update ihm
134
135
    
    String getFormuleAsString() {
882d59f8   mandjemb   Rapport
136
137
        if (formula != null) 
            return formula.toString();
23982881   [mandjemb]   update ihm
138
139
140
141
        else
            return toString();
    }
  }
9f417dcb   mandjemb   Update rapport
142
  ```
88514699   rtaniel   update rapport
143
  
9f417dcb   mandjemb   Update rapport
144
  **Exemple pour Addition** (Opération Binaire)
23982881   [mandjemb]   update ihm
145
  
88514699   rtaniel   update rapport
146
147
148
  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.
  
9f417dcb   mandjemb   Update rapport
149
150
  ```java
  class BinaryOperation {
882d59f8   mandjemb   Rapport
151
152
      Cell leftCell;
      Cell rightCell;
23982881   [mandjemb]   update ihm
153
      
9f417dcb   mandjemb   Update rapport
154
155
156
157
158
159
160
161
162
  	public String toString() {
  		return "(" + this.leftCell.getId() + this.getOperator() + this.rightCell.getId() + ")";
  	}
  }
  class Addition {
      	
  	public String getOperator() {
  		return "+";
  	}
23982881   [mandjemb]   update ihm
163
  }
23982881   [mandjemb]   update ihm
164
165
  ```
  
882d59f8   mandjemb   Rapport
166
  #### 3. Methode getDevelopedFormula
23982881   [mandjemb]   update ihm
167
  
88514699   rtaniel   update rapport
168
169
170
171
172
  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)))
  
23982881   [mandjemb]   update ihm
173
  ```java
882d59f8   mandjemb   Rapport
174
  class Grid{
9f417dcb   mandjemb   Update rapport
175
    Map<String, Cell> cells  = new HashMap<>();
23982881   [mandjemb]   update ihm
176
    
882d59f8   mandjemb   Rapport
177
178
    String getDevelopedFormula(String column, int line) {
      return this.getCell(column,line).getFormuleDeveloppe();
23982881   [mandjemb]   update ihm
179
180
181
    }
  }
  
9f417dcb   mandjemb   Update rapport
182
  class Cell{
882d59f8   mandjemb   Rapport
183
184
185
186
187
    String column;
    int line;
    double value;
    Formula formula;
    List<Cell> usedIn = new ArrayList<>(); 
23982881   [mandjemb]   update ihm
188
    
882d59f8   mandjemb   Rapport
189
190
    String getDevelopedFormula() {
        if (formula != null)
9f417dcb   mandjemb   Update rapport
191
            return formula.getDevelopedFormula();
23982881   [mandjemb]   update ihm
192
193
194
195
        else
            return toString();
    }
  }
9f417dcb   mandjemb   Update rapport
196
197
198
  ```
  
  **Exemple de la méthode getDevelopedFormula() pour la class Average** (moyenne)
23982881   [mandjemb]   update ihm
199
  
9f417dcb   mandjemb   Update rapport
200
  ```java
882d59f8   mandjemb   Rapport
201
202
  class Average {
      List<Cell> listCases = new ArrayList<Cell>();
23982881   [mandjemb]   update ihm
203
      
882d59f8   mandjemb   Rapport
204
      String getDevelopedFormula() {
23982881   [mandjemb]   update ihm
205
206
207
208
209
210
          return Average + listCases.stream().map(c -> c.getFormuleDeveloppe()).collect((Collectors).joining(", ")) + ")";
      }
  }
  
  ```
  
88514699   rtaniel   update rapport
211
  #### 4. Methode eval
23982881   [mandjemb]   update ihm
212
  
88514699   rtaniel   update rapport
213
  Cette méthode permet de retourner le résultat d'un calcul avec des opérations binaires ou des fonctions.
9f417dcb   mandjemb   Update rapport
214
  
88514699   rtaniel   update rapport
215
  ##### Opération Binaire
9f417dcb   mandjemb   Update rapport
216
217
218
219
220
221
  
  class BinaryOperation {
      Cell leftCell;
      Cell rightCell;
      
  }
88514699   rtaniel   update rapport
222
223
  Les classes `Addition`, `Multiplication`, `Subtraction` et `Division` héritent de la classe `BinaryOperation` et utilisent 
  donc ses getters associés à `leftCell` et `rightCell`.
9f417dcb   mandjemb   Update rapport
224
  
23982881   [mandjemb]   update ihm
225
226
227
228
  - Dans Addition :
  
  ```java
  class Addition {
23982881   [mandjemb]   update ihm
229
230
  
    double eval() {
88514699   rtaniel   update rapport
231
        return getLeftCell().getValue() + getRightCell().getValue();
23982881   [mandjemb]   update ihm
232
233
234
235
236
237
238
239
240
    }
  }
  
  ```
  
  - Dans Multiplication :
  
  ```java
  class Multiplication {
9f417dcb   mandjemb   Update rapport
241
  
23982881   [mandjemb]   update ihm
242
    double eval() {
88514699   rtaniel   update rapport
243
        return getLeftCell().getValue() * getRightCell().getValue();
23982881   [mandjemb]   update ihm
244
245
246
247
    }
  }
  ```
  
23982881   [mandjemb]   update ihm
248
249
250
  - Dans Soustraction :
  
  ```java
88514699   rtaniel   update rapport
251
  class Subtraction {
23982881   [mandjemb]   update ihm
252
253
  
    double eval() {
88514699   rtaniel   update rapport
254
        return getLeftCell().getValue() - getRightCell().getValue();
23982881   [mandjemb]   update ihm
255
256
257
258
259
260
261
262
263
    }
  }
  
  ```
  
  - Dans Division :
  
  ```java
  class Division {
9f417dcb   mandjemb   Update rapport
264
  
23982881   [mandjemb]   update ihm
265
    double eval() {
88514699   rtaniel   update rapport
266
      return getLeftCell().getValue() / getRightCell().getValue();
23982881   [mandjemb]   update ihm
267
268
269
270
    }
  }
  
  ```
9f417dcb   mandjemb   Update rapport
271
272
273
274
  ##### Fonctions
  
  class Function {
      List<Cell> listCells;
9f417dcb   mandjemb   Update rapport
275
  }
88514699   rtaniel   update rapport
276
  Les classes `Average` et `Sum` héritent de la classe `Function` et utilisent donc le getter associé à `listCells`. 
23982881   [mandjemb]   update ihm
277
278
279
280
  
  - Dans Moyenne :
  
  ```java
882d59f8   mandjemb   Rapport
281
  class Average {
23982881   [mandjemb]   update ihm
282
283
284
  
    double eval() {
      double val=0;
23982881   [mandjemb]   update ihm
285
      if (listCases.size() != 0)
88514699   rtaniel   update rapport
286
287
288
          for(Cell c : getUtilisedCells())
              val += c.getValue();
          return val / getUtilisedCells().size();
23982881   [mandjemb]   update ihm
289
      else
88514699   rtaniel   update rapport
290
          leve une exception
23982881   [mandjemb]   update ihm
291
292
293
294
295
296
297
    }
  }
  
  ```
  - Dans Somme :
  
  ```java
882d59f8   mandjemb   Rapport
298
  class Sum {
23982881   [mandjemb]   update ihm
299
300
301
  
    double eval() {
      double val=0;
88514699   rtaniel   update rapport
302
303
304
      for(Cell c : getUtilisedCells())
          val += c.getValue();
      return val;
23982881   [mandjemb]   update ihm
305
306
307
308
309
    }
  }
  
  ```
  
9f417dcb   mandjemb   Update rapport
310
311
  #### 5. Methode setValue
  
88514699   rtaniel   update rapport
312
313
314
  Nous différencions une valeur fixe et une formule quand nous souhaitons une cellule.
  De plus, si la cellule est utilisée dans une autre, nous propageons la nouvelle valeur
  pour modifier la valeur des cellules en conséquence.
23982881   [mandjemb]   update ihm
315
316
  
  ```java
882d59f8   mandjemb   Rapport
317
  class Grid {
9f417dcb   mandjemb   Update rapport
318
    Map<String, Cell> cells  = new HashMap<>();
23982881   [mandjemb]   update ihm
319
    
88514699   rtaniel   update rapport
320
321
    void setValue(String column, int line, double v)  {
  		this.getCell(column, line).setValue(v);
9f417dcb   mandjemb   Update rapport
322
  	}
23982881   [mandjemb]   update ihm
323
324
  }
  
882d59f8   mandjemb   Rapport
325
  class Cell {
9f417dcb   mandjemb   Update rapport
326
327
328
329
330
    String column;
    int line;
    double value;
    Formula formula;
    List<Cell> usedIn = new ArrayList<Cell>(); 
23982881   [mandjemb]   update ihm
331
    
88514699   rtaniel   update rapport
332
333
334
335
    void setValue(double v) {
      value = v;
      for(Cell c : usedIn)
         c.updateValue();
23982881   [mandjemb]   update ihm
336
337
    }
  }
23982881   [mandjemb]   update ihm
338
339
  ```
  
9f417dcb   mandjemb   Update rapport
340
341
  #### 5. Methode setFormula
  
88514699   rtaniel   update rapport
342
343
344
  Cette méthode assigne une formule à une case en étant sûre qu'un cycle n'est pas créée, 
  une exception est lévée dans le cas où un cycle est crée.
  
23982881   [mandjemb]   update ihm
345
  ```java
882d59f8   mandjemb   Rapport
346
347
  class Grid {
    Map<String, Cell> cases  = new HashMap<>();
23982881   [mandjemb]   update ihm
348
    
9f417dcb   mandjemb   Update rapport
349
    void setFormula(String column, int line, Formula formula) {
88514699   rtaniel   update rapport
350
      this.getCell(column, line).setFormula(formula);
23982881   [mandjemb]   update ihm
351
352
353
    }
  }
  
882d59f8   mandjemb   Rapport
354
  class Cell {
9f417dcb   mandjemb   Update rapport
355
356
357
358
359
    String column;
    int line;
    double value;
    Formula formula;
    List<Cell> usedIn = new ArrayList<Cell>(); 
23982881   [mandjemb]   update ihm
360
    
9f417dcb   mandjemb   Update rapport
361
362
    void updateValue() {
        valeur = formula.eval();
23982881   [mandjemb]   update ihm
363
364
    }
    
9f417dcb   mandjemb   Update rapport
365
366
    void setFormula(Formula formula) {
      if (!formula.createCycle(this))
23982881   [mandjemb]   update ihm
367
        formule = formula;
9f417dcb   mandjemb   Update rapport
368
        updateValue();
88514699   rtaniel   update rapport
369
370
        for(Cell c : usedIn)
          c.updateValue();
23982881   [mandjemb]   update ihm
371
      else
88514699   rtaniel   update rapport
372
        leve une exception
23982881   [mandjemb]   update ihm
373
374
    }
  }
9f417dcb   mandjemb   Update rapport
375
376
377
  ```
  #### 5. Methode createCycle
  
88514699   rtaniel   update rapport
378
379
  Cette méthode vérifie si on crée un cycle direct ou indirect. La façon de la définir est différente 
  si on a une opération binaire ou une fonction.
9f417dcb   mandjemb   Update rapport
380
381
  
  #####   Opération binaire
23982881   [mandjemb]   update ihm
382
  
9f417dcb   mandjemb   Update rapport
383
384
385
386
  ```java
  class BinaryOperation {
      Cell leftCell;
      Cell rightCell;
23982881   [mandjemb]   update ihm
387
      
9f417dcb   mandjemb   Update rapport
388
      boolean createCycle(Cell cell) {
88514699   rtaniel   update rapport
389
390
391
          Si la case gauche contient une formule, voir si on crée un cycle avec la fonction
          Sinon si la case droite en contient une, voir si on crée un cycle avec
          Sinon vérifier que la case à droite et à gauche sont égales avec celle donnée en paramètre
882d59f8   mandjemb   Rapport
392
393
      }
  }
9f417dcb   mandjemb   Update rapport
394
395
396
397
398
399
  ```
  
  #####   Fonction
  
  ```java
  class Function {
882d59f8   mandjemb   Rapport
400
401
      List<Cell> listCells;
      
9f417dcb   mandjemb   Update rapport
402
      boolean creerCycle(Cell cell) {
882d59f8   mandjemb   Rapport
403
          Si la case n'est pas dans listCells
88514699   rtaniel   update rapport
404
          Sinon pour toute les cases dans listCells qui contiennent des formules, regarder si on crée un cycle avec
23982881   [mandjemb]   update ihm
405
406
407
408
409
410
411
412
413
414
415
416
417
      }
  }
  
  ```
  
  ### 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
88514699   rtaniel   update rapport
418
419
  - Création d'une case avec une formule d'opération binaire et une 
  fonction comme une moyenne
23982881   [mandjemb]   update ihm
420
421
422
423
424
425
  - 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é
88514699   rtaniel   update rapport
426
  - Sauvegarde d'une grille
08cc28cc   [mandjemb]   update ihm
427
428
429
  
  ## 2. STRUCTURE DU PROJET
  
88514699   rtaniel   update rapport
430
  ### PACKAGES, CLASSES, FICHIERS DE DONNÉES
e4ef4371   [mandjemb]   mm
431
  
08cc28cc   [mandjemb]   update ihm
432
433
  L'implémentation du projet peut se résumer comme suit :
  
88514699   rtaniel   update rapport
434
  ![PACKAGE](package.png)
e4ef4371   [mandjemb]   mm
435
  
88514699   rtaniel   update rapport
436
437
  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).
e4ef4371   [mandjemb]   mm
438
439
440
  
  ### MODES D'UTILISATION
  
9f417dcb   mandjemb   Update rapport
441
  Concernant les commandes de compilation et d'exécution, sous des logiciels comme Eclipse ou IntelliJ par exemple, juste un clique bouton suffit.
88514699   rtaniel   update rapport
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 : 
e4ef4371   [mandjemb]   mm
443
  
9f417dcb   mandjemb   Update rapport
444
  **Commande de compilation**: 
e4ef4371   [mandjemb]   mm
445
  
88514699   rtaniel   update rapport
446
  find src -not \( -path src/kernel/test -prune \) -name \*.java|xargs -i javac -d bin {} -cp src/ 
e4ef4371   [mandjemb]   mm
447
  
9f417dcb   mandjemb   Update rapport
448
  **Commande d'exécution**: 
882d59f8   mandjemb   Rapport
449
  
88514699   rtaniel   update rapport
450
451
  java -cp bin app.Menu
  java -cp bin ihm.TablooProto
882d59f8   mandjemb   Rapport
452
  
3d82806c   [mandjemb]   rapp
453
454
  ## 3. BILAN 
  
88514699   rtaniel   update rapport
455
  Au cours de ce projet, voici ce que nous avons réalisé :
e4ef4371   [mandjemb]   mm
456
  
882d59f8   mandjemb   Rapport
457
458
459
460
461
462
463
464
465
466
467
468
469
470
  ### 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
471
472
473
474
475
476
     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
477
  - Emettre une erreur lorsque l'on saisit du texte au lieu d'un double ou une formule incorrecte.
13e51102   mandjemb   img
478
479
    
    ![CASE](rapport_image/erreur_s.PNG)
1b85b400   mandjemb   update rf
480
481
  - 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
482
483
    
    ![CASE](rapport_image/erreur_sup.PNG)
882d59f8   mandjemb   Rapport
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
  
  ### 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
499
  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
500
  - 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
501
  - La deuxième, de créer un interface.
882d59f8   mandjemb   Rapport
502
503
  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
504
  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.