0

私が持っているこのコードを実行しようとすると頭痛がします。入力した float の値が float と同じデータ型になるかどうかを識別しようとしています。これは私のコーディングです。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    float x1, y1, x2, y2, x3, y3, percentage;
    string sym1, sym2;
    int count;

    cout<<"Enter the first fraction : ";

    do{
        cin>>x1>>sym1>>y1;

        if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym1 != "/")
        {
        cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x1 == float(x1) || sym1 == string(sym1) || y1 == float(y1));

    cout<<"Enter the second fraction : ";

    do{
        cin>>x2>>sym2>>y2;

        if(x2 != float(x2) || sym2 != string(sym2) || y2 != float(y2))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym2 != "/")
        {
            cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x2 == float(x2) || sym2 == string(sym2) || y2 == float(y2));

    x3 = x1 * x2;
    y3 = y1 * y2;

    percentage = (x3*100)/y3;

    cout<<x1<<"/"<<y1<<" and "<<x2<<"/"<<y2<<" is "<<x3<<"/"<<y3<<"\n";
    cout<<x3<<"/"<<y3<<" is "<<percentage<<"%";

    return 0;
}

私が変更しようとしているコードはこれです

    do{
        cin>>x1>>sym1>>y1;

        if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym1 != "/")
        {
        cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x1 == float(x1) || sym1 == string(sym1) || y1 == float(y1));

4 / 6 またはその他の関連する分数形式を入力すると、正しく読み取られるようです。同じことが 4 * 6 にも当てはまり、期待される出力が出力されます。しかし、/ 6 または 6 / a を入力すると、論理エラー、無限ループに入ります。if文やwhile文のデータ変換のどこかが間違っているような気がします。それとも、使用されているデータ型が間違っているためですか? 問題が何であるかを追跡できませんでした。これを行う方法に関する解決策はありますか?助けてください。兄弟姉妹の皆さん、よろしくお願いします。

4

1 に答える 1

1

これらの比較で false が返されることはありません。

if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
{
    cout<<"Please enter the correct fraction : ";
}

x1y1は float であり、それらを float にキャストしても値はまったく変わりません。比較演算子も文字列のstd::string内容を比較するため、この比較も常に true を返します。

無限ループにつながるループ条件と同じステートメントを使用しています。両方の条件にのみ使用してみてくださいif(sym1 != "/")(なお良い: 比較を 1 回だけ評価し、結果をブール値に格納します。2 回実行すると、後で何かを変更してどこでも変更するのを忘れたときにバグが発生します)。

の動作の詳細についてはoperator>>、たとえばcppreferenceを参照してください。

見積もり:

C++11 まで:

抽出に失敗した場合 (たとえば、数字が必要な場所に文字が入力された場合)、値は変更されず、failbit が設定されます。

C++11 以降:

抽出に失敗した場合、値にゼロが書き込まれ、failbit が設定されます。抽出の結果、値が大きすぎたり小さすぎたりして値に収まらない場合、 std::numeric_limits::max() または std::numeric_limits::min() が書き込まれ、failbit フラグが設定されます。

于 2013-09-24T05:42:17.250 に答える