В то время как условие соблюдается, только если я поставил время 1 и поставил if и порвал с тем же условием - PullRequest
0 голосов
/ 05 апреля 2020

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

int arrayBinary_search(myarray[], key){

    int selector = 0;
    int low_limit = 0;
    int high_limit = SIZE;
    while (1){
        selector = (low_limit+high_limit)/2;
        printf("The selector is: %d\n", selector);
        if (myarray[selector] == key){
            return 1;
        }
        else {
            if (low_limit==selector || high_limit==selector)        // this is the condition
                break;
            if (key < myarray[selector])
                high_limit = selector;
            else
                low_limit = selector;
            printf("The high_limit is: %d\n", high_limit);
            printf("The low_limit is: %d\n", low_limit);
        }

    }

}

Код работает, но так как не рекомендуется ставить while (1), я хотел вставить условие low_limit==selector || high_limit==selector непосредственно внутри условия while, заменяющего это «1».

Итак, это должно быть:

int arrayBinary_search(myarray[], key){

    int selector = 0;
    int low_limit = 0;
    int high_limit = SIZE;
    while (!(low_limit==selector) && !(high_limit==selector)){        // this is the condition implemented
        selector = (low_limit+high_limit)/2;
        printf("The selector is: %d\n", selector);
        if (myarray[selector] == key){
            return 1;
        }
        else {
            //if (low_limit==selector || high_limit==selector)
            //  break;
            if (key < myarray[selector])
                high_limit = selector;
            else
                low_limit = selector;
            printf("The high_limit is: %d\n", high_limit);
            printf("The low_limit is: %d\n", low_limit);
        }

    }

}

Поскольку это условие должно соответствовать ОТКЛЮЧЕННОМУ ИЛИ, то есть двум отрицательным элементам с AND.

Но это не работает.

Полный код здесь: https://hastebin.com/cebaxicasu.cpp

1 Ответ

1 голос
/ 05 апреля 2020

Значение селектора переменной инициализируется следующим образом:

 int selector = 0;

В связи с этим ваша программа никогда не будет вводить значение l oop, поскольку !(low_limit==selector) всегда ложно.

Следующие изменения приведут к корректной работе вашего кода.

int arrayBinary_search(int myarray[], int key){
    int selector;
    int low_limit = 0;
    int high_limit = SIZE;
    while (low_limit <= high_limit){
        selector = (low_limit+ high_limit)/2;
        printf("The selector is: %d\n", selector);
        if (myarray[selector] == key){
            return 1;
        }
        else {
            if (key < myarray[selector])
                high_limit = selector-1;
            else
                low_limit = selector+1;
            printf("The high_limit is: %d\n", high_limit);
            printf("The low_limit is: %d\n", low_limit);
        }

    }

}

Также обратите внимание, что прототипы ваших функций должны иметь типы параметров, как показано ниже.

int arrayGenerator(int myarray[]);
int arrayBinary_search(int myarray[], int key);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...