【问题标题】:Searching the number of occurrences in a dynamically allocated array in C++在 C++ 中搜索动态分配数组中的出现次数
【发布时间】:2020-02-08 13:42:07
【问题描述】:

这是我用来创建数组的方法。

int* createArray(int N)
{

    int* array = new int[N];

    for (int i = 0; i < N; i++)
    {
        int rand_num = rand() % 10;
        array[i] = rand_num % 10;
    }

    return array;

}

这是我用来计算出现次数的方法 使用线性搜索的数组

    int linearSearch(int* nums, int N, int val)
{
    int count = 0;
    for (int i = 0; i <= N; i++)
    {
        if (val == *nums)
        {
            count+=1;
        }
    }

    return count;
}

这是主要方法。线性搜索方法甚至返回 1 虽然数组中有两个。我该如何解决这个问题?

int main()

{

int N = 5;
    int* arr =  createArray(N);

    for (int i = 0; i < N; i++)
    {
        cout << *arr++ << " " << endl;
    }

    cout << linearSearch(arr, N, 1) << " " << endl;

    return 0;
}

【问题讨论】:

  • 这是为了教育目的,一些关于指针和搜索算法的课程吗?
  • 另一个错误是您的循环在线性搜索中执行了N + 1 次。确保将 i &lt;= N 更改为 i &lt; N
  • 请注意:一旦发布的答案指出您的代码中存在错误,您就不应修复该错误 - 因为这会使答案无效,即使它是“善意”发布的'。
  • rand_num % 10;int rand_num = rand() % 10; 之后有什么意义?请查看&lt;random&gt; 标头提供的现代功能,或者至少在main 中调用srand

标签: c++ arrays dynamic-memory-allocation linear-search


【解决方案1】:

我认为您不会在函数 shearch 中增加 *nums。

所以你总是比较数组[0]。

【讨论】:

  • 您是否像@Arden Coder 在顶部所说的那样将 i
  • 是的,我做到了,我会的
  • 天哪!我没有看到,但是当您在主“for”中打印时,指针会移到数组的末尾!因此,当您在 shearch 函数中增加指针时,您会内存不足!
【解决方案2】:

您的代码中至少有三个错误!两个在您的 linearSearch 函数中,其中 (a) 您不增加在 if (val == *nums) { 行中指向的地址和 (b) 您在循环中使用 @987654323 去“超出数组末尾的一个” @(大小为N 的数组的最后一个元素有一个索引N-1)。这是一个固定版本:

int linearSearch(int* nums, int N, int val)
{
    int count = 0;
    for (int i = 0; i < N; i++) {
        if (val == *nums++) {
            count += 1;
        }
    }
    return count;
}

第三个问题也许更微妙。在您的主代码中,您首先将指针arr 分配给createArray 返回的地址,这里:

int* arr = createArray(N);

然后,在您的输出循环中,您修改(增加)该地址的值:

    cout << *arr++ << " " << endl;

因此,当您稍后执行这行 linearSearch(arr, N, 1); 时,arr 的值将错误 - 您会得到未定义的行为,试图访问无效内存。

我建议在输出循环中使用 数组索引,如下所示:

    for (int i = 0; i < N; i++) {
        cout << arr[i] << " " << endl;
    }

请随时要求进一步澄清和/或解释。

【讨论】:

  • 我已经按照您指出的那样编辑了上面的代码,但控制台仍然输出错误的值
  • @Brian - 在发布答案时不要继续编辑您的问题!
  • @Brian - 您需要所有三个更正 - 但在代码的“本地副本”中进行这些更正。
  • 好的。您还有其他想法为什么输出错误的值吗?
  • @Brian 在我的电脑上,代码现在将1 7 4 0 9 1 作为其输出 - 这是正确的(数组中只有一个 1 - 最后一个是搜索的结果)。跨度>
猜你喜欢
  • 2023-03-28
  • 2012-02-16
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
相关资源
最近更新 更多