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 :

Petite aide tableaux


Sujet :

Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut Petite aide tableaux
    Salut à tous, après avoir le chapitre des constructeurs, je commence le chapitre de Java qui concerne les tableaux.
    Pour m'entrainer j'essaie de faire un petit programme qui demande la saisie d'un nombre d'élève dans une classes, les informations propres à chaque élève (nom, prénom, nombres de notes, notes, moyenne des notes).
    Seulement je bloque sur un point.
    Comme vous voyez dans mon code source j'ai deux classes : Etudiant (concerne chaque étudiant) et Cursus (concerne une classe entière d'étudiants).
    Mon programme tourne plutôt bien. Seulement, j'aimerais ajouter une toute petite amélioration.
    Après avoir demandé le nombre d'étudiant dans la classe, le programme demande donc la saisie des infos personnelles expliquées ci-dessus.
    Et au lieu de marquer nom de l'étudiant (ligne 18 de la classe Etudiant ), prénom de l'étudiant (ligne 20 de la classe Etudiant), etc...
    J'aimerais rajouter sa position dans la liste d'étudiants : nom et prénom de l'étudiant n°1 puis n°2, etc... jusqu'au dernier étudiant.
    Pour ça j'aimerais dans les paramètres d'une boucle for faire appel à une méthode get contenue dans la classe Cursus.
    Ma question est donc : comment faire appel à l'objet cursus de type Cursus (pour utiliser cursus.getListe()) sans faire appel au constructeur qui demande d'initialiser toute les données.
    En effet, si j'utilise la ligne Cursus cursus = new Cursus, le constructeur par défaut va être appelé et ça va redemander la saisie des données de l'objet classe.
    Moi, je veux juste faire appel à la méthode getListe() en fait.

    Voici mon code source :

    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
     
    package tri;
     
    import java.util.*;
     
    public class Etudiant {
       private String nom, prenom;
       private double [] note;
       private double moyenne;
     
     
       public Etudiant(){
           int nombre;
           int zero = 0;
           Scanner scan = new Scanner(System.in);
           // J'ai essayé ça mais cest un peu bête en fait 
           //Cursus cursus = new Cursus(zero);
           for (int i=0; i<=cursus.getTailleListe() - 1;i++){
               System.out.print("Nom de l'étudiant : " );
               nom = scan.next();
               System.out.print("Prénom de l'étudiant : ");
               prenom = scan.next();
           }
           do{
            System.out.print("Combien de note pour l'étudiant  ");
            System.out.print(prenom + " " + nom + " : ");
            nombre =  scan.nextInt();
           }while (nombre<1); 
           note = new double [nombre];
           for (int i=0; i<=note.length-1; i++){
               System.out.print("Note numéro " + (i+1)+ " : ");
               note[i]=scan.nextDouble();
           }
           moyenne = calculMoyenne();
       }
     
     
     
       // Private car pour des raisons de sécurité, il vaut mieux que le calcul ne puisse se faire que dans la classe Etudiant
       private double calculMoyenne(){
           double somme=0;
           for(double valeur : note){
               somme = somme + valeur;
           }  
           return somme / note.length;
       }
     
       public double getMoyenne(){
           return moyenne;
       }
     
       public void afficherEtudiant(){
           System.out.print("Notes de l\'élève " + prenom + nom +" : " );
           for (double valeur:note){
               System.out.print(" ");
               System.out.print(valeur);
           }
           System.out.println("");
           System.out.print("Moyenne de l\'élève " + prenom + nom+ " : ");
           System.out.println(moyenne);
       }
     
    }
    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
     
     
    package tri;
     
    import java.util.*;
     
     
    public class Cursus {
        // liste est un tableau d'objets de types Etudiant
        private Etudiant [] liste;
        private int nombreEtudiant;
       // private double [] listeMoyenne;
     
        public Cursus(){
            Scanner scan = new Scanner(System.in); 
            System.out.print("Nombre d\'étudiants dans la classe : ");
            nombreEtudiant = scan.nextInt();
            liste = new Etudiant [nombreEtudiant];
            for (int i=0; i<= liste.length - 1; i++){
                // saisie des infos relatives à chaque étudiant
                liste[i] = new Etudiant(); 
            }
        }
     
        public Cursus(int pNombreEtudiant){
           if (pNombreEtudiant>0){
               nombreEtudiant = pNombreEtudiant;
               liste = new Etudiant [nombreEtudiant];
               for (int i=0; i<= liste.length - 1; i++){
                  liste[i] = new Etudiant(); 
               }
           }    
        }   
     
     
     
        public int getTailleListe(){
            return liste.length;
        }
     
        public void afficherListe(){
            //pour chaque (valeurs) objet e (de type Etudiant) de la liste appliquer afficherEtudiant() (présent dans l'objet e)
            for(Etudiant e :liste){
                e.afficherEtudiant();
            }
          // listeMoyenne = new double [liste.length];
           //for (int i=0; i< liste.length; i++){
             //listeMoyenne[int i] =   
           //}
     
     
        }           
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package tri;
     
     
    public class Tri {
     
     
        public static void main(String[] args) {
     
     
            Cursus cursus = new Cursus();
            cursus.afficherListe();
        }
     
    }
    Merci d'avance pour votre aide.
    En espérant que ma question soit compréhensible (c'est pas toujours facile de bien formuler ses question quand on débute ....)

  2. #2
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    J'ai essayé de faire appel à un constructeur cursus avec paramètre qui aurait pour but de simplement initialiser les données .
    Mais je crois que c'est un peu bête car ça va initialiser les données après avoir demandé leurs saisies c'est ça?

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu ne devrais pas faire la lecture des paramètres de Etudiant dans son constructeur : ça rend la classe trop dépendante de cette façon de la construire. Tu devrais faire le code de saisie des paramètres dans une classe à part, qui crééra l'instance de classe Etudiant en lui passant les paramètres lus au clavier, puis l'ajoutera à l'instance de Cursus. Ainsi, la façon de lire les paramètres sera externe à chacune des 2 classes,et tu pourras facilement la changer, par exemple, pour lire les données dans un fichier, ou une base de données, etc.

    En l'état, au lieu de chercher à récupérer les informations du Cursus dans le constructeur de Etudiant, il te suffit de passer la position de l'étudiant en paramètre du constructeur de Etudiant, puisque quand tu fais new Etudiant(), tu as bien la position (la variable i).
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Oui c'est vrai c'est pas bête ça me permettrait de faire appel a certaines données du constructeur sans à chaque fois redemander les saisies en même temps.
    Seulement, j'ai lu que un constructeur était formé :
    - des données nécessaires à la définition de l'objet
    - du comportement de ces données
    Pour moi le comportement des données que j'ai mis dans le constructeur était indiqué par leurs demande de saisie. Donc si finalement je le met hors du constructeur, qu'est-ce qui définira le comportement des données?
    Des contrôles de condition des données? (s'assurer qu'un temps ou que la taille d'un tableau est positif par exemple?)
    Ou alors finalement, la boucle for de mon constructeur Cursus suffit pour définir le comportement de la données tableau liste[] ?

    Merci pour ton conseil en tout cas.
    Tu vas m'enlever de nombreuses heures de tirage de cheveux

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    D'une manière générale, si t'as besoin d'accéder au Cursus depuis Etudiant, tu dois le passer en paramètre du constructeur, donc dans Cursus faire un truc du genre Dans ton cas précis, ton besoin n'a pas de sens, même en gardant l'input dans Etudiant, il n'y a absolument aucune raison logique à ce que tu dois parcourir la liste de ce qui se trouve dans le cursus.

  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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Citation Envoyé par souchi63 Voir le message
    ...un constructeur était formé :
    - des données nécessaires à la définition de l'objet
    - du comportement de ces données
    Ça n'a aucun sens pour moi. Un constructeur sert à initialiser l'instance, c'est-à-dire initialiser les attributs de l'objet (les propriétés si tu veux) qui nécessitent de l'être, avec des valeurs cohérentes par rapport au comportement attendu de l'objet.

    Par exemple, si on a un objet Etudiant qui a un attribut nom immutable, il est nécessaire qu'il soit initialisé dès la construction de l'objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class Etudiant {
        private final String nom;
        public Etudiant(String nom) {
              this.nom=nom;
        }
    }
    On peut vouloir imposer des règles à nom : par exemple, on peut estimer que, fonctionnellement, un Etudiant ne doit pas avoir un nom null.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Etudiant {
        private final String nom;
        public Etudiant(String nom) {
              if ( nom==null )  throw new IllegalArgumentException("Le nom ne doit pas être null");
              this.nom=nom;
        }
    }
    Mais ce contrôle peut être fait en amont, lors de la lecture de la donnée qui va servir à construire l'objet, et on peut écrire dans une fabrique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ( nomEtudiant==null ) {
       throw new UneExceptionSpeciale("Impossible de créer un Etudiant avec un nom null");
    }
    else {
        etudiant = new Etudiant(nomEtudiant);
    }
    De la même manière qu'on peut faire ce type de contrôle dans un mutateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Etudiant {
        private final String nom;
        private int variableJeSaisPasQuoi;   // un variable exemple qui doit être un nombre strictement positif
        public Etudiant(String nom) {
              if ( nom==null )  throw new IllegalArgumentException("Le nom ne doit pas être null");
              this.nom=nom;
        }
        public void setJeSaisPasQuoi(int valeur) {
            if ( valeur<=0 ) throw new IllegalArgumentException("Cette valeur doit être strictement positive");
            this.variableJeSaisPasQuoi=valeur; 
        }
    }
    Dans ton cas, on peut imaginer que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Etudiant {
       private String nom, prenom;
       private double [] note;
       private double moyenne;
     
       public Etudiant(String nom, String prenom, double[] notes){
            ...
       }
     
       ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public class Cursus {
        private Etudiant [] liste;
     
        public Cursus(Etudiant[] liste){
            ...
        }
     
    }
    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
    public class FabriqueParSaisieAuClavier {
     
       private Scanner scanner;
     
       public FabriqueParSaisieAuClavier() {
           scanner=new Scanner(System.in);
       }
     
       public Cursus creerCursusParSaisieAuClavier() {
           System.out.print("Nombre d\'étudiants dans la classe : ");
           int nombreEtudiant = scanner.nextInt(); // je note qu'il n'y a aucun contrôle de la saisie : si on saisit un mot au lieu d'un nombre ici, ça plante !
           Etudiant[] liste = new Etudiant [nombreEtudiant];
           for (int i=0; i< liste.length; i++){
                // saisie des infos relatives à chaque étudiant
                System.out.printf("Saisie des informations de l'étudiant %d :%n",(i+1));
                liste[i] = creerEtudiantParSaisieAuClavier(); 
           }
           return new Cursus(liste);
       }
     
       public Etudiant creerEtudiantParSaisieAuClavier() {
            System.out.print("Nom de l'étudiant : " );
            String nom = scanner.next();
            System.out.print("Prénom de l'étudiant : ");
            String prenom = scanner.next();
            int nombre=0;
            do {
                System.out.print("Combien de note pour l'étudiant : ");
                nombre =  scanner.nextInt();
           } while (nombre<1); 
           double[] notes=new double[nombre];
           for (int i=0; i<nombre; i++){
               System.out.printf("Note numéro %d : ", (i+1));
               notes[i]=scanner.nextDouble();
           }
           return new Etudiant(nom, prenom, notes);
       }
     
    }
    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
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    D'une manière générale, si t'as besoin d'accéder au Cursus depuis Etudiant, tu dois le passer en paramètre du constructeur, donc dans Cursus faire un truc du genre Dans ton cas précis, ton besoin n'a pas de sens, même en gardant l'input dans Etudiant, il n'y a absolument aucune raison logique à ce que tu dois parcourir la liste de ce qui se trouve dans le cursus.
    En fait j'essaie de le faire par simple exercice pour essayer de bien comprendre cette partie de la programmation java.
    Je ne veux pas vraiment parcourir la liste mais simplement aspirer le nombre d'étudiants présents dans la liste pour rendre plus "beau" le programme.
    Comme ça au lieu de demander à chaque fois le nom, prénom de l'étudiant, j'aimerais plutôt demander le nom, prénom de l'étudiant 1, puis de l'étudiant 2, 3, etc...
    Pour ça il me faut bien une boucle for avec comme condition i<= liste.length.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 12
    Points : 4
    Points
    4
    Par défaut
    joel.drigo merci pout ces infos !
    Tu me conseillerais alors (en général) d'opter pour des constructeurs avec paramètres plutot que des constructeurs par défaut ?
    Ou les deux restent important?
    Pk si je fais les demandes de saisies en dehors du constructeur, on est d'accord que le constructeur par défaut ne sert à rien?
    Car si j'ai bien compris le constructeur par défaut sert à initialiser les variables quand on ne connait pas encore leurs valeurs, une saisie est donc nécessaire pour les connaitre...

Discussions similaires

  1. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 15h17
  2. petite aide sur les transactions et triggers SVP
    Par CharleLéo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2004, 20h43
  3. Petite aide pour gros problème : libstdc++
    Par Info-Rital dans le forum Linux
    Réponses: 5
    Dernier message: 30/08/2004, 19h17
  4. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 16h28
  5. Une petite aide pour les API ?
    Par Yop dans le forum Windows
    Réponses: 2
    Dernier message: 04/04/2002, 21h45

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