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




>var sym : char;

>...

>      Read(InFile, sym);       { чтение одного символа }


А фамилию S склеим из отдельных букв:


>      S:= S + sym;


Разумеется, что здесь нужен цикл, условием выхода из которого будет либо достижение первого пробела, либо достижение конца строки. В этом и состоит основная идея алгоритма, показанного на рис. 71.



Рис.71 – Упрощенный алгоритм побуквенного чтения фамилии
Нелишняя предосторожность

Людям свойственно ошибаться, – даже учителям! В строках журнала (а это текстовый файл) могут оказаться лишние пробелы – как между оценками, так и в начале строки, перед фамилией. И что тогда? – проверьте на практике. При чтении чисел процедура Read «не заметит» лишних пробелов, – она достаточно «умна». Другое дело – показанная выше блок-схема: если перед фамилией обнаружится пробел, то чтение слова завершится досрочно. Стало быть, для правильного чтения фамилии надо пропустить стоящие перед нею пробелы (если они есть). Это улучшение слегка усложнит блок-схему (рис. 72).



Рис.72 – Усовершенствованный алгоритм побуквенного чтения фамилии
Достройка программы

В основу новой версии программы «P_31_1» положим программу «P_30_1». Вам следует, прежде всего, открыть её и сохранить под новым именем. Готово? Тогда приступаем к правке.

Начнем с главной программы, где надо изменить имена входных и выходных файлов (чтобы не путать с похожими файлами предыдущей версии).


>      Assign(InFile,'Journal2.in');       Reset(InFile);

>      Assign(OutFile,'Journal2.out'); Rewrite(OutFile);


Позаботьтесь о том, чтобы файл «Journal2.in» был похож на настоящий классный журнал с фамилиями, как о нём сказано в начале 30-й главы.

Второе изменение внесем в процедуру обработки строки HandleString. Здесь объявим ещё одну переменную строкового типа, назовем её Fam, она будет вмещать фамилию ученика.


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


Разумеется, оператор печати строки тоже будет изменен.


>      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);