Title: Plus en avant dans les classes Introduction aux tableaux
1Plus en avant dans les classesIntroduction aux
tableauxà partir de l'exemple du jeu de la vie
2Le jeu de la vie
John Conway 1970 But modéliser l'évolution
d'organismes vivants
Exemple de programme
http//www.bitstorm.org/gameoflife/
3Règles de vie et mort des organismes
n nombre de cellules voisines hébergeantun
organisme vivant
cellule vide
cellule occupée
Automateà 2 états
4Cellule - l int- c int- occupee boolean-
age int constructeurs estOccupee()
boolean naitre() nouvelEtat(in nbVoisins
int) toString() afficher() String
5Rappels constructeurs
Constructeur méthode spéciale, appelée
automatiquement après la créationd'une instance
de cette classe
Syntaxe même nom que la classe pas de type de
retour (même pas void)
6A la création d'un objet, le compilateur décide
duconstructeur à appeler au vu de la liste des
paramètres effectifs
Cellule cc new Cellule(1,1) //?
constr. 2
c new Cellule(2,2,true) //?
constr. 1
c new Cellule(1,1,4) // ?
??
À la création d'un objet, il faut qu'un
constructeur puisse être appelé
- Et si la classe ne définissait aucun
constructeur? - Constructeur par défaut (sans paramètre,
corps vide)
7Mais
Si la classe définit (au moins) un
constructeur,le constructeur par défaut est
inhibé
Cellule c new Cellule ()
Erreur!
Si le programmeur gère les constructeurs, il les
gère tous ! Sauf cas très spécial TOUJOURS
écrire un constructeur par défaut
8Le 1er constructeur aurait pu s'écrire ainsi
public Cellule(int lig, int col, boolean oc) l
lig c col occupee oc if (oc) age 0
else age -1
9this
- Dans une méthode, this référence lobjet receveur
public boolean estOccupee() return occupee
Ici, this serait superflumais on en a parfois
besoin.
Exemple en cas de conflit entre un nom de
paramètre et un nom d'attribut ou pour manipuler
lobjet lui-même
10Règles de priorité paramètre/attribut
- public boolean estOccupee()
- return occupee
paramètre
variable locale
attribut
Paramètres et variables locales ont même
prioritéIls sont prioritaires sur les attributs
11Paramètre prioritaire sur lattribut. Donc l, c
et occupee désignent les paramètres
D'où l'utilisation de this pour désigner les
attributs
Convention dans les constructeurs, on nomme
chaque paramètre comme lattribut quil
initialise
12Evolution d'une cellule
public void nouvelEtat(int nbV)
vide
4 ? nbV ou nbV ? 1
nbV 3
occupée
2 ? nbV ? 3
13Evolution d'une cellule
public void nouvelEtat(int nbVoisins)
if (occupee) if ((nbVoisins 2)
(nbVoisins 3)) age else occupee
false age -1 else if
(nbVoisins 3) occupee true age 0
14L'opérateur
A B
- Si A et B sont des expressions de type
numérique, addition - (char est vu comme un type numérique)
- Si A ou B est une chaîne (instance de String),
concaténation - L'autre argument, s'il n'est pas une chaîne est
converti en une String
Comment?
15- valeur de type primitif
- 'a' --gt "a"
- 123 --gt "123"
- true --gt "true"
- objet appel de sa méthode toString()
"état cellule " cel
"état cellule " cel.toString()
"état cellule " "1 1 true"
? "état cellule 1 1 true"
16construction de gauche à droite(en prenant par
ex, l 2c 4occupee true)
l " " c " " occupee
"2 " c " " occupee
"2 4" " " occupee
"2 4 " occupee
"2 4 true"
En déduire une technique toute simplepour
traduire un entier en une String
Si l'on écrivait l ' ' c ' ' occupee
qu'obtiendrait-on ?
17Passons à la classe Monde
- Seule est donnée son interface publique
- Ecrire la partie implémentation
- attributs privés
- corps des méthodes publiques
- ajout de méthodes privées éventuelles
Comment créer et initialiser la matrice de
cellules ?
18Tableau
19int T null T new int 50 T new int
10
L'espace mémoire réservé au tableau qui n'est
plus référencé sera libéré par le ramasse-miettes
20Rappels
- Le premier indice d'un tableau est 0
- T0
- Attribut length
- T.length
T.length ? 50
21Raccourci syntaxique"initialiseur"
int T 4,10,2002
int T new int 3 T0 4 T1 10 T2
2002
Ce n'est qu'un raccourci
22Et les tableaux d'objets?
int T new int 3 Crée un tableau de 3
entiers Date T new Date3 Crée un tableau
de quoi?
De références
Aucun objet Date nest créé
23T0 new Date(...)T1 new Date(...)T2
new Date(...)
24Tableau à plusieurs dimensions
'a'
3 lignes6 colonnes
char T new char 36
char T
Tableau de tableaux de caractères
T01 'a'
25char T new char 36
Décomposons
(1) char T new char 3
(2) for (int c 0 c lt 3 c) Tc new
char 6
T.length ?
3
T0.length ?
6
26On peut ainsi créer des tableaux qui ne sont pas
"rectangulaires"
(1) char T new char 3
(2) for (int c 0 c lt 3 c) Tc new
char 6-c
T
27Revenons à la classe Monde
Attribut matrice
private Cellule matrice
Construction effective de la matrice
public Monde() // initialise le monde avec des
cellules inoccupées
matrice new Cellule nbLignbCol
for(int i 0 i lt nbLig i) for (int j
0 j lt nbCol j) matrice ij new
Cellule(i,j)
28public void creerVie(int l, int c)
matricelc.naitre()
Exercice - Exercice - Exercice public void
nouvelleGeneration() // fait passer le monde Ã
une nouvelle // génération
- Problème ne pas modifier la matrice alors que
tous les voisinages n'ont pas été calculés
- Attention à ne pas sortir des bornes de la
matrice... ArrayOutOfBound Exception