Песни о Паскале
Шрифт:
Итоги
• Редактором текста можно открыть столько файлов, сколько вам нужно. Каждый файл открывается в отдельном окне; обращаться с окнами так же легко, как с окнами Windows.
• Для переноса кусков текста используйте буфер обмена.
• Буфер обмена IDE и буфер обмена Windows не связаны между собой. Для переноса текста в другие файлы Windows открывайте файлы своих программ в редакторах этой системы, например, в блокноте. Или воспользуйтесь пунктами меню Copy to Windows и Paste from Windows.
• Ищите ответы на свои вопросы в справочной системе IDE.
Глава 29
Читайте по-новому
Отдохнув на экскурсии, с новой силой набросимся на файлы, – ведь именно там хранятся наши данные. Научимся извлекать из файлов числа.
Полицейская база данных, версия 1
Одна из первых наших программ исполняла должность электронного часового, охранявшего секретный объект. Теперь поможем другой силовой структуре – дорожной полиции.
Долг автоинспектора – в числе прочего – поиск угнанных автомобилей. Работа нехитрая: заприметив подозрительный автомобиль, инспектор сверяет его номер со своей картотекой. И, если номер в картотеке найдется, принимает меры к задержанию автомобиля и поимке преступника. В отличие от часового, который помнит всего один пароль, полицейский роется в пухлой картотеке с тысячами номеров. В этом и состояла его главная трудность, пока не явились компьютерные базы данных.
Базы данных (сокращенно БД) – кто не слышал о них? На ум приходят базы данных Пентагона, ЦРУ и налоговой инспекции. Да, эти чудовищные БД впечатляют! Впрочем, чтобы увидеть базу данных, не спешите потрошить Пентагон. Вот расписание поездов, программа телепередач или классный журнал, – все это простые базы данных. В конце концов, любая БД – это организованное хранилище данных, приспособленное для удобного поиска информации. Нам тоже по силам создать несложную полицейскую базу данных.
Соорудим такую базу с номерами угнанных автомобилей, и воспользуемся для этого текстовым файлом. Допустим, что номера автомобилей – это числа; тогда база данных – это файл с напечатанными в столбик номерами: каждая строка файла содержит один номер. Номера могут следовать в любом порядке, например:
123
325
234
11
Такой файл можно напечатать любым редактором текста, в том числе и встроенным в IDE. Мы так и поступим: создайте новый файл, впечатайте в него десяток-другой пришедших на ум номеров и сохраните в рабочей папке под именем «Police.txt». Окно с этим файлом пока не закрывайте, оно ещё пригодится.
Все, база данных готова! Только не предлагайте полицейскому рыться в этом файле, – вместо благодарности вы услышите совсем другие слова. В довершение доброго дела напишем программу для поиска номера в этой базе. Такая программа должна работать как часовой, запрашивая у полицейского номер автомобиля и сообщая о том, содержится ли этот номер в БД. Признаком выхода из программы будет ввод нулевого номера.
Итак, приступим к программе «P_29_1». Схема главной программы ясна из вышесказанного. Выносить заключение об автомобиле будет функция булевого типа, принимающая два параметра: файловую переменную, связанную с нашей БД, и номер искомого автомобиля. Если номер в базе данных обнаружится, функция вернет значение TRUE. Ввиду простоты алгоритма не буду рисовать блок-схему. Если чуете в себе силу, напишите программу сами, и, после некоторых мучений, сравните с тем, что показано ниже.
{ P_29_1 – Полицейская база данных, версия 1 }
function FindNumber(var aFile: text; aNumber: integer): boolean;
var N: integer; { текущий номер в БД }
begin
FindNumber:= false; { на случай, если файл пуст }
Reset(aFile); { позицию чтения устанавливаем в начало файла }
N:=0; { в начале цикла задаем несуществующий номер }
{ читаем номера из файла, пока НЕ конец файла И номер НЕ найден }
while not Eof(aFile) and (N<>aNumber) do begin
Readln(aFile, N);
FindNumber:= (N=aNumber); { true, если номер нашелся }
end;
end;
var F: text; Num: integer;
begin {----- Главная программа -----}
Assign(F, 'Police.txt');
repeat
Write('Укажите номер автомобиля: '); Readln(Num);
if FindNumber(F, Num)
then Writeln('Эта машина в розыске, хватайте его!')
else Writeln('Пропустите его');
until Num=0; { 0 – признак завершения программы}
Close(F);
end.
Поясню некоторые моменты. В начале главной программы файловая переменная F связывается с файлом «Police.txt». Далее следует хорошо знакомая конструкция REPEAT–UNTIL с проверкой условия в конце цикла.
Самое интересное скрыто внутри функции FindNumber (от Find – «искать», Number – «номер»). Туда передаются два параметра, один из которых – файловая переменная. Обратите внимание на способ её передачи: файловая переменная передается по ссылке (в заголовке указано слово VAR). И никак иначе такую переменную не передают! Со временем узнаете причину, а пока просто запомните: файловые переменные передают внутрь процедур и функций только по ссылке! Следовательно, параметр aFile ссылается на глобальную переменную F.
А к чему здесь приставки «a» перед именами параметров: aFile, aNumber? Или это тоже правило языка? Нет, друзья, это всего лишь уловка программистов, которую полезно перенять. Чем сложнее будут ваши программы, тем гуще будут заселены разного рода переменными и параметрами. Во избежание путаницы лучше учредить разумную систему обозначений. Большинство программистов используют для систематизации имен так называемые префиксы или приставки. Например, для параметров (аргументов) процедур и функций применяют префикс «a» (от слова «argument»). Помеченные таким образом параметры уже не спутаешь с локальными или глобальными переменными.
Теперь заглянем внутрь функции FindNumber. В первой строке результату функции присваивается значение FALSE. И это оправдано, поскольку значение функции обязательно должно быть определено, а в случае, если файл БД окажется пустым, этого не случится, поскольку следующий далее цикл WHILE не будет выполняться.
Поиск номера должен начинаться с начала файла. Оператор Reset внутри функции как раз и возвращает позицию чтения на линию старта. Будьте спокойны – файл от этого не пострадает, открывать его для чтения можно без ограничений!