Песни о Паскале | страница 165



>      Assign(F, 'P_40_1.in'); Reset(F);

>      ReadFromFile(F);

>      Close(F);

>      Randomize; { чтобы порядок вопросов не повторялся }

>      { Начало главного цикла }

>      repeat

>      Write('Введите вопрос: '); Readln(S);

>      if S<>'' then Writeln(Answers[Random(Fact)+1]);

>      until S='';

>end.


Открыв файл ответов «P_40_1.IN», мы вызываем процедуру ReadFromFile (читать из файла), которая загружает строки в массив Answers (ответы). Она же подсчитывает введенные строки в переменной Fact. Таким образом, если файл содержит больше сотни строк, то в массив попадёт первая сотня, а иначе — столько, сколько там есть фактически, и это количество покажет переменная Fact. Дальше всё работает, как в прежнем варианте: после ввода вопроса ответ случайным образом выбирается из массива. Индекс элемента с ответом определяется выражением Random(Fact)+1. Если помните, функция Random(Fact) возвращает значения в диапазоне от 0 до Fact-1, а индексы нашего массива начинаются с единицы.

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

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