Поиск информации в файле записей



Поиск информации в файле необходим для отбора из файла тех записей, которые удовлетворяют некоторому признаку. Алгоритм поиска информации в файле записей представлен на рис.10. Признак, по которому ведётся поиск, в алгоритме называется ключом поиска. На рис.10 ключом поиска является переменная key, задающая интересующую пользователя фамилию. Значение ключа пользователь вводит с клавиатуры. В процессе поиска записи последовательно считываются из файла, и поле FIO каждой записи сравнивается со значением ключа key. При совпадении все поля записи выводятся на экран. Таким образом, в файле будут найдены все записи о людях с заданной фамилией.

В общем случае в процессе поиска может быть получен один из двух результатов: либо будут найдены и выведены на экран сведения об одном или нескольких людях, либо информация ни об одном человеке найдена не будет. В последнем случае необходимо оповестить пользователя об отсутствии результатов поиска, чтобы избежать недоразумений. С этой целью в алгоритме участвует переменная FLAG. Она относится к типу BOOLEAN. Начальное значение переменной FLAG зададим равным TRUE (истина), и этим опишем предположение о наихудшем результате поиска, т. е. предположение о том, что необходимая информация не будет найдена. Если в процессе поиска наш начальный пессимистический прогноз не оправдается, и хотя бы одна запись, удовлетворяющая ключу поиска, будет найдена, то значение переменной FLAG сменится на FALSE (ложь).

Таким образом, когда файл закончится, по значению, хранящемуся в переменной FLAG, можно сделать заключение:

ü если переменная FLAG равна TRUE, значит ни одной записи, удовлетворяющей ключу, найдено не было, т.к. переменная FLAG так и не поменяла своё значение. Следовательно, необходимо вывести сообщение об отсутствии результата;

ü если переменная FLAG равна FALSE, значит хотя бы одна запись, удовлетворяющая ключу, найдена, и её значение уже выведено на экран.

В программе алгоритм поиска записи по ключу, представленный на рис.10, выглядит следующим образом:

• • •

write(’Введите интересующую фамилию:’);

readln(key);

FLAG:=TRUE;

reset(F);

writeln(’Сведения о:’,key);

writeln(’Дата рождения’:25,’Рост’:10,’Вес’:10);

while NOT EOF(F) do

begin

read(F,a);

WITH a, a.BirthDate do

If FIO=key then

begin

FLAG:=FALSE;

writeln(Day:6,Month:11,Year:5,’г.’:3,

Height:10:2,Wieght:10:2);

end;

end;

close(F);

If FLAG then

writeln(’Поиск не дал результата’);

• • •

В данном примере ключ поиска является простым одинарным ключом. Для более сложного поиска может использоваться несколько ключей, что усложнит условие отбора.

4.5. Добавление информации к файлу записей

Алгоритм добавления записей к файлу представлен на рис.11. Легко заметить, что в своей основе этот алгоритм совпадает с алгоритмом ввода файла. Поэтому удобно будет объединить эти алгоритмы, как и показано на рис. 11.  При  объединении  алгоритмов  необходимо учитывать, что  при  вводе файла  его  нужно  открывать для записи оператором rewrite(F) и ввод файла начинается сначала. При добавлении компонент в файл они дописываются в конец файла. При этом уже существующие компоненты не уничтожаются, а указатель переставляется в конец файла оператором seek(F,filesize(F)). Чтобы определить, создавать ли файл заново или дописывать компоненты в конец файла, попытаемся открыть файл для чтения оператором reset(F).

Чтобы избежать аварийного завершения программы при открытии этим оператором несуществующего файла, необходимо сначала отключить, а после оператора reset(F) снова включить контроль ошибок ввода/вывода. Отключение контроля ошибок ввода/вывода выполняется директивой {$I-}, включение контроля – {$I+}.

Если при открытии файла ошибок не произошло, то переменная ioresult примет значение 0. Это означает, что файл уже существует и нужно добавлять данные в конец файла. Если переменная ioresult не равна 0, значит при открытии файла произошла ошибка. Это случилось из-за того, что файл не существует. Поэтому его нужно открыть для записи оператором rewrite(F) и вводить новый файл.

Текст программы, соответствующий алгоритму (рис. 11), приведён ниже:

• • •

{$I-}

reset(F);

{$I+}

If ioresult=0 then

seek(F,filesize(F))

else

rewrite(F);

writeln(’Введите сведения об очередном человеке:’);

WITH a do

begin

write(’ФИО:’);

readln(FIO);

while FIO<> ’***’ do

begin

WITH BirthDate do

begin

writeln(’Дата рождения:’);

write(’День:’);

readln(Day);

write(’Месяц:’);

readln(Month);

write(’Год:’);

readln(Year);

end;

write(’Рост:’);

readln(Height);

write(’Вес:’);

readln(Weight);

write(F,a);

writeln(’Введите сведения об очередном человеке:’);

write(’ФИО:’);

readln(FIO);

end;

end;

close(F);

• • •

Корректировка файла записей

При корректировке записей в БД обычно исправлению подлежат не все записи, а только указанные пользователем. Для этого необходимо эти записи найти в файле по ключу, также как делалось в разделе “Поиск информации в файле записей”, а затем вывести на экран информацию, хранящуюся в откорректированной записи (для ознакомления с ней пользователя), запросить у пользователя новые данные и записать их в файл на место корректируемых.

Здесь ik – номер корректируемой компоненты. В шаге 1-2 выполняется поиск значения ik по ключу key. При нахождении нужной компоненты в файле запоминается её номер, а указатель файла переставляется за его пределы , т.к. нужная компонента уже найдена, и дальнейший поиск неуместен.

Если: компонента была найдена, то флаг поиска FLAG примет значение FALSE, и в этом случае выполнятся шаги 3-4 и 4-5.

В шаге 3-4 указатель устанавливается на корректируемую компоненту. Она считывается из файла и по полям выводится на экран.

В шаге 5-6 вводится новое значение корректируемой компоненты по полям, а затем указатель в файле устанавливается на корректируемую компоненту и она целиком записывается в файл.

В программе алгоритм корректировки записывается следующим образом:

• • •

write(’Введите фамилию корректируемого человека:’);

readln(key);

reset(F);

{1-2}

FLAG:=TRUE;

while NOT EOF(F) do

begin

read(F,a);

if a.FIO=key then

begin

FLAG:=FALSE;

ik:=filepos(F)-1;

seek(F,filesize(F));

end;

end;

if FLAG then

writeln(’Поиск не дал результата’)

else

WITH a do

begin

{3-4}

seek(F,ik);

read(F,a);

writeln(’Корректируются сведения о человеке:’);

writeln(’ФИО:’,FIO);

writeln(’Дата рождения:’,Day,’.’,Month,’.’,Year);

writeln(’Рост:’,Height);

writeln(’Вес:’,Weight);

{5-6}

writeln(’Введите новые сведения:’);

write (’ФИО:’);

readln(FIO);

writeln(’Дата рождения:’);

write(’День:’);

readln(Day);

write(’Месяц:’);

readln(Month);

write(’Год:’)

readln(Year);

write(’Рост:’);

readln(Height);

write(’Вес:’);

readln(Weight);

seek(F,ik);

write(F,a);

end;

• • •


Дата добавления: 2018-10-27; просмотров: 224; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!