CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

petite aide C++

leagueofeeder
leagueofeeder
Niveau 10
29 mars 2012 à 15:10:15

Bonjour la communauté , je vous remercie d'avance pour votre présence, vous m'aviez déja bien aider lors de 2 petis soucis que j'avais eu en Unix :hap:

Pour rappel :

:d) https://www.jeuxvideo.com/forums/1-47-61617-1-0-1-0-petite-question-unix.htm

:d)https://www.jeuxvideo.com/forums/1-47-62300-1-0-
1-0-petite-question-unix-2.htm

Aujourd'hui j'en appel à vous pour un probleme dans le domaine de la programmation par objet, le C++ :noel: )

Je débute encore et je dois dire que j'ai quelque soucis,mais mon probleme est le suivant:

Je cherche à vérifier que une valeur entré est bien un nombre, j'ai trouver une réponse sur un autre site :

:d) http://www.commentcamarche.net/forum/affich-13403731-verifier-si-une-valeur-est-un-nombre-c

et sur une archive de programme (oui c'est mal je sais :hap: ) , j'ai trouver cette commande là qui lui ressemble beaucoup:

int saisie_nombre()
{
int nombre;
// verification si une valeur est un nombre :
while(!(cin >> nombre))
{
if(cin.eof())
{// verification du F10
cin.clear();
return -1;
}
else if(cin.fail()) // valeur entrée n'est pas un nombre
{
cout << "Erreur de saisie, Entrez un nombre svp : ";
cin.clear(); // on enlève les bits d'erreur.
// on vide le buffer ci-dessous
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
}
return nombre;
}

Mais ce que je souhaite à comprendre, c'est la signification de cette commmande :

while(!(cin >> nombre)), je ne vois pas a quoi sert le "!" dans cette ligne de commande et surtout comment il sait que ce n'est pas un nombre par cette méthode :hap:

Merci d'avance et oui mes questions sont assez basiques je sais :ange:

godrik
godrik
Niveau 30
29 mars 2012 à 15:36:54

Ok, c'est un peu complique. "cin>>nombre; appelle la fonction "istream& operator>>(int&)". En pratique cette fonction renvoie "cin". C'est ce qui permet d'ecrire "cin>>nombre1>>nombre2;". Quand "operator>>(int&)" (ou toute fonction de lecture) n'arrive pas a lire un "int" il place le bit d'erreur de l'objet istream qui sert a dire "une I/O c'est mal passe".

Dans le test du while, "while(!(cin>>nombre))", la valeur de retour de "operator>>" (qui est "cin") est typecaste en "bool". Ce typecast est implemente par istream comme etant un appel a "good()". Apres typecast, c'est un boolean donc on peut appliquer l'operateur "!".

Notons que ce code est assez etrange. L'utilisation d'un while est super etrange, voire dangereuse. En effet, "good" verifie trois condition differente : eofbit, badbit, failbit. Si une des trois condition apparait avec "good()" renvoie faux. Ensuite le code verifie si c'est "eof()" qui verifie le eofbit. Finalement, il appelle "fail()" qui verifie badbit ET failbit. badbit indique que le flux est foutu, tandis que failbit indique qu'une operation s'est mal passe. Pour un probleme de formatage, c'est le failbit qui est active, pas le badbit. Ensuite le failbit est retire par l'appel a clear.

Ce code est dangereux parceque le badbit n'est jamais verifie. Si le badbit est actif (parexemple si le systeme de fichier tombe, ou si la socket se ferme), alors "!(cin>>nombre)" sera toujours vrai. Et l'application ne sortira jamais de la boucle.

source: http://www.cplusplus.com/om/reference/iostream/istream/

leagueofeeder
leagueofeeder
Niveau 10
29 mars 2012 à 15:55:30

je viens de lire un peut ta réponse et je dois dire que je n'ai pas vraiment tout compris :/

Je suis désoler de te demander ça mais pourrais tu faire une réponse plus simple? ( ça fait vraiment cancre :noel: )

désoler encore mais je ne comprend pas vraiment et j'ai relu 2 fois la réponse :(

tbop2
tbop2
Niveau 10
29 mars 2012 à 15:59:12

2 fois c'est un peu court, et il ne faut pas que la lire il faut regarder un peu la source qu'il te donne. si tu bosses sur le sdz tu dois avoir ce mauvais reflexe de croire que l'on peut apprendre en lisant, c'est totalement faux.

Donc relis calmement, essaye de bien t#arreter sur tous les concepts qui t'echappent, de regarder la doc, de regarder ton cours et ca devrait deja s'eclaircir.

Sinon on dit programmation orientee object (POO en francais ou OOP en anglais), et non pas programmation par objet :ok.

ArgentComptant
ArgentComptant
Niveau 5
29 mars 2012 à 16:14:02

Si bad() renvoi true il faudrait faire quoi ? Fermer le flux ?

godrik
godrik
Niveau 30
29 mars 2012 à 16:23:10

ArgentComptant, tu peux (dois?) essayer mais c'est pas sur que ca marche non plus. De toute facon quand "bad()" est vraie, toutes les I/O seront foirees.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment