数组中的线性搜索返回意外结果

时间:2017-10-21 02:43:37

标签: c++ arrays boolean

我需要开发一个线性搜索算法来测试数组是否包含testVal

这就是我写的

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; }

调试时,它打印正确,但它也打印19“假”。我想这与数组大小为20有关。我不知道如何修复它只打印一次没有19“假”。有人能告诉我出了什么问题吗?

4 个答案:

答案 0 :(得分:2)

您需要做的就是在for循环中添加以下条件:

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

在不更改代码中的任何其他内容的情况下,这样做的原因是contains在找到值时设置为true

因此,在下一次迭代中(如果你还没有到达数组的末尾),循环的条件i < arraySize && !contains将为false,从而终止循环。

另一种看待它的方法是!是否令人困惑,以下几行做同样的事情:

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

仅当i < arraySizecontains值为false时,循环才会继续。由于您在找到值时将contains设置为true,因此for循环会在下一次迭代时终止。

答案 1 :(得分:0)

首先,您只需要在找到它时更改contains的值,并将false设置为默认值,这样在搜索数组末尾时,仍然没有找到,结果将是false

如果找到,请将contain设置为true并将break设置为循环,因为已找到它,无需进一步测试

并将++i更改为i++,在执行嵌套中的代码之前添加了差异++i,这样如果使用10的arraySize,则循环将是1到9,即9倍,与i++相比,i在执行嵌套后添加,因此使用相同的arraySize,您的循环将为0到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; 
}

答案 2 :(得分:0)

一旦发现它包含testVal,您就应该返回,或者您可以打破for循环。返回更好,并在下面的代码中完成,只需要很少的更改。

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; }

您还可以在找到匹配项时更新包含,如下面的代码所示。在此代码中,您可能不必在for循环中使用return。但是,如果你这样做,你的代码会更快,因为它不会等待终止循环。

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; }

答案 3 :(得分: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; }

您必须使用 i ++ 而不是 ++ i ,并且必须在 if 块中使用return语句,以便在找到testval时而不是进行进一步的测试。