280 likes | 387 Views
Plus en avant dans les classes Introduction aux tableaux à partir de l'exemple du jeu de la vie. Le jeu de la vie. John Conway 1970 But : modéliser l'évolution d'organismes vivants. Exemple de programme. http://www.bitstorm.org/gameoflife/. n = 3 naissance. 4 n ou n 1 mort.
E N D
Plus en avant dans les classesIntroduction aux tableauxà partir de l'exemple du jeu de la vie
Le jeu de la vie John Conway 1970 But : modéliser l'évolution d'organismes vivants Exemple de programme http://www.bitstorm.org/gameoflife/
n = 3naissance 4 n ou n 1mort 2 n 3survie Règles de vie et mort des organismes n : nombre de cellules voisines hébergeantun organisme vivant cellule vide cellule occupée Automateà 2 états
Le nombre de voisins (vivants) est fourni(sinon il faudrait que les cellules connaissent la matrice qui les contient) Cellule - l : int- c : int- occupee : boolean- age : int + constructeurs+ estOccupee(): boolean+ naitre()+ nouvelEtat(in nbVoisins : int)+ toString()+ afficher() : String
public Cellule(int l, int c, boolean occupee) // initialise cellule avec position (l,c) avec un// occupant d'âge 0 si occupee = true, sinon sans occupant public Cellule(int l, int c) // initialise cellule avec position (l,c) sans occupant Rappels : 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 classepas de type de retour (même pas void)
A la création d'un objet, le compilateur décide duconstructeur à appeler au vu de la liste des paramètres effectifs Cellule c;c = 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)
Mais … 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
Mais on préfère cette forme d'écriture : public Cellule(int l, int c, boolean occupee) { this.l = l;this.c = c;this.occupee = occupee; if (occupee) age = 0; else age = -1 ; } Le 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; }
écriture équivalente public boolean estOccupee() { return this.occupee; } this public boolean estOccupee() { return occupee; } Dans une méthode,thisréférence l’objet receveur 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 l’objet lui-même
Pour le compilateur : qu’est-ce que ça peut être? Règles de priorité paramètre/attribut public boolean estOccupee() { return occupee; } paramètre variable locale attribut Paramètreset variables locales ont même prioritéIls sont prioritaires sur les attributs
public Cellule(int l, int c, boolean occupee) { this.l = l;this.c = c;this.occupee = occupee; if (occupee) age = 0; else age = -1 ; } Paramètre prioritaire sur l’attribut. 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 nommechaque paramètre comme l’attribut qu’il initialise
Evolution d'une cellule public void nouvelEtat(int nbV) { } vide [4 nbV ou nbV 1] [nbV = 3] occupée [2 nbV 3]
Evolution 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; }
L'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?
valeur de type primitif : • 'a' --> "a" • 123 --> "123" • true --> "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"
construction 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 + ' ' + occupeequ'obtiendrait-on ?
Passons à 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 lamatricede cellules ?
manipulé par des variables références int [] T; int T []; // à la C++ Création d'une référence de type "tableau d'entiers" • créé par new T = new int [50]; Création d'un tableau de 50 entiers Tableau
0 49 0 9 T int 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
0 49 T Rappels • Le premier indice d'un tableau est 0 • T[0] • Attribut length • T.length T.length ? 50
Raccourci syntaxique"initialiseur" int T [] = {4,10,2002} int T [] = new int [3]; T[0] = 4; T[1] = 10; T[2] = 2002; Ce n'est qu'un raccourci
Et les tableaux d'objets? int T []= new int [3]; Crée un tableau de 3 entiers Date T[] = new Date[3]; Crée un tableau de quoi? De références Aucun objet Date n’est créé
Date T[] = new Date [3]; T T[0] = new Date(...);T[1] = new Date(...);T[2] = new Date(...);
Tableau à plusieurs dimensions 'a' 3 lignes6 colonnes char [] [] T = new char [3][6]; char [] T [] Tableau de tableaux de caractères T[0][1] = 'a';
T char [][] T = new char [3][6]; Décomposons : (1) char [][] T = new char [3][]; (2)for (int c = 0; c < 3; c++) T[c] = new char [6]; T.length ? 3 T[0].length ? 6
On peut ainsi créer des tableaux qui ne sont pas "rectangulaires" (1) char [] [] T = new char [3][]; (2)for (int c = 0; c < 3; c++) T[c] = new char [6-c]; T
Revenons à 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 [nbLig][nbCol]; for(int i = 0; i < nbLig ; i++) for (int j = 0; j < nbCol; j++) matrice [i][j] = new Cellule(i,j);
public void creerVie(int l, int c) { } matrice[l][c].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 bornesde la matrice...ArrayOutOfBound Exception