Песни о Паскале - [82]

Шрифт
Интервал

Полицейская база данных – ускоряем поиск

А теперь освежите в памяти другое наше творение – программу поиска угнанных автомобилей в полицейской базе данных (глава 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       {--- главная программа ---}

>{ Перед началом подсчета все счетчики обнуляем }

>for c:='a' to 'z' do Counts[c]:=0;

>{ Открываем входной файл для чтения }

>Assign(F, 'P_40_3.pas'); Reset(F);

>while not Eof(F) do begin { Цикл чтения и подсчета букв }

>Read(F, c);       { чтение одного символа из файла }

>if c in ['a'..'z']       { если символ в нужном диапазоне }

>      then Counts[c]:= Counts[c]+1; { наращиваем его счетчик }

>end;

>Close(F);

>{ После подсчета распечатаем все счетчики }

>for c:='a' to 'z' do Writeln (c, Counts[c]:6);

>Write('Нажмите Enter'); Readln;

>end.


Здесь осталась лишь одна шероховатость – при печати результатов часть строк не поместится на экране. Так направьте вывод в текстовый файл. Или слабо?


Рекомендуем почитать
Другая жизнь

Я нашла свою вторую половинку. И счастлива там, в другой жизни.


Маргаритка под снегом

Вы бывали в Калининграде? Город мистический и старый. Но не это главное. То что происходит с главной героиней не объясняется древними стенами. За ней гоняется призрак погибшего мотоциклиста. Зачем? Почему?. Рита узнает все и будет счастлива.


«Ад» для студентов

Я смотрела на бесплатный цирк с мученическим выражением лица, подперев голову рукой. В другой момент можно было бы посмеяться, но не тогда, когда вернувшись с очередной вылазки в опасное место, проспала всего час. А ещё через час мне нужно быть уже на защите по поводу окончания двухмесячного обучения целителей в моём персональном Аду.Так косолапый ещё и жопой ко мне повернулся, тряся больше. Это намёк? Закатив глаза к потолку, думала заканчивать выступление, как вдруг набедренная повязка мишки упала, а лифчик лопнул, разлетаясь на части.


Проект Королева

Лианка попадает в мир, который не отличался бы от нашего, если бы не драконы. Давняя война разрушила традиционный уклад. Человечество выбрало путь технического прогресса. Драконы одичали настолько, что прямоходящие собратья забыли о прежней дружбе и начали считать ящеров животными, притеснять и отлавливать для опытов и зоопарков. Крылатые обречены. Они отступают все выше в горы, но люди жадные до знаний и земель беспощадны.В первый же день Лианка, угодив в сети ловцов, оказывается в огромной клетке вместе с другими драконами.


Дорога снов

В застывшем воздухе — дымы пожарищ. Бреду по раскисшей дороге. Здесь до меня прошли мириады ног. И после будут идти — литься нескончаемым потоком… Рядом жадно чавкает грязь. — тоже кто-то идет. И кажется не один. Если так, то мне остается только позавидовать счастливому попутчику. Ибо неизбывное одиночество сжигает мою душу и нет сил противостоять этому пламени.Ненависть повисла над дорогой, обнажая гнилые, побуревшие от крови клыки. Безысходность… Я не могу идти дальше, я обессилел. Но… все-таки иду. Ибо в движении — жизнь.


Он идет за мной

Главная героиня юная карьеристка, Татьяна Лунева, живет в своем неприметном городе, работает на не приметной работе и мечтает об отпуске. В один из июльских вечеров в ее жизнь врывается незнакомец. Он представляется как убийца теней и увозит ее в свой мир, что бы защитить от темных душ, охотившихся за ней. Вскоре Татьяна узнает, что она не просто человек, и что отныне ей придётся бороться за свою жизнь и свободу. Читайте захватывающие приключения юной девушки в мире призраков. И узнайте, каково быть человеком с серебреной душой.