2017-10-21 5 views
-2
私は配列は、これは、それが正しく印刷しデバッグするとき、私は

リニア検索は、予期しない結果

bool Contains(int a[], int arraySize, int testVal) 
{ 

     bool contains = 0; 
     for (int i = 0; i < arraySize; ++i) 
     { 
      if (a[i] == testVal) 
      { 
       contains = true; 
       std::cout << "true" << std::endl; 
      } 
      else if (a[i] != testVal) 
      { 
       contains = false; 
       std::cout << "false" << std::endl; 
      } 
     } 
     return contains; } 

を書いたものであるtestValという

含まれているかどうかをテストする線形探索アルゴリズムを開発する必要があり

を返しますそれは19 "偽"も表示します。私は配列の大きさ20と何か関係があると思います。私はそれを19 "偽"なしで一度だけ印刷するように修正する方法はありません。誰かが間違っていることを教えてくれますか?

+1

値を見つけたときにループを停止する方法について考えてみましょう。 – PaulMcKenzie

答えて

0

まず、containsの値を変更する必要があります。falseをデフォルトに設定するだけです。つまり、配列の最後まで検索しても見つからない場合、結果はそれが発見された場合false

こと、それがすでに見つかっているので、さらにテストの必要はありません

、ループの外にtruebreakcontainを設定し、i++++iを変更、違いが++iである前に追加されますnesのコードtを実行すると、arraySizeが10の場合、ループは1から9になります。これはi++と比較して9倍であり、ネスト実行後にiが追加されるため、同じarraySizeでループは0〜あなたはそれがtestValというが含まれているか、あなたがのためにループを破ることができることを見つけたら9は、それが10倍

bool Contains(int a[], int arraySize, int testVal) 
{ 
    bool contains = false; 
    for (int i = 0; i < arraySize; i++) 
    { 
     if (a[i] == testVal) 
     { 
      contains = true; 
      std::cout << "true" << std::endl; 
      break; 
     } 
    } 
    return contains; 
} 
0

であるあなたは返す必要があります。リターンはより良いものであり、最小限の変更で下のコードで行われます。

bool Contains(int a[], int arraySize, int testVal) 
{ 

    bool contains = 0; 
    for (int i = 0; i < arraySize; ++i) 
    { 
     if (a[i] == testVal) 
     { 
      contains = true; 
      std::cout << "true" << std::endl; 
      return contains; 
     } 
     else if (a[i] != testVal) 
     { 
      contains = false; 
      std::cout << "false" << std::endl; 
     } 
    } 
    return contains; } 

また、次のコードのように一致するものが見つかった場合は、この部分だけを更新することもできます。このコードでは、return inside forループを使用する必要はありません。しかし、コードを実行すると、ループを終了するのを待たないという意味でコードが高速になります。

bool Contains(int a[], int arraySize, int testVal) 
{ 

    bool contains = false; 
    for (int i = 0; i < arraySize; ++i) 
    { 
     if (a[i] == testVal) 
     { 
      contains = true; 
      std::cout << "true" << std::endl; 
     } 
    } 
    return contains; } 
2

あなたがする必要があるすべてはあなたのforループの中で以下の条件を置くことです:

bool contains = false; 
for (int i = 0; i < arraySize && !contains; ++i) 

これはあなたのコード内で他に何も変更せずに動作する理由containstrueときに設定されていることですその値が見つかります。

したがって、次の繰り返しでは(既に配列の最後に達していない場合)、ループの条件i < arraySize && !containsfalseになり、ループが終了します。 i < arraySizecontains値がfalseある場合

​​

ループのみを続けて:

!が混乱している場合、それはあるを見て別の方法は、以下の行は同じことを行います。値が見つかるとcontainstrueに設定するので、forループは次の繰り返しで終了します。

0
bool Contains(int a[], int arraySize, int testVal) 
{ 


bool contains = false; 
for (int i=0;i<arraySize;i++) 
{ 
    if (a[i] == testVal) 
    { 
     contains = true; 
     std::cout << "true" << std::endl; 
     return contains; 
    } 
} 
return contains; } 

あなたは私が ++ではなくを++とのtestValはそれ以上の検査は行われていないよりも、発見された場合にように、あなたがかのブロックにreturn文を使用する必要がありますを使用する必要があります。

関連する問題