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 :

Saisie contrôlée et bornée de 3 floats


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 71
    Points
    71
    Par défaut Saisie contrôlée et bornée de 3 floats
    Salut à tous,
    J'ai essayé de coder la saisie de 3 floats contrôlés et bornés avec le code ci-après.
    Le résultat est correct mais j'ai l'impression d'utiliser un semi-remorque pour transporter un pot de peinture.
    Tous les avis et conseils seront les bienvenus.

    L.P.

    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
    #include <iostream>  // Verifier si une valeur est un nombre. c++
    #include <sstream>
    #include <string>
    #include <cmath>
    using namespace std;
     
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~    suite   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int suite()
    {
     char x;
     int s;
        cout <<"\n   Choix (R) pour Recommencer (Q) pour Quitter  ", cin >> x ;
            cout << endl;
            int xx = x;
    //                cout << "int de x : " << xx;
            if (xx == 82 || xx == 114){
                s=1;
            }
            else {
                s = 0;
            }
    //                cout << "int de s : " << s;
            return s;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    string consolePause() // declenche la PAUSE avec la console en direct depuis l'.exe
    {
        cout <<"\n       Press Enter to Exit . . .\n";
            cin.get();
                cin.clear();
    return "";
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //~~~~~~~~~~~~~~~~~~~~~~~~~~   saisies   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    float saisies(int x)
    {
     
    bool r; // résultat des vérif
    float i; // valeur float attendue
    char ascii (96); // code ASCII -1 de 'a'
    string cs = ""; // chaine saisie à convertir en float
    string cr = ""; // chaine 's' aprés conversion en float et reconversion en string
    int len_cs, len_cr; /* respectivement longueur de la chaine 's' initialement
                     saisie et longueur aprés la double conversion pour comparaison */
     
    ascii = ascii + x ; // les valeurs ASCII de a, b et c
     
    cout << "Valeur de " << ascii << " : "; getline (cin, cs);
        len_cs = cs.length();
    //        cout<< "len de " << ascii << " : " << len_cs << endl; // pour vérif
    istringstream istr(cs);
        if (istr >> i) r = 1; //  i=i+0;
    //        cout << "resultat_1= " << r << endl; // pour vérif
    //if (istr >> i) {cout << "La valeur de "  << ascii << " : "<< i+0 << endl; // pour vérif
     
     ostringstream oss;
        oss << i;
            cr=oss.str();
                len_cr = cr.length();
    //            cout << cr << "  len cr: " << len_cr << endl; // verif
     
    if (len_cs != len_cr || r != 1) {cout << "\tVALEUR INCORRECTE\a\a\a\n"; // validation
    istr.clear(); // vider
    //cout << "resultat_2= " << r << endl; // pour vérif
            return 'faux'; // renvoie 1.71766e+09
    }
    else    return i ;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~    depart      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int depart()
    {
    int s = 0; // relancer ou arreter
    float tab[2]; // tableau conteneur des 3 saisies validées
    float i = 0 ; // nombre saisi à controler et valider
    int n = 1 ; // n:= num de la de saisie (obtenir 3 saisies valides)
     
    while (n < 4) {
        i = saisies(n);
    //    cout<< "ligne 50  et i:= " << i << endl; // vérif
            if (i > 10 || i < -10) { /* bornes*/
                  cout << "\n  Erreur\a\a\n\n"; // si en dehors des bornes
                     i = 0;
                                   }
            else {  cout << endl; // sans 'cout' dans cette ligne une saisie alpha n'est pas
                    tab[n-1]=i;   // detectée comme erreur.... ??
                     n = n + 1;
                 }
    }
    //cout<< " (main)valeur de " << i << " n:= " << n ; //<< saisies(r);
    cout << "\n     RESULTATS de la Saisie\n\n";
    cout << "   a:= " << tab[0] ;
    cout << "   b:= " << tab[1] ;
    cout << "   c:= " << tab[2] << endl ;
     
    //***
    s = suite(); // relancer ou arreter
        if (s == 1) {  cin.ignore();
                        depart();   }
    //***
            return 0;
    }
     
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    //~~~~~~~~~~~~~~~~~~~~~~~~       main      ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    int main()
    {
    depart();
     
    consolePause(); // declenche la PAUSE si lancement de l'.exe en direct
     
            return 0;
    }
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  2. #2
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Salut,

    la lisibilité est très médiocre, commence par améliorer ça, ne pas mettre de saut de ligne ou tabulation au petit bonheur la chance.
    Ensuite tu verras des problèmes, comme celui qui m'a sauté aux yeux avec juste une lecture rapide : float tab[2]; // tableau conteneur des 3 saisies validées
    On a inventé le type bool. Retourner une string vide c'est stupide si ta fonction ne doit rien retourner, qu'elle ne retourne rien. Et plein d'autres trucs à revoir.
    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 régulier
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 71
    Points
    71
    Par défaut
    Salut à tous,

    En fait, j'ai l'intention d'utiliser le contenu tu tableau pour la suite de l'exercice que je me suis donné.
    (Résolution d'une équation du second degré), mais avant d'aller plus loin, l'étape de saisie et de validation m'a parue mériter une halte.
    Je reconnais que la visibilité n'est pas fameuse mais j'ai cru bien faire en documentant au maximum.
    Bien sûr que les lignes de code qui sont inhibées ne sont pas destinées à rester.
    J'ai utilisé ce moyen pour suivre les variables avec Code::Blocks.
    Merci pour la réponse

    L.P.

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 379
    Points
    11 379
    Billets dans le blog
    10
    Par défaut
    Plutôt que de documenter chaque ligne, choisis des noms explicites pour tes variable, parce que x, s, xx, r, cs, cr, c'est pas super parlant...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Plutôt que de documenter chaque ligne, choisis des noms explicites pour tes variable, parce que x, s, xx, r, cs, cr, c'est pas super parlant...
    Je cite car ça pour moi c'est la base. Un morceau de code aussi simple n'a pas besoin de commentaire si le code en lui-même est clair.

    Évite aussi les lignes de commentaires inutiles comme //~~~~~~~~~~~~~~~~~~~~~~~~ main ~~~~~~~~~~~~~~~~~~~~~~~~~~~. C'est de la mise en page, la plupart du temps ça n'a rien à faire dans un fichier source.

    Indente ton code et surtout soit constant (cf. remarque de Bousk) dans sa présentation : si tu choisis quatre espaces d'indentation ou de sauter une ligne après un bloc de déclaration, fais-le tout le temps. Idéalement la présentation doit pouvoir être réalisée par un script, elle doit donc être déterministe.


    Citation Envoyé par luc pic Voir le message
    avant d'aller plus loin, l'étape de saisie et de validation m'a parue mériter une halte
    Ça c'est bien, vas-y par étape. Vérifie le bon fonctionnement d'un module simple avant de l'assembler au reste.

  6. #6
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 71
    Points
    71
    Par défaut
    Salut à tous,
    Merci pour vos remarques pertinentes et fondées.
    Je ne cherche pas d'excuses mais comme je débute avec cet outil, j'ai besoin de repères et cette 'outrance' dans les commentaires m'aide bien pour l'instant.
    La prochaine fois, je l'efface avant de poster.
    Au fur et à mesure de l'apprentissage de cette syntaxe, j'essaye de l'employer, c'est pourquoi il y a pléthore de choses inutiles mais c'est un essai et même si c'est 'lourd', quand ça marche, le résultat est encourageant, en tout cas pour moi.
    J'aurais aimé un commentaire sur l'algorithme lui-même et éventuellement quelques correctifs.
    Je ne prépare pas d'examen, je n'ai pas de devoir à faire et encore moins de travail à rendre ou à vendre.
    C'est juste pour le plaisir.

    L.P.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    La prochaine fois, je l'efface avant de poster.
    @luc pic, si on te fait cette remarque, ce n'est pas pour être désobligeant.
    Il est bien plus facile de comprendre et de maintenir du code avec des noms de variables et de fonctions explicites qu'un code avec énormément de commentaire.
    Donc, privilégie le nommage pertinent des variables et des fonctions plutôt que de faire des commentaires à outrance.
    Les commentaires ne sont pas nuisibles, c'est le fait de ne pas nommer soigneusement les variables et les fonctions.

  8. #8
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 71
    Points
    71
    Par défaut
    Salut à tous,

    Pas de souci, à aucun moment je n'ai pris vos remarques comme désobligeantes, bien au contraire, j'en suis demandeur.
    J’apprécie trop cette sorte de tutorat désintéressé et sympathique où il est dit quelque part, que seules,les questions qui ne sont pas posées sont stupides.
    Je peaufine ce code et je reviens dés qu'il est présentable.

    L.P.

  9. #9
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ce n'est jamais désintéressé dans mon cas : j'ai la prétention de participer à former de meilleurs programmeurs (si possible meilleurs que moi, j'ai donc choisi une tâche loin d'être insurmontable ) et j'en tire satisfaction.

    Continue à demander conseil, c'est un bon réflexe. Même si le style des réponses est lapidaire, ce n'est pas une marque d'exaspération mais plus le souci d'aller droit au but.

    Je n'ai personnellement pas fait de remarque sur le fond de ton programme simplement parce que j'utilise très rarement les entrées-sorties C++ et qu'il m'aurait fallu déployer plus d'énergie et/ou de temps pour analyser ton code que je n'en avais à ce moment.

  10. #10
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Quelques remarques sur suite (je n'ai pas lu le reste, il y a déjà à dire sur cette fonction)

    Pourquoi convertir ton char en int pour le tester ? Tu peux faire directement if (x==82) ou, bien mieux, if (x == 'R').
    Ta fonction ment : Si je tape A, elle quitte aussi. Peut-être devrait-elle boucler ? Ou alors changer son message.
    Et devrait retourner un bool
    Je n'aime pas le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool b;
    if (condition)
      b = true;
    else
      b = false;
    return b;
    Je trouve plus clair de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool b;
    b = condition;
    return b;
    Ce qui permet d'aller vers le cas plus propre et simple où chaque variable est directement initialisée avec sa bonne valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool b = condition;
    return b;
    Et finalement d'enlever la variable inutile :
    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.

  11. #11
    Membre régulier
    Homme Profil pro
    retraité
    Inscrit en
    Septembre 2010
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Septembre 2010
    Messages : 102
    Points : 71
    Points
    71
    Par défaut
    salut à tous,
    merci à JolyLoic, c'est lumineux!

    j'ai 'découvert' le passage par paramètres et c'est devenu beaucoup plus simple.
    la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool choix(double& saisie)
    appelée dans main() par if(choix(leChoix)) teste cin.fail() et renvoi vrai ou faux dans une boucle.

    C'est parfait.
    Encore merci.
    L.P.

  12. #12
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    C'est passage par référence.
    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.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/06/2010, 14h41
  2. contrôle de saisie menu déroulant
    Par shnouf dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 05/01/2006, 16h30
  3. contrôle de saisie
    Par oceane751 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/01/2006, 11h24
  4. [debutant] contrôle de saisie et formulaire
    Par oceane751 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/11/2005, 22h29
  5. Réponses: 4
    Dernier message: 14/09/2005, 15h50

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