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

Java Discussion :

Problème dans une classe


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Par défaut Problème dans une classe
    Bonjour,
    Je souhaite créer un petit programme qui permettrait de simuler un magasin.
    J'ai donc commencé par la classe relative aux données des clients, et je rencontre un problème que je n'arrive pas à résoudre :/
    Pour l'âge du client, peu importe celui que je rentre, la donnée qu'il me ressort à la fin est -1. (soit la donnée par défaut de ma classe client). J'ai essayé en int et en double, aucun des deux ne résout le problème.
    Je suis un pur débutant en programmation et je suis donc venu chercher de l'aide ici, j'espère que vous pourrez m'aidez à résoudre ce problème qui me donne envie de m'arracher les cheveux...
    Donc voilà ma classe main :
    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
     import java.util.ArrayList;
    import java.util.Scanner;
    public class main {
     
    	public static void main(String[] args) {
    //-----------------------------------------------------------------------------
    		ArrayList listeClients = new ArrayList();
    		Scanner ss = new Scanner(System.in);
    		Scanner si = new Scanner(System.in);
    		Scanner sd = new Scanner(System.in);
    		Scanner sb = new Scanner(System.in);
    		double age;
    		String nom = "";
    		String commune ="";
    		double tarif = 0;
    		boolean restart = true;
    		boolean tf;
    //----------------------------------------------------------------------
    		while (restart==true)
    		{
    			System.out.println("Age du client?");
    			age = sd.nextDouble();
    			System.out.println("Nom du client?");
    			nom = ss.nextLine();
    			System.out.println("Commune du client?");
    			commune = ss.nextLine();
    			System.out.println("Tarif client?");
    			tarif = sd.nextDouble();
    			Client addClient = new Client(age, nom, commune, tarif);
    			listeClients.add(addClient);
    			addClient.setAgeClient(age);
    			System.out.println("Introduire un autre client?(true/false)");
    				tf = sb.nextBoolean();
    				if (tf == false)
    				{
    					restart = false;
    				}
    		}
    //------------------------------------------------------------------------
    		System.out.println("Souhaitez vous revoir un client en particulier?(true/false)");
    		boolean revoirClients = sb.nextBoolean();
    		boolean revoirTousClients;
    		Client allTemp = new Client();
    		int iFocus = 0;
    		int iAll=0;
    		if (revoirClients == true)
    		{
    			System.out.println("Quel est le numéro du client que vous souhaitez revoir? (En commençant à 0)");
    			System.out.println("Pour rappel vous avez enrengistré "+listeClients.size()+" client(s).");
    			iFocus = si.nextInt();
    			Client focus = (Client) listeClients.get(iFocus);
    			printClient(focus);
    		}
    		else if (revoirClients == false)
    		{
    			System.out.println("Souhaitez vous revoir tous les clients?(true/false)");
    			revoirTousClients = sb.nextBoolean();
    			if (revoirTousClients == true)
    			{
    				while(iAll < listeClients.size())
    				{
    					allTemp = (Client) listeClients.get(iAll);
    					printClient(allTemp);
    					iAll = iAll+1;
    				}
    			}
    			else if(revoirTousClients==false)
    			{
    				System.out.println("Au revoir !");
    			}
    		}
     
     
    //------------------------------------------------------------------------
     
     
    //-----------------------------------------------------------------------------
     
     
     
     
     
     
     
     
     
    	}
     
    	public static void printClient(Client client)
    	{
    		double age = Client.getAgeClient();
    		System.out.println("Monsieur/madame "+client.getNomClient()+", originaire de la commune de "+client.getCommuneClient()+" et agé(e) de "+age+" ans, nous doit "+client.getTarifClient()+" euros.");
    	}
    }
    Et ma classe Client :
    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
     
    public class Client {
     
    	private static double ageClient;
    	private String nomClient;
    	private String communeClient;
    	private double tarifClient;
    	//----------------------------------------------------------
    		public Client()
    		{
    			ageClient = -1;
    			nomClient = "inconnu";
    			communeClient = "inconnue";
    			tarifClient = 0;
    		}
    	//-----------------------------------------------------------
    		public Client(double pAgeClient, String pNomClient, String pCommuneClient, double pTarifClient)
    		{
    			ageClient = pAgeClient;
    			nomClient = pNomClient;
    			communeClient = pCommuneClient;
    			tarifClient = pTarifClient;
    		}
    	//---------------------------------------------------------------
    		//GET
    		public static double getAgeClient()
    		{
    			return ageClient;
    		}
     
    		public String getNomClient()
    		{
    			return nomClient;
    		}
     
    		public String getCommuneClient()
    		{
    			return communeClient;
    		}
     
    		public double getTarifClient()
    		{
    			return tarifClient;
    		}
     
    	//------------------------------------------------------------------
    		//SET
    		public void setAgeClient(double newAge)
    		{
    			ageClient = newAge;
    		}
     
    		public void setNomClient(String newName)
    		{
    			nomClient = newName;
    		}
     
    		public void setCommuneClient(String newCommune)
    		{
    			communeClient = newCommune;
    		}
     
    		public void setTarifClient(double newTarif)
    		{
    			tarifClient = newTarif;
    		}
    	//-------------------------------------------------------------------
     
     
     
     
     
     
     
    }

  2. #2
    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 : 55
    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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private static double ageClient;
    Une variable static est partagée en toutes les instances de l'objet. Donc tous les clients ont le même age : à chaque création d'un nouveau client, comme l'age est initialisé à -1, tout le monde à -1, puis on affecte une valeur et tous les clients ont ce même age. Si tous tes clients ont -1 à la fin, c'est à cause de la ligne Client allTemp = new Client();, qui ne sert strictement à rien.

    Donc enlève le mot static sur la déclaration de variable, puis sur l'accesseur getAgeClient.

    Au sujet de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void printClient(Client client)
    	{
    		double age = Client.getAgeClient();
    		System.out.println("Monsieur/madame "+client.getNomClient()+", originaire de la commune de "+client.getCommuneClient()+" et agé(e) de "+age+" ans, nous doit "+client.getTarifClient()+" euros.");
    	}
    La notation Client.getAgeClient();, c'est-à-dire avec le nom de la classe avant le ., est justement celle pour appeler une méthode statique : il faut que tu modifies ça pour appeler la méthode sur l'instance de client :
    Au sujet de la déclaration de allTemp, supprime la ligne Client allTemp = new Client(); et déclare-le ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Client allTemp = (Client) listeClients.get(iAll);
    printClient(allTemp);
    iAll = iAll+1;
    Il vaut mieux toujours déclarer une variable dans un scope (portée, visibilité...) limité à son usage (ici le scope est le bloc de la boucle while (le bloc ci-dessus donc).

    A noter, que si tu déclares ta liste comme ça ArrayList<Client> listeClients = new ArrayList<>();, tu n'auras plus besoin de caster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client allTemp = /*(Client)*/ listeClients.get(iAll);
    Le cast(ce que j'ai commenté et surligné) peut être supprimé.

    Enfin, utilise une seule instance de Scanner. C'est inutile d'avoir 4 scanners. En plus cette classe est bufferisée, et donc peut lire des caractères d'avance, ce qui pourra causer des bugs (des saisies qui ne seront pas prises en compte, ou prises en compte au mauvais endroit) : dans tout programme, prend l'habitude de n'utiliser qu'une seule instance de Scanner.
    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.

  3. #3
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Par défaut
    Merci beaucoup pour la réponse rapide et complète !
    J'ai fait ce que tu m'as dit et le programme fonctionne maintenant à merveille.
    J'aurai cependant deux autres petites questions
    Premièrement, j'envisage par la suite de créer une classe "Article", qui servirait à associer à chaque client les articles qu'ils aurait acheté, et éventuellement déterminer le tarif en fonction de cela.
    Je pensais modifier la liste lient pour qu'elle soit comme ceci : {{Client 1, article1, article2},{..},{..},...};
    Est-ce possible avec une arraylist?

    Deuxièmement, j'ai essayé de créer un .jar avec eclipse, pour pouvoir lancer le programme directement, mais il ne dispose pas d'interface graphique et donc rien ne s'affiche, existe-t-il un moyen d'utiliser la console via ce .jar?

    Merci d'avance !

  4. #4
    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 : 55
    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 lledune Voir le message
    Premièrement, j'envisage par la suite de créer une classe "Article", qui servirait à associer à chaque client les articles qu'ils aurait acheté, et éventuellement déterminer le tarif en fonction de cela.
    Je pensais modifier la liste lient pour qu'elle soit comme ceci : {{Client 1, article1, article2},{..},{..},...};
    Est-ce possible avec une arraylist?
    Oui et non. En fait, ce n'est pas la bonne solution de faire une seule ArrayList avec clients et articles : c'est trop lourd à gérer.
    Comme pour n'importe quel attribut, si un client a une liste d'articles, il suffit de lui ajouter un attribut liste d'articles, donc une variable de type List<Article>.

    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
    public class Client {
     
    	private double ageClient;
    	private String nomClient;
    	private String communeClient;
    	private double tarifClient;
    	private List<Article> articles = new ArrayList<>();
     
        /* ... */
     
        public void ajouterArticle(Article article) {
             articles.add(article);
        }
     
        public List<Article> getArticles() {
              return articles;
        }
    Attention, avec ce getArticles(), on peut modifier la liste d'articles à l'extérieur de la classe, ce que tu veux peut-être empêcher. Dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        public List<Article> getArticles() {
              return Collections.unmodifiableList(articles);
        }
    Citation Envoyé par lledune Voir le message
    Deuxièmement, j'ai essayé de créer un .jar avec eclipse, pour pouvoir lancer le programme directement, mais il ne dispose pas d'interface graphique et donc rien ne s'affiche, existe-t-il un moyen d'utiliser la console via ce .jar?

    Merci d'avance !
    Si c'est un jar exécutable, ouvre une console, et exécute-le en tapant la commande : java -jar tonjar.jar
    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.

  5. #5
    Membre averti
    Homme Profil pro
    étudiant
    Inscrit en
    Juillet 2015
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 15
    Par défaut
    D'accord merci, je vais bosser donc j'essaierai ça ce soir
    Et pour le prix des articles?
    Je suppose que je renseigne dans main ?
    Par exemple : Article classeur = new Article(prixunitaire, quantité).
    Dans ce cas lors de l'impression des clients, comment déterminer que chaque client possède tel nombre d'articles ? (pour pouvoir déterminer le tarif).

  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 : 55
    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 lledune Voir le message
    D'accord merci, je vais bosser donc j'essaierai ça ce soir
    Et pour le prix des articles?
    Je suppose que je renseigne dans main ?
    Par exemple : Article classeur = new Article(prixunitaire, quantité).
    Par exemple (avec les attributs pour la classe Article pour stocker ces informations) et client.ajouterArticle(classeur); pour l'affecter au client

    Citation Envoyé par lledune Voir le message
    Dans ce cas lors de l'impression des clients, comment déterminer que chaque client possède tel nombre d'articles ? (pour pouvoir déterminer le tarif).
    Le nombre d'articles, c'est la taille de la liste : articles.size()Pour parcourir les articles pour les afficher, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for( Article article : articles ) {
       System.out.println(article);
    }
    ou (Java8)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    articles.forEach( System.out::println );
    Si c'est la somme totale dont tu as besoin, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double total=0;
    for( Article article : articles ) {
       total += article.getQuantite() * article.getPrixUnitaire();
    }
    System.out.println("Prix total " + total);
    ou (Java8) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double total = articles.stream()
                           .mapToDouble(article-> article.getQuantite()*article.getPrixUnitaire())
                           .sum()
    ou (Java8)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double total = articles.stream()
                           .map(article-> article.getQuantite()*article.getPrixUnitaire())
                           .reduce((s, v)-> s + v)
                           .orElse(0d);
    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. Réponses: 1
    Dernier message: 17/04/2007, 22h07
  2. Réponses: 8
    Dernier message: 12/04/2007, 11h32
  3. Problème Access Violation dans une classe
    Par randriano dans le forum C++Builder
    Réponses: 1
    Dernier message: 11/04/2007, 18h49
  4. problème d'accès dans une classe dérivée!
    Par chrono23 dans le forum C++
    Réponses: 47
    Dernier message: 10/10/2006, 11h22
  5. Problème dans une Classe
    Par Orbix dans le forum Langage
    Réponses: 8
    Dernier message: 02/10/2006, 14h52

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