2016-10-25 3 views
1

変数 "check"の完全一致を探したいと思います。ユーザーが「タイプo」または「タイプb」と入力すると、ループは終了します。私はwhile (check != "type o"){...}を試しましたが、それは動作しますが、2番目の状態では動作しません。私は混乱しています。以下は私のコードです。C++正確な文字列に一致する複数の条件

void sunTypeCheck(string sunCheck){ 
    string check = sunCheck; 

    transform(check.begin(), check.end(), check.begin(), ::tolower); 

    while (check != "type o" || check != "type b"){ //This is the problem. 
     cout << "Please enter a valid type of Sun. Try again: "; 
     getline(cin, check); 
     transform(check.begin(), check.end(), check.begin(), ::tolower); 
    } 
} 

これは私の主な方法です。

int main(){ 
cout << "Please enter sun type: "; 
     getline(cin, typeOfSun); 
     sunTypeCheck(typeOfSun); 
} 

ご協力いただきますようお願い申し上げます。私はオンラインを見て、「比較」が、限り、私は第二の条件を含めて、それが動作しません使用してみました、そしてプログラムは常にPlease enter a valid type of Sun. Try again:

+0

'||'(または)のことを考えてください。一方の側が 'true'ならば、式は何に評価されますか? – NathanOliver

+1

'check'が' 'type o '' 'ではない場合に条件を真にしたいと思います。基本的な[ブール代数](https://en.wikipedia.org/wiki/Boolean_algebra)を学んでください。 –

答えて

2

while条件がfalseになるとループが中断します。

check != "type o" || check != "type b" 

注:
||演算子は、いずれかの条件がtrueを返すとtrueを返します。 とfalseの両方がfalseの場合はfalseです。最初の条件がfalseを返すと第二は、trueを返します

"type o" != "type o" || "type o" != "type b" 

は、あなたが「O型」 それはこのようになりますに入ったと言うことができます。

false || true 

だから私は、||演算子はtrueを返しますか?はい、それは本当です。 & &オペレータのため 条件の一つがfalseで、かつ唯一の条件の両方場合場合はtrueを返した場合、それはfalseを返しますので、この[編集] & &オペレータ

while(check != "type o" && check != "type b") 

を使用する必要があります修正する

本当です。

+0

OH私は今理解しています!君たちありがとう!!あなたの説明は一番読みやすいものでした! – JamesPoppycock

1
while (check != "type o" && check != "type b") 
+0

これは問題を解決しますが、説明を追加することで誰も傷つけることはありません; – Treycos

2

を返しますのは、我々が持っているものを見るためにデモーガンズの法律を適用してみましょう:

だから、ループは限りcheck両方と等しくないとして継続されます

!(check == "type o" && check == "type b") 

check != "type o" || check != "type b" 

はequivalnetにありますの文字列は同じ時刻です。それはもちろん、文字列が異なるため、常に当てはまります。

1

あなたが肯定と交換条件で負論理を理解することは困難である場合:

while (true) { 
    if(check == "type o" || check == "type b") break; 
    ... 
} 

同じパターンはプログラムのロジックを修正するために、あなたのケースで有用であろう - あなたは、コードを持つべきではない、ということ同じことを複数回実行しています(getlinetransformが重複しています)。また、関数の値を修正しようとすると、ローカルコピーが変更されます。したがって、より良い実装は次のようになります:

std::string getTypeOfSun() 
{ 
    string sun; 
    while(true) { 
     cout << "Please enter a type of Sun: "; 
     getline(cin, sun); 
     transform(sun.begin(), sun.end(), sun.begin(), ::tolower); 
     if(sun == "type o" || sun == "type b") 
      break; 
     cout << "Invalid type of Sun, try again..." << endl; 
    } 
    return sun; 
} 


int main(){ 
    string typeOfSun = getTypeOfSun(); 
    ... 
} 
関連する問題