2010-11-10 7 views
1

Je suis novice en programmation C++ et je n'ai rien fait depuis une semaine, alors je me suis amusé avec des choses que je connais jusqu'à maintenant pour voir si je dois revoir les choses.Code C++, booléens et boucles

Cependant, j'ai rencontré un problème avec bools (je ne les ai pas vraiment utilisé auparavant).

Source:

#include "stdafx.h" 
#include <iostream> 
using namespace std; 

int main() 
{ 
    signed long int x; 
    unsigned short int y = 12345; 
    bool POSX; 
    bool yes; 

    cin >> x; 

    if (x >= 0) 
    { 
     POSX = true; 
    }//end of if for bool 
    else 
    { 
     POSX = false; 
    } 

    cout << "This is the current value of X: " << x << endl; 
    if(x < y) 
    { 
     cout << "x is less than the integer y \n \n"; 
    }//end of if 
    else 
    { 
     cout << "y is greater than the integer x \n \n"; 
    }//end of else 
    cout << "The current value of Y is: " << y << endl << endl << endl; 
    cout << "Is X positive?: " << POSX << endl << endl; 

    cout << "How much more would X need to be to surpass y? The answer is: " << y - x << endl; 
    if(x > y) 
    { 
     cout << "well, actually, x is greater than y by: " << y - x << " so you would need to add that to get to the value of x" <<endl <<endl; 
    }//end of if 

    cout << "Do you like cookies? Enter below. . ." <<endl; 
    cin >> yes; 

    if(yes = "yes") // should this be if(yes = 1)? 
    { 
     cout << "I do too! But only when they are soft and gooey!"; 
    } //end of if for bool yes 
    else 
    { 
     cout << "Well, join the dark side, and you may be persuaded by the power of cookies and the power of the dark forces!"; 
    }//end of else for bool yes 
    char f; 
    cin >> f; 
    return 0; 
} //end of main 

La question que j'ai est quand je tente de compiler, pour l'un, le programme sort avant que je puisse voir le résultat de la question des cookies [donc je dois placer un point de rupture le compilateur], et deuxièmement, quand je peux voir la réponse, il arrive toujours avec la réponse oui, et rien d'autre. Donc, si je ne mets pas d'entrée, il sort quand même le si oui pour que le booléen soit vrai. Je ne suis pas sûr si je définis correctement la clause if dans la dernière déclaration. Quelqu'un peut-il m'aider?

+2

style Brace == beurk: P –

+5

Quelque chose à noter: '=' est l'affectation, '' == est la comparaison. 'if (yes =" yes ")' ne fait probablement pas ce que vous pensez qu'il est. – eldarerathis

+0

Billy: quel est l'autre moyen d'y parvenir? Je pensais que les accolades le rendaient plus facilement lisible. –

Répondre

1

Modifier oui à une chaîne (#include <string>), puis comparer comme ceci:

if (yes == "yes") 
+1

Cela fonctionnerait, mais cela n'apprend pas vraiment à l'OP quoi que ce soit sur ce qui ne va pas dans le code original. –

2

La question que j'ai est quand je tente de compiler, pour un, les sorties du programme avant que je puisse voir le résultat de la question de cookie

C'est parce que vous avez invalidé cin lorsque vous avez défini "non" comme valeur. operator>>(std::istream&, bool&) suppose numérique entrée. Les valeurs non égales à zéro seront interprétées comme true, et les valeurs égales à zéro seront interprétées comme false.

Si vous fournissez une entrée qui ne peut pas être analysée, le code numérique badbit sera défini sur le flux. Tenter d'utiliser le flux alors qu'il est dans cette condition échouée entraînera la lecture des ordures (ou plutôt, un comportement indéfini), et aucun avancement du pointeur get dans le flux.

4

Ok, deux choses. Votre problème majeur est la suivante:

if(yes = "yes") 

« oui » est definend comme un type bool, à savoir, il peut contenir les valeurs « true » ou « false ». Vous tentez de comparer en comparant (en essayant réellement d'assigner en raison d'utiliser seulement un = au lieu de ==, qui est la façon dont vous vérifiez l'égalité) un booléen à une chaîne "oui". Eh bien, cela n'a aucun sens. Ce devrait être:

if(yes) 

C'est tout. 'yes' est déjà un booléen, et l'expression dans une instruction if ne nécessite pas plus.

En second lieu, construit comme celui-ci sont redondants et inutiles:

if (x >= 0) 
    { 
    POSX = true; 
    }//end of if for bool 
else 
    { 
    POSX = false; 
    } 

Vous regardez une valeur booléenne, puis attribuer un. Faites-le simplement en une ligne comme ceci:

POSX = (x >=0); 

De même, vous n'utilisez généralement pas toutes les majuscules pour les variables locales.

Encore une chose; vous entrez des données de chaîne ("no" ou "yes") et cin attend un int. Je suggère que vous passiez un peu de temps à apprendre sur les types de données.

+0

+1 pour signaler l'instruction frivole si. –

+0

Le programme était valide. La raison pour laquelle il est compilé: la chaîne littérale "oui" convertit implicitement de tableau en pointeur, puis de pointeur en booléen. Puisque le pointeur n'est pas nul, le booléen résultant est toujours vrai. Donc 'yes' est assigné' true'. Évidemment pas ce qui était prévu .. – aschepler

+0

Je sais que le type de données char peut contenir un caractère, je sais qu'une chaîne est quelque chose entre guillemets qui peut être aussi long que possible, comme cela dans les instructions cout. Je sais qu'un interger ne peut contenir que des chiffres, et unsigned ne peut que rester positif, alors que signed peut contenir à la fois négatif et positif. Je sais qu'un appartement peut contenir des décimales (8.25) tandis qu'un double peut contenir des décimales plus longues (8.252342). Y a-t-il des types de données que je devrais connaître? –

1

Il ya quelques choses qui ne vont pas ici, mais je pense que celui qui vous trébuche est cin >> yes; En C++, false est 0. Par conséquent, cela retournera probablement true pour toutes les valeurs d'entrée non nulles. Une approche plus fiable serait de demander et d'évaluer sur quelque chose d'autre, par exemple, la saisie de caractères:

cout << "Do you like cheese? (y/n) "; 
char c; 
cin >> c; 

if (c == 'y' || c == 'Y') 
    do whatever; 

De plus, lors du test conditionals, assurez-vous d'utiliser des « doubles égaux », condition == true. Mieux encore, adopter le raccourci où:

  • (condition) signifie (condition == true)
  • (! condition) signifie (condition == false)

Espoir qui vous donne un début dans la bonne direction.

+0

En fait, ce n'est pas vrai. Lorsque 'goodbit' n'est pas défini sur le flux (comme cela se produit la deuxième fois que l'OP essaie de l'utiliser), les résultats sont ** indéfinis **. De plus, des choses comme '-0' seront toujours interprétées comme fausses. –

+0

Merci d'avoir souligné cela, j'ai essayé de faire la réponse un peu plus approfondie. Je n'avais effectué qu'un test rapide et non exhaustif avant de le publier. Il est logique que des choses comme '-0' évaluent à' false '. –

+0

+1 pour l'édition (15 caractères de plus) –

0

Voici le code source édité, j'ai fait des modifications afin de l'étudier et de le comparer avec le code original. * e *

#include <iostream> 
#include <string> 
#include <iomanip> //headerfile for boolalpha 
using namespace std; 

int main() 
{ 
    string answer; 
    signed long int x; 
    unsigned short int y = 12345; 
    bool POSX; 
    bool yes; 
    cout<<"Enter any value: "; 
    cin >> x; 

    if (x >= 0) 
    { 
     cout << boolalpha; // print bools as true or false 
     POSX = true; 
    }//end of if for bool 
    else 
    { 
    cout << boolalpha; // print bools as true or false 
     POSX = false; 
    } 

    cout << "This is the current value of X: " << x << endl; 
    if(x < y) 
    { 
     cout << "x is less than the integer y \n \n"; 
    }//end of if 
    else 
    { 
     cout << "y is greater than the integer x \n \n"; 
    }//end of else 
    cout << "The current value of Y is: " << y << endl << endl << endl; 
    cout << "Is X positive?: " << POSX << endl << endl; 

    cout << "How much more would X need to be to surpass y? The answer is: " << y - x << endl; 
    if(x > y) 
    { 
     cout << "well, actually, x is greater than y by: " << y - x << " so you would need to add that to get to the value of x" <<endl <<endl; 
    }//end of if 

    cout << "Do you like cookies? Yes/No. . ." <<endl; 
    cin >> answer; //this is a string 

    if(answer =="yes") // it can be a simple if statement 
    { 
     cout << "I do too! But only when they are soft and gooey!"; 
    } //end of simple if 
    else 
    { 
     cout << "Well, join the dark side, and you may be persuaded by the power of cookies and the power of the dark forces!"; 
    }//end of else for simple if 

    return 0; 
} //end of main`