1 / 28

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

donat
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

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

More Related