IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

erreur dans main "no enclosing instance"


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut erreur dans main "no enclosing instance"
    bonjour j'ai cette érreur et je ne vois pas ou est le problème ?
    erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    No enclosing instance of type Magie is accessible. Must qualify the allocation with an enclosing instance of type Magie (e.g. x.new A() where x is an instance of Magie).
    je vous met le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    import java.util.Scanner;
     
    public class Magie {
    	static Scanner clavier = new Scanner(System.in);
     
    	public static void main(String[] args) {
    			Spectateur spec = new Spectateur()	; "l érreur est sur cette ligne j ai new Spectateur de souligné ?"
    	}
    	class Spectateur{
    		//attributs
    		int age;
    		int argent;
     
    		//méthode arrive ou on me demande mon âge et mon argent
    		void arriveEtEcrit() {
    			System.out.println("[Spectateur] j'entre en scène");
    			System.out.println("Mon âge ?");
    			age = clavier.nextInt();
    			//je repeté la question si la somme est plus grande que 100€
    			do {
    				System.out.println("Combien j'ai d'argent ? (<=100€)?");
    				argent = clavier.nextInt();
    			}while(argent>100);
    			System.out.println("[spectateur]j'ai le montant qui convient");
    		}
    		int lireAge() {
    			return age;
    		}
    		int lireArgent() {
    			return argent;
    		}
    	}
     
     
     
    }
    j 'essai de tester au fur et à mesure mon code et là ??
    merci pour vos réponses

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Hello,

    déjà, c'est un peu bizarre que tu mettes une classe dans une classe. Tu pouvais pas tout mettre juste dans la classe Magie ? Et si tu voulais une autre classe, tu pouvais pas la mettre en dehors de la classe Magie ?

    Bon, on va dire que tu essaies d'apprendre comment on se sert de classes à l'intérieur d'autres classes.

    Ton code actuel a l'air de vouloir se servir de la classe Spectateur comme si elle était static. Or elle ne l'est pas, donc... Ça marche pas.

    Pour rappel, quand un champ, une méthode, ou une classe imbriquée n'est pas static, ça veut dire qu'ils sont associés aux instances de la classe qui les contient.

    Un champ age de la classe Person, s'il n'est pas static, ça veut dire que tous les objets de classe Person ont leur propre age, et qu'il y a des gens qui ont 24 ans, d'autre 48 ans.
    Une méthode direMonAge() de la classe Person, si elle n'est pas static, ça veut dire qu'on ne peut l'appeler que sur une instance de la classe Person. Genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Person paul = new Paul(48);
    paul.direMonAge();
    Et une classe imbriquée Hobby de la classe Person, si elle n'est pas static, ça veut dire qu'on ne peut pas avoir d'instance de Hobby qui ne soit pas liée à une instance de Person, genre le canoë Kayak, c'est un Hobby de paul, pas de n'importe qui.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Paul paul = new Paul(48);
    Person.Hobby paulFaitDuKayak = paul.new Hobby("kayak");
    ---

    Or toi, tout ça au-dessus, c'est pas ce que tu veux. Ton objet Spectateur, tu le veux pas spécialement attaché à un objet Magie.

    Il faudrait donc que la classe Spectateur soit static. Ou placée en dehors de Magie.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Le problème est que la classe Spectateur est une classe interne de la classe Magie : il n'est donc possible de l'instancier que dans le contexte d'une instance de Magie, or le contexte statique de la méthode main n'est pas un contexte d'instance puisque static.

    C'est la même idée dans ce genre de cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Exemple {
        public void exemple() {
            System.out.println("Execution exemple...");
        }
        public static void main(String[] args)  {
               exemple();
        }
    }
    On ne peut pas appeler exemple() directement : il faut avoir une instance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exemple exemple = new Exemple();
    exemple.exemple();
    Avec la création de classe, c'est un peu plus compliqué : on ne peut pas créer une instance de classe Spectateur de l'extérieur de la classe Magie. Le code suivant ne fonctionnerait donc pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Magie magie = new Magie(); 
    Spectateur spec = new magie.Spectateur();
    Les classes internes sont faites pour être utilisées de manière interne. Dans le cas contraire :

    1. Soit la classe doit être déclarée externe, dans un autre fichier .java donc
    2. Dans le cadre d'un exercice, ou dans d'autres cadres (que je n’expliciterai pas ici), on peut simplement déclarer la classe Spectateur static, ce qui permet de l'instancier dans un contexte statique :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      static class Spectateur{
    3. Dans le cadre d'un exercice (dans une vraie application professionnelle, ce n'est pas vraiment une bonne idée à mon avis, pour des raisons que je n'expliciterai pas ici), on peut éventuellement déclarer la classe Spectateur externe mais dans le même fichier (regarde bien les accolades pour voir la différence) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      public class Magie {
      	static Scanner clavier = new Scanner(System.in);
       
      	public static void main(String[] args) {
      			Spectateur spec = new Spectateur()	; 
      	}
      }
      class Spectateur{ 
      /** etc **/
      }
    4. Il faut réfléchir à l'organisation du programme et quelle est la meilleure solution. Dans le cadre d'un exercice, on peut choisir la solution la plus simple/rapide : dans ton cas, la 2 permet de conserver qu'un seul fichier .java, donc ça pourrait être une solution. Mais tout dépend réellement de l'énoncé. Peut-être que tu dois faire quelque chose plus dans le genre (conserver l'aspect interne et procéder à l'instanciation en interne) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      public class Magie {
       
          public Magie() {
                Spectateur spectateur = new Spectateur();
          }
          public static void main(String[] args) {
               new Magie();
          }
       
          class Spectateur {
          }
       
      }


    Attention, dans les cas 2 et 3, la variable statique clavier n'est plus directement. Il faut donc adapter. Par exemple, en changeant l'accès par Magie.clavier tant que le code fait partie d'une classe du même package (puisque la portée de clavier est package). Il y a plein d'autres manières que je n'expliciterai pas ici.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  4. #4
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    mais oui, j'avais pas fait attention que la classe magie englobait tout au lieu d englober que le main , c est pour ça que je n 'avait jamais eu cette erreur ,c'est le métier qui rentre .
    merci à tout les 2 pour votre aide.

  5. #5
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    je vous met une partie du code car je suis coinçé, je n 'arrive pas à passer la valeur "age" de la class spectateur à "ageLu" de la class Assistant ,Pourtant en paramètre de la méthode lire de la class Assistant je déclare un objet papier de type Spectateur pour ensuite me servir de la méthode "age" sur cet objet =>" papier.age()"
    en écrivant ageLu = papier.age(); ne récupère t'on pas la valeur de retour de la méthode age ?
    un morceau du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    import java.util.Scanner;
     
    public class Magie {
     
    	public static void main(String[] args) {
    		 Spectateur pierre = new Spectateur() ;
    		 Assistant charles = new Assistant();
    		// Magicien gandalf = new Magicien();
    		// gandalf.tourDeMagie(pierre, charles);
    		 pierre.arriver();
    		 pierre.age();
    		 charles.calculer();
     
    	}
    }
    	class Spectateur {
    		// attributs
    		static Scanner clavier = new Scanner(System.in);
    		private int age;
    		private int argent;
     
    		// méthode arrive ou on me demande d ecrire sur un papier mon âge et mon argent
    		public void arriver() {
    			System.out.println("[Spectateur] j'entre en scène");
    			System.out.print("Mon âge ? ");
    			age = clavier.nextInt();
    			// je repete la question si la somme est plus grande que 100€
    			do {
    				System.out.print("Combien j'ai d'argent ? (<=100€)? ");
    				argent = clavier.nextInt();
    			} while (argent > 100);
    			System.out.println("[spectateur]j'ai le montant qui convient");
    		}
     
    		public void ecrire() {
    			System.out.println("[spectateur]J'écris le papier");
    		}
    		public int age() {
    			System.out.println(age);
    			return age;
     
    		}
    		public int argent() {
    			return argent;
    		}
     
     
    	}
     
    	class Assistant {
    		// attributs
    		private int ageLu;
    		private int argentLu;
    		private int resultat;
     
    		// il faut une méthode pour calculer le résultat obtenu avec l'âge et l'argent  lu sur le papier
     
    		public void Lire(Spectateur papier) {
    			System.out.println("[assistant] je lis le papier");
    			ageLu = papier.age();
    			argentLu = papier.argent();
     
     
    		}	
    		public void calculer() {	
    			System.out.println("[assistant]je calcul mentalement");
    			System.out.println(ageLu);
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
    		}
     
    		// ensuite il faut donner le resultat à voix haute
    		int direAHauteVoix() {
    			System.out.println("[assistant] j'annonce " + resultat);
    			return resultat;
    		}
     
    	}
    merci pour vos réponse, j 'ai mis quelques print pour m'aider mais j ai "0"

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    pierre.age();
    charles.calculer();
    L'appel de pierre.age() ne fait que lire la propriété age et n'en fait rien... il n'y a en tout cas aucune raison que ça modifie la variable ageLu de charles.

    Tu as une méthode lire(Spectateur) dans Assistant. Ce n'est pas la meilleure façon de faire, mais au moins l'appel de cette méthode initialiserait bien les variables de Assistant, ageLu et argentLu, utilisés dans calculer() pour faire le calcul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    charles.lire(pierre);
    charles.calculer();
    Je dis que ce n'est pas la meilleure façon de faire parce que ça oblige à appeler les méthodes dans un ordre particulier, ce qui ne rend pas la classe très intuitive. Soit tu fais des méthodes dans Assistant, pour affecter les valeurs de ces variables, du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setAge(age) {
       ageLu=age;
    }
    en faisant pareil pour "argent"/"argentLu"
    et dans main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    charles.setAge(pierre.age());
    charles.setArgent(pierre.argent());
    charles.calculer();
    soit tu ajoutes à calculer des paramètres pour pouvoir faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void calculer(int age, int argent) {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charles.calculer(pierre.age(), pierre.argent());
    ou, en fusionnant lire() et calculer() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void calculer(Spectateur spectateur) {
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charles.calculer(pierre);
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    merci joel pour ton aide,
    voila je mets le code avec les rectifs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    import java.util.Scanner;
     
    public class Magie {
     
    	public static void main(String[] args) {
    		 Spectateur pierre = new Spectateur() ;
    		 Assistant charles = new Assistant();
    		 Magicien gandalf = new Magicien();
    		 gandalf.tourDeMagie(pierre, charles);
     
    	}
    }
    	class Spectateur {
    		// attributs
    		static Scanner clavier = new Scanner(System.in);
    		private int age;
    		private int argent;
     
    		// méthode arrive ou on me demande d ecrire sur un papier mon âge et mon argent
    		public void arriver() {
    			System.out.println("[Spectateur] j'entre en scène");
    			System.out.print("Mon âge ? ");
    			age = clavier.nextInt();
    			// je repete la question si la somme est plus grande que 100€
    			do {
    				System.out.print("Combien j'ai d'argent ? (<=100€)? ");
    				argent = clavier.nextInt();
    			} while (argent > 100);
    			System.out.println("[spectateur]j'ai le montant qui convient");
    		}
     
    		public void ecrire() {
    			System.out.println("[spectateur]J'écris le papier");
    		}
    		//je cree ces méthodes pour récuper les variables âge et argent dans les autres classes
    		public int age() {
    			return age;
    		}
    		public int argent() {
    			return argent;
    		}
    	}
     
    	class Assistant {
    		// attributs
    		private int ageLu;
    		private int argentLu;
    		private int resultat;
     
    		// il faut une méthode pour calculer le résultat obtenu avec l'âge et l'argent  lu sur le papier
     
    		public void lireEtCalculer(int age,int argent) {	
    			System.out.println("[assistant] je lis le papier");
    			System.out.println("[assistant]je calcul mentalement");
    			ageLu = age;
    			argentLu = argent;
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
    		}
     
    		// ensuite il faut donner le resultat à voix haute
    		int direAHauteVoix() {
    			System.out.println("[assistant] j'annonce " + resultat);
    			return resultat;
    		}
     
    	}
    	class Magicien {
    		private int resultat;
    		private int ageTrouve;
    		private int argentTrouve;
     
    		// méthode pour calculer l age et l'argent du spectateur
    		public void calculer(int resul){
    			resultat = resul;
    			resultat += 115;
    			ageTrouve = resultat /100;
    			argentTrouve = resultat %100;
     
    		}
    		public void tourDeMagie(Spectateur pierre,Assistant charles) {
    			Spectateur papier = new Spectateur();
    			pierre.arriver();
    			System.out.println("un petit tour de magie ");
    			pierre.ecrire();
    			charles.lireEtCalculer(pierre.age(),pierre.argent());
    			calculer(charles.direAHauteVoix());
    			annoncer();
    		}
    		public void annoncer(){
    			System.out.println("[Magicien ] hum je vois que vous etes agés de "+ageTrouve+" ans ,et que vous avez "+argentTrouve+ " euros dans les poches");
     
    		}
    	}
    Donc j'ai fait la même modif pour la méthode calculer() du magicien avec un paramètre résultat.Donc si j'ai bien compris même si avec un print on lit un return ,on ne peut pas faire :
    int variable à instancié = retour de l entier de la méthode trucmuche ?
    il faut mettre la méthode de celui ci en paramètre sinon c'est juste une lecture ?
    merci pierre.

  8. #8
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cpiter Voir le message
    Donc si j'ai bien compris même si avec un print on lit un return :.
    Avec un print on lit un return ? Cela ne veut rien dire. return est l'instruction qui permet de retourner un résultat dans une méthode/ return expression; indique que le résultat de la méthode sera l'évaluation de l'expression à droite du return. Je ne sais pas où ton "print" intervient là-dedans et ce que c'est exactement. Je suppose que tu parles de System.out.println()... Si c'est dans une instruction de la méthode, on s'en fout, ça n'a ni aucun lien ni aucun impact sur le return. Il n'y a aucune raison que ça en est un.

    Citation Envoyé par cpiter Voir le message
    ,on ne peut pas faire:
    int variable à instancié = retour de l entier de la méthode trucmuche ?
    .
    Déjà on n'instancie pas des variables... on instancie des objets et on stocke leur référence dans ce qu'il faut pour les stocker, des variables éventuellement comme quand on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Spectateur spectateur = new Spectateur();
    qui signifie :
    1. Déclarer une variable spectateur de type Spectateur
    2. instancier un objet de type Spectateur
    3. affecter la référence de l'objet créé dans la variable (ou stocker la référence quelque part en mémoire qui est identifié dans le programme par la variable spectateur


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int machin = trucmuche();
    1. Signifie déclarer une variable appelée machin de type int
    2. Appeler la méthode trucmuche() et récupérer sont résultat
    3. affecter ce résultat à la variable machin.


    Citation Envoyé par cpiter Voir le message
    il faut mettre la méthode de celui ci en paramètre
    On ne met pas de méthode en paramètre en Java. Il faut être strict lorsqu'on parle de programme, de syntaxe, etc, sinon c'est confusion et malentendus.

    Je suppose que tu as voulu parler de ce genre de syntaxe, en disant on passe la méthode bidule en paramètre de la méthode trucmuche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int machin = trucmuche(bidule(42));
    Or, ce n'est pas ça du tout. On ne passe pas la méthode, on passe le résultat de son exécution, ce que retourne donc l'exécution de bidule(42).

    Citation Envoyé par cpiter Voir le message
    il faut mettre la méthode de celui ci en paramètre sinon c'est juste une lecture ?
    Le nombre de paramètres n'a rien à voir avec la notion de lecture (get) ou d'affectation (set).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void afficheMachin() {
        System.out.println("Machin");
    }
    Ni lecture ou écriture (directe du moins, on ne sais pas trop ce qu'il se passe dans println...)

    Mais on peut avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void incrémentMachin() {
        machin++;
    }
    Pas de retour, pas de paramètre, et pourtant lecture et écriture d'une variable machin


    Une méthode peut ne pas avoir de paramètre et avoir un retour :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public int setMachin() {
        return 42;
    }
    Aucune "lecture" de valeur de variable ou similaire : on retourne une constante littérale.

    Une méthode peut ne pas faire d'affectation , même si elle à un paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public void setMachin(int value) {
        System.exit(0);
    }
    Cette méthode prend un paramètre, mais ne fait rien d'autre que d'arrêter le programme.

    Il n'y a donc pas de corrélation entre les paramètres, leurs nombres et si on fait des get ou des set.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  9. #9
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    je vais essayé d 'être plus precis:
    je voulais dire initialisé ma variable ageAlu et non l'instancier qui est éffectivement pour un objet .
    je mets le code
    donc dans mon ancien code il y une classe Spectateur avec une méthode age() qui retourne un entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int age(){
    return age;
    }
    dans mon nouveau code ,age est en paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void lireEtCalculer(int age,int argent) {	
    			System.out.println("[assistant] je lis le papier");
    			System.out.println("[assistant]je calcul mentalement");
    			ageLu = age;
    			argentLu = argent;
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
    Ce que je ne comprend pas c'est ceci:
    pourquoi dans la méthode Assistant avant modification
    je n arrive pas à récupérer la valeur de retour de la méthode age
    et que quand dans la dernière méthode assistant j écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charles.lireEtCalculer(pierre.age(),pierre.argent())
    ;dans cette méthode j ai bien ageLu = age qui récupère la valeur mise en parametre et qui est le retour de" pierre.age()")
    dans les 2 cas j'ai bien le retour de la même méthode age avec :"pierre.age()" ?

    il faudrait que dans ma classe spectateur j ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void setage(age)
    this.age = age
    pour que ma valeur de retour de la méthode age prenne la valeur de la variable ?

  10. #10
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cpiter Voir le message
    donc dans mon ancien code il y une classe Spectateur avec une méthode age() qui retourne un entier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int age(){
    return age;
    }
    Ok, jusque là.

    Citation Envoyé par cpiter Voir le message
    dans mon nouveau code ,age est en paramètre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void lireEtCalculer(int age,int argent) {	
    			System.out.println("[assistant] je lis le papier");
    			System.out.println("[assistant]je calcul mentalement");
    			ageLu = age;
    			argentLu = argent;
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
    ok

    Citation Envoyé par cpiter Voir le message
    Ce que je ne comprend pas c'est ceci:
    pourquoi dans la méthode Assistant avant modification
    hum, y a bien une classe Assistant, et une méthode Lire(Spectateur papier) dans la classe Assistant, mais pas de méthode Assistant (pourquoi appeler le paramètre papier par ailleurs ?)...

    Citation Envoyé par cpiter Voir le message
    je n arrive pas à récupérer la valeur de retour de la méthode age
    C'est-à-dire ? Il n'y a aucune raison que ça ne fonctionne pas en effet. Simplement, dans ton premier code, il fallait appeler Lire() avant d'appeler calculer() pour que calculer() s'effectue bien avec les valeurs de age et argent de "pierre". Alors que toi tu faisais juste un pierre.age(); dans la méthode main() ce qui ne faisait rien d'autre que lire l'age de pierre et le jeter dans le néant ensuite... donc aucun risque que ça soit utilisé dans calculer() qui se basait sur la variable ageLu de charles. En d'autres termes ce n'est pas parce que tu as écrit ageLu = papier.age(); dans Lire() que c'est exécuté un jour. Il faut que la méthode Lire() soit invoquée quelque part, d'une manière ou une autre, pour qu'elle s'exécute.

    Citation Envoyé par cpiter Voir le message
    et que quand dans la dernière méthode assistant j écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charles.lireEtCalculer(pierre.age(),pierre.argent())
    ici on passe en paramètre deux entiers, qu'on va lire dans une autre instance de classe
    On pourrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int ageLu = pierre.age();
    int argentLu = pierre.argent();
    charles.lireEtCalculer(ageLu,argentLu)
    Ici, ageLu et argentLu, n'ont rien à voir avec les variables de même nom de Assistant. Ce sont juste des variables locale à la méthode main() qui servent temporairement à stocker le résultat des méthodes age() et argent() avant de les utiliser en paramètre de l'appel de lireEtCalculer().

    Citation Envoyé par cpiter Voir le message
    ;dans cette méthode j ai bien ageLu = age qui récupère la valeur mise en parametre et qui est le retour de" pierre.age()")
    Non, pas dans la méthode lireEtCalculer(int,int). Oui dans une méthode lireEtCalculer(Spectateur spectateur) ou tu ferais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public int lireEtCalculer(Spectateur spectateur) {
    public int lireEtCalculer(int age,int argent) {	
    			System.out.println("[assistant] je lis le papier");
    			System.out.println("[assistant]je calcul mentalement");
    			ageLu = spectateur.age();
    			argentLu = spectateur.argent();
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
                            return resultat;
    }
    Citation Envoyé par cpiter Voir le message
    dans les 2 cas j'ai bien le retour de la même méthode age avec :"pierre.age()" ?
    Quels deux cas ?

    Citation Envoyé par cpiter Voir le message
    il faudrait que dans ma classe spectateur j ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void setage(age)
    this.age = age
    pour que ma valeur de retour de la méthode age prenne la valeur de la variable ?
    non. le fait d'avoir setage(age) n'importe où n'a aucun lien avec le retour d'une méthode quelconque.


    Je ne vois pas trop comment t'expliquer une fois de plus et autrement que les instructions n'ont pas d'influence entre elles. L'exécution de l'une ne modifie ni l'exécution d'une autre ni les variables qui entreraient en jeu dans une autre, ni les méthodes qui y seraient appelées, ni encore moins ce qu'il peut y avoir comme code, et donc variables, ou appel d'autres méthodes, ou autre code quelconque, dans les méthodes en question. On dirait que tu raisonnes comme si Java était une sorte de langage réactif, genre si j'écris age = 33, alors tous les résultats qui utilisent age ou une variable qu'on aurait affecté avec la valeur de age ou un résultat en question, se modifient instantanément comme si age avait toujours valut 33. Ce n'est pas le cas. Et non plus pour les méthodes censées retourner des résultats de fonctions appliquées à age qui ne font que continuer à exécuter le code qui existait à la compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class Personne {
     
        // une variable de classe Exemple : ceci veut dire que toute instance de Exemple aura un attribut age qui lui est propre, avec une valeur potentiellement différente pour chaque instance
        private int age;
     
        /**
          * Cette méthode permet de changer la valeur de la variable age pour l'instance sur laquelle elle est appelée
          */
        public void setAge(int age) {
             this.age=age;
        }
     
        /**
          *
          */
        public int getAge() {
            return this.age;
        }
     
        public static void main(String[] args) {
     
                // l'exécution de cette méthode est indépendante de la notion d'instance de Personne. Elle juste déclarée dans cette classe ce qui rend cette classe "exécutable" par la commande java.exe
     
                Personne pierre = new Personne(); // je créé une instance de classe Personne dont je stocke la référence (d'instance) dans la variable pierre de type Personne
                Personne charles = new Personne(); // je créé une instance de classe Personne dont je stocke la référence (d'instance) dans la variable charles de type Personne 
                // jusque là aucune variable ni de pierre (sous-entendu l'instance de Personne référencé par la variable pierre), ni de charles, n'ont été modifiée par quoi que ce soit (elles ont été initialisées à 0 au moment de l'instanciation (l'appel du new) parce qu'en Java les variables de type primitif (comme int) prennent la valeur 0 par défaut.
                // aucune méthode n'a été modifiée (y'a que en tapant du code source et en le compilant que ça pourrait se faire), et encore moins le return de getAge()
     
               pierre.setAge(18); // on appelle la méthode setAge() de pierre (sous entendu on invoque cette méthode pour l'instance de Personne référencé par pierre maintenant à ce moment précis avec la valeur 18 en paramètre
               // ceci provoque l'exécution du code de la méthode, soit  this.age=age
               // ce qui provoque l'affectation de la valeur de age à l'attribut age de l'instance référencée par pierre (ici le this correspont à la référence stockée dans pierre)
               // en résumé l'age de pierre change et prend la valeur du paramètre soit 18
               // mais en aucun cas ça ne modifie getAge() ni son retour ni rien d'autre que la variable age de pierre, provenant de la classe Personne.
               // ça ne modifie pas la méthode getAge() ou son retour, mais à l'avenir son appel retournera bien 18, parce c'est ce que son code fait : retourne la valeur de la variable age à l'appelant
               // sauf si on appelle setAge(33) avant d'appeler getAge(). dans ce cas, jamais getAge() ne retournera 18 parce que ce gue fait getAge() c'est retourner la valeur age au moment de l'appel. 
               // autrement dit un changement de age ne provoque qu'un changement de age et de rien d'autre, sauf du code qui viendrait volontairement récupérer la nouvelle valeur de age pour modifier quelque chose
     
               charles.setAge( pierre.getAge() ); // ici on lit l'age de pierre à ce moment précis et on l'utilise comme paramètre de setAge() appelé sur charles ce qui appelle le code this.age=age pour l'instance charles, ce qui donc consiste à affecter la valeur passée en paramètre à l'attribut age de charles. Aucune méthode n'est modifiée et seul l'attribut age de charles l'est.
     
               System.out.println(charles.getAge()); // on envoie vers la sortie standard (la plupart du temps la console, mais pas forcément) la valeur retournée par la méthode getAge() appelée sur l'instance de Personne référencée par charles à ce moment précis, c'est-à-dire après qu'on ait exécuté charles.setAge( pierre.getAge() ) donc à un moment où l'age de charles vaut 18 
     
               pierre.setAge( 19 ); // on modifie l'age de pierre, il vaut 19 maintenant et ceci n'a eu aucun effet sur des méthodes ou variables (à part age de l'instance pierre)
     
               System.out.println(charles.getAge()); // on "affiche" la valeur retournée par la méthode getAge() appelée sur l'instance de Personne référencée par charles à ce moment précis, c'est-à-dire toujours 18. Le fait de passer pierre à 19 n'a rien changé du tout pour charles.
     
     
        }
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  11. #11
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    Merci joel de prendre de ton temps pour expliquer des choses si simples pour des personnes avisées comme toi à des personnes comme moi qui font ce qu elles peuvent pour comprendre mais c'est parfois un peu dur mais je me suis toujours accroché donc je continu ,je vais analyser tes réponses pour comprendre ...

  12. #12
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    j 'essaie pour comprendre,et sinon on verre demain
    alors j ai essayer ce code que tu m as indiqué
    mais j ai du faire une boulette car ça ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ou, en fusionnant lire() et calculer() :
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void calculer(Spectateur spectateur) {
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    charles.calculer(pierre);
    code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public void lireCalculer(Spectateur papier) {
    			System.out.println("[assistant] je lis le papier");
    			ageLu  = papier.getAge();
    			argentLu =papier.getArgent();
    			System.out.println("[assistant]je calcul mentalement");
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
     
    		}
    et l appelle de celle ci dans le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void tourDeMagie(Spectateur pierre,Assistant charles) {
    			Spectateur papier = new Spectateur();
    			pierre.arriver();
    			System.out.println("un petit tour de magie ");
    			pierre.ecrire();
    			charles.lireCalculer(papier);
    			calculer(charles.direAHauteVoix());
    			annoncer();

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cpiter Voir le message
    code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    	public void lireCalculer(Spectateur papier) {
    			System.out.println("[assistant] je lis le papier");
    			ageLu  = papier.getAge();
    			argentLu =papier.getArgent();
    			System.out.println("[assistant]je calcul mentalement");
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
     
    		}
    Pour l'instant ça correspond bien à une solution que je t'ai donnée. Et je commence à comprendre pourquoi ton paramètre s'appelle papier. En fait, ce n'est pas un spectateur, c'est un papier sur lequel un spectateur a écrit son age et une somme d'argent à priori.
    C'est un peu bizarre du coup. Est-ce que tu es toujours en train d'essayer des exercices sur je ne sais plus quel site dont tu avais parlé ? Est-ce que dans l'énoncé on ne parle pas d'une classe Papier ? Ce qui justifierait l'apparition de cette méthode écrire qui sort de nulle part dans tourDeMagie(). Papier serait une classe qui permet de décrire un message que le Spectateur donne au magicien. Le magicien (que tu appelles Assitant dans ton programme) procède ensuite au tour (des opérations ) et annonce un résultat, à priori étonnant.

    Citation Envoyé par cpiter Voir le message

    et l appelle de celle ci dans le main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void tourDeMagie(Spectateur pierre,Assistant charles) {
    			Spectateur papier = new Spectateur();
    			pierre.arriver();
    			System.out.println("un petit tour de magie ");
    			pierre.ecrire();
    			charles.lireCalculer(papier);
    			calculer(charles.direAHauteVoix());
    			annoncer();
    En revanche, on n'en est revenu au point de départ : charles lireCalculer à partir de papier qui est un nouveau spectateur pour qui on n'a définit ni aucun age, ni aucun argent. En tout cas, ce ne sont pas les données de pierre qui risque d'aller dans papier, sauf à faire éventuellement pierre.ecrire(papier), en ayant papier de classe Papier.

    Les deux dernières lignes me semblent douteuses : annoncer() et direAHauteVoix() ça fait à priori la même chose pour moi (vu le sens en français) et mais pourquoi une nouvelle instance englobante... quant à calculer() ça ne semble pas non plus utile... surtout là où elle semble être déclarée. Elle est définie où cette méthode, dans quelle classe ?

    Peut-être que nous donner l'énoncé nous aiderait à te guider. Et avoir un code complet aussi, parce qu'on ne peut pas comprendre tous les tenants et aboutissants si des méthodes apparaissent dans chacun de tes nouveaux messages et qu'on ne sait pas ce qu'elles font.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Juillet 2019
    Messages : 49
    Par défaut
    Oui effectivement il y a une classe papier mais on pouvait faire sans donc j ai essayé car je trouvais la classe papier pas très logique
    l' ennonçé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exercice 2 : tour de magie2.1 Organisation de l'exerciceDans cet exercice, nous vous demandons d'élaborer un programme orienté objets de manière indépendante pour la première fois. Nousavons donc organisé l'exercice en 2 parties :1. une première (de 2.2 et 2.3) qui décrit le problème à résoudre et qui, idéalement devrait suffire pour élaborer puis écrire leprogramme de façon autonome, certainement en plusieurs tentatives;2. une seconde (partie 2.4), pour aider au cas où la première partie vous semble insuffisante, vu que c'est votre première conceptionautonome d'un programme. Dans un premier temps, essayez de ne pas la lire et revenez-y si nécessaire.2.2 Buts du programmeOn souhaite ici écrire un programme « simulant » le tour de magie élémentaire suivant :Un magicien demande à un spectateur d'écrire sur un papier son âge et la somme qu'il a en poche (moins de 100 francs suisses).L'assistant doit ensuite le lire (sans rien dire), puis effectuer secrètement le calcul suivant : multiplier l'âge par 2, lui ajouter 5, multiplierle résultat par 50, ajouter la somme en poche, et soustraire le nombre de jours que contient une année, puis finalement donner lerésultat à haute voix. En ajoutant mentalement (rapidement !) 115 au chiffre reçu, le magicien trouve tout de suite l'âge et la somme en poche (qui étaientrestés secrets).Modéliser ce tour de magie, en définissant au moins les classes (simples) Magicien, Assistant et Spectateur. Il pourrait égalementêtre utile de disposer d'une classe Papier.L'instance de Spectateur devra demander son âge à l'utilisateur du programme ainsi que la somme d'argent en poche, et s'assurerqu'une valeur correcte est entrée (entre 0 et 99).Essayer de faire une modélisation la plus exacte possible ; faire notamment usage des droits d'accès là où cela semble pertinent. Pourchaque méthode, effectuer un affichage à l'écran de l'opération en cours et de l'acteur qui la réalise.Note :Il existe de nombreuses variantes possibles. Commencer par un modèle très simple, et le faire évoluer pour se rapprocher de lasituation « réelle » décrite.Rappel : pour pouvoir lire une donnée depuis le clavier, il faut avoir au préalable déclaré une variable de type Scanner :private final static Scanner clavier = new Scanner(System.in);...int i = clavier.nextInt(); // par exemple pour lire un entieravec au préalable l'importation import java.util.Scanner en début de programme.Vous pourrez déclarer la variable clavier (ou équivalent) dans la classe Spectateur ici (c'est un point sur lequel nous reviendronsplus tard dans le cours).2.3 Exemple de déroulementSpectateur] (j'entre en scène)Quel âge ai-je ? 35Combien d'argent ai-je en poche (<100) ? 110Combien d'argent ai-je en poche (<100) ? 12[Spectateur] (j'ai un montant qui convient)[Magicien] un petit tour de magie...[Spectateur] (j'écris le papier)[Assistant] (je lis le papier)[Assistant] (je calcule mentalement)[Assistant] J'annonce : 3397 ![Magicien]   - hum... je vois que vous êtes agé de 35 ans     et que vous avez 12 francs suisses  en poche !2.4 Indications plus détailléesVous trouverez sur la page suivante quelques indications en vrac qui peuvent vous être utiles. Ne les lisez pas si vous voulez êtrecomplètement indépendant (but premier de l'exercice)...
    j ai remodifier mon code avec charles.lire(papier) suivi de charles .calculer() mais le calcul ne se fait toujours pas.Avant d'exposer mon problème sur le forum ,j 'avais essayer de faire le code sans la classe papier, mais ça ne marchait pas donc j 'ai regarder la solution , mais je ne vois pas ou est le problème par rapport à eux ? et tout seul on bute parfois pour rien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    package fr.piter.exo;
    import java.util.Scanner;
     
    public class Magie {
     
    	public static void main(String[] args) {
    		 Spectateur pierre = new Spectateur() ;
    		 Assistant charles = new Assistant();
    		 Magicien gandalf = new Magicien();
    		 gandalf.tourDeMagie(pierre, charles);
     
    	}
    }
    	class Spectateur {
    		// attributs
    		static Scanner clavier = new Scanner(System.in);
    		private int age;
    		private int argent;
     
    		// méthode arrive ou on me demande d ecrire sur un papier mon âge et mon argent
    		public void arriver() {
    			System.out.println("[Spectateur] j'entre en scène");
    			System.out.print("Mon âge ? ");
    			age = clavier.nextInt();
    			// je repete la question si la somme est plus grande que 100€
    			do {
    				System.out.print("Combien j'ai d'argent ? (<=100€)? ");
    				argent = clavier.nextInt();
    			} while (argent > 100);
    			System.out.println("[spectateur]j'ai le montant qui convient");
    		}
     
    		public void ecrire() {
    			System.out.println("[spectateur]J'écris le papier");
    		}
    		//je cree ces méthodes pour récuper les variables âge et argent dans les autres classes
    		public int getAge() {
    			return this.age;
    		}
    		public int getArgent() {
    			return this.argent;
    		}
    	}
     
    	class Assistant {
    		// attributs
    		private int ageLu;
    		private int argentLu;
    		private int resultat;
     
    		// il faut une méthode pour calculer le résultat obtenu avec l'âge et l'argent  lu sur le papier
    		public void lire(Spectateur papier) {
    			System.out.println("[assistant] je lis le papier");
    			ageLu  = papier.getAge();
    			argentLu =papier.getArgent();
     
    		}
     
    		public void Calculer() {
     
    			System.out.println("[assistant]je calcul mentalement");
    			resultat = ageLu * 2;
    			resultat += 5;
    			resultat *= 50;
    			resultat += argentLu;
    			resultat -= 365;
     
    		}
     
    		// ensuite il faut donner le resultat à voix haute
    		int direAHauteVoix() {
    			System.out.println("[assistant] j'annonce " + resultat);
    			return resultat;
    		}
     
    	}
    	class Magicien {
    		private int resultat;
    		private int ageTrouve;
    		private int argentTrouve;
     
    		// méthode pour calculer l age et l'argent du spectateur
    		public void calculer(int resul){
    			resultat = resul;
    			resultat += 115;
    			ageTrouve = resultat /100;
    			argentTrouve = resultat %100;
     
    		}
    		public void tourDeMagie(Spectateur pierre,Assistant charles) {
    			Spectateur papier = new Spectateur();
    			pierre.arriver();
    			System.out.println("un petit tour de magie ");
    			pierre.ecrire();
    			charles.lire(papier);
    			charles.Calculer();
    			calculer(charles.direAHauteVoix());
    			annoncer();
     
    		}
    		public void annoncer(){
    			System.out.println("[Magicien ] hum je vois que vous etes agés de "+ageTrouve+" ans ,et que vous avez "+argentTrouve+ " euros dans les poches");
     
    		}
    	}
    et leur solution avec la méthode papier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    import java.util.Scanner;
     
    class Magie
    {
      // L'histoire générale :
    	public static void main(String[] args) {
     
    		Spectateur thorin = new Spectateur();    // Il était une fois un spectateur...
    		thorin.arriver();                        // ...qui venait voir un spectacle (!!)...
     
    		Magicien gandalf = new Magicien();       // ...où un magicien...
    		Assistant bilbo = new Assistant();       // ...et son assistant...
    		gandalf.tourDeMagie(bilbo, thorin);      // ...lui firent un tour fantastique
    	}
    }
     
    // un bout de papier... pour ce tour de magie
    class Papier {
     
    	// les données sur le papier
    	private  int age;
    	private int argent;
     
    	// on peut écrire sur le papier
    	public void ecrire(int unAge, int unMontant) {
    		age    = unAge;
    		argent = unMontant;
      }
     
    	// et on peu lire les données depuis le papier
    	public int lireAge() { return age   ; }
    	public int lireArgent() { return argent; }
    }
     
    // --------------------------------------
    class Assistant {
        /* l'assistant mémorise dans son cerveau les valeurs lues
    	 * et le resultat du calcul.
    	 */
    	private int ageLu;
    	private  int argentLu;
    	private int resultat;
     
    	public  void lire(Papier billet) {
     
    		System.out.println("[Assistant] (je lis le papier)");
    		ageLu    = billet.lireAge();
    		argentLu = billet.lireArgent();
    	}
     
    	public void calculer() {
    		System.out.println("[Assistant] (je calcule mentalement)");
    		resultat = ageLu * 2;
    		resultat += 5;
    		resultat *= 50;
    		resultat += argentLu;
    		resultat -= 365;
    	}
     
    	public int annoncer() {
    		System.out.println("[Assistant] J'annonce : " + resultat + " !" );
    		return resultat;
    	}
    }
     
    // --------------------------------------
    class Spectateur {
    	// pour le moment a prendre comme tel (vu dans le MOOC précédent)
    	// nous y reviendrons dans ce cours:
    	private final static Scanner clavier = new Scanner(System.in);
     
        // Les spécificités du spectateur
    	private int age;
    	private int argent;
     
     
    	// lorsqu'il entre dans la salle (avant il n'existe pas pour nous)
     
    	public void arriver() {
    		System.out.println("[Spectateur] (j'entre en scène)");
    		System.out.print("Quel âge ai-je ? ");
     
    		age = clavier.nextInt();
     
    		do {
    			System.out.print("Combien d'argent ai-je en poche (<100) ? "); 
    			argent = clavier.nextInt();
    		} while (argent >= 100);
    		System.out.println("[Spectateur] (j'ai un montant qui convient)");
    	}
     
    	/* Dans cette modélisation on suppose que le papier
    	   n'appartient à personne : il a été par exemple trouvé
    	   dans la salle de spectacle
    	*/
     
    	// écrit sur un papier
    	public void ecrire(Papier billet) {
    		System.out.println("[Spectateur] (j'écris le papier)");
    		billet.ecrire(age, argent);
    	}
    }
     
     
    // --------------------------------------
    class Magicien {
     
    	// ce que le magicien doit deviner:
    	private int ageDevine;
    	private int argentDevine;
     
    	// pour faire son tour, le magicien a besoin d'au moins
    	// un spectateur et d'un assistant
    	public void tourDeMagie(Assistant fidele, Spectateur quidam) {
    		Papier billet = new Papier();
    		System.out.println("[Magicien] un petit tour de magie...");
    		// le magicien donne ses instructions :
    		quidam.ecrire(billet);
    		fidele.lire(billet);
    		fidele.calculer();
    		calculer(fidele.annoncer());
    		annoncer();
    	}
    	// partie privée ici car seul le magicien sait ce qu'il doit
    	// faire dans son tour
    	private void calculer(int resultatRecu) {
    		resultatRecu += 115;
    		ageDevine    = resultatRecu / 100;
    		argentDevine = resultatRecu % 100;
    	}
     
    	private void annoncer() {
    		System.out.println("[Magicien] " 
    						   + "  - hum... je vois que vous êtes agé de "
    						   + ageDevine + " ans ");
    		System.out.println("    et que vous avez " + argentDevine + " francs  suisseen poche !");
    	}
     
    }

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Le problème dans ta version, c'est qu'il n'y a aucun code qui permet à l'age et l'argent de pierre d'être connus de charles. Il est beaucoup moins logique d'utiliser un Spectateur papier dont l'age et l'argent sont à zéro que d'utiliser une classe Papier que pierre écrit (transfert de l'age et l'argent de pierre dans papier) et que charles lis (récupération de l'age et de l'argent, écrit précédemment par pierre) pour faire le calcul. Si tu veux te passer de la classe Papier, il faut à un moment donné que pierre donne à charles son age et son argent.
    La classe Papier dans la solution finale est un message qui permet à pierre et charles de communiquer indirectement. Techniquement ça permet à Spectateur et Assistant de ne pas être dépendant l'un de l'autre, ce qui ne serait pas logique.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déclencher une erreur dans main.
    Par jeremux dans le forum C
    Réponses: 2
    Dernier message: 07/10/2011, 14h59
  2. probleme paramaitre instance dans main()
    Par lovedesitaliens dans le forum C#
    Réponses: 1
    Dernier message: 04/11/2010, 14h26
  3. Erreur dans mon main
    Par diditin dans le forum Langage
    Réponses: 8
    Dernier message: 19/12/2006, 14h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo