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 :

Programme test de condition


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 51
    Par défaut Programme test de condition
    Je vous explique : dans un programme je demande l'age de l'utilisateur, si il et majeur, bienvenue vous est majeur s'affiche. Si il est pas majeur je souhaiterai que le programme redemande l'age de l'utilisateur. Donc reparte au debut de la fonction main() mais c'est là ou je n'arrive pas !

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <iostream>
    using namespace std;
     
     
     
    int Utilisateur(int ageUtilisateur)
    {
        if(ageUtilisateur>18)
        {
            cout << "bienvenue vous est majeur";
        }
     
        else
        {
            return main();
        }
    }
     
    int main()
    {
        int age(0);
     
        cout << "Quel age avez vous ?" << endl;
        cin >> age;
     
        Utilisateur(age);
     
    }
    Voici les erreur qui s'affiche.

    C:\Users\alex\Desktop\c++\boucles\main.cpp||In function 'int Utilisateur(int)'
    C:\Users\alex\Desktop\c++\boucles\main.cpp|15|error: 'main' was not declared in this scope|
    C:\Users\alex\Desktop\c++\boucles\main.cpp|17|warning: control reaches end of non-void function [-Wreturn-type]|
    ||=== Build finished: 1 errors, 1 warnings (0 minutes, 0 seconds) ===|


    merci pour votre aide

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    l'erreur n'est-elle pas assez explicite ?
    error: 'main' was not declared in this scope
    Ta façon de faire est vraiment très mauvaise.
    http://cpp.developpez.com/faq/cpp/?p...#SL_cin_verify
    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.

  3. #3
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    Je complete la remarque de Bousk par celle-ci :

    On ne rappelle JAMAIS la fonction main !

    Pour ce qui est de redemander l'age de l'utilisateur si ce dernier n'est pas majeur, il te suffit de faire une boucle avant ton affichage qui demande de rentrer l'age avec pour condition si l'age est superieur a 0.

  4. #4
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 51
    Par défaut
    merci pour vos conseils, je me doutais qui il y avait une boucle, je vais voir tout ça.

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Effectivement, l'appelle de Main est juste pas possible.
    tu écris ton main comme ca:
    Le compilateur va l'écrire comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char*[] argv)
    donc dans tout les cas ut ne peux pas appeler main car tu n'as pas les paramètres et même si c'est le cas on te pendrais à l'entré de ta boite pour ça

    tu veux faire un cin tant que tu l'ages est inférieur à 18 alors tu fais une boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int age(); //par default c'est 0 pas besoin que tu le mettes toi.
    do
    {
        cin >> age;
    }while(age<=18)

  6. #6
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Effectivement, l'appelle de Main est juste pas possible.
    tu écris ton main comme ca:
    Le compilateur va l'écrire comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char*[] argv)
    donc dans tout les cas ut ne peux pas appeler main car tu n'as pas les paramètres et même si c'est le cas on te pendrais à l'entré de ta boite pour ça
    Je ne pense pas que ca change grand chose. Le seul probleme sera que la fonction main n'est pas declaree avant son appel dans la fonction Utilisateur().

    Citation Envoyé par Astraya Voir le message
    tu veux faire un cin tant que tu l'ages est inférieur à 18 alors tu fais une boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int age(); //par default c'est 0 pas besoin que tu le mettes toi.
    do
    {
        cin >> age;
    }while(age<=18)
    T'es sur que c'est initialise a 0 si on le precise pas ? Dans tous les cas c'est une excellente habitude de bien initialiser ses variables. Trop d'erreurs surviennent de ces "oublis".

  7. #7
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 51
    Par défaut
    merci a tous pour votre aide, j'ai résolu mon problème. Grâce a une boucle, je sait pas si j'ai bien codé mon programme, mais je suis encore débutant.

    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
    #include <iostream>
    using namespace std;
     
    int main()
    {
        int ageUtilisateur(0);
     
        do
        {
            cout << "Quel age avez vous ?" << endl;
            cin >> ageUtilisateur;
        } while(ageUtilisateur<18);
     
            cout << "bienvenue vous est majeur" << endl;
    }

  8. #8
    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
    Citation Envoyé par imperio Voir le message
    Je ne pense pas que ca change grand chose. Le seul probleme sera que la fonction main n'est pas declaree avant son appel dans la fonction Utilisateur().
    La fonction main est spéciale :
    Citation Envoyé par Le standard, 3.6.1/3
    The function main shall not be used (3.2) within a program
    Sinon, l'idée de la fonction qui se rappelle peut très bien marcher avec une fonction autre que main (même si ce n'est pas très idiomatique en C++ pour ce genre de situation), et j'invite le posteur initial à persévérer dans cette direction, maintenant qu'il a réussi avec la boucle. C'est formateur.
    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.

  9. #9
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Citation Envoyé par Astraya Voir le message
    tu veux faire un cin tant que tu l'ages est inférieur à 18 alors tu fais une boucle.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int age(); //par default c'est 0 pas besoin que tu le mettes toi.
    do
    {
        cin >> age;
    }while(age<=18)
    Citation Envoyé par imperio Voir le message
    T'es sur que c'est initialise a 0 si on le precise pas ? Dans tous les cas c'est une excellente habitude de bien initialiser ses variables. Trop d'erreurs surviennent de ces "oublis".
    Un appel explicite au constructeur par défaut d'un type POD l'initialise à zéro, il me semble (différence entre int*p=new int et int*p=new int()).

    Par contre, le code présenté va déclarer une fonction nommée age et retournant un int.
    Pour un type POD alloué sur la pile, la bonne façon d'invoquer explicitement son constructeur par défaut est la suivante:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int age=int(); //EDIT: corrigé la syntaxe
    do
    {
        cin >> age;
    }while(age<=18);
    (Avec un peu de chance, la copie engendrée par le = sera élidée.)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Un appel explicite au constructeur par défaut d'un type POD l'initialise à zéro, il me semble (différence entre int*p=new int et int*p=new int()).
    Sauf erreur de ma part (selon mes souvenirs, peut être selon la verion de la norme C++ ?), c'est pas un problème de POD ou non.
    Pour moi, les 2 écritures sont équivalentes. Il n'y a pas moyen de faire un appel explicite au constructeur par défaut, puisque celui-ci est toujours appelé s'il y en a un. Donc pour toutes les class/struct (généré automatiquement ou non par le compilateur). Seul les build-in types ne sont pas initialisé par défaut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int i; // non initialisé
    int* pi; // non initialisé
    int j = 0; // initialisé
    int* pj = 0; // initialisé
    class A {
        int i; // non initialisé
        int j = 0; // initialisé (C++11)
        int k;
        A() : k(0) {} // initialisation de k
    };
    De même
    dans ce cas, age est déclaré comme une variable ("age" de gauche") puis on essaie de l'utiliser comme une fonction ("age" de droite). Donc erreur :
    prog.cpp:4:17: error: ‘age’ cannot be used as a function
    Tu voulais peut être dire ?
    Je ne suis pas sur pour autant que l'initialisation soit garantie. Mais difficile de tester, ideone (gcc 4.8) semble initialiser dans tous les cas.

    int age(); //par default c'est 0 pas besoin que tu le mettes toi.
    Non. Ce n'est pas une définition+initialisation de variable mais une déclaration d'une fonction !

    Préférer l'écriture avec = ou avec {} (on voit trop souvent l'erreur avec les parenthèses) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int age = 0;
    int age { 0 }; // C++11
    auto age = int { 0 } // sutter

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 392
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    dans ce cas, age est déclaré comme une variable ("age" de gauche") puis on essaie de l'utiliser comme une fonction ("age" de droite). Donc erreur :

    Tu voulais peut être dire ?
    Oui, tout à fait. Je corrige.

    Citation Envoyé par gbdivers Voir le message
    Je ne suis pas sur pour autant que l'initialisation soit garantie. Mais difficile de tester, ideone (gcc 4.8) semble initialiser dans tous les cas.
    Je viens de tester les deux versions sous Visual 2010:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void TestPOD()
    {
    	int i1;
    	int i2 = int();
    	int *p1 = new int;
    	int *p2 = new int();
    	std::cout << "with (): " << i2 << ' ' << *p2 << std::endl << "without: " << i1 << ' ' << *p1 << std::endl;
    	delete p1;
    	delete p2;
    }
    En Debug, J'obtiens ceci, plus une "run-time check failure #3" pour accès à une variable non-initialisée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with (): 0 0
    without: -858993460 -842150451//Respectivement 0xCCCCCCCC et 0xCDCDCDCD
    EDIT: Oops, j'ai fait une copie d'une vieille version de mon code
    En Release, pareil sauf que les valeurs affichées ne sont plus les valeurs magiques (et la run-time check n'a pas lieu).

    Citation Envoyé par gbdivers Voir le message
    Sauf erreur de ma part (selon mes souvenirs, peut être selon la verion de la norme C++ ?), c'est pas un problème de POD ou non.
    Pour moi, les 2 écritures sont équivalentes. Il n'y a pas moyen de faire un appel explicite au constructeur par défaut, puisque celui-ci est toujours appelé s'il y en a un. Donc pour toutes les class/struct (généré automatiquement ou non par le compilateur). Seul les build-in types ne sont pas initialisé par défaut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int i; // non initialisé
    int* pi; // non initialisé
    int j = 0; // initialisé
    int* pj = 0; // initialisé
    class A {
        int i; // non initialisé
        int j = 0; // initialisé (C++11)
        int k;
        A() : k(0) {} // initialisation de k
    };
    J'ai fait le même test avec une structure POD:
    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
    class uneStructurePod
    {
    public:
    	int toto, tata, titi;
    };
     
    void TestPOD2()
    {
    	uneStructurePod s1;
    	uneStructurePod s2 = uneStructurePod();
    	uneStructurePod *p1 = new uneStructurePod;
    	uneStructurePod *p2 = new uneStructurePod();
    	std::cout << std::hex << "with (): " << s2.tata << ' ' << p2->tata << std::endl << "without: " << s1.tata << ' ' << p1->tata << std::endl;
    	delete p1;
    	delete p2;
    };
    Même résultat qu'avec int.
    Note que ce que j'ai dit, je le tenais d'un article sur les types POD que j'ai du trouvé sur le présent site.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Par contre, le code présenté va déclarer une fonction nommée age et retournant un int.
    Oups my bad... Heureusement que le weekend va être long :p

    EDIT:
    Il s'agirait donc de faire :
    Pas grand différence avec
    sauf que si on l'utilise dans un template on peut faire construire un int ou une classe maison(avec constructeur avec un int) ou voir un float.

    J'avoue ne pas avoir trop réfléchi en tapant le code :p je fais rarement ce genre de chose

  13. #13
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par gbdivers
    Je ne suis pas sur pour autant que l'initialisation soit garantie.
    Il me semble que MSVC prend quelques libertés avec la norme (à une époque tout au moins). Du coup, on risque d'avoir des comportements différents selon le compilateur (voir selon la version du compilateur).

    Avec gcc (4.8, -Wall -Wextra) en debug et en release, j'ai le warning :
    C:\Users\guillaume\Desktop\test-cpp\main.cpp:11: avertissement : 'i1' is used uninitialized in this function [-Wuninitialized]
    std::cout << "with (): " << i2 << ' ' << *p2 << std::endl << "without: " << i1 << ' ' << *p1 << std::endl;
    ^
    Et la sortie
    with(): 0, 0
    without(): 4203728 6887928
    Donc pareil que toi sur gcc

    Avec le pod, je n'ai pas de warning ( si quelqu'un sait pourquoi le compilo dit rien ?) et j'ai la sortie :
    with(): 0, 0
    without(): 3 3600c4
    Ca m'étonne que l'on a effectivement un comportement différent entre int et int() et entre pod et pod(). Je sais pas si c'est normal ou non
    Par contre, c'est trop dangereux d'utiliser ces écritures je trouve, trop facile de se tromper. Je préfère avoir la valeur 0 explicitement écrite

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

Discussions similaires

  1. Compilateur test des conditions dans un if
    Par BenoitM dans le forum Framework .NET
    Réponses: 4
    Dernier message: 03/10/2007, 10h07
  2. [Htaccess] - Tests et conditions
    Par Samyhijodelaluna dans le forum Apache
    Réponses: 11
    Dernier message: 17/07/2007, 15h34
  3. structure d un test de condition avec ?
    Par *alexandre* dans le forum Langage
    Réponses: 4
    Dernier message: 11/12/2006, 10h56
  4. Unordered list , test et condition d'arret
    Par NeHuS dans le forum ASP
    Réponses: 2
    Dernier message: 23/05/2006, 15h13
  5. [Débuter] Programmation objet mais conditions particulières
    Par KaptainouK dans le forum Langages de programmation
    Réponses: 13
    Dernier message: 30/09/2005, 00h20

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