Nick_is_asking Ответов: 4

Как проверить, имеет ли массив число дважды или более?


Привет.У меня проблема с кодом на языке Си.
Я хочу проверить, содержит ли массив число дважды или более...

Например, у меня есть массив емкостью 20.
С помощью цикла for я даю случайные числа(от 1 до 20) и сохраняю их в этом массиве.Но каждый раз,когда программа выдает случайное число, я проверяю, содержится ли это число в массиве (с помощью do-while).

Но каждый раз я получаю номер дважды или больше...
Остальная часть кода не имеет значения.
Я хочу помочь только с функцией check_array (.....)...

Спасибо!!!

Что я уже пробовал:

Code:


int check_array(int *pinakas , int N)
{
    int checked = 1;
    for(int i = 0; i < N; i++)
    {
        for(int j = i + 1; j < N; j++)
        {
            if(*(pinakas + j) == (*(pinakas + i)) )
            {
                checked = 0;
            }
        }
    }
    checked = 1;



void init_array(int *array , int N , int a , int b)
{
    srand(time(NULL));
    for(int i = 0; i < N; i++)
    {
        do
        {
            *(array + i) = a + rand() % (b - a + 1);
        }
        while(check_array(array , N) == 0);
    }
}

Joe Woodbury

Учитывая ваши требования, вы можете рассмотреть возможность использования перетасовки Фишера-Йейтса наизнанку. (https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle#The_%22inside-out%22_algorithm)

Shao Voon Wong

Я не вижу никакого отношения вашего поста к вопросу ОП, но я хочу поблагодарить вас за ссылку. Просто сегодня узнал кое-что полезное. Перетасовка-это то, что я делаю довольно часто в своих хобби-проектах. До сегодняшнего дня в основном занимался наивной перетасовкой. Еще раз спасибо!

Joe Woodbury

Это решает проблему, которую он представил; он хочет 20 уникальных случайных чисел в массиве в диапазоне от 1 до 20.

(Кстати, я добрался до этой ссылки после того, как прочитал о перетасовке, которую я делал. Вот один из них: https://www.i-programmer.info/programming/theory/2744-how-not-to-shuffle-the-kunth-fisher-yates-algorithm.html)

4 Ответов

Рейтинг:
6

Nick_is_asking

Хорошо.Я нашел его.Я сделал кое-что еще.
Я инициализирую массив с некоторыми другими значениями в init_array().
Код:

for(int i = 0; i < N; i++)
{
    *(array + i) = i-N;
    printf("%d  ",array[i]);
}



и я исправил эту проблему в check_array() -> return checked (not checked = 1)
Все работает так, как я и ожидал.(без повторения случайных чисел)

В любом случае,спасибо вам за помощь!!!
Я действительно ценю это...


Patrice T

Похоже, вы решили проблему.
Вы можете принять ваше решение и любое другое полезное решение. Это закроет вопрос и вознаградит помощников.

Рейтинг:
1

OriginalGriff

Выньте эту строку из конца функции:

checked = 1;

И замените его вот этим:
return(checked);
}

Затем, посмотрите на свой код - это не проверить, что это не так, это init_array.
Попробовать это:
int main()
{
    printf("Main started\n");
    int arr[100];
    init_array(arr, 20, 1, 15);
    printf("Init complete\n");
    int x = check_array(arr, 20);
    printf("%u\n", x);
    return 0;
}
Запустите приложение и посмотрите, что вы печатаете:
Main started
Это все, что вы получаете.
Итак, почему же он не выходит из init_complete?
Просто: он никогда не выходит из вашего do ... while петля, так что я никогда не увеличиваюсь. А поскольку массив инициализирован нулями, он будет автоматически находить совпадение каждый раз, когда попытается проверить ...

Взгляните на отладчик и посмотрите, можете ли вы понять, что я имею в виду.


Рейтинг:
1

Patrice T

int check_array(int *pinakas , int N)
{
    int checked = 1;
    for(int i = 0; i < N; i++)
    {
        for(int j = i + 1; j < N; j++)
        {
            if(*(pinakas + j) == (*(pinakas + i)) )
            {
                checked = 0;
            }
        }
    }
    checked = 1;
    // And you plan to return an answer ?

    // Looks like the end of function is missing here    


Рейтинг:
1

Rick York

Попробуйте более простой подход. Я не уверен, почему у вас есть вложенный цикл for для проверки массива. Из вашего описания один цикл-это все, что вам нужно. Вот альтернативная функция, которая будет проверять массив :

int check_array( int array[], int size, int value )
{
    int found = 0;
    int index;
    for( index = 0; index < size; ++n )
    {
        if( array[ index ] == value )
        {
            found = 1;    // the value is already in the array
            break;
        }
    }
    return found;
}
Это делает его простым - либо значение находится в массиве, либо его нет, и это все, что вам нужно от него. Измените другую логику, чтобы увидеть, находится ли новое значение в массиве. Если это так, то проигнорируйте его и получите другое значение. Если это не так, то добавьте его в массив.
void init_array( int *array , int maxSize, int minVal, int maxVal )
{
    int span = maxVal - minVal + 1;
    int count = 0;
    int newvalue = 0;

    srand( time( NULL ) );
    while( count < maxSize )
    {
        // rand() mod span will give values from 0 to 19
        // offset it to give values from 1 to 20

        newvalue = minVal + ( rand() % span );

        if( ! check_array( array, count, newvalue ) )
        {
            // the new value is not in the array so add it

            array[ count ] = newvalue;
            ++count;
        }

        // if the new value is not in the array then
        // loop back around and get another value
    }
}