2016-11-08 4 views
-1

この関数は、すべての番号1、... x-1が配列内にあるような可能性のある最大値xを計算します。 {1,3,2,5} - > 4.関数はゼロを持つ配列に対しては機能しません。それは常に1を返します。それはなぜですか?ソートされた数のシーケンスをチェックするとき配列のサブシーケンス

int array(int* t, int r) 
{ 
    for (int x = 0; x < r; x++) 
    { 
     for (int y = 0; y < r-1; y++) 
     { 
      if (t[y] > t[y+1]) 
      { 
       int temp = t[y+1]; 
       t[y+1] = t[y]; 
       t[y] = temp; 
      } 
     } 
    } 
    for (int i = 0; i != r; i++) 
    { 
     if (t[i] != (i + 1)) 
     { 
      return i+1; 
     } 
    } 
    return r+1; 
} 
+0

私はあなたの要件を完全に理解していません。 'Z'と' x'の関係はどうですか? –

+0

Typo。私の間違い。 – vforbiedronka

+1

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

答えて

1

、あなたはそのt[i] == i+1をチェックし、そうi番目の要素は位置に私の場合。あなたのシーケンスが1で始まる場合代わりにあなたがi+1番目の要素がi番目の要素+1であることを確認する必要があります。この唯一の作品なので、

if (t[i]+1 != t[i+1]) { 
    return t[i] + 1; 
} 
+0

0で動作しますが、配列内に0がない場合は、数値1を返します。 – vforbiedronka

+1

あなたは正しいですが、私は 'if'節を変更しましたが、戻り値もオフでした。要素自体は1だけインクリメントされるので、 'i + 1'ではなく' t [i] + 1'です。 –

2

は、これはあなたのコード

for(int x=0;x<r;x++){ 
    for(int y=0; y<r-1;y++){ 
     if(t[y]>t[y+1]){ 
      int temp=t[y+1]; 
      t[y+1]=t[y]; 
      t[y]=temp; 
     } 
    } } 

を壊すのをしてみましょうソートアルゴリズム(Bubble Sort、kind of)したがって、これらのループの後で、配列がソートされているとみなすことができます。

次のforループを見ると、ループは各iの(i + 1)番目の番号の存在をチェックします。つまり、最初の反復(i = 0)では、0番目の位置で1(i + 1)をチェックします。見つからない場合は、その値を返します。そうでなければ検索を続けます。すべてがうまくいくと、r + 1(配列のサイズ+1)が返されます。今

for (int i = 0; i != r; i++) { 
    if (t[i] != (i + 1)) { 
     return i + 1; 
    } 
} 

0が(すべて陽性と)配列に存在する場合、それは常に最初の位置(0番目のインデックス)を占めることになります。したがって、0番目のインデックスで1が予想されていたので、1を返します。

あなたがこれを理解していれば、私はそうではないと思います。あなたも0に対応するのは難しいでしょう。

関連する問題