Download
plus en avant dans les classes introduction aux tableaux partir de l exemple du jeu de la vie n.
Skip this Video
Loading SlideShow in 5 Seconds..
Plus en avant dans les classes Introduction aux tableaux à partir de l'exemple du jeu de la vie PowerPoint Presentation
Download Presentation
Plus en avant dans les classes Introduction aux tableaux à partir de l'exemple du jeu de la vie

Plus en avant dans les classes Introduction aux tableaux à partir de l'exemple du jeu de la vie

102 Vues Download Presentation
Télécharger la présentation

Plus en avant dans les classes Introduction aux tableaux à partir de l'exemple du jeu de la vie

- - - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

  1. Plus en avant dans les classesIntroduction aux tableauxà partir de l'exemple du jeu de la vie

  2. Le jeu de la vie John Conway 1970 But : modéliser l'évolution d'organismes vivants Exemple de programme http://www.bitstorm.org/gameoflife/

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

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

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

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

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

  8. 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; }

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

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

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

  12. Evolution d'une cellule public void nouvelEtat(int nbV) { } vide [4  nbV ou nbV  1] [nbV = 3] occupée [2  nbV  3]

  13. 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; }

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

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

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

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

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

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

  20. 0 49 T Rappels • Le premier indice d'un tableau est 0 • T[0] • Attribut length • T.length T.length ? 50

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

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

  23. Date T[] = new Date [3]; T T[0] = new Date(...);T[1] = new Date(...);T[2] = new Date(...);

  24. 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';

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

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

  27. 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);

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