1

次の方法で std::cin >> number を使用している間:

float number;
while(std::cin >> number) {
     //perform a check here if possible

    //if number does not contain a decimal point do this
    for(int i = 0; i < number; i++) {
        std::cin >> readMoreFloats; 
    }
    //otherwise read 1000 more floats
}

次の種類の行を区別できる方法はありますか:

1.500 (1000 more floats)
2 2.000 2.000

行は float または int で始まります。行が float で始まる場合は、さらに 1000 個の float を読みたいと思います。int ならその数の float を読みたい。float を int にキャストして、キャストされた int が float と等しいかどうかを確認できることはわかっていますが、float が 1.000 などのフラットな値を持つ場合は機能しません。

getline() を使用して行全体を読み取らないことをお勧めします。後で分割すると時間がかかるためです。また、最初の数値を除いてすべての入力が float であることは既にわかっています。もう 1 つの方法は、各行の最初の値を文字列として読み取り、ピリオドが含まれているかどうかを確認することです。最初に入力を文字列として読み取らずに、これを確認する方法はありますか? または、文字列ステップが必要ですか。

4

4 に答える 4

4

ドットがあるかどうかを確認するために、本当に文字列として読み取る必要がありますか?

最初に整数を取らないのはなぜですか?

int intNum = 0; char ch;

cin >> intNum;
cin.get(ch);     

ia dot ie がある場合は、別の整数の読み取りと浮動小数点数への結合を使用できます。ch=='.'

于 2013-03-17T06:18:36.823 に答える
0

ドットを検索し、文字列の場合はそのように解析します。

于 2013-03-17T06:18:27.310 に答える
0

これを行う 1 つの方法は、最初のフィールドを文字列として読み取り、小数点以下の桁数が含まれているかどうかをテストすることです。もしそうなら、それをフロートにキャストして、もっと読んでください。それ以外の場合は、整数にキャストして、その数を読み取ります。cin は文字列のスペースでも自動的に改行するため、これはうまく機能します。

次のコードが機能するはずだと思います:

#include <iostream>
#include <string>
int main()
{

    std::string myStr;
    std::cin >> myStr;

    float myVal = 0;

    if(myStr.find('.') != std::string::npos)
    {
        std::cout << "Is floating point, now convert this and read lots.\n";
        float myFloat = atof(myStr.c_str());
        for(int k =0; k < 1000; k++)
        {
            std::cin >> myVal;
        }
    }
    else
    {
        std::cout << "Is integer, so read just that many\n";
        int myInt = atoi(myStr.c_str());

        for(int k =0; k < myInt; k++)
        {
            std::cin >> myVal;
        }

    }

    return 0;
}
于 2013-03-17T06:22:01.677 に答える
0

質問を正しく理解していると仮定すると、おそらく次のようなものが必要です。

using namespace std; // I'm lazy

string temp;
int number;
while(std::cin >> temp)
{
    number = 0;
    if (temp.find(".") != string::npos) number = 1000; // string has decimal point
    else istringstream(temp) >> number; // no decimal point, probably an integer

    for(int i = 0; i < number; i++) {
        std::cin >> readMoreFloats; 
    }
}

文字列に小数点が含まれているかどうかを確認する基本的な方法を使用して、浮動小数点数かどうかを示します。入力ファイルが常に適切にフォーマットされており、整数の小数点が常に省略されていると仮定すると (一部の解釈では、「2.」のような値が有効である可能性がありますが)、これは期待どおりに機能するはずです。

于 2013-03-17T06:25:51.383 に答える