Песни о Паскале | страница 116
>var sym : char;
>...
> Read(InFile, sym); { чтение одного символа }
А фамилию S склеим из отдельных букв:
> S:= S + sym;
Разумеется, что здесь нужен цикл, условием выхода из которого будет либо достижение первого пробела, либо достижение конца строки. В этом и состоит основная идея алгоритма, показанного на рис. 71.
Людям свойственно ошибаться, – даже учителям! В строках журнала (а это текстовый файл) могут оказаться лишние пробелы – как между оценками, так и в начале строки, перед фамилией. И что тогда? – проверьте на практике. При чтении чисел процедура Read «не заметит» лишних пробелов, – она достаточно «умна». Другое дело – показанная выше блок-схема: если перед фамилией обнаружится пробел, то чтение слова завершится досрочно. Стало быть, для правильного чтения фамилии надо пропустить стоящие перед нею пробелы (если они есть). Это улучшение слегка усложнит блок-схему (рис. 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);