Программирование >>  Элементы языков с и с++ 

1 ... 42 43 44 [ 45 ] 46 47 48 ... 200


char ,О, continue ,О, end ,О },bbb;

struct key BinarylnStruc(char *word,struct key tab[],int n)

/♦Ищет в массиве структур слово, находящееся в word

п - размерность массива, которая должна быть задана не больше, чем количество инициализированных элементов массива.

Возвращает структуру (элемент массива tab[]), в которой находится слово, заданное в word, либо tab[] последнего обработанного индекса (можно было бы возвратить tab[] любого существующего индекса), в котором значение keycount равно -1 (сигнгш того, что заданное слово в массиве структур не обнаружено)*/

int low, high, mid,cond; low=0;

high=n-l;

while(low <= high) I

mid=(low+high)/2;

if((cond=strcmp(word,tab[mid].keyword)) < 0) high=mid - 1;

if(cond < 0) {

high=mid - 1; continue;

if(cond > 0) {

low=mid +1; continue;

tab[mid].keycount=0; return(tab[mid]); found

} while

tab[mid].keycount=-l;

return(tab[mid]); not found



int tmain О I

char s [maxline] ; int с;

printf ( Enter your new string > );

getline(s, maxline);

bbb =BinaryInStruc(s,tab,5);

if (bbb.keycount!= -1)

printf( Found string = %s\n ,bbb.keyword); else

printf( not found\n ); getch(); 1

while ((c=getchar()) != eof) /*здесь, как и в операторе getiineО, надо использовать getchar {), а не getchO, иначе не будет останова на вводе в getiine О при повторном обращении */

; конец оператора do...while

нам надо бьшо, чтобы тело while выполнилось хотя бы один раз

) tmainO

Рассмотрим функцию Binaryinstruc, возвращающую структуру: struct key Binaryinstruc(char *word,struct key tab[],int n)

Сама структура определена до объявления функции: объявлен щаблон key и поэтому щаблону задан массив структур tab[] и один экземпляр bbb. Массив структур инициализирован: заданы значения только символьных строк, т. к. мы собираемся искать нужную строку, задавая на входе ее образец. Массив упорядочен по возрастанию строк, т. к. для поиска будет применяться метод деления отрезка пополам. Алгоритм этого метода рассматривался нами ранее. Значение keycount для поиска не используется, а применяется только для возврата: если не найдена структура, в которой содержится заданное с клавиатуры слово, то возвращается структура, у которой значение keycount будет равно-1.

В теле функции реализован метод двоичного поиска: концы отрезка, на котором располагаются индексы массива tab[], постоянно находятся в переменных low и high, а Средняя точка - в переменной mid. Сравнение значений в



word и tab[] осуществляется с помощью уже рассмотренной функции strcmp (word, tab [mid] . keyword). Если В средней точке строки в переменной word и в переменной tab [mid] значения keyword совпадают, то возвращается таблица структур в этой точке, иначе возвращается таблица структур в последней средней точке со значением keycount, равным -1.

В основной программе запращивается слово, которое вводится функцией! getline (), а затем передается вместе с массивом структур (таблицей tab[l)B качестве параметров функции BinaryinstrucO, возвращающей структуру, значение которой, в свою очередь, присваивается экземпляру ььь этого же шаблона (как мы видели ранее, эту операцию можно применить к структурам J одинаковых шаблонов). Результат работы программы показан на рис. 7.7.

C:\WINDOWS\system32\cmd.exe


Рис. 7.7. Результат работы программы листинга 7.7

Функция возвращает указатель на структуру

Изменим предыдущую программу так, чтобы функция возвращала вместо индекса массива указатель на структуру, в которой найдено или не найдено заданное слово (листинг 7.8).

Листинг 7.8

28.СРР : Defines the entry point for the console application.

iinclude stdafx.h iinclude <stdio.h> iinclude <conio.h>

for getchar(),putchar <)



1 ... 42 43 44 [ 45 ] 46 47 48 ... 200

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика