Я не хочу отдавать слишком много, так как это домашняя работа, поэтому я перенесу часть вашего кода, держу его как можно ближе и покажу вам, почему он в настоящее время не работает.
В данный момент вы как бы думаете, что цикл do...while
- это своего рода двойной блок, это не так. Код после while(...);
в вашем коде будет выполняться только один раз, после выхода из цикла do...while
он никак не связан. Вам понадобятся два цикла: внешний, который запрашивает имена, и внутренний, который ищет это имя в вашем списке.
Вы также не сбрасываете friends
и last
после того, как попросите пользователя ввести другое имя. Простое решение - переместить ваши объявления (которые содержат инициализации) в первый цикл.
Вот как будет выглядеть ваш код после его основной перестройки и применения вышеуказанных изменений:
void search(string *array, int size)
{
string name;
cout<<"Please enter a name or END to terminate:";
cin>>name;
while (name != "END")
{
bool friends = false;
int first = 0;
int last = size - 1;
int middle;
while(!friends && first <= last)
{
middle = (first + last) / 2;
if (array[middle] == name)
{
friends = true;
cout<<array[middle]<<" is my friend."<<endl;
}
else if (array[middle] > name)
last = middle - 1;
else
last = middle + 1;
}
cout<<"Please enter another name or END to terminate:";
cin>>name;
}
}
На этот раз есть два разных запроса, так что если пользователь вводит "END"
, внешний цикл завершается немедленно, вместо того, чтобы добавлять дополнительную проверку внутри цикла.
Кроме того, как и в случае с другим вашим вопросом, search(friendArray, maxsize);
должно быть search(friendArray, sub);
, по той причине, о которой я говорил вам в прошлый раз - sub
- это число допустимых элементов в массиве, maxsize
- это емкость массив.
ПРИМЕЧАНИЕ: Если имя не существует в вашем списке, это вызовет бесконечный цикл. Я позволю тебе разобраться с этим, потому что это домашнее задание, и я не хочу менять твою настоящую логику. Однако намек следует подумать о том, что на самом деле происходит - если значение не существует, вы просто будете увеличивать и уменьшать last
вокруг области, где должно быть значение, если оно существует.
Возможно, если бы ваша логика включала first
, где-то изменяясь, так что условие first <= last
не выполнится, и вы выйдете из цикла ...