2016-10-25 5 views
3

今週宿題私は1,000の数字のテキストファイルを読み込み、ユーザーが入力した数字の線形検索を行うことになっています。私は線形検索部分を完了しましたが、その整数の最後の出現箇所を見つけて印刷する必要があります。私は最後から配列を実行し、最後のオカレンスを出力してループを中断するのが最も簡単だと考えました。私はコードを開始しましたが、最後の発生を見つける際にいくつかの問題を抱えています。C++線形検索でintの最後の出現を見つける

ループのためにを知っていますアレイを後方に実行するのは間違っていますが、どういうことが間違っているのか分かりません。どんな助けもありがとう!ありがとうございました!

#include <iostream> 
#include <fstream> 
#include <conio.h> 

using namespace std; 

int main() 
{ 
    ifstream input("A1.txt"); 
    int find; 

    cout << "Enter a number to search for: "; 
    cin >> find; 

    if (input.is_open()) 
    { 
     int linSearch[1000]; 

     for (int i = 0; i < 1000; i++) 
     { 
      input >> linSearch[i]; 

      for (i = 1000; i > 0; i--) 
      { 
       if (find == linSearch[i]) 
       { 
        cout << find << " is at position " << i << ". " << endl; 
       } 
      } 
     } 
    } 

    _getch(); 
    return 0; 
} 
+1

ヒント: 'int [1000]'の最後のインデックスは何ですか? – Beta

+0

私は今参照してください。ありがとうございました! @Beta –

答えて

1
for (int i = 0; i < 1000; i++) 
    { 
     input >> linSearch[i]; 

これは良いスタートです。あなたはあなたの配列に1000の数字を読むためのループを始めました。

 for (i = 1000; i > 0; i--) 

これは少し時期尚早だと思いませんか?あなたはまだファイル内の1000個の数字を読むためにループを終了していませんが、まだ完全には読み込まれていない配列を探しています。この論理的な間違いは、「馬の前にカートを置く」という非常に専門的な用語があります。最初に1000の数字を読むためにループを終了する必要があります。そして、あなたはこの2番目のループを実行することができます。

 { 
      if (find == linSearch[i]) 

これでもう少しバックアップしましょう。あなたはi=1000でループを開始しました。今、ここに、iの場合、最初の値は何ですか?それは1000です。あなたはここで問題を見ない?ご存知のように、1000要素配列 "linSearch"には、0〜999の番号が付けられています。これは合計1000要素です。 iの値が1000から始まり、存在しないlinSearch [1000]へのアクセスは未定義の動作であり、バグです。

ここでロジックを微調整して、正しく調整できます。しかし、それをする必要はありません。ファイルから1000の数字を読み取る完全に動作するループが既にあります。そしてあなたは検索したい番号を知っています。

ファイルから次の番号を読み取るたびに、探している番号の場合はその位置を保存するだけです。したがって、すべてのことが言われて実行されると、その変数に格納されている最後の位置は、検索している番号の最後の位置です。シンプルなロジック。あなたがしなければならないことは、検索した番号が見つかったことを示すフラグもセットされているだけです。

これを行うことになったら、もはや最初に何らかの配列を持つ必要がなくなったことがわかります。あなたがしなければならないことは、一度に1つの番号でファイルから1000の数字を読み、あなたが探している数字であるかどうかをチェックし、そうであればその位置を保存します。次に、ループの最後にノートを比較します。

+0

私は配列で作業する必要はありませんでしたが、教授の命令!私は今、私の問題を解決しました。ありがとうございました! –

1

これは宿題なので、多少はっきりしているはずです。コードを使用しないでください。

最初のループ内に2番目のループを入れ子にしないでください。最初のループと同じ字下げレベルにする必要があります。

また、ほとんどすべての場合、0に戻って検索するのではなく、線形検索で要素を見つけた場所、またはその場所を見つけた場所に戻る必要があります。

はい、ベータが書いたものに注意してください。

また、あなたが探しているものが見つかるたびにループから抜け出すべきですか?

関連する問題