Поиск количества вхождений в динамически размещаемом массиве в C ++ - PullRequest
0 голосов
/ 08 февраля 2020

Это метод, который я использую для создания массива.

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

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

я думаю, что вы не увеличиваете свои * числа в функции shearch.

, поэтому вы всегда сравниваете с массивом [0].

0 голосов
/ 08 февраля 2020

В вашем коде как минимум три ошибки! Два находятся в вашей функции linearSearch, где (a) вы не увеличиваете адрес, на который указывает строка в if (val == *nums) {, и (b) вы go «один за концом» массива в l oop с for (int i = 0; i <= N; i++) (последний элемент массива размером 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);

Но затем, в вашем выводе l oop, вы изменяете (увеличиваете) значение по этому адресу:

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

Итак, когда вы позже выполните эту строку linearSearch(arr, N, 1);, значение arr будет неправильно - и вы получите неопределенное поведение, пытаясь получить доступ недопустимая память.

Я бы предложил использовать индекс массива в вашем выводе l oop, например:

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

Не стесняйтесь просить дальнейших разъяснений и / или объяснение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...