Песни о Паскале - [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.
Здесь осталась лишь одна шероховатость – при печати результатов часть строк не поместится на экране. Так направьте вывод в текстовый файл. Или слабо?
Вы бывали в Калининграде? Город мистический и старый. Но не это главное. То что происходит с главной героиней не объясняется древними стенами. За ней гоняется призрак погибшего мотоциклиста. Зачем? Почему?. Рита узнает все и будет счастлива.
Я смотрела на бесплатный цирк с мученическим выражением лица, подперев голову рукой. В другой момент можно было бы посмеяться, но не тогда, когда вернувшись с очередной вылазки в опасное место, проспала всего час. А ещё через час мне нужно быть уже на защите по поводу окончания двухмесячного обучения целителей в моём персональном Аду.Так косолапый ещё и жопой ко мне повернулся, тряся больше. Это намёк? Закатив глаза к потолку, думала заканчивать выступление, как вдруг набедренная повязка мишки упала, а лифчик лопнул, разлетаясь на части.
Лианка попадает в мир, который не отличался бы от нашего, если бы не драконы. Давняя война разрушила традиционный уклад. Человечество выбрало путь технического прогресса. Драконы одичали настолько, что прямоходящие собратья забыли о прежней дружбе и начали считать ящеров животными, притеснять и отлавливать для опытов и зоопарков. Крылатые обречены. Они отступают все выше в горы, но люди жадные до знаний и земель беспощадны.В первый же день Лианка, угодив в сети ловцов, оказывается в огромной клетке вместе с другими драконами.
В застывшем воздухе — дымы пожарищ. Бреду по раскисшей дороге. Здесь до меня прошли мириады ног. И после будут идти — литься нескончаемым потоком… Рядом жадно чавкает грязь. — тоже кто-то идет. И кажется не один. Если так, то мне остается только позавидовать счастливому попутчику. Ибо неизбывное одиночество сжигает мою душу и нет сил противостоять этому пламени.Ненависть повисла над дорогой, обнажая гнилые, побуревшие от крови клыки. Безысходность… Я не могу идти дальше, я обессилел. Но… все-таки иду. Ибо в движении — жизнь.
Главная героиня юная карьеристка, Татьяна Лунева, живет в своем неприметном городе, работает на не приметной работе и мечтает об отпуске. В один из июльских вечеров в ее жизнь врывается незнакомец. Он представляется как убийца теней и увозит ее в свой мир, что бы защитить от темных душ, охотившихся за ней. Вскоре Татьяна узнает, что она не просто человек, и что отныне ей придётся бороться за свою жизнь и свободу. Читайте захватывающие приключения юной девушки в мире призраков. И узнайте, каково быть человеком с серебреной душой.