1

だから私は入力ファイルを持っています。40個の数字で構成されています。最初の20個の数値は配列に入力されます(これを確認しましたが、実際にはそこにあります)。次に、入力ファイルを閉じてから再度開きます。順次検索を使用して、入力ファイルの最初の20個の数値を配列と比較します。これは、それらがすべて成功するはずであることを意味します。次に、次の20個の数値を配列内の数値と比較します。これらはすべて、検索に失敗するはずです。この時点で、私の配列はソートされていません。

私が遭遇している問題は、成功の最後の数字がシーケンシャルを使用して見つからないことです。これを修正する方法がわかりません。

順次検索機能は次のとおりです。

length = 19;

void Search::sequential(ItemType item, bool& found)
{ 
  int place = 0;
  while (place < length && item != list[place])
    place++;
  found = (place < length); 
}

そして、これが私の成功/失敗したループです

outFile << "\n\n ************Sequential Successful ********** \n";
outFile << endl << "ID" << endl;

inFile >> num;
for(int i=0; i<=length && inFile; i++)
{
  search.sequential(num, found);
  if (found)
    outFile << num << endl; 

  inFile >> num;
} 


//sequential unsuccessful
outFile << "\n\n ************Sequential unsuccessful ********** \n";
outFile << endl << "ID" << endl;

for(int i=0; i<=length && inFile; i++)
{
  search.sequential(num, found);
  if (!found)
    outFile << num << endl; 

  inFile >> num;
}

ただし、私の出力は次のとおりです。

 ************Sequential Successful ********** 

 ID
 1111
 3352
 4567
 5678
 6789
 7890
 8901
 9012
 1223
 2113
 8546
 2374
 4723
 9573
 3284
 7474
 8594
 3589
 5858
 //THERE SHOULD BE 1925 HERE BUT THERE ISN'T

  ************Sequential unsuccessful ********** 

 ID
 9456
 3584
 2222
 4319
 4477
 5710
 5497
 1502
 1599
 1504
 1506
 9943
 8833
 9944
 6678
 5555
 5660
 9911
 6130
 1613

「if(found)」ステートメントを削除すると、すべてが完全に機能しますが、削除せずにこれを回避するにはどうすればよいですか?

前もって感謝します

- - - - - - - -編集 - - - - - - - -

さて、長さを20に変更しても、まだ機能していないようです。私はとても迷っています。

ここで配列を作成します

inFile >> num;
for (int i=0; i<length && inFile; i++)
{
  search.addToList(num);
  inFile >> num;
}

これがaddToList関数です

 void Search::addToList(ItemType num)
 {
   if (index < length)  //ive tried taking out this statement just to see if it makes a difference and it didn't
   {
     list[index] = num;
     index++;
   }
 }

コンストラクターでインデックスを0に初期化します

これが私が配列を宣言する方法です

    ItemType list[length]; 

できます!!!!本当にありがとうございました!本当に感謝しています。

4

5 に答える 5

3

2つの解決策があります:長さは値として20を取得する必要があります

length = 20;

または 、「<」の代わりに「<=」を使用します(この場合、「length」には「lastIndex」という名前を付ける必要があります)

void Search::sequential(ItemType item, bool& found) 
{  
  int index = 0; 
  while (index <= length && item != list[index]) 
    index++; 
  found = (index <= length);  
} 
于 2010-12-09T15:33:19.970 に答える
0

検索機能を見てください。20番目の数値を見つけようとすると、インデックスにはどのような値がありますか?

于 2010-12-09T15:28:36.670 に答える
0

20個の数字がある場合、なぜ長さを19に設定するのですか?それは非常に直感に反します。

于 2010-12-09T15:30:40.600 に答える
0

古典的なオフバイワンの問題。コードの修正については、@Kipotlovの回答を参照してください。

于 2010-12-09T15:47:48.063 に答える
0

Cを使用したインデックスシーケンシャル検索

このコードはすべての場合に機能します。つまり、配列の最後の要素が見つかった場合、このコードは機能します...

#include<stdio.h>
void main()
{
  int d[100],kin[20],pin[20],temp,k,i,j=0,n,n1=0,start,end;
  printf("Enter the number of elements:");
  scanf("%d",&n);
  for(i=0;i<n;i++)
    scanf("%d",&d[i]);
  printf("Enter the number to be searched:");
  scanf("%d",&k);
  for(i=0;i<n;i+=3)
  {
    kin[n1]=d[i];
    pin[n1]=i;
    n1++;
  }
  if(k < kin[0])
  {
    printf("element not found");
    exit(0);
  }
  else
  {
    for(i=1;i<=n1;i++)
      if(k < kin[i] )
      {
        start=pin[i-1];
        end=pin[i];
        break;
      }
      else
      {
        start=n1;
        end=n-1;
      }
  }
  for(i=start;i<=end;i++)
  {
    if(k==d[i])
    {
      j=1;
      break;
    }
  }
  if(j==1)
    printf("element found at position %d",i);
  else
    printf("element not found");
}
于 2016-11-06T14:45:44.367 に答える