Песни о Паскале | страница 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