2016-02-24 2 views
1

Я пытаюсь посмотреть в массиве, чтобы узнать, найден ли в нем точный элемент (x). Для этого я говорю в начале проблемы, что contor = 0 (логический параметр), что означает, что в массиве нет x, но если во время цикла for и x найдено в массиве, я сказал что contor = 1 ... и в конце я выполнил тест if (contor) else и он не работает в случае, когда x не найден в массиве. Это просто ничего не показывает. Я не понимаю ... Я новичок. Спасибо!Я неправильно использую логический оператор?

#include<iostream> 

    using namespace std; 

    void main() 

    {int x, st, dr, m,n,i,contor=0;  //dr = right, st = left, m=middle; 
    int v[100]; 

    cout << "How many elements will the array have?"; 
    cin >> n; 
    cout << endl; 

    for (i = 0; i < n;i++) 
     {cout << "Insert a element in the array:"; 
     cin >> v[i]; 
     } 

    cout << "Which is the number you are looking for?"; 
    cin >> x; 

    st = 0; 
    dr = n - 1; 

    for (i = st; i <= dr;) 

     {m = (st + dr)/2; 

     if (v[m] == x) 
     { contor = 1; 
      break; 
     } 
     else if (v[m] > x) 
      dr = m - 1; 
     else st = m + 1; 
     } 

    if (contor) 
     cout << "The element you are looking for is in the array."; 
    else 
     cout << "The element you are looking for is NOT in the array."; 

    cin.get(); 
    cin.get(); 
    } 
+1

Очень важно, чтобы вы форматировали свой код последовательно с отступом, если хотите, чтобы мы потратили более пяти секунд на его чтение. – Sebivor

+0

Я думал, что с самого начала все в порядке. Теперь я сделал некоторые изменения. Все в порядке ? – Skyp89

+0

№ Все еще непоследовательно. Я предлагаю рассмотреть [эту статью в википедии о стилях отступа] (https://en.wikipedia.org/wiki/Indent_style) ... – Sebivor

ответ

3

Вы пытаетесь выполнить двоичный поиск, но вы делаете это в бесконечном цикле. Если элемент найден, вы прерываете цикл, но если он не найден, ваш цикл продолжается бесконечно. Кроме того, вы пытаетесь выполнить двоичный поиск в массиве, который не гарантируется. Если предположить, что массив упорядочен, а это значит, что:

я < = у < => v [я] < = v [J]

это то, что может работать:

do { 
    m = (st + dr)/2; 
    if (v[m] == x) { 
     contor = 1; 
     break; 
    } else if (v[m] > x) { 
     dr = (st + m - 1)/2; 
    } else { 
     st = (m + dr + 1)/2; 
    } 
} while (st < dr); 
+0

Я тестировал также, когда массив имеет только один элемент, а x отличается от элемента массива (большего или меньшего), и он работает просто отлично. (для последнего комментария Лайоша Арпада в ответе, набранном с -1, который был удален). У нас там была диссоциация. – Skyp89

+0

, поэтому мне просто нужно было стереть st = 0, dr = n-1 и поставить эти условия в for (st = 0, dr = n - 1; st <= dr;), и он работает правильно для всех тестов, которые Я сделал (и да, массив упорядочен.) – Skyp89

 Смежные вопросы

  • Нет связанных вопросов^_^