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



>until not ((Ord(sym)>32));

>ReadFam:= S; { возвращаемый результат }

>end;


Обратите внимание на сравнение введенного символа с пробелом. Это сравнение можно было бы записать так:


>      sym <> ’ ’


Но пробел в кавычках трудно разглядеть. Лучше сравнивать код символа с кодом пробела (который равен 32), что и сделано внутри функции.

Испытание

Теперь все готово, запустите программу. Что оказалось в выходном файле «Journal2.out»? Наверное, вот это.


>Номер Фамилия       Количество       Сумма       Средний

>ученика       оценок       баллов       балл

>1       Акулова       3       12       4.0

>2       Быков       4       20       5.0

>3       Волков       4       18       4.5

>4       Галкина       3       10       3.3

>5       Крокодилкин       2       7       3.5


Если не считать кривых колонок, неплохо. Кривизну даёт разная длина фамилий учеников. Можно выровнять колонки, вычисляя спецификатор ширины в зависимости от длины фамилии. Или поступить иначе, – дополнить фамилии до одинаковой длины пробелами справа, например:


>      while Length(Fam) < 12 do Fam:= Fam + Char(32);


Этот оператор уместен после чтения фамилии. Окончательный вариант программы со всеми дополнениями и уточнениями представлен ниже.


>      { P_31_1 – Обработка классного журнала, второй этап }


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

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


>{----- Функция чтения фамилии -----}


>function ReadFam: string;

>var sym: char;

>S : string;

>begin

>s:=''; { очистка накопителя строки }

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

>repeat Read(InFile, sym); until Ord(sym)>32;

>{ чтение последующих символов }

>repeat

>s:= s+sym;

>if Eoln(InFile) then Break;

>Read(InFile, sym);

>until not ((Ord(sym)>32));

>ReadFam:= S;

>end;

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


>procedure HandleString;

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

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

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

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

>      Fam: string; { фамилия }

>begin

>      Fam:= ReadFam; { читаем фамилию }

>      { для выравнивания столбцов добавляем пробелы }

>      while Length(Fam) < 12 do Fam:= Fam + ' ';

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

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

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

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

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

>      end;

>      if Cnt>0