Читаем Песни о Паскале полностью

Перейдем к процедуре ввода этих строк. Техника ввода массива рассмотрена в предыдущей главе. Но теперь надо ещё и подсчитать введенные строки, иначе в дальнейшем мы не всегда сможем правильно индексировать массив, — ведь фактическое количество строк в файле может быть и меньше ста. С этой целью объявим переменную Fact, в которой и сделаем нужный нам подсчёт.

Обсудив эти моменты, обратимся к программе «P_40_1».


{ P_40_1 – Программа "вопрос-ответ" с применением массива }


const CAnswers = 100; { размер массива с ответами }

      { объявление типа для массива ответов }

type TAnswers = array[1..CAnswers] of string;


var Answers : TAnswers; { объявление массива ответов }

      Fact : integer;       { фактическое количество ответов }

      F : text;       { файл с ответами }

      S : string;       { строка с вопросом }

{ Процедура ввода ответов из файла с подсчетом введенных строк }

procedure ReadFromFile(var aFile: text);

var i: integer;

begin

Fact:=0; { для начала подсчета строк обнуляем счетчик }

{ цикл по массиву строк }

for i:=1 to CAnswers do begin

      if Eof(aFile) then Break; { если конец файла – выход}

      Readln(aFile, Answers[i]); { читаем строку в элемент массива }

      Fact:= Fact+1;       { наращиваем счетчик строк }

end;

end;


begin {--- Главная программа ---}

      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;       { номер проверяемого автомобиля }


      { Процедура ввода номеров из файла }

Перейти на страницу:

Похожие книги

Сломанная кукла (СИ)
Сломанная кукла (СИ)

- Не отдавай меня им. Пожалуйста! - умоляю шепотом. Взгляд у него... Волчий! На лице шрам, щетина. Он пугает меня. Но лучше пусть будет он, чем вернуться туда, откуда я с таким трудом убежала! Она - девочка в бегах, нуждающаяся в помощи. Он - бывший спецназовец с посттравматическим. Сможет ли она довериться? Поможет ли он или вернет в руки тех, от кого она бежала? Остросюжетка Героиня в беде, девочка тонкая, но упёртая и со стержнем. Поломанная, но новая конструкция вполне функциональна. Герой - брутальный, суровый, слегка отмороженный. Оба с нелегким прошлым. А еще у нас будет маньяк, гендерная интрига для героя, марш-бросок, мужской коллектив, волкособ с дурным характером, балет, секс и жестокие сцены. Коммы временно закрыты из-за спойлеров:)

Лилиана Лаврова , Янка Рам

Современные любовные романы / Самиздат, сетевая литература / Романы