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 :

petit probleme à l'exécution


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Par défaut petit probleme à l'exécution
    Bonjour je suis entrain de faire 1 pb basique de c++, il s'agit de construire une classe qui permet d'ajouter des integer. Si l'ensemble est plein , ou si l'element que l'on veut inserer y est deja => message pour le signaler. Il faut en plus du constructeur par defaut, un constructeur avec comme parametre la taille du tableau et une fonction pour avoir le cardinal de l'ensemble.
    Voila ce que j'ai fait à la compliation ça va mais à l'execution ça "bugge" merci de vôtre aide
    Coold

    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
     fichier.h
    #pragma once
     
    //-----------------
    #define NON 0
    #define OUI 1
    #define EXISTE_OK 2
    #define NO_EXISTE 3
    #define OK_AD 4
    #define AD_EXISTE 5
    #define ENS_FULL 6
    //-----------------
     
    class CSetInteger
    {
    public:
        // constructeur par défaut de la classe
        CSetInteger(void);
     
        //constructeur pour initialiser le tableau
        CSetInteger(int dTaille);
     
        //destructeur de la classe
        ~CSetInteger(void);
     
    private:
        // taille du tableau
        int m_dTaille;
        //pointeur du tableau
        int * m_dTab;//????????????
        // position courante
        int m_dCurPos;
    public:
        // fonction pour verifier si l'element existe ou pas
        void Existe(int dNbr, int * pEx_RC);
        // fonction d'ajout d'un nouvel element
        void IntegerAdd(int dNbr, int * pAd_RC);
        // fonction permettant d'avoir le nombre d'éléments de l'objet
        int CardinalEnsemble(void);
     
        // fonction d'affichage de l'ensemble
        void Affiche(void);
    };
     
     
    fichier.cpp
    #include "SetInteger.h"
    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #include<assert.h>
     
     
    // constructeur par defaut de la classe 
    CSetInteger::CSetInteger(void)
    : m_dTaille(0)
    , m_dCurPos(0)
    {
    }
     
    //destructeur de la classe
    CSetInteger::~CSetInteger(void)
    {
        free (m_dTab);
    }
     
    //constructeur d'initialisation de l'objet
    CSetInteger::CSetInteger(int dTaille)
    {
        m_dTaille = dTaille;
        m_dTab = (int *)malloc(sizeof(int) * m_dTaille);
        if(m_dTab == NULL)
        {
            printf("Erreur allocation mémoire pour l'objet\n");
            assert(0);
        }
    }
     
    // fonction pour verifier si l'element existe ou pas
    void CSetInteger::Existe(int dNbr, int * pEx_RC)
    {
        int dExiste, dTrouve;
     
        *pEx_RC = NO_EXISTE;
        //dExiste = NON;
        dTrouve = NON;
        while(dTrouve == NON && m_dCurPos != m_dTaille)
        {
            if(m_dTab[m_dCurPos] == dNbr)
            {
                //dExiste = OUI;
                dTrouve = OUI;
                *pEx_RC = EXISTE_OK;
            }
            else
            {
                dTrouve = NON;            
                m_dCurPos++;
            }
        }
        if (*pEx_RC = EXISTE_OK);
            return;
    }
     
    // fonction d'ajout d'un nouvel element
    void CSetInteger::IntegerAdd(int dNbr, int * pAd_RC)
    {
        *pAd_RC = OK_AD;
     
        //---------------------------------------------
        //Tant que l'on est dans l'ensemble
        // si le nombr est + grand on passe au suivant
        //sinon on l'insere à la position courantes
        //---------------------------------------------
        while(m_dCurPos != m_dTaille)
        {
            if(dNbr > m_dTab[m_dCurPos])
                m_dCurPos++;
            else
                m_dTab[m_dCurPos] = dNbr;
     
            return;
        }
     
        //-----------------------------------------
        //traitement du cas ou l'ensemble est plein
        //-----------------------------------------
        if(m_dCurPos > m_dTaille)
        {
            *pAd_RC = ENS_FULL;
            return;
        }
    }
     
    // fonction permettant d'avoir le cardinal de l'ensemble
    int CSetInteger::CardinalEnsemble(void)
    {
        int dI;
     
        dI = 0;
        while(dI != m_dCurPos)
            dI++;
        return dI;
    }
     
     
    // fonction d'affichage de l'ensemble
    void CSetInteger::Affiche(void)
    {
        for(int dI = 0; dI < m_dCurPos; dI++)
            printf("%d", m_dTab[m_dCurPos]);
    }
     
     
    main.cpp
    #include "SetInteger.h"
    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
        CSetInteger oEnsemble(10);//declaration et init objet de taille 10
        int dNbr, dEx_RC, dAd_RC;
        char cRep;
     
        printf("PROGRAMME D'AJOUT D'ENTIERS\n");
     
        printf("Voulez-vous introduire un entier ? (o,n)");
        cRep = getchar();
        fflush(stdin);
        while (cRep != 'n')
        {
            printf("Entrez l'entier que vous desirez inserer : ");
            scanf("%d", &dNbr);
     
            //------------------------------------------------------------------
            //appel à la fonction qui teste si l'element appartient à l'ensemble
            //s'il n'appartient pas 
            //    alors on l'ajoute et gestion des erreurs
            //------------------------------------------------------------------
     
            oEnsemble.Existe(dNbr, &dEx_RC);
     
            if(dEx_RC == EXISTE_OK)
            {
                exit(0);
            }
            else 
            {
                oEnsemble.IntegerAdd(dNbr, &dAd_RC);
     
                if(dAd_RC == EXISTE_OK)
                {
                    printf("l'element existe deja et ne peut etre insere\n");
                    exit(0);
                }
                if(dAd_RC == ENS_FULL)
                {
                    printf("l'enemble est plein et l'element ne peut etre insere \n");
                    exit(0);
                }
            }
            printf("L'insetion s'est bien deroulee\n");
            printf("Voulez-vous introduire un entier ? (o,n) ");
            cRep = getchar();
            fflush(stdin);
        }
     
        //-----------------------
        //affichage de l'ensemble
        //-----------------------
        oEnsemble.Affiche();
     
    }

    ====

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    "ça "bugge" merci de vôtre aide"

    c'est un peu flou!

    qu'est ce qui ne marche pas? t'as un message d'erreur?ya une fonction qui marche pas?

    quand c'est un pti bout de code a tester ca va mais la c'est un peu long, et puis c'est l'heure d'aller manger

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Par défaut
    en fait quand je veux introduire 1 int , il se plante et j'ai Un fenetre qui me propose de debugger mais je ne m'y connais pas ...

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    J'ai juste survolé le code, donc je ne garanti rien sur le résultat :

    - La position courante est gérée comme une variable membre, mais n'est pas remise à 0. Ca peut encore marcher pour le premier ajout, mais pas le second
    - D'ailleurs, pourquoi en faire une variable membre ? Qu'est-ce que ça apporte
    - Tu n'augmentes pas la taille quand tu ajoutes une donnée
    - D'ailleurs, tu n'ajoute pas de donnée, tu ne fais qu'en remplacer une existante par la nouvelle
    - Tu utilises des entiers et des #define pour gérer des informations d'état (ok,...). Utiliser des enums (ou des booléens, quand les valeurs sont OUI et NON) serait plus clair et éviterait des erreurs
    - Ta fonction d'ajout devrait retourner l'information de succès ou pas, plutôt que de prendre cette information en argument variable (et si on voulait garder ça, un passage par référence serait préférable à un passage par pointeur).
    - Tes algorithmes sont sous-optimaux (ex : O(n) pour l'ajout, là où on peut avoir O(ln n), voire O(1) si on limite l'ensemble des données ajoutables). Mais bon, il s'agit probablement d'un exercice scolaire, et avoir les bons algos demanderait plus de code.
    - J'ai vu un if(a=b) qui devrait être if(a==b)
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum.

    Déjà, on ne le répète jamais assez, mais, quand on code en C++, il est fortement préférable d'utiliser les classes du C++ plutot que les fonctions héritées du C.

    Je vais "glisser" sur la classe vector, étant donné que ton exercice consiste à fournir une classe qui lui ressemble, mais je t'invite donc à éviter les fonctions printf, getc et autres au profit des flux d'entrée/sortie standard, respectivement cin et cout, tous les deux disponibles dans l'espace de noms std par inclusion du fichier d'en-tête <iostream>.

    De la même manière, je te conseillerais fortement de préférer le système d'allocation dynamique fournit par le C++ sous la forme de new (new[]) et delete (delete[]) aux fonctions *alloc et free

    En outre, il faut savoir que le prototype de la fonction principale main est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int main()
    /* ou */
    int main( int argc, char *argv[])
    Si ton compilateur était bien réglé, il devrait t'indiquer un avertissement (au minimum) t'indiquant que la fonction ne renvoie rien.

    La raison en est que la valeur renvoyée par cette fonction permet au système d'exploitation de savoir la manière dont le programme s'est terminé: selon le système d'exploitation, il existe deux ou trois valeurs
    • EXIT_SUCCES : qui est une macro équivalant à 0 et signalant que le programme s'est bien terminé
    • EXIT_FAILURE : qui est une macro équivalant à 1 et signalant que le programme s'est terminé sur une erreur
    • (pour certains systèmes d'exploitation) EXIT_WARNING : qui est une macro équivalant à 2 et signalant que le programme s'est terminé sur un avertissement (une erreur "non fatale" )
    et dont le but est de permettre l'écriture de script sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    programe1 && programe2 &2 &1 programme3
    qui demande, en gros, de lancer programme1, puis, s'il s'est correctement terminé de lancer programme2 et sinon (s'il s'est terminé sur une erreur ou sur un avertissement), de lancer programme3

    Enfin, ce n'est pas parce que, pour une raison ou une autre l'utilisateur a fait une c en essayant d'introduire plus d'entiers que ce qu'il ne pouvait que tu ne dois pas donner la permission de voir quand même le contenu de ton objet (tu pourrais d'ailleurs même prévoir, pourquoi pas , la possibilité d'obtenir les informations dans la boucle d'encodage, de manière à ce que l'utilisateur puisse vérifier ce qu'il a fait

    Et, cerise sur le gâteau, tant qu'à faire, ce serait pas mal de ne pas oublier que l'utilisateur est, par défaut, un imbécile distrait, et donc de t'assurer en permanence que ce qu'il introduit correspond à ce que l'application attend de lui

    Accessoirement (enfin, pas si accessoirement que cela), on pourrait faire valoir que:
    • il existe un type booléen, qui vaut true ou false : le type bool, qu'il est intéressant d'utiliser
    • il est souvent préférable d'utiliser une valeur de retour plutôt qu'un argument, si du moins, tout ce que tu veux, c'est savoir si une méthode de ta classe a correctement fait son travail (le type bool prend alors tout son sens )
    • il faut se méfier des directive pragma... ce n'est pas portable, il vaut mieux utiliser des "guard dogs"
    • il n'est pas nécessaire de préciser le type void dans la liste d'arguments, si une fonction n'en demande pas
    • il est généralement conseillé d'éviter les #define quand il s'agit d'avoir des valeur d'état... les énumérations sont parfaites pour cet usage

    Maintenant que je t'ai bien assommé avec toutes les remarques que m'inspiraient la lecture en diagonale de ton code, voyons un peu comment les prendre en compte...

    Nous allons commencer par virer les fonctions issues du C en les remplaçant par les équivalents C++, et nous assurer que le programme renvoie une valeur cohérente quand tout se passe bien, et en prenant en compte les remarques "subsidiaires" qui peuvent l'être (sans modifier la logique que tu as utilisé... on en parlera plus tard ).

    Voici à peu près la forme qu'il prendrait
    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
    /* je préfère honnetement les "guard dogs"
    #pragma once
     */
    #ifndef SETINTEGER_H
    #define SETINTEGER_H 
    //-----------------
    /* ces deux-ci sont inutiles, on a les booléens :D
    #define NON 0
    #define OUI 1
    */
    /* comme j'ai décidé de ne pas modifier ta logique, on les garde pour l'instant
     * mais on verra plus tard qu'ils sont également inutiles :D
     */
    #define EXISTE_OK 2
    #define NO_EXISTE 3
    #define OK_AD 4
    #define AD_EXISTE 5
    #define ENS_FULL 6
    //-----------------
     
    class CSetInteger
    {
    public:
        // constructeur par défaut de la classe
        CSetInteger();
     
        //constructeur pour initialiser le tableau
        CSetInteger(int dTaille);
     
        //destructeur de la classe
        ~CSetInteger();
     
    private:
        // taille du tableau
        int m_dTaille;
        //pointeur du tableau
        int * m_dTab;// si, il le faut... c'est la responsabilité majeure de ta classe :D
        // position courante
        int m_dCurPos;
    public:
        // fonction pour verifier si l'element existe ou pas
        void Existe(int dNbr, int * pEx_RC);
        // fonction d'ajout d'un nouvel element
        void IntegerAdd(int dNbr, int * pAd_RC);
        // fonction permettant d'avoir le nombre d'éléments de l'objet
        int CardinalEnsemble(void);
     
        // fonction d'affichage de l'ensemble
        void Affiche(void);
    };
    #endif //SETINTEGER_H
    fichier.cpp
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
     
    #include "SetInteger.h" //OK, lui on en a besoin
    /* mais tous ceux-là, il vaut mieux les éviter...
     * Ils seront avantageusement remplacés par <iostream>
     * Seul assert.h pourrait s'avérer intéressant, mais on lui préfèrerait alors <cassert>
     * et encore, on se rend compte que l'on n'en a pas besoin
    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #include<assert.h>
    */
    #include <iostream> 
     
    // constructeur par defaut de la classe 
    CSetInteger::CSetInteger()
    : m_dTaille(0),
    m_dTab(NULL), //tant qu'à faire, initialise le aussi :D
    m_dCurPos(0)
    {
    }
    /* nota: pour rendre l'utilisation du constructeur par défaut cohérente
     * il serait sans doute intéressant de prévoir une méthode permettant
     * de modifier la taille :D
     */
    //destructeur de la classe
    CSetInteger::~CSetInteger()
    {
        delete[] m_dTab; //utilisation de delete (ici delete[] parce que c'est un
                  // tableau au lieu de free
    }
     
    //constructeur d'initialisation de l'objet
    CSetInteger::CSetInteger(int dTaille) //utilise les listes d'initilalisation
                                      //pour tous les membres que tu peux ;)
    m_dTaille(dTaille),
    m_dCurPos(0) 
    {
        /* m_dTaille = dTaille; n'est plus nécessaire: il est dans la liste d'initialisation :D */
        m_dTab = new int[dTaille];//remplacement de malloc par new
        /* Ce code est inutile: new lance une exception de type
         * std::bad_alloc si l'allocation échoue...
         * on pourrait éventuellement envisager de la récupérer dans la fonction
         * qui déclare l'instance de notre classe, mais ici, le risque d'échec de
         * l'allocation dynamique est suffisemment restreint pour que l'on
         * puisse décider de ne pas le faire :D
        if(m_dTab == NULL)
        {
            printf("Erreur allocation mémoire pour l'objet\n");
            assert(0);
        }
        */
    }
     
    // fonction pour verifier si l'element existe ou pas
    void CSetInteger::Existe(int dNbr, int * pEx_RC)
    {
        /*je sais qu'on peut, mais je n'aime pas les déclarations successives 
         * je préfère mettre une déclaration par ligne :D
         */
        bool dExiste; 
        bool dTrouve;
     
        *pEx_RC = NO_EXISTE;
        //dExiste = NON;
        dTrouve = false;
        /* cette boucle, bien que je ne l'ai pas modifiée, cette boucle
         * va te poser problème: tu modifie la valeur de m_dCurPos sans
         * garder la position du dernier élément inséré... (je croyais qu'il servait
         * à ca, ce membre :D)... tu devrais utiliser une variable temporaire ;)
         */
        while(dTrouve == false && m_dCurPos != m_dTaille)
        {
            if(m_dTab[m_dCurPos] == dNbr)
            {
                //dExiste = OUI;
                dTrouve = OUI;
                *pEx_RC = EXISTE_OK;
            }
            else
            {
                dTrouve = NON;            
                m_dCurPos++;
            }
        }
        /* il est généralement mal vu de provoquer un retour de fonction
         * alors qu'elle n'en demande pas... d'autant plus que,une fois que  tu
         * sors de ta boucle, la valeur de pEx_RC est correcte ;)
         * ce code ne sert donc à rien... viré :D
        if (*pEx_RC = EXISTE_OK);
            return;
       */
    }
     
    // fonction d'ajout d'un nouvel element
    void CSetInteger::IntegerAdd(int dNbr, int * pAd_RC)
    {
        *pAd_RC = OK_AD;
     
        //---------------------------------------------
        //Tant que l'on est dans l'ensemble
        // si le nombr est + grand on passe au suivant
        //sinon on l'insere à la position courantes
        //---------------------------------------------
        /*soit, mais que fais tu de l'élément qui se trouvait avant
         * à l'emplacement choisi ???
         */
        while(m_dCurPos != m_dTaille)
        {
            if(dNbr > m_dTab[m_dCurPos])
                m_dCurPos++;
            else
                m_dTab[m_dCurPos] = dNbr;
           /* te rend tu compte que tu quitte d'office la fonction avec
            * ce return, dés que tu arrive en fin de boucle ???
            * ce n'est surement pas ce que tu veux... viré :D
            return;
            */
        }
     
        //-----------------------------------------
        //traitement du cas ou l'ensemble est plein
        //-----------------------------------------
        /* ne trouve tu pas plus logique de faire le test avant d'essayer d'insérer
         * un élément, et meme de n'entrer dans la boucle
         * que s'il y a effectivement la place pour rajouter un élément ??? */
        if(m_dCurPos > m_dTaille)
        {
            *pAd_RC = ENS_FULL;
            return;
        }
    }
     
    // fonction permettant d'avoir le cardinal de l'ensemble
    int CSetInteger::CardinalEnsemble()
    {
        int dI;
     
        dI = 0;
        while(dI != m_dCurPos)
            dI++;
        return dI;
    }
     
     
    // fonction d'affichage de l'ensemble
    void CSetInteger::Affiche()
    {
        for(int dI = 0; dI < m_dCurPos; dI++)
            std::cout<< m_dTab[m_dCurPos]<<" "; //remplacer printf par cout ;)
    }
    main.cpp
    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
     
    #include "SetInteger.h"
    /* ici aussi, on remplace avantageusement les deux fichiers par <iostream>
    #include<stdio.h>
    #include<stdlib.h>
    */
    #include <iostream>
    int main()
    {
        CSetInteger oEnsemble(10);//declaration et init objet de taille 10
     
        /*je sais qu'on peut, mais je n'aime pas les déclarations successives 
         * je préfère mettre une déclaration par ligne :D
         */
        int dNbr;
        int dEx_RC; 
        int dAd_RC;
        char cRep;
     
        std::cout<<"PROGRAMME D'AJOUT D'ENTIERS"<<std::endl; //remplacer printf par cout
        /* nota: std::endl a l'énorme avantage de
         *     - passer à la ligne
         *     - forcer la vidange du buffer
         */
     
        std::cout<<"Voulez-vous introduire un entier ? (o,n)"; //idem
        std::cin>>cRep;
        /* supprimé pour l'instant... on en reparle quand on arrive à la sécurisation
         * :D
        fflush(stdin);
        */
        while (cRep != 'n')
        {
            std::cout<<"Entrez l'entier que vous desirez inserer : ";
            cin>>dNbr;// remplacer scanf par cin
     
     
            //------------------------------------------------------------------
            //appel à la fonction qui teste si l'element appartient à l'ensemble
            //s'il n'appartient pas 
            //    alors on l'ajoute et gestion des erreurs
            //------------------------------------------------------------------
     
            oEnsemble.Existe(dNbr, &dEx_RC);
     
            if(dEx_RC == EXISTE_OK)
            {
     
                /*Le fait de ne pas pouvoir ajouter un élément existant
                 *justifie-t-il de quitter l'application si brutalement ?
                 * je ne suis pas de cet avis...*/
                exit(0);
            }
            else 
            {
                oEnsemble.IntegerAdd(dNbr, &dAd_RC);
     
                if(dAd_RC == EXISTE_OK)
                {
                    std::cout<<"l'element existe deja et ne peut etre insere"
                             <<std::endl;
                    /* idem */
                    exit(0);
                   */
                }
                /* par contre, il faut donc s'assurer que le fonctionnement
                 * reste identique
                 */
                if(dAd_RC == ENS_FULL)
                {
                    std::cout<<"l'enemble est plein et l'element ne peut etre insere"
                             <<std::endl;
                   /* idem
                    exit(0);
                    */
                }
            }
            std::cout<<"L'insetion s'est bien deroulee"<<std::endl
                     <<"Voulez-vous introduire un entier ? (o,n) ";
            std::cin>>cRep;
        }
        oEnsemble.Affiche();
        return 0;
    }
    Tu remarquera que j'ai rajouté plein de commentaires dans le code...

    Tous ces commentaires rajoutés ont pour but de te permettre de comprendre ce que j'ai modifié, et pourquoi, mais aussi d'attirer ton attention sur les erreurs de logique que tu as commises.

    A vrai dire, je te soupçonne très fortement (c'est bien plus une constation qu'une attaque personnelle, n'est-ce pas) de t'être "jeté sur ton clavier" et d'avoir commencé à "vomir ton code" sans avoir pensé au préalable à un algorithme cohérent qui t'assure que chaque fonction réagit exactement de la manière à laquelle tu t'y attend.

    Cette erreur est classique chez les gens qui commencent en programmation, aussi, je me permet une petite disgression pour te donner un conseil supplémentaire:
    [MODE DISGRESSION ON]
    Avant de commencer à écrire la première ligne de code, prend l'habitude de répondre à quatre questions de base:
    1. que doit faire mon application
    2. de quelles données mon application a-t-ellle besoin
    3. où mon application va-t-elle obtenir ces données
    4. et la plus importante de toute: quelle est le traitement logique que mon application doit appliquer à ces données

    en sachant qu'il est généralement inutile de vouloir passer à la question suivante tant que tu n'a pas trouvé une réponse correcte à celle à laquelle tu es occupé à répondre.

    Tu trouveras le plus souvent les réponses aux trois premières questions dans l'énoncé, et elles auront comme but principal de te permettre d'éclaircir les choses lorsque tu devra répondre à la dernière.

    Mais cette dernière question représentera, finalement, tout le travail "intéressant" car, il s'agit en fait de prendre une feuille et un crayon et de réfléchir point par point à l'ensemble de la logique qu'il faut suivre, pour chaque fonction, pour que, d'un point de départ donné (l'appel de la fonction), elle finisse à un point d'arrivée donné (le retour de la fonction) en étant sur que son comportement correspond exactement à ce que tu attend d'elle.

    De la même manière, il faut penser au fait qu'une classe doit être seule responsable de son contenu... ainsi, le fait que l'insertion échoue (pour une raison ou une autre) devrait être géré... dans ta classe, et non dans la fonction principale

    J'ai bien conscience qu'en cours, on apprend souvent la conception et l'algorithmique après avoir appris un langage, et j'ai meme conscience du fait que l'algorithmique se limite souvent au flowchart ou, avec un peu de chance, au pseudo code...

    Aussi, je t'invite avec insistance à "prendre un peu d'avance" et à te renseigner sur les différentes méthodes de conception et d'algorithmique qui existent

    A titre preso, la méthode algorithmique qui a ma préférence, est le Nassi-Schneiderman (mais bon, d'aucuns te diront que c'est trop "petits dessins")
    [MODE DISGRESSION OFF]
    Voyons maintenant comment faire quelque chose de cohérent...

    Mais, pour cela, il vaut peut être mieux reprendre tout depuis le début, et donc, commencer par répondre aux quatre questions que j'ai introduites dans ma disgression.

    Que doit faire mon application
    L'application doit:
    • permettre de gérer une classe personnelle
    • demander à l'utilisateur ce qu'il veut faire (parmi les choix "insérer un entier", "afficher le contenu" ou "quitter")


    la classe doit gérer un tableau d'entier

    Ca, c'est ce que tu as dit au départ, mais il est donc intéressant de détailler un peu:
    Elle devra:
    • permettre l'insertion d'un entier, tout en s'assurant de renvoyer une valeur de réussite ou d'échec
    • permettre d'afficher les différents éléments insérés
    • s'occuper de la gestion du tableau dans son ensemble
    • (éventuellement) fournir un message indiquant l'erreur survenue lors de la tentative d'insertion

    Cela nous permet de répondre à la deuxième question:
    De quelles données mon application et ma classe ont-elles besoin
    L'aplication a besoin:
    • d'une instance de la classe
    • d'une variable permettant de connaitre le choix de l'utilisateur


    La classe a besoin:
    • d'un tableau géré dynamiquement capable de contenir des entiers
    • d'un entier représentant le nombre maximal d'élément que le tableau peut contenir
    • d'un entier représentant l'indice du dernier élément inséré
    • d'une chaine de caractères indiquant l'erreur survenue lors de la dernière instruction reçue
    • de la valeur de l'entier à insérer (quand on est en phase d'insertion)

    On peut donc passer à la troisième question:

    Où la classe et l'application vont-elle obtenir ces informations
    • La taille du tableau est obtenue de la fonction appelante lors de la création de l'instance.
    • le nombre d'éléments déjà inséré sera géré en interne
    • le tableau d'entiers sera géré en interne, sur base de la taille fournie lors de la création
    • Le message d'erreur sera géré en interne si une erreur survient (avec des valeurs connues à l'avance, selon l'erreur)
    • la valeur de l'entier à insérer est fournie par l'utilisateur


    Tu l'auras sans doute remarqué, je n'ai fait ici que présenter les mêmes choses sous un autre angle ... mais, au moins, on en arrive à une compréhension correcte de ce qui se passe

    Il est temps maintenant de passer au gros morceau: répondre à la quatrième question:
    Quel traitement logique la classe et l'application doivent-elles fournir
    Pour l'application:

    L'application doit :
    demander à l'utilisateur combien d'élément il souhaite pouvoir mettre dans l'instance de la classe,
    créer l'instance de la classe en conscéquence
    "boucler" sur la proposition des choix jusqu'à ce que l'utilisateur décide de quitter
    Si on demande l'insertion et qu'elle échoue, provoquer l'affichage de l'erreur survenue
    Un dernier affichage sera forcé lorsque l'utilisateur décidera de quitter

    Pour la classe:

    Lors de la création, elle doit:
    allouer dynamiquement un tableau d'entiers capable de contenir le nombre indiqué par l'utilisateur
    initialiser la taille maximale à la valeur du nombre indiqué par l'utilisateur
    initialiser l'indice du dernier élément inséré à 0
    initialiser le message à une chaine vide

    Lors de la destruction, elle doit:
    désallouer le tableau (les autres membres sont détruits automatiquement

    Lors de l'insertion, elle doit:
    • Vérifier s'il est encore possible d'insérer un élément
      si c'est possible
      • Demander la valeur à insérer
      • Vérifier si l'élément existe déjà (il faut une boucle pour vérifier ceci)
        S'il existe:
        • donner la valeur de "l'element existe deja" au message d'erreur
        • renvoyer "false"

        sinon
        • incrémenter l'indice du dernier élément existant
        • insérer le l'élément après le dernier élément existant
        • (éventuellement) afficher que l'insertion s'est correctement déroulée

      sinon
      • donner la valeur de "impossible rajouter un element supplementaire" au message d'erreur
      • renvoyer "false"
    • renvoyer "true", vu que, si on arrive ici, c'est que tout s'est bien passé

    lorsque l'application demande le message d'erreur, elle doit:
    renvoyer simplement le message d'erreur, sous forme constante

    Avec toutes ces informations, et mis à part le fait qu'il manque une boucle, tu devrais presque être en mesure de créer quelque chose d'efficace

    Si tu as des questions, n'hésite pas à les poser, mais j'aime autant te laisser "suer" un peu là dessus (c'est le meilleur service à te rendre )

    PS: tu peux te vanter de m'avoir incité à battre tous les records en terme de taille d'un message
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Beaucoup de choses
    Moi, je dis : joli (et je le pense)
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Par défaut
    "Le savoir est mieux quand il est partagé", de quelqu'un...
    Merci pour tous vos conseils et critiques bien judicieuses.
    je ne connaisais pas le <stdio> c'est quoi la différence avec le <stdio.h>, je vois qu'il y'a y 1 erreur à la compilation et justement sur la ligne du stio: fatal error C1083: Impossible d'ouvrir le fichier include*: 'stdio'*: No such file or directory.(j'utilise Microsoft Visual Studio 2005),
    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
     
     //constructeur d'initialisation de l'objet
    CSetInteger::CSetInteger(int dTaille) //utilise les listes d'initilalisation
                                      //pour tous les membres que tu peux ;)
    m_dTaille(dTaille),
    m_dCurPos(0) 
    {
        /* m_dTaille = dTaille; n'est plus nécessaire: il est dans la liste d'initialisation :D */
        m_dTab = new int[dTaille];//remplacement de malloc par new
        /* Ce code est inutile: new lance une exception de type
         * std::bad_alloc si l'allocation échoue...
         * on pourrait éventuellement envisager de la récupérer dans la fonction
         * qui déclare l'instance de notre classe, mais ici, le risque d'échec de
         * l'allocation dynamique est suffisemment restreint pour que l'on
         * puisse décider de ne pas le faire :D
        if(m_dTab == NULL)
        {
            printf("Erreur allocation mémoire pour l'objet\n");
            assert(0);
        }
        */
    }
    je suis sûr de ben comprendre, comment se fait la gestion des erreurs

    Merci

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 116
    Par défaut
    Bjr Kaola01 apres tes conseils avises, j'ai pu arriver à quelque chose qui je pense s'approche de la solution. Il ya bien sûr certains conseils que je n'ai pu mettre en pratique, vu le niveau du cours où on en est...par exemple le pragma once, pareil pour le type booleen, je préfère rester en accord avec le cours, nous ne somme qu'au debut du C++ et je suppose que le prof nous en parlera, c'est vrai l'an passé en java on a utilisé le type bool et je pense que ça ne va pas tardrer.
    pour le iostram.h, j'ai 1 souci car le complitaur me signale une erreur sur cet include, je ne sais pas pourquoi, j'ai dû faire comme avant avec tous les includes necessaires
    J'ai encore quelques soucis car j'introduis des int et tout semble bien se dérouler car 1 message qui me le confirme mais à l'affichage ça ne va pas.
    Je pense que l'insertion est en cause. Merci d'y jeter un coup d'oeil.

    fichier.h
    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
    #pragma once
     
    //-----------------
    #define NON 0
    #define OUI 1
    #define EXISTE_OK 2
    #define NO_EXISTE 3
    #define OK_AD 4
    #define AD_EXISTE 5
    #define ENS_FULL 6
    //-----------------
     
    class CSetInt
    {
    public:
    	// constructeur par défaut de la classe
    	CSetInt(void);
     
    	//constructeur pour initialiser le tableau
    	CSetInt(int dTaille);
     
    	//destructeur de la classe
    	~CSetInt(void);
     
    private:
    	// taille du tableau
    	int m_dTaille;
    	//pointeur du tableau
    	int * m_pdTab;
    	// position courante
    	int m_dCurPos;
    public:
    	// fonction pour verifier si l'element existe ou pas
    	void Existe(int dNbr, int * pEx_RC);
    	// fonction d'ajout d'un nouvel element
    	void IntegerAdd(int dNbr, int * pAd_RC);
    	// fonction permettant d'avoir le nombre d'éléments de l'objet
    	int CardinalEnsemble(void);
     
    	// fonction d'affichage de l'ensemble
    	void Affiche(void);
    };
    fichier.cpp
    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
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    #include "SetInt.h"
    //#include<iostream.h>
    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #include<assert.h>
     
    //**************************************
    //constructeur par defaut de la classe 
    //**************************************
    CSetInt::CSetInt(void)
    : m_dTaille(0)
    , m_dCurPos(0)
    ,m_pdTab(NULL)
    {
    }
     
    //*****************************************¨*******
    //constructeur d'initialisation de l'objet
    //*************************************************
     
    CSetInt::CSetInt(int dTaille)
    //------------------------------------------------
    //initialisation de la taille du taille du tableau
    //initialisation de la position courante
    //creation du tableau
    //------------------------------------------------
    :m_dTaille(dTaille),
    m_dCurPos(0) 
    {
    	//ces 2 instructions sont deja dans la liste d'initilisation
    	/*m_dTaille = dTaille;
    	m_dCurPos =0;
    	*/ 
    	m_pdTab = (int *)malloc(sizeof(int) * m_dTaille);
    	if(m_pdTab == NULL)
    	{
    		printf("Erreur allocation mémoire pour l'objet\n");
    		assert(0);
    	}
    }
    //**************************************************
    // fonction pour verifier si l'element existe ou pas
    //**************************************************
    void CSetInt::Existe(int dNbr, int * pEx_RC)
    {
    	int dI, dExiste, dTrouve;
     
    	*pEx_RC = NO_EXISTE;
    	dExiste = NON;
    	dTrouve = NON;
    	dI = 0;
    	while( dI != m_dTaille && dTrouve == NON && dExiste == NON )
    	{
    		if(m_pdTab[dI] == dNbr)
    		{
    			dExiste = OUI;
    			dTrouve = OUI;
    			printf("l'element existe deja et ne peut etre insere !!!\n");
    			*pEx_RC = EXISTE_OK;
    		}
    		else
    		{
    			dTrouve = NON;			
    			dI++;
    		}
    	}
    }
     
    //******************************************
    // fonction d'insertion d'un nouvel element
    //******************************************
    void CSetInt::IntegerAdd(int dNbr, int * pAd_RC)
    {
    	*pAd_RC = OK_AD;
     
    	//-----------------------------------------
    	//traitement du cas ou l'ensemble est plein
    	//-----------------------------------------
     
    	if(m_dCurPos > m_dTaille)
    	{
    		printf("l'ensemble est plein et l'entier ne peut etre insere !!!\n ");
    		*pAd_RC = ENS_FULL;
    	}
     
    	//---------------------------------------------
    	//Sinon
    	//	on insere le nombre  à la position courante
    	//	on incrémente la position courante
    	//---------------------------------------------
     
    	while(m_dCurPos != m_dTaille)
    	{
    		m_pdTab[m_dCurPos] = dNbr;
    		m_dCurPos++;
    	}	
    }
    //******************************************************
    // fonction permettant d'avoir le cardinal de l'ensemble
    //******************************************************
    int CSetInt::CardinalEnsemble(void)
    {
    	int dI;
     
    	dI = 0;
    	while(dI != m_dCurPos)
    		dI++;
    	return dI;
    }
     
    //***********************************
    // fonction d'affichage de l'ensemble
    //***********************************
    void CSetInt::Affiche(void)
    {
    	for(int dI = 0; dI < m_dCurPos; dI++)
    		printf("%d", m_pdTab[dI]);
    }
     
    //************************
    //destructeur de la classe
    //************************
    CSetInt::~CSetInt(void)
    {
    	free (m_pdTab);
    }
     
    main.cpp
    #include "SetInt.h"
    #include<stdio.h>
    #include<stdlib.h>
     
    //----------------------------------------------------------------------------
    //PRJ02 Programme de gestion d'integer
    //Réaliser une classe nommée CSetInt permettant de manipuler des ensembles
    //de nombres entiers. On devra pouvoir réaliser sur un tel ensemble les 
    //opérations classiques suivantes :
     
    //•	Lui ajouter un nouvel entier; si plus de place, la fonction renvoit 
    //une valeur dans le code de retour. Si l’entier existe déjà dans l’objet
    //alors il ne devra plus y être ajouté.
    //•	Connaître son cardinal (nombre d’éléments)
    //•	Savoir si un entier donné lui appartient
    //Ici on conservera les différents éléments de l’ensemble dans un tableau 
    //alloué dynamiquement par le constructeur. Un argument (auquel on pourra 
    //prévoir une valeur par défaut) lui précisera le nombre maximal d’éléments
    //de l’ensemble.
    //•	Constructeur par défaut
    //•	Constructeur acceptant un seul paramètre spécifiant la taille de l’ensemble
    //•	Le destructeur
    //----------------------------------------------------------------------------
     
    void UseClassSetInt()
    {
    	CSetInt oEnsemble(10);//declaration et init objet de taille 10
    	int dNbr, dEx_RC, dAd_RC; 
    	char cRepInser, cChoix, cRepAffich;
     
    	printf("Voulez-vous inserer un entier (o,n) ?  ");
    	cRepInser = getchar();
    	fflush(stdin);
    	while (cRepInser != 'n')
    	{
    		printf("Entrez l'entier que vous desirez inserer : ");
    		scanf("%d", &dNbr);
    		fflush(stdin);
     
    		//------------------------------------------------------
    		//appel à la fonction qui teste si l'element existe deja
    		//s'il n'appartient pas 
    		//	alors on l'ajoute et gestion des erreurs
    		//-------------------------------------------------------
    		oEnsemble.Existe(dNbr, &dEx_RC);
    		if(dEx_RC == EXISTE_OK)
    		{
    			exit(0);
    		}
    		else 
    		{
    			oEnsemble.IntegerAdd(dNbr, &dAd_RC);
    			if(dAd_RC == EXISTE_OK)
    			{
    				printf("l'element existe deja et ne peut etre insere\n");
    				exit(0);// ne pas sortir du programme laisser la possibilite de poursuivre
    			}
    			if(dAd_RC == ENS_FULL)
    			{
    				printf("l'enemble est plein et l'element ne peut etre insere \n");
    				exit(0);//exit(0); ne pas sortir du programme laisser la possibilite de poursuivre
    			}
    		}
    		printf("L'insetion s'est bien deroulee\n");
    		printf("Voulez-vous introduire un autre entier ? (o,n) ");
    		cRepInser = getchar();
    		fflush(stdin);
    	}
     
    	printf("Voulez vous afficcher la classe (o, n) ?");
    	cRepAffich =  getchar();
    	fflush(stdin);
    	while(cRepAffich != 'n')
    	{
    		oEnsemble.Affiche();
    		printf("Voulez vous afficcher la classe (o, n) ?");
    		cRepAffich =  getchar();
    		fflush(stdin);
    	}
    }
     
    //********************
    //Programme principal
    //********************
    int main()
    {
    	char cVotreChoix;
     
    	printf("PRJ02 Class CSetInt\n");
    	printf("---------------------------------------------------\n");
    	printf("Application permettant l'ajout d'int\n\n");
    	printf("pour utiliser la classe SetInt appuyer sur 1\n");
    	printf("Pour quitter appuyer sur 2\n\n");
    	printf("votre choix : ");
    	cVotreChoix = getchar();
    	fflush(stdin);
     
    	switch(cVotreChoix)
    	{
    	case'1': UseClassSetInt();
    		break;
    	case '2': printf("Vous avez decide de quitter !!! au revoir\n");
    		exit(0);
    		break;
    	default:printf("Enter lke bon choix soit 1 ou 2\n");
    	}
    }
    Coold

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

Discussions similaires

  1. Petit problème de fork
    Par osmose22 dans le forum Linux
    Réponses: 7
    Dernier message: 18/03/2007, 21h10
  2. petit probleme avec l'éditeur de builder
    Par qZheneton dans le forum C++Builder
    Réponses: 2
    Dernier message: 28/10/2004, 16h19
  3. petit probleme de requete
    Par nico33307 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 25/08/2004, 11h36
  4. [ struts ] probleme à l'exécution
    Par flogreg dans le forum Struts 1
    Réponses: 12
    Dernier message: 23/08/2004, 12h11
  5. petit probleme dans une requte POSTGRE SQL
    Par ghis le fou dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/09/2003, 13h51

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