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

C++ Discussion :

Comportement de la methode ajoute()


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Par défaut Comportement de la methode ajoute()
    Bonsoir,
    je travaille sur un exercice c++, que je n'ai pas pu résoudre, qui demande de concevoir une classe qui manipule des ensembles d'entiers allouées dynamiquement dans un tableau. le livre où je travail propose comme solution à l'exercice veuillez voir ci-dessous.
    ma question svp c'est l'explication du comportement des méthodes ajoute() et appartient()
    merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* fichier SETINT1.H */
    /* déclaration de la classe set_int */
    class set_int
    {
    int * adval ; // adresse du tableau des valeurs
    int nmax ; // nombre maxi d'éléments
    int nelem ; // nombre courant d'éléments
    public :
    set_int (int = 20) ; // constructeur
    ~set_int () ; // destructeur
    void ajoute (int) ; // ajout d'un élément
    int appartient (int) ; // appartenance d'un élément
    int cardinal () ; // cardinal de l'ensemble
    } ;
    Voici la définition de notre classe :
    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
    #include "setint1.h"
    set_int::set_int (int dim)
    { adval = new int [nmax = dim] ; // allocation tableau de valeurs
    nelem = 0 ;
    }
    set_int::~set_int ()
    { delete adval ; // libération tableau de valeurs
    }
    void set_int::ajoute (int nb)
    { // on examine si nb appartient déjà à l'ensemble
    // en utilisant la fonction membre appartient
    // s'il n'y appartient pas et si l'ensemble n'est pas plein
    // on l'ajoute
    if (!appartient (nb) && (nelem<nmax)) adval [nelem++] = nb ;
    }
    int set_int::appartient (int nb)
    { int i=0 ;
    // on examine si nb appartient déjà à l'ensemble
    // (si ce n'est pas le cas, i vaudra nele en fin de boucle)
    while ( (i<nelem) && (adval[i] != nb) ) i++ ;
    return (i<nelem) ;
    }
    int set_int::cardinal ()
    { return nelem ;
    }

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Le code ne fonctionne pas en l'état
    • Comment est-initialisé l'attribut nmax ? (Édit : voir ci-dessous)
    • Dans le destructeur c'est delete[] puisqu'on désalloue un tableau


    Sinon pour tes questions, il y a une tartine de commentaires en français qui explique bien.
    D'ailleurs le prof a fait du code très concis avec lequel il faut être un chouïa attentif

    Édit : La méthode set_int::ajoute est mal faite :
    • Il faut déjà faire le test des bornes avant de lancer le parcours de la collection pour tester l'appartenance.
    • Il faut retourner un état, parce que si la collection est pleine ou si l'élément est déjà présent, la méthode ne fait rien mais cela on ne le sait pas

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par foetus Voir le message
    Comment est-initialisé l'attribut nmax ?
    D'une manière peu conventionnelle et un peu caché mais il est initialisé adval = new int [nmax = dim] ..

    Avec la tonne de commentaires, que ne comprends-tu pas ? Ce que fait ta fonction ajoute est over-détaillée dans son implémentation
    Sinon pour utiliser un set, il existe std::set. Et si tu veux une collection d'un set avec un nombre d'élément maximum, tu peux très bien composer un vrai set dans ta classe au lieu d'utiliser de l'allocation dynamique.
    Ca manque de const-correctness, le code est pas du tout aéré et très peu lisible et en C++ on a inventé le type bool.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Citation Envoyé par Bousk Voir le message
    D'une manière peu conventionnelle et un peu caché mais il est initialisé adval = new int [nmax = dim]
    Ce trouage, j'avais vu un signe moins

    C'est ce que j'appelle la persistance métier : à force de voir tout le temps les mêmes choses, à un moment on les voie de façon inconsciente.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2015
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2015
    Messages : 39
    Par défaut Pourquoi
    Ce que je n'ai pas compris c'est cet écriture : while ( (i<nelem) && (adval[i] != nb) ) i++ ; return (i<nelem) ;
    nelem est initialisé à 0 alors pourquoi écrire i<nelem et je n'ai pas compris compris ce que fait cette boucle while. En plus je ne suis pas habitué à voir cette return (i<nelem).
    merci de prendre du temps pour m'expliquer. Car je suis un débutant.

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 771
    Par défaut
    Citation Envoyé par monsrhf Voir le message
    nelem est initialisé à 0 alors pourquoi écrire i<nelem
    Réfléchis : ici on veut parcourir le tableau pour savoir si l'élément est présent.
    L'attribut nelem est le nombre d'éléments que contient le tableau.

    C'est un test de bornes. Et en plus en C/ C++ les index commencent à zéro, ce qui est pratique et on met un signe inférieur strict.
    Donc c'est un test qui veut dire "tant qu'on est pas arrivé au dernier élément + 1"

    Si ton tableau n'a aucun élément, alors le test est faux est on sort de la boucle while tout de suite : c'est logique.


    Citation Envoyé par monsrhf Voir le message
    je n'ai pas compris ce que fait cette boucle while.
    On peut la remplacer par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        int i;
        bool is_found = false;
     
        for(i=0; (!is_found  && (i < nelem)); ++i) {
            if (adval[i] == nb) {
                is_found  = true;
            }
        }
     
        return is_found;

    Citation Envoyé par monsrhf Voir le message
    En plus je ne suis pas habitué à voir cette return (i<nelem).
    Ici on retourne un booléen (TRUE - FALSE) et c'est pour tester si on a parcouru tout le tableau

    C'est logique : Si on a parcouru tout le tableau cela veut forcément dire qu'on n'a pas trouvé l'élément.
    Après ici, on retourne TRUE si on a trouvé l'élément (donc si on s'est arrêté avant la fin du tableau)

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

Discussions similaires

  1. Association "Ajout" ou plutot Methode "Ajout"
    Par pifpafpoof dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 24/03/2012, 17h27
  2. Réponses: 12
    Dernier message: 05/08/2009, 13h24
  3. une methodes pour ajouter des DLL
    Par am@123 dans le forum C#
    Réponses: 3
    Dernier message: 09/06/2007, 11h46
  4. Réponses: 6
    Dernier message: 19/06/2006, 09h38
  5. Classe interne, methode static et ajout de boutons
    Par comme de bien entendu dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 09/03/2006, 14h13

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