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
|
}
}
```
|
08cc28cc
[mandjemb]
update ihm
|
410
411
|
## 2. STRUCTURE DU PROJET
|
88514699
rtaniel
update rapport
|
412
|
### PACKAGES, CLASSES, FICHIERS DE DONNÉES
|
e4ef4371
[mandjemb]
mm
|
413
|
|
08cc28cc
[mandjemb]
update ihm
|
414
415
|
L'implémentation du projet peut se résumer comme suit :
|
88514699
rtaniel
update rapport
|
416
|
![PACKAGE](package.png)
|
e4ef4371
[mandjemb]
mm
|
417
|
|
88514699
rtaniel
update rapport
|
418
419
|
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
|
420
421
422
|
### MODES D'UTILISATION
|
9f417dcb
mandjemb
Update rapport
|
423
|
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
|
424
|
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
|
425
|
|
9f417dcb
mandjemb
Update rapport
|
426
|
**Commande de compilation**:
|
e4ef4371
[mandjemb]
mm
|
427
|
|
88514699
rtaniel
update rapport
|
428
|
find src -not \( -path src/kernel/test -prune \) -name \*.java|xargs -i javac -d bin {} -cp src/
|
e4ef4371
[mandjemb]
mm
|
429
|
|
9f417dcb
mandjemb
Update rapport
|
430
|
**Commande d'exécution**:
|
882d59f8
mandjemb
Rapport
|
431
|
|
88514699
rtaniel
update rapport
|
432
433
|
java -cp bin app.Menu
java -cp bin ihm.TablooProto
|
882d59f8
mandjemb
Rapport
|
434
|
|
3d82806c
[mandjemb]
rapp
|
435
436
|
## 3. BILAN
|
88514699
rtaniel
update rapport
|
437
|
Au cours de ce projet, voici ce que nous avons réalisé :
|
e4ef4371
[mandjemb]
mm
|
438
|
|
882d59f8
mandjemb
Rapport
|
439
440
441
442
443
|
### 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).
|
a174fc7a
rtaniel
update rapport
|
444
445
|
- De supprimer une case que si elle existe et, si elle n'est pas utilisée par d'autres cases.
- De sauvegarder l'état d'une grille après avoir effectué des actions, puis de pouvoir la récupérer.
|
882d59f8
mandjemb
Rapport
|
446
447
448
449
450
|
### L'interface graphique
L'interface graphique implementée permet d'effectuer les actions suivantes :
|
a174fc7a
rtaniel
update rapport
|
451
452
453
|
- Créer une case en saisissant une valeur.
- Créer une case en saisissant une formule (aussi bien en français qu'en anglais).
Par exemple, on écrit dans la cellule A10 : "=SOMME(A1,A2,B2)"
|
13e51102
mandjemb
img
|
454
455
456
457
458
|
![CASE](rapport_image/case_f.PNG)
![CASE](rapport_image/case_fv.PNG)
|
a174fc7a
rtaniel
update rapport
|
459
|
- Emettre une erreur lorsque l'on saisit du texte au lieu d'un double ou une formule inconnue / incorrecte.
|
13e51102
mandjemb
img
|
460
461
|
![CASE](rapport_image/erreur_s.PNG)
|
a174fc7a
rtaniel
update rapport
|
462
|
|
1b85b400
mandjemb
update rf
|
463
|
- Emettre une erreur indiquant qu'un cycle est généré.
|
a174fc7a
rtaniel
update rapport
|
464
|
- Emettre une erreur indiquant qu'on ne peut pas supprimer une cellule qui est utilisée par d'autres cellules.
|
13e51102
mandjemb
img
|
465
|
|
a174fc7a
rtaniel
update rapport
|
466
|
![CASE](rapport_image/erreur_sup.PNG)
|
882d59f8
mandjemb
Rapport
|
467
468
469
470
471
|
### Les tests
Plusieurs tests ont été réalisés au cours de ce projet notamment celles permettant de :
|
a174fc7a
rtaniel
update rapport
|
472
|
- Créer une ou plusieurs cases avec une valeur fixe ou une formule
|
882d59f8
mandjemb
Rapport
|
473
474
|
- Mettre à jour une case avec une valeur ou formule
- Créer une exception lorsqu'un cycle est créee
|
a174fc7a
rtaniel
update rapport
|
475
476
|
- Créer une exception lorsqu'on utilise une case qui n'est pas encore créée
- Effectuer le re-calcul des cases qui dépendent d'une case quand elle est modifiée
|
882d59f8
mandjemb
Rapport
|
477
|
- Supprimer une case que si elle n'est pas utilisée par d'autres cases
|
a174fc7a
rtaniel
update rapport
|
478
|
- Sauvegarde d'une grille
|
882d59f8
mandjemb
Rapport
|
479
480
481
|
## Conclusion
|
a174fc7a
rtaniel
update rapport
|
482
483
484
485
486
487
|
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 :
- La première, créée un noyau 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.
- La deuxième, de créer une interface graphique.
Ces deux parties ont été réalisées ainsi que des tests permettant de vérifier le fonctionnement de notre noyau.
|
882d59f8
mandjemb
Rapport
|
488
|
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
|
489
|
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.
|