2015-10-03 9 views
5

配列内の整数をスワップするコードを書いていますが、breakステートメントを使用しないでループを終了し、ロジックを一貫して維持する方法を知りたいと思います。ここでは以下の私のコードは次のとおりです。ブレークを使用せずにC++でループを終了するにはどうすればよいですか?

int swapped = 0; 
if (arrays[0][first] % 2 == 0) 
{ 
    cout << arrays[0][first] << " is odd " << endl; 
    for (int i = 1; i < arraycount; ++i) 
    { 
     for (int j = 1; j < arrays[i][0] + 1; ++j) 
     { 
      if (arrays[i][j] % 2 != 0) 
      { 
        int temp = arrays[i][j]; 
        cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with " 
          << "Array #" << i << " value " << temp; 

        arrays[i][j] = arrays[0][first]; 
        arrays[0][first] = temp; 
        swapped = 1; 
        break; 
       } 
      } 
      if (swapped) { 
       break; 
      } 
+2

ブレークには何が問題なのですか? –

+2

これはC++です。 'bool 'として動作するときに' swapped'が 'int'になるのはなぜですか? – dureuill

+0

これはおそらく 'for(initial;通常の条件&& break-condition; stepper){...}' – Emadpres

答えて

2

必ずしもあなたのコードのロジックが矛盾せないbreak文を使用し、休憩は頻繁にあなたのコードの可読性を改善するのに有用です。しかし、あなたの質問に答えて、これはwhileループと論理ブール演算子を利用することで実現できます。あなたのコードの修正版は以下の通りですが、私はできるだけ修正しないようにしようとしていますので、例の中であなたのコードを見ることができます。以下の例では、私が残しておきたいいくつかの論理的なエラーがあります。実際に数字が偶数の場合、特に下の行は "奇妙です"と表示されます。数字arrays[0][first]が奇数かどうかをチェックしたい場合は、if (arrays[0][first] % 2 == 0)の代わりにif (arrays[0][first] % 2 != 0)が必要です。

論理エラー

if (arrays[0][first] % 2 == 0) 
      { 
        cout << arrays[0][first] << " is odd " << endl; 

これは、改行を使用しないコードです。

bool swapped = true; 
      if (arrays[0][first] % 2 == 0) 
      { 
        cout << arrays[0][first] << " is odd " << endl; 
        int i = 1; 
        while ((i < arraycount) && swapped) 
        { 
          int j = 1; 
          bool if_odd = true; 
          while ((j < arrays[i][0] + 1) && if_odd) 
          { 
            if (arrays[i][j] % 2 != 0) 
            { 
              int temp = arrays[i][j]; 
              cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with " 
                << "Array #" << i << " value " << temp; 

              arrays[i][j] = arrays[0][first]; 
              arrays[0][first] = temp; 
              swapped = false; 
              if_odd = false; 
            } 
            j++; 
          } 
          i++; 
        } 
      } 
4
for (int i = 1; i < arraycount && !swapped; ++i) 
{ 
    for (int j = 1; j < arrays[i][0] + 1 && !swapped; ++j) 
    { 
     if(arrays[i][j] % 2 != 0) 
      int temp = arrays[i][j]; 
      cout << "Array #" << 1 << " value " << arrays[0][first] << " swapped with " << "Array #" << i << " value " << temp; 
      arrays[i][j] = arrays[0][first]; 
      arrays[0][first] = temp; 
      swapped = 1; 
     } 
    } 
} 

これはあなたが内側のループで持っている同じことを行います。

+0

最初は 'int swapped = 0;'なので、最初のforループには入りません。 – Himanshu

+0

良い点:)問題点を修正します:) –

+0

2番目のループでは、すべての偶数番号を渡し、最初の奇数番目の 'doSomethings'のためにブレークします。あなたのコードでは、すべての偶数に対して 'doSometings'を行い、最初の奇数を見つけるとループから復帰します。 – aisa

5

goto [私はこれのために倒れます]。

if (arrays[0][first] % 2 == 0) 
{ 
    cout << arrays[0][first] << " is odd " << endl; 
    for (int i = 1; i < arraycount; ++i) 
    { 
     for (int j = 1; j < arrays[i][0] + 1; ++j) 
     { 
      if (arrays[i][j] % 2 != 0) 
      { 
        int temp = arrays[i][j]; 
        cout << "Array #" << 1 << " value " 
          << arrays[0][first] << " swapped with " 
          << "Array #" << i << " value " << temp; 

        arrays[i][j] = arrays[0][first]; 
        arrays[0][first] = temp; 
        goto done; 
       } 
      } 
done: 
    something; 
+1

マルチレベルブレークは、IMOであり、現代のC++における 'goto'の主な使用例の1つです。 – Hurkyl

関連する問題