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 :

projet en console, saisie et affichage de messages


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut projet en console, saisie et affichage de messages
    Bonjour à tous

    Je cherche à récupérer un message saisie par l'utilisateur (contenant des espaces). J'ai cru comprendre que ce n'est pas possible avec un variable de type char et les cin et cout. Quel est le type qu'il me faudrait utiliser ? et quelles fonctions ?

    Je précise, je fais du C en C++ pour un TP de prog C. Les étudiants n'aiment pas avoir à faire aux classes et aux méthodes orientées objet donc si vous savez où je peut trouver mon bonheur sans trop compliquer la chose.

    Un type string ou msg seraient parfait mais ce serait trop facile.

    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    http://cpp.developpez.com/faq/cpp/?p...ture_par_ligne
    Mais ... si tu leur fais faire du C, fais leur vraiment faire du C. Ne les fais pas compiler en C++.
    Ou alors fais du C++. Mais vraiment, pas un ersatz de C -- il est parfaitement possible de faire du C++ procédural, cf /Je me Lance/ de Francis Glassbourough publié chez Micro Application. Il enseigne le C++ à quelqu'un qui ne connait rien, et sans parler une seule fois de pointeur ou de classe.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Par pitié, ne mélangez pas le C et le C++, c'est un désastre! C'est la cause de tout un tas de problèmes que nous rencontrons en milieu professionnel, et c'est également la cause d'un syndrôme du: "le c++ c'est un langage compliqué", à cause de la confusion que cela induit

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Merci pour cette solution mais je vais faire le flemmard.

    Ils écriront de petits messages illisibles : caractère '_' à la place de ' '.

    Sinon, je suis d'accord que le C--, c'est pas le top. En fait, ils ont 3*20h d'informatique et nous n'en sommes qu'à la première session. Les pointeurs seront pour le semestre prochain et les objets celui encore après. Donc en attendant, on bidouille.

    Bonne soirée

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par saih_tam Voir le message
    Merci pour cette solution mais je vais faire le flemmard.

    Ils écriront de petits messages illisibles : caractère '_' à la place de ' '.

    Sinon, je suis d'accord que le C--, c'est pas le top. En fait, ils ont 3*20h d'informatique et nous n'en sommes qu'à la première session. Les pointeurs seront pour le semestre prochain et les objets celui encore après. Donc en attendant, on bidouille.

    Bonne soirée
    Sérieux ?

    Il y a comme qui dirait un problème dans le cursus. Moi, j'aurais commencé par leur apprendre l'architecture orientée objet, puis les objets, puis les pointeurs.

  6. #6
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    130
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2009
    Messages : 130
    Points : 373
    Points
    373
    Par défaut
    Salut, tu peux utiliser la bibliotheque String en C++.

    code de base :

    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
     
    #include <iostream>
    #include <string>
     
    using namespace std;
     
     
    int main()
    {
        string maChaine; // Création d'un objet "maChaine" de type string
     
        cin >> maChaine;
        cout << "La chaine rentrée est : " << maChaine;
     
        return 0;
    }
    Pour l'histoire de faire du C en C++ ... a la fin çà va piquer les yeux je pense

  7. #7
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    J'aurais plutôt présentez ça comme du c++ procédural... Au moins, ça induit pas la confusion.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Bonjour

    J'ai terminé mon énoncé de TP il y a de ça une semaine et j'ai pu avoir le retour des étudiants qui ont apprécié le contexte mais pas trop le travail demandé (c'est toujours trop difficile).

    Sinon, je repassais par hasard sur la discussion et je suis assez d'accord pour parler de "programmation en C++ procédural". Malheureusement, dans une école d'ingénieur généraliste, l'informatique n'est pas l'enseignement dominant et une grande partie des étudiants est larguée. Si on introduit de telles nuances ne serait-ce que dans l'intitulé de l'unité d'enseignement, ils seront perdus à jamais. Je pense que pour eux, "programmation" est synonyme de cerveau en surchauffe et donc que ce soit du "C" ou du "C++ procédural" ne changera pas grand chose.

    Enfin, j'ai testé l'utilisation de la classe string comme vous me l'avez proposé mais ça s'est soldé d'un échec. En cherchant un peu, je suis tombé sur cette page où la solution fonctionne :
    http://fr.wikibooks.org/wiki/Program..._classe_string (cf. exemple 2)

    Merci à vous

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Je suis assez d'accord, l'enseignement du C++ n'a pas à rimer avec l'énonciation des principes théoriques (valeurs, entité, LSP, procédural, ...). Il "suffit" juste de les présenter avec des mots simples.

    Pour l'échec relativement à std::string, c'est par rapport à l'aspect lecture de noms avec espaces ? Ce devrait être un détail, non ?
    Je me serais contenté de >>, et ceux qui râlent sur les espaces, on leur parle des notions de "extraction d'un mot" vs "lecture d'une ligne". Parce qu'à jouer avec getline, ils vont se heurter à l'extraction de nombres entre deux lectures de lignes.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Re tout le monde.

    Je viens de finaliser la nouvelle version de la source de mon TP. Toutes les chaînes de caractères fortement susceptibles de contenir des espaces (message et message_perso) et non manipulées par les étudiants sont maintenant de la classe string.

    J'ai juste un petit problème. Je suis obligé d'insérer un appel à la fonction getline() "pour du beurre" pour éviter que ma première saisie ne soit sautée (comme l'est celle qui est "pour du beurre" actuellement).
    C'est difficile d'énoncer le problème et pourtant il est simple.
    En d'autres termes, le première appel à la fonction getline() est zappé.

    Je vous transmets le code (TP6-source.cpp)(cette version correspond dorénavant à ma solution) pour que vous puissiez le constater et me dire ce que vous en pensez (recherchez getline dans le fichier, les lignes en question sont commentées).

    Pour résoudre complètement cette discussion, il serait bien de savoir ce qui ne va pas dans mon programme. Je me suis fait un exemple basique pour tester la classe string et cette fameuse fonction getline() avant de me lancer dans les modifications de mon fichier et tout fonctionnait très bien. Mystère ...

    Je vous remercie d'avance pour votre aide.

    PS1 : Je vous mets aussi le sujet du TP (TP6 - TDA.pdf). La source correspondante est obtenue en supprimant le corps des fonctions que les étudiants doivent compléter (sauf modifie_profil()).
    PS2 : Si vous pouviez me dire ce que vous en pensez, je serais ravi.
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Sinon,

    Je me serais contenté de >>, et ceux qui râles sur les espaces, on leur parle des notions de "extraction d'un mot" vs "lecture d'une ligne". Parce qu'à jouer avec getline, ils vont se heurter à l'extraction de nombres entre deux lectures de lignes.
    J'ai pas trop compris, si tu pouvais expliciter un peu plus (je suis seulement un noviCe++).

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Cela n'a rien de mystérieux, c'est ce à quoi je faisais référence au sujet des mélanges de getline avec >>.

    Après un >>, tu dois purger la fin de ligne, que >> ne consomme pas, avec un std::istream::ignore() ou faire un std::getline pour du beurre comme tu le disais avant de pouvoir réaliser le getline qui lit la ligne suivante.
    Je ne sais plus si on en avait parlé dans la FAQ ou pas de ça.

  13. #13
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par saih_tam Voir le message
    En d'autres termes, le première appel à la fonction getline() est zappé.
    Comme dit Luc, il faut consommer les fins de ligne avec ignore. Voir cette faq et la suivante.

  14. #14
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par saih_tam Voir le message
    PS2 : Si vous pouviez me dire ce que vous en pensez, je serais ravi.
    J'en pense qu'il y a de fortes chances pour qu'il y ait des étudiants à toi qui lisent régulièrement ce forum... si tu vois où je veux en venir.

  15. #15
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    OK pour ignore(), ça fonctionne très bien comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    string objet;
    cin.ignore(256, '\n'); // Vidage du buffer clavier avant getline()
    cout<<"\n\t\tObjet du message :\n\n ";
    getline(cin, objet);
    Mais pourquoi je ne peux appeler ignore() de la même manière que getline() et inversement. Je trouve ça pas terrible au niveau de la cohérence de mon code.

    Et sinon, ça marche aussi bien avec une variable de type char comme ceci et je vais rester sur cette solution pour éviter l'utilisation de la classe string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char objet[200];
    cin.ignore(256, '\n'); // Vidage du buffer clavier avant getline()
    cout<<"\n\t\tObjet du message :\n\n ";
    cin.getline(objet, 200);
    Pour ce qui concerne mes étudiants, ils se contentent de google et j'ai vérifié, aucune recherche simple n'amène à cette discussion (pas fou le saih_tam). Je ne vais tout de même pas prendre le risque et je vais faire disparaître les pièces jointes très rapidement.

    Merci à tous. (I'll be back)

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Et be en fait, je viens de trouver ce sujet depuis google en cherchant "TP6 - TDA.pdf". Je vais vite sortir la correction et la remplacer par la source (à trous).

  17. #17
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Concernant le PPS, je n'ai pas le temps de développer, mais je vois un mélange de C et de C++.
    Pour moi, c'est soit l'un soit l'autre. Mais surtout pas les deux. C'est important les bonnes habitudes. Compléter la formation initiale par des choses qui sont propres aux procédures industrielles, c'est normal, mais leur rétorquer "oubliez ce que vous avez appris, car c'est comme ça qu'il faut faire" (version soft et polie) n'est un bon message pour personne.

    Ma vision : Généralistes ? Donc pas besoin d'apprendre à maintenir du code inmaintenable (car ils feront du Java ou du Python -- c'est la réalité d'aujourd'hui) ou pire d'apprendre à en écrire. L'objectif est plus probablement de les initier à l'algorithmique. Pas d'en faire des développeurs C chevronnés ni d'en faire des concepteurs de bibliothèques C++ ou encore des pompiers C++ -- mieux vaut apprendre ça sur le tas plutôt d'oublier ce qu'ils savaient pour tout reprendre.

    Donc ouste les char[]! Ouste les tableaux statiques. Ouste les tableaux dynamiques -- le but n'est pas de former des informaticiens après tout.
    Et pas de grosses classes par copie (chose impossible en C dans mes souvenirs), ref-const pour les passages de paramètres,d'autant plus qu'au fond on s'intéresse ici à des entités.


    PS: les using on les fait après tous les includes.
    PPS: pas 256 ou autre constante magique. C'est mal les constantes magiques, cela mérite des points en moins . -> la bonne valeur est dans la FAQ.
    PPPS: il faudra rajouter cet aspect (>> puis getline) dans la todo list pour la FAQ.

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Re

    Je suis d'accord avec ton propos. Si ça ne tenait qu'à moi, on ferait seulement de l'algorithmique. Malheureusement, nos étudiants ont besoin de manipuler des concepts assez terre à terre pour s'approprier ceux qui sont sous-jacents et théoriques. La capacité d'abstraction que demande la pratique de l'algorithmique est au-dessus de leurs moyens. L'initiation à la programmation est le seul biais dont nous disposons pour relier leur réalité et celle de l'informatique. Il est vrai que quand on les lance dans la programmation, le langage utilisé est, d'une part, réducteur de leur champ de vision car trop concret et, d'autre part, difficile à prendre en main au premier abord : pour amener les étudiants à comprendre tel ou tel concept, on leur demande d'utiliser un support qui leur est inconnu. Le peu qu'ils en retiennent est un bel amalgame entre la théorie pure et la mise en œuvre pratique à but illustratif.

    Notre but n'est pas de les rebuter mais plutôt de leur donner envie de s'investir dans l'informatique : cette discipline est maintenant omniprésente (tant dans nos loisirs qu'au travail) et il est impossible de passer à côté alors que nombreux sont ceux qui pensent que faire l'impasse ne fera de mal à personne. Pour cette raison, le C a été délaissé au profit du C++ car la prise en main en est tout de même plus aisée et qu'il devient possible de leur faire manipuler les concepts théoriques au cours de séances de 4h sans trop de difficulté (je mens un peu, les types ne sont pas capables de mettre les points virgules alors je ne vous parle pas des accolades et encore moins de la déclaration de fonctions)(on essaye...).

    Ce qui est sûr, c'est que plus l'application proposée leur parle, plus ils mesurent l'importance de l'informatique en général. Donc plus le sujet s'apparente à de l'algorithmique pure, plus on les perd (et on les dégoute), et plus le sujet s'apparente à une application connue, plus ils prennent conscience du travail que cela représente et de la légitimité de cette discipline comme outils d'automatisation et de développement pour d'autres disciplines (calcul de structure, ordonnancement, fabrication, traitement de données... et même pour leurs loisirs). L'algorithmique les dégoute et FaceBook les emballe : on essaye de ficeler le tout pour les inciter malicieusement à s'y intéresser.

    Le compromis est difficile à trouver mais facile à critiquer. Je ne pense pas que la solution soit de se cantonner aux généralités. En revanche, il est vrai que, à vouloir trop faire, on fait mal.

    PPS: pas 256 ou autre constante magique. C'est mal les constantes magiques, cela mérite des points en moins . -> la bonne valeur est dans la FAQ.
    Quelle est cette valeur ??? Je ne trouve pas dans la FAQ.
    J'ai pris 256 parce que j'étais inspiré et que je me disais que l'utilisateur n'arriverai jamais à saisir 256 caractères par erreur : 3 lignes et des brouettes (il faut vraiment avoir à faire à un acharné !!!). Il est vrai que ça fait un peu constante magique mais pas beaucoup plus que 1, 10 ou 100.

  19. #19
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    std::numeric_limits<std::streamsize>::max() est la bonne valeur.

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 109
    Points : 63
    Points
    63
    Par défaut
    Trop bien, c'est la classe comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char objet[200];
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // Vidage du buffer clavier avant getline()
    cout<<"\n\t\tObjet du message :\n\n ";
    cin.getline(objet, 200); // Permet de saisir un char contenant des espaces
    Merci à tous de votre contribution et bonnes fêtes

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Masque de saisie et affichage de message
    Par tun_code dans le forum Débuter
    Réponses: 1
    Dernier message: 31/12/2013, 22h03
  2. Réponses: 2
    Dernier message: 28/08/2009, 16h20
  3. [Exception]Affichage de message dans une Execption
    Par harris_macken dans le forum Général Java
    Réponses: 8
    Dernier message: 29/05/2005, 18h34
  4. Saisie et affichage d'une chaîne de caractères
    Par sali dans le forum Assembleur
    Réponses: 2
    Dernier message: 31/03/2004, 19h01

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