-4

問題:1 このコードでは、配列に含まれていない数値を検索すると表示されるはずValue not foundですが、表示されるたびにそのメッセージが表示されていないことがわかりませんFound value in element -5。なぜそれが起こっているのかわかりません。

#include<stdio.h>
#define SIZE 100

size_t linearSearch(const int array[], int key, size_t size);

int main(void)
{

    int a[SIZE];
    size_t x;
    int searchKey;
    size_t element;


    for(x=0; x<SIZE; ++x){
        a[x] = 2*x;
    }

    for(x=0; x<SIZE; ++x){
        if(x%10 == 0){
            puts("");
        }
        printf("%5d", a[x]);
    }

    puts("\n\nEnter integer search key:");
    scanf("%d", &searchKey);

    // attempt to locate searchKey in array a
    element = linearSearch(a, searchKey, SIZE);

    // display results
    if(element != -1){
        printf("Found value in element %d", element);
    }
    else{
        puts("Value not found");
    }
}

size_t linearSearch(const int array[], int key, size_t size)
{
    if(size<0){
        return -1;
    }
    if(key == array[size-1]){
        return size-1;
    }
    return linearSearch(array, key, size-1);

}

問題:2

方法がわかりません

size_t linearSearch(const int array[], int key, size_t size)

これらの行を特別に機能させる機能

if(key == array[size-1]){
        return size-1;
return linearSearch(array, key, size-1);
4

3 に答える 3

2

if(size==0)誰もが言ったように、あなたにはちょっとした間違いがあります。if(size<0).

linearSearch()関数で再帰的に何が起こっているのか説明させてください

size_t linearSearch(const int array[], int key, size_t size)
{
    if(size == 0){
        return -1;
    }
    else
        if(key == array[size-1]){
            return size-1;
    }
    else{
        return linearSearch(array, key, size-1);
    }
}

検索キーとして入力を与えたとします198linearSearch()ステートメントで関数を呼び出す場合

element = linearSearch(a, searchKey, SIZE);

array[], searchKey 198, and Size 100への参照を引数として渡しています。

linearSearch 関数では、最初に if ステートメントif(size==0)がサイズがゼロに等しいかどうかをチェックし、そうでない場合は if ステートメントが実行されます。

in else if ステートメントのIf(198 == array[100-1])条件がチェックされます。198が存在することがわかりarray[99]ます。else if 条件が true の場合、linearSearch 関数は結果として 99 を返します。

55配列リストにないものを入力するとどうなるか見てみましょう。if(size==0) は true ではないため、プログラムはそれをスキップして次のステートメントに進みます。 if(55 == array[100-1]true ではないためチェックされてからlinearSearch(array, 55, 100-1)呼び出されます。再度if(55==array[99-1])チェックされます。ある時点で size は 0 になり、最初のif(size==0)ステートメントが実行されます。

于 2016-10-15T13:06:58.717 に答える
2

1) 主な問題はif(size<0){. 条件式は常に false になります。size_t は符号なし整数であるためです。そのため、見つかった値を持つランダムな位置を返します (これは未定義の動作です) 偶然に大きな数値になります (たとえば、-5 は符号なしとして 4294967291 です) 終了 (見つかりません) はありません。

if(size<0){する必要がありますif(size==0){

2) キーが最後の要素と一致する場合、その位置を返します。そうでない場合は、ワンサイズ短くして繰り返します。サイズがゼロの場合、キーが見つかりません。

于 2016-10-04T03:22:05.687 に答える
1

if ステートメントを から コードに変更するだけでif(size<0)機能しif(size==0)ます。

于 2016-10-15T13:19:33.717 に答える