Writeln(OutFile, Counter:3, Fam:18, Cnt:8, Sum:14, Rating:11:1);

Осталось выяснить, что такое ReadFam? Это функция чтения фамилии, которую мы напишем по рассмотренному чуть выше алгоритму (рис. 72). Мой вариант функции таков.

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;

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

      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

      then begin       { если оценки в четверти были }

      Rating:= Sum / Cnt; { вычисляем и печатаем ср. балл }

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

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