2013-06-09 3 views
-2

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

Вот что я сейчас:

bool solids[50]; 
    int a,i; 

//"equality" is a function that checks the equality between "a" and a defined value 
solids[0] = equality(a,&value_1); 
solids[1] = equality(a,&value_1); 
solids[2] = equality(a,&value_1); 
solids[3] = equality(a,&value_1); 

for (i = 0; solids[i] != true; i++) 
{ 

[...] 

} 

Но я понятия не имею, что я должен поместить в петлю?

Моя попытка была

for (i = 0; i <= 50; i++) 
{ 
    if (solids[i] == true) 
    { 
    return true; 
    break; 
    } else { 
    return false; 
    } 
} 

, который должен вернуться true после первого верен и вернуть false если массив не имеет элемент с true значение, но это не похоже на работу в коде.

Неправильно? Если да, в чем проблема?

PS .: Я могу посчитать количество true с счетчиком, но это не является оптимальным решением этой проблемы, так как я просто смотрю на ПЕРВЫЙ true значения и, следовательно, программа не должен проверять все 50 членов. Needley рассчитывать, сколько ненужных шагов это должно было бы означать.

+4

Просто используйте 'std :: find'. – chris

+1

Вам не нужна часть 'else'. Подумайте об этом - он возвращает 'false' для первого недействительного значения, чтобы он прекратил поиск. –

+0

Вы намерены установить каждый элемент твердых тел [] на одно и то же значение? Вы всегда сравниваете 'a' с' value_1' – Tawnos

ответ

1

вот краткий пример использования std::find() в соответствии с рекомендациями @ Крис:

bool find_element_in_array() { 
    bool solids[50]; 
    int length; 

    /* ... do many operations, and keep length as the size of values inserted in solids */ 

    bool* location = std::find(solids, length, true); 
    // if element is found return true 
    if (location != solids + length) 
     return true; 
    // else return false 
    return false; 
} 
+0

Спасибо! Разве вы не забыли сформировать первую строчку? –

+0

@ ZoltánSchmidt: Это не скомпилируется. Второй параметр 'std :: find' должен быть итератором (как и первый параметр). В инструкции также отсутствует '='. Я понятия не имею, откуда пришел «ARRAY_SIZE» (должен быть «длина»). – Blastfurnace

+0

сожалею о нескольких ошибках, которые я сделал, но за пределами моего vim я часто делаю опечатки :-) В противном случае я в основном следил за документацией и примером из ссылки, которую я дал, и считаю, что это отправная точка для @ ZoltánSchmidt для ему приспособиться к его потребностям. – zmo

0

После того, как вы твердые правильно установить (это выглядит, как вы в настоящее время установки каждого значения в одно и то же), вы можете сделать петлю, которая выходит на первый истинный, как это:

for (i = 0; i < 50; i++) 
{ 
    if (solids[i] == true) 
    { 
     return true; 
    } 
} 
return false; 

Я d также просто переместите объявление i в тело цикла for, так как оно не используется снаружи, но приведенное выше отвечает на ваш вопрос.

+1

'i <= 50' является неправильным условием для массива из 50 элементов. Должно быть 'i <50'. – Inspired

+0

Правда, я скопировал эту петлю и не проверял ее – Tawnos

0

return немедленно выходит из функции, поэтому нет необходимости в break петле после.

Если это достаточно, чтобы выйти из функции сразу после поиска, вы должны написать что-то вроде:

for (int i = 0; i < 50; i++) { 
    if (solids[i]) return true; 
} 
return false; 

Если вам нужно использовать результат поиска в одной и той же функции, использовать дополнительную переменную:

bool found = false; 
for (int = 0; i < 50; i++) { 
    if (solids[i]) { 
    bool = true; 
    break; 
    } 
} 

if (found) { ... 
Смежные вопросы