-1
#include <iostream>

int main()
{
    int currVal = 0, val = 0;

    if (std::cin >> currVal) {
        int cnt = 1; 

        while (std::cin >> val) { 
            if (val == currVal)
                ++cnt; 
            else 
            {
                std::cout << currVal << " occurs " << cnt << " times" << std::endl;
                currVal = val; 
                cnt = 1; 
            }
        } 

        std::cout << currVal << " occurs " << cnt << " times" << std::endl;
    } 

    return 0;
}

このプログラムに次の入力を与えると:

42 42 42 42 42 55 55 62 100 100 100

出力は次のようになります

42が5回発生

55が2回発生

62 1回発生

100が3回発生

このコードはすべて正しく動作するはずです。ご不便をおかけして申し訳ありません。(脳のおならがありました)

4

2 に答える 2

3

これは期待どおりに動作するようです。

ステートメントまたはループstd::cin >> whateverの状態で行うには、十分な理由があります。抽出演算子は、操作しているストリームを返します。したがって、式の値はそれ自体です。ifwhile>>std::cin >> whateverstd::cin

などのストリームは、ストリームが有効な状態かどうかを確認するためにstd::cinに変換できます。bool検討:

if (std::cin >> whatever)

whateverこれは、ユーザーから変数への入力を取得し、入力が有効かどうかをチェックすることと理解できます。そうでない場合、ifブロックは実行されません。

同様に:

while (std::cin >> whatever)

これは、ユーザーが無効なものを入力するまで、毎回ユーザーからの入力を取得してループします。

無効な入力とは何ですか? 上記whateverの例で が でint、ユーザーがテキストを入力したblah場合、これは有効な整数ではないため失敗します。

于 2013-03-03T17:23:01.047 に答える
0

あなたが与えたコードは意図したとおりに機能します。

stream >> variableは への参照を生成しstream、条件としてこれは、記述したかのようifに に変換されます。bool !(stream >> variable).fail()

ただし、コードは技術的には機能しますが、多くの冗長性があります

したがって、著者のポイントが技術的に良くないコードを説明することであった場合を除いて (おそらくコードのすべての問題についての議論を伴う)、それは教育的に良くありません。

冗長性がはるかに少ない代替定式化を次に示します。

#include <iostream>
using namespace std;

int main()
{
    int current_value = 0;
    int run_length = 0;

    for( bool at_end = false; !at_end; )
    {
        int value;
        at_end = (cin >> value).fail();

        if( run_length > 0 && (at_end || value != current_value) )
        {
            cout << current_value << " occurs " << run_length << " times" << endl;
            run_length = 0;
        }

        if( !at_end )
        {
            if( run_length == 0 )
            {
                current_value = value;
            }
            ++run_length;
        }
    }
}

テスト:

[D:\開発\テスト]
> g++ foo.cpp

[D:\開発\テスト]
>エコー 42 42 42 42 42 55 55 62 100 100 100 | a
42が5回発生
55が2回発生
62 1回発生
100が3回発生

[D:\開発\テスト]
> _
于 2013-03-03T17:57:54.470 に答える