2014-11-02 12 views
0

Я только что узнал, C++ в течение очень короткого промежутка времени, и в назначении Я пытаюсь найти конкретную цель в 2 одномерный массив следующим образом:Почему этот поиск терпит неудачу?

bool simsearch(int array[22][22], int target, int n){ 
    bool result = 0; 
    for (int a = 1; a < n + 1; a++){ 
     for (int b = 1; b < n + 1; b++){ 
      if (array[a][b] == target) 
       result = 1; 
       break; 
     } 
    } 
    return result; 
} 

и использовать его как:

if(simsearch(substitute, 6, size) == 0){ 
     cout << "**Warning**" << '\n'; 
    } 

Но выход предупреждения всегда присутствует, даже если цель находится в массиве. Какова основная проблема в коде?

Спасибо!

+2

Индексирование массивов в C/C++ идет между 0 и 'n-1' (не между 1 и' n'). –

+2

Почему вы используете '0' и' 1' для 'bool', почему бы не' false' и 'true'? –

+0

Извините, что вводите вас в заблуждение, но n не представляет размер массива, поэтому основная проблема - это не цифры, но спасибо за все ответы, и я решил проблему! :) – hkbgner

ответ

1
bool simsearch(int array[22][22], int target, int n){ 
    bool result = 0; 
    for (int a = 0; a < n ; a++){ 
     for (int b = 0; b < n; b++){ 
      if (array[a][b] == target){ 
       result = 1; 
       break; 
      } 
     } 
     if(result) break; 
    } 
    return result; 
} 

Это должно сработать. Правильно использовать скобки и условия

+0

Почему люди дают -1 ??? Пожалуйста, укажите причину! – rocker

+0

Я думаю, причина в том, что код выглядит плохо. –

+0

Я только что отредактировал в его ответе, чтобы лучше понять его ошибки. Это не мой стиль кодирования! – rocker

1

Индексы массивов начинаются с 0 и если массив имеет n элементов, то самым высоким индексом является n-1.

переписать функцию следующим образом

bool simsearch(const int array[22][22], int target, int n) 
{ 
    bool found = false; 

    for (int i = 0; i < n && !found; i++) 
    { 
     for (int j = 0; j < n && !found; j++) 
     { 
      if (array[i][j] == target) found = true; 
     } 
    } 

    return found; 
} 

Или

bool simsearch(const int array[22][22], int target, int n) 
{ 
    bool found = false; 

    for (int i = 0; i < n && !found; i++) 
    { 
     int j = 0; 

     while (j < n && array[i][j] != target) j++; 

     found = j != n; 
    } 

    return found; 
} 

Я надеюсь, что аргумент п всегда равен 22. :)

Другой подход заключается в следующем

template <typename T, size_t M, size_t N> 

bool simsearch(const T (&a)[M][N], const T &value) 
{ 
    bool found = false; 

    for (size_t i = 0; i < M && !found; i++) 
    { 
     size_t j = 0; 

     while (j < N && !(a[i][j] == value)) ++j; 

     found = j != N; 
    } 

    return found; 
} 
0

Есть две вещи, чтобы заметить здесь: -

for (int a = 1; a < n + 1; a++) 

Если п представляет размер здесь (который, кажется, от вызова к этой функции), то это нужно изменить. Массив размера 10 должен быть проиндексирован от 0 до 9.

Второй вещи, а не возвращать целое число

return result; 

вы можете вернуть истинными или ложными.

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