900_____________________________________________Глава 14

int *elem;

qsort(array, ARRAYSIZE(array),sizeof(int), fcmp) ;

elem = (int *) bsearch (

&key, array, ARRAYSIZE(array), sizeof(int), fcmp);

if(elem == 0) ShowMessage("Элемент " + IntToStr(key) + " не найден");

else ShowMessage("Индекс элемента " + IntToStr(*elem) +
" равен " + IntToStr(elem- array));

)

Функции Ifind и Isearch выполняют в массиве линейный поиск. Он медлен-
нее, чем дихотомия, но может применяться к неупорядоченным массивам. Функ-
ции различаются тем, что Isearch, если элемент не обнаружен, добавляет его в ко-
нец массива. Функции поиска в Ifind и Isearch отличаются от рассмотренных
выше. Они должны возвращать нуль при совпадении элементов и ненулевое значе-
ние, если элементы различны.

Ниже приведен пример использования функции Isearch, похожий на рассмот-
ренный ранее. В примере объявлен массив array неупорядоченных целых чисел.
Функция fcmpi — это функция сравнения. При щелчке на кнопке Buttoni в мас-
сиве ищется элемент, соответствующий указанному пользователем в окне Editl.
Если элемент не найден, он добавляется в конец массива.

ftinclude <malloc.h>
ttinclude <stdlib.h>
int array[10] = {800,123,512,627,933,145};

unsigned Narray = 6;

int fcmpi (const void *pl, const void *p2)
{ return(*(int*)pi != *(int*)p2); }

void_fastcall TFormI::ButtonlClick(TObject *Sender)
{

int key = StrToInt(Editl->Text);

int *elem;

elem = (int *) Isearch (&key, array, &Narray, sizeof(int), fcmpi);

ShowMessage("Индекс элемента " + IntToStr(key) + " равен " +
IntToStr(elem- array));

)

Функции GetShortHint и GetLongHint возвращают соответственно первую и
вторую части строки формата

<текст первой части>|<текст второй части>

Строки такого вида, в частности, задаются в свойстве компонентов Hint (см.
главу 15). Если вторая часть, следующая после символа «|», отсутствует, т.е. стро-
ка не разбита на две части, то обе функции возвращают строку целиком.

Функции обычно используются в обработчиках событий OnMouseMove, соот-
ветствующих прохождению курсора мыши над данным компонентом. Например,
обработчик

void _fastcall TFormI::LabellMouseMove(

TObject *Sender, TShiftState Shift, int X, int Y)

(

Panell->Caption = GetShortHint(((TControl *)Sender)->Hint);

Panel2->Caption = GetLongHint(((TControl *)Sender)->Hint);

}

отобразит в панели Panell первую, а в панели Panel2 — вторую часть свойства
Hint всех компонентов, над которыми будет перемещаться, если в этих компонен-
тах в событии OnMouseMove указан этот обработчик. Причем это не зависит от
значения их свойства ShowHint.

Более подробные пояснения и примеры см. в главе 15 в разделе Hint.