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



Кстати, годится ли для чтения строки оператор цикла REPEAT-UNTIL? Правильный ответ – нет. Если текущая строка окажется пустой, следующая оценка прочитается уже на следующей строке, а это не то, что нам нужно! Оператор WHILE – единственно правильное решение.

Барабаним по клавишам

Теперь все готово для сочинения задуманной программы «P_30_1», ниже показан её текст. В начале программы объявлены три глобальные переменные: две – для доступа к входному и выходному файлам, и одна – для подсчета читаемых строк. Поскольку эти переменные объявлены перед процедурой обработки строки HandleString, то будут видны и в этой процедуре. Поэтому передавать содержащиеся в них данные через параметры здесь не обязательно (но возможно). Таким образом, мы передаем данные в процедуру через глобальные переменные, – в небольших программах это допустимо. Только не злоупотребляйте этим приемом, иначе в сложных программах запутаетесь.

Заглянем теперь внутрь процедуры HandleString. Кстати, её название составлено из двух слов: Handle – «обработка», и String – «строка». Процедура не принимает параметров, поскольку все необходимые данные получает через глобальные переменные. Обратите внимание на вычисление среднего балла:


>      Rating:= Sum div Cnt;


Сумма баллов делится на счетчик оценок; в этой операции участвуют целочисленные переменные, а результат деления тоже получится целым. Стало быть, дробную часть рейтинга мы теряем, – к решению этой проблемы вернемся позже.

А что сказать о главной программе? Она работает по ранее рассмотренному алгоритму. По крайней мере, сейчас нам так кажется.


>{ P_30_1 – обработка журнала, первый вариант }

>      {----- Глобальные переменные -----}

>var InFile, OutFile : text; { входной и выходной файлы }

>      Counter: integer;       { счетчик строк входного файла }

>      {----- Процедура обработки одной строки -----}

>procedure HandleString;

>var N : integer; { оценка, прочитанная из файла }

>      Cnt: integer; { количество оценок }

>      Sum: integer; { сумма баллов }

>      Rating: integer; { средний балл }

>begin

>      Sum:=0; Cnt:=0; { очищаем накопитель и счетчик оценок }

>      while not Eoln(InFile) do begin { пока не конец строки }

>      Read(InFile, N);       { читаем оценку в переменную N }

>      Sum:= Sum+N;       { накапливаем сумму баллов }

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

>      end;

>      if Cnt>0

>      then begin       { если оценки были }

>      Rating:= Sum div Cnt;