Поиск информации в файле записей
Поиск информации в файле необходим для отбора из файла тех записей, которые удовлетворяют некоторому признаку. Алгоритм поиска информации в файле записей представлен на рис.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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!