Песни о Паскале
Шрифт:
Полицейская база данных – ускоряем поиск
А теперь освежите в памяти другое наше творение – программу поиска угнанных автомобилей в полицейской базе данных (глава 29). Её слабость в том, что поиск номеров выполняется в текстовом файле. Ах, если б вы знали, как «тормозит» такой поиск! Вы не заметили? Да, на десятках строк этого не ощутить, иное дело – сотни тысяч, или миллионы. Итак, перенесем список номеров из текстового
В программе «P_40_2» обратите внимание на пропуск пустых строк в процедуре ReadFromFile. Если этого не сделать, счётчик Fact может оказаться на 1 больше, чем должно, – так случится, если за последним числом будут пустые строки. Следующий далее оператор чтения числа пренебрегает границами между строками, поэтому в одной строке допустимы несколько чисел.
{ P_40_2 – Полицейская база данных с применением массива }
const CNumbers = 1000; { размер массива с номерами автомобилей }
{ объявление типа для массива номеров }
type TNumbers = array[1..CNumbers] of integer;
var Numbers : TNumbers; { объявление массива номеров }
Fact : integer; { фактическое количество номеров в файле }
F : text; { файл с номерами }
Num : integer; { номер проверяемого автомобиля }
{ Процедура ввода номеров из файла }
procedure ReadFromFile(var aFile: text);
var i: integer;
begin
Fact:=0; { для начала подсчета номеров обнуляем счетчик }
for i:=1 to CNumbers do begin { цикл по массиву номеров }
while Eoln(aFile) do { Пропуск пустых строк }
if Eof(aFile) then Break else Readln(aFile);
if Eof(aFile) then Break; { если конец файла – выход из цикла }
Read(aFile, Numbers[i]); { читаем номер в элемент массива }
Fact:= Fact+1; { наращиваем счетчик номеров }
end;
end;
{ Функция поиска в массиве номеров автомобилей }
function FindNumber(aNum: integer): boolean;
var i: integer;
begin
FindNumber:= false;
for i:=1 to Fact do
if aNum=Numbers[i] then begin
FindNumber:= true; { нашли ! }
Break; { выход из цикла }
end
end;
begin {--- Главная программа ---}
{ открываем файл и читаем номера автомобилей }
Assign(F, 'P_38_2.in'); Reset(F);
ReadFromFile(F); { ввод номеров из файла }
Close(F);
repeat { Главный цикл }
Write('Укажите номер автомобиля: '); Readln(Num);
if FindNumber(Num)
then Writeln('Эта машина в розыске, хватайте его!')
else Writeln('Пропустите
until Num=0; { 0 – признак завершения программы}
end.
Ещё раз о статистике
Следующая программка будет маленькой, да удаленькой. Вернемся к статистике, с которой познакомились при обработке классного журнала. Напомню, что статистика – это наука, изучающая массовые явления. В текстах наших программ полным-полно разных букв, – давайте посчитаем их. Результатом работы программы будет таблица, похожая на эту.
a 119
b 45
c 72
...
Здесь левый столбец составляют буквы, а правый – количество этих букв в некотором файле. Упростим себе задачу, ограничившись подсчетом лишь маленьких латинских букв от «a» до «z».
Для подсчета общего количества символов в файле хватило бы одного счетчика. Но здесь 26 букв, а значит и счетчиков надо столько же. Массив счетчиков напрашивается сам собой, его тип можно объявить так:
type TCounts = array [1..26] of integer;
Однако не спешите этого делать. Вспомните о том, что индексом массива может быть любой порядковый тип данных. А к ним, наряду с числами, относятся символьный и даже булев тип. Стало быть, допустимы такие массивы.
type TA = array ['A'..'F'] of integer;
TB = array [false..true] of integer;
Первый из них содержит 6 элементов, а индексируется символьным выражением. Второй содержит всего два элемента, индексы которого имеют булев тип. В решаемой задаче напрашивается символьная индексация, а потому объявим тип для массива счетчиков так:
type TCounts = array ['a'..'z'] of integer;
Теперь символ, прочитанный из файла, можно использовать как индекс в массиве счетчиков, надо лишь предварительно проверить его на попадание в нужный диапазон.
Входным файлом программы будет текст её самой же. Вот она, простая и красивая.
{ P_40_3 – Подсчет количества различных букв в файле }
{ Тип массива из целых чисел, индекс – символьный }
type TCounts = array ['a'..'z'] of integer;
var Counts : TCounts; { массив из счетчиков букв }
c: char; { текущий символ файла, он же – индекс счетчика }
F : text; { файл с текстом программы }
begin {--- главная программа ---}