このプログラムで無限ループを回避する方法

私はC + +で3n + 1の問題を解決しようとしています。私はペアで入力を取り、その最大サイクル長を計算して出力したいと考えています。

I/P: 1 10
     100 200
     201 210
     900 1000
O/P: 1 10 25
     100 200 125
     201 210 89
     900 1000 174

コード:

#include
using namespace std;

int clen(int i)
{
    int len=1;
    while(i!=1)
    {
        len++;
        if(i%2==0)
            i/=2;
        else
            i=3*i+1;
    }
    return len;
}

int maxclen(int a, int b)
{
    int i,len,maxlen=0;
    for(i=a;i<=b;i++)
    {
        len=clen(i);
        if(len>maxlen)
            maxlen=len;
    }
    return maxlen;
}

main()
{
    int b[10][2],l,i,len[10];
    for(i=0;;i++)
    {
        cin>>b[i][0];
        if(cin.fail())
        {
            cin.clear();
            goto a;
        }
        cin>>b[i][1];
        if(cin.fail())
            goto a;

    }
    a:
    l=i;
    for(i=0;i<=l;i++)
    {
        if(b[i][1]>b[i][0])
            len[i]=maxclen(b[i][0],b[i][1]);
        else
            len[i]=0;
    }
    for(i=0;i

私はcin.fail()がtrueを返すたびに入力を止めたいが、プログラムの最初の実行はほとんど行われないが、その後は無限ループに入り、数字を入力するだけで終了する。誰もこのcinの問題で私を助けることができる、どのように私はこの無限ループを避けることができますか?

2
これはあなたの問題には直接関係していないようですが、 b を10×2の配列にすると、 i
追加された 著者 jwodder,
ここで goto の必要はありません。代わりに break を使用してください。
追加された 著者 Pubby,
貴重なCmmntsのおかげで..
追加された 著者 Pankaj Anand,

2 答え

1つの数字だけを入力した後でCtrl + D(eof)を押すと死に至ったことが分かりました。

エラー状態を別の「クリア」してみてください。

main()
{
    int b[10][2],l,i,len[10];
    for(i=0;;i++)
    {
        cin>>b[i][0];
        if(cin.fail())
        {
            cin.clear();
            goto a;
        }
        cin>>b[i][1];
        if(cin.fail())
        {
            cin.clear();//ADDED LINE
            goto a;
        }
    }
 ...

私は100%エラーを再現できませんでしたが、それは私の行動を助けるように思えました。

また、あなたの配列はわずか10長いです。多分それはあまりにも多くを読んで、いくつかの奇妙な状態になる?

1
追加された
どうもありがとうございました...
追加された 著者 Pankaj Anand,

あなたはここでひとつずつ誤りがあります:

for(i=0;i<=l;i++)
{
 //...
}

私はこのようなあなたのメインを修正していくつかの問題を修正しました:

int main()
{
    const size_t length = 10;
    int b[length][2], len[length];

    size_t i = 0;
    while(i < length)
    {
        cin >> b[i][0];
        if(!cin) break;
        cin >> b[i][1];
        if(!cin) break;
        ++i;
    }

    for(int j = 0; j < i; j++)
    {
        if(b[j][1] > b[j][0])
            len[j] = maxclen(b[j][0], b[j][1]);
        else
            len[j] = 0;
    }
    for(int j = 0; j < i; j++)
        cout << b[j][0] << " " << b[j][1] << " " << len[j] << endl;
}
0
追加された
本当にクールなソリューション..ありがとう
追加された 著者 Pankaj Anand,