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.
|